使用git,我如何获取git目录当前状态的树哈希值?也就是说,如果我运行git add -A
后再运行git commit
,该提交的树哈希值是什么(而不是提交哈希值)?
使用git,我如何获取git目录当前状态的树哈希值?也就是说,如果我运行git add -A
后再运行git commit
,该提交的树哈希值是什么(而不是提交哈希值)?
比Greg Bacon的方法稍微容易一些:
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
git hash-object
和git mktree
来拼凑它,正如The Git Community Book的Raw Git章节所描述的那样,但我建议采用更简单的方法,在一个可丢弃的detached HEAD上完成所有工作。git checkout $(git rev-parse HEAD)
git checkout
的聊天输出部分暗示了以这种方式进行操作的优势。
您处于“分离 HEAD”状态。您可以浏览,进行实验性更改并提交它们,并且您可以通过执行另一个 checkout 而舍弃在此状态下所做的任何提交,而不会影响任何分支。
在这里,我创建了新文件,这将为 git 提供一些操作,并代表您的真实更改。
touch new other stuff blah etc
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
$ git rev-parse HEAD
0ae9d12408d1ea7eb02821d66f6de8a2f8423e7f
但是您想知道提交的树形对象的哈希值,可通过以下方式寻址:
$ git rev-parse HEAD^{tree}
afba5669cbf579a9f27f1fda66cb0958282fae3a
git write-tree
的输出相同。git branch
在此处创建一个新分支。否则,如果您忽略它,提交和未使用的对象将最终作为Git的普通垃圾回收的一部分被丢弃。