【问题标题】:How to get the tree hash of the working copy in git?如何在 git 中获取工作副本的树形哈希?
【发布时间】:2019-11-03 02:28:33
【问题描述】:

使用 git,如何获取 git 目录当前状态的树形哈希?也就是说,如果我运行git add -A 后跟git commit,那么提交的树哈希(不是提交哈希)会是什么?

【问题讨论】:

标签: git


【解决方案1】:

Greg Bacon's method简单一些:

  • 通过复制当前索引创建临时索引
  • 使用git add -A 更新临时索引中的所有内容
  • 使用git commit-tree 将临时索引变成实际的树

一个小的 shell 脚本(未经测试)就足够了:

#! /bin/sh -e
export GIT_INDEX_FILE=$(mktemp)
trap "rm -f $GIT_INDEX_FILE" 0 1 2 3 15
cp $(git rev-parse --git-dir)/index $GIT_INDEX_FILE
git add -A && git write-tree

复制当前索引的原因是,如果我们不使用临时索引,则当前跟踪(在常规索引中)可能被忽略的文件(通过.gitignore 或排除文件)将被忽略从实际索引中初始化临时索引。

另请参阅您自己的问题How to get the tree hash of the index in git?

【讨论】:

  • 我接受了这个答案,因为它是最简单的答案,并且完全符合我的要求。遗憾的是,没有单线,但三线已经足够接近了。
【解决方案2】:

您可以尝试将其与git hash-objectgit mktree 拼凑在一起,如The Git Community BookRaw Git 章节所述,但我建议使用更简单的方法,即在一次性分离的HEAD 上完成所有工作。

假设您想从当前分支的尖端开始,请转到detached HEAD state

git checkout $(git rev-parse HEAD)

git checkout 的部分闲聊输出暗示了这样做的好处。

您处于“分离 HEAD”状态。你可以环顾四周,做实验 更改并提交它们,您可以丢弃您在此所做的任何提交 在不影响任何分支的情况下执行另一次结帐。

在这里,我创建了新文件,这些文件将让 git 有事可做,并代表您的真正更改

touch new other stuff blah etc

现在不必重新实现 git,让 git 做它已经做的事情

git add -A .

此阶段更改为索引,git write-tree 将愉快地从中创建一个新的树对象。 存储库中机器上的输出是您询问的哈希值。

git write-tree
afba5669cbf579a9f27f1fda66cb0958282fae3a

写入标准输出的哈希是刚刚创建的树对象的哈希,但不必相信我的话。

$ git commit -m 'Throwaway commit'
[detached HEAD 0ae9d12] Throwaway commit
 5 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 blah
 create mode 100644 etc
 create mode 100644 new
 create mode 100644 other
 create mode 100644 stuff

输出提示新提交的 SHA1 对象名称 (0ae9d12),我们可以用它来确认

$ git rev-parse HEAD
0ae9d12408d1ea7eb02821d66f6de8a2f8423e7f

但是你想知道提交的对象的哈希值,可以用

$ git rev-parse HEAD^{tree}
afba5669cbf579a9f27f1fda66cb0958282fae3a

请注意,哈希值与git write-tree 的输出相同。

现在,如果您想保留提交,请在此处使用git branch 创建一个新分支。否则,如果你忽略它,提交和未使用的对象最终将作为 git 普通垃圾回收的一部分被丢弃。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 2011-08-07
    • 2013-02-06
    • 2013-05-01
    • 2010-12-19
    • 1970-01-01
    相关资源
    最近更新 更多