Git树哈希是否可用于唯一标识子目录中的特定状态?

3

我希望使用git树对象中使用的哈希来唯一标识git下子目录的状态,特别是作为构建避免的工件库的索引。类似这样:

# Get hash for source tree in <path-do-dir>/<dir-name>
git cat-file -p HEAD^{tree}:<path-to-dir> | awk '$4 == "<dir-name>" { print $3 }'

我的问题是这些哈希值是否真正持久。朴素的实验表明它有效,但我想知道是否有人真正这样做。

1个回答

4
这里的 ^{tree} 实际上对您没有任何帮助。
还有一种更简单的方法:
git rev-parse HEAD:<path-to-dir>/<dir-name>

e.g.:

$ git cat-file -p HEAD:t | awk '$4 == "t9604" { print $3 }'
846893f0b08b1fa03a6383c9a4deade32c16e929
$ git rev-parse HEAD:t/t9604
846893f0b08b1fa03a6383c9a4deade32c16e929

树对象的SHA-1是树的“内容”的校验和,也就是它的树形结构,再加上树中所有名称及其模式、类型和SHA-1's的列表。因此,是的:它标识了目录的状态。如果树中包含的任何blob更改了模式(+x或-x),它甚至可能标识得过于强烈而发生变化。
如果您想确保HEAD:path命名了一个树(而不是一个blob),您可以对rev-parse的结果使用git cat-file -t(但这在这里可能不需要)。

太好了,正是我所需要的。这个加上所有依赖项的哈希值将非常适合避免构建。我<3 git。 - Christian Goetze
t/t9604是什么? - starbeamrainbowlabs
@starbeamrainbowlabs:Git存储库中的目录。它包含用于git cvsimport的测试文件(实际上是输入文件)。因此,这只是一个方便的示例,以展示git rev-parse提取树哈希ID的方法。 - torek
@torek 那我可以用 src/bar/SomeDirectory 替换它吗? - starbeamrainbowlabs
假设您的Git存储库中有此路径,则可以使用git rev-parse找到任何现有对象的哈希ID,只要该对象具有有效的名称<rev>:<path> - torek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接