3

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

# 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 }'

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

4

1 回答 1

4

这里^{tree}实际上对你没有任何好处。

还有一个更简单的方法:

git rev-parse HEAD:<path-to-dir>/<dir-name>

例如:

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

树对象的 SHA-1 是树的“内容”的校验和,也就是说,它的树性,加上树中所有名称的列表以及它们的模式和类型以及 SHA-1 . 所以,是的:它标识了目录的状态。它可能会过于强烈地识别它,因为如果树中包含的任何 blob 甚至更改模式(+x-x),它都会改变。

如果你想确保命名一棵树(不是 blob),你可以在结果上使用(但这里可能不需要)。HEAD:pathgit cat-file -trev-parse

于 2013-10-03T00:27:12.563 回答