如何在git中获取工作副本的树哈希?

如何在git中获取工作副本的树哈希?,git,Git,使用git,如何获取git目录当前状态的树散列?也就是说,如果我运行git add-A,然后运行git commit,提交的树散列(而不是提交散列)会是什么?您可以尝试将其与一起并按照的一章中所述进行拼接,但我建议在一次性分离的头上执行所有工作的更简单方法 假设要从当前分支的尖端开始,请转到“带” git checkout的部分聊天输出暗示了这种方式的优势 你处于“超脱的头部”状态。你可以四处看看,做实验 更改并提交它们,您可以放弃在此过程中所做的任何提交 通过执行另一个签出,在不影响任何分支的

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

您可以尝试将其与一起并按照的一章中所述进行拼接,但我建议在一次性分离的头上执行所有工作的更简单方法

假设要从当前分支的尖端开始,请转到“带”

git checkout的部分聊天输出暗示了这种方式的优势

你处于“超脱的头部”状态。你可以四处看看,做实验 更改并提交它们,您可以放弃在此过程中所做的任何提交 通过执行另一个签出,在不影响任何分支的情况下进行状态设置

在这里,我创建了一些新的文件,这些文件将为git提供一些工作,并用它来表示您的实际更改

touch new other stuff blah etc
现在,与其重新实现git,不如让git做它已经做过的事情

git add -A .
这将对索引进行阶段性更改,从中可以愉快地创建一个新的树对象存储库中计算机上的输出是您询问的哈希值。

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普通垃圾收集的一部分被丢弃。

您可以尝试将其与的一章中描述的内容组合在一起,但我建议使用一种更简单的方法,在一次性分离的头上完成所有工作

假设要从当前分支的尖端开始,请转到“带”

git checkout的部分聊天输出暗示了这种方式的优势

你处于“超脱的头部”状态。你可以四处看看,做实验 更改并提交它们,您可以放弃在此过程中所做的任何提交 通过执行另一个签出,在不影响任何分支的情况下进行状态设置

在这里,我创建了一些新的文件,这些文件将为git提供一些工作,并用它来表示您的实际更改

touch new other stuff blah etc
现在,与其重新实现git,不如让git做它已经做过的事情

git add -A .
这将对索引进行阶段性更改,从中可以愉快地创建一个新的树对象存储库中计算机上的输出是您询问的哈希值。

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普通垃圾收集的一部分被丢弃。

比:

  • 通过复制当前索引创建临时索引
  • 使用
    git add-A
    更新临时索引中的所有内容
  • 使用
    git提交树
    将临时索引转换为实际的树
一个小的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
或排除文件)将被忽略

另请参见您自己的问题

比以下问题稍微简单一些:

  • 通过复制当前索引创建临时索引
  • 使用
    git add-A
    更新临时索引中的所有内容
  • 使用
    git提交树
    将临时索引转换为实际的树
一个小的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
或排除文件)将被忽略


另请参见您自己的问题

检查链接是否对您有帮助。另一个问题的可能重复部分更一般,因为它询问如何获取任意目录的树散列,而不仅仅是repo当前状态的树散列。另外,这里的答案要好得多。检查链接是否对您有帮助。另一个问题的可能重复稍微更一般,因为它询问如何获取任意目录的树散列,而不仅仅是repo当前状态的树散列。我接受了这个答案,因为它是最简单的答案,并且完全符合我的要求。遗憾的是,没有一条直线,但三条直线已经足够接近了。我接受了这个答案,因为这是最简单的答案,而且完全符合我的要求。遗憾的是没有一艘客轮,但三艘客轮已经足够近了。