可以使用git树哈希来唯一地标识子目录中的特定状态

时间:2013-10-02 23:16:10

标签: git hash

我想使用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 个答案:

答案 0 :(得分: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的。所以,是的:它标识了目录的状态。它可能会强烈地识别它 ,因为如果树中包含的任何blob甚至改变模式(+x-x),它都会改变。

如果您想确保HEAD:path命名树(不是blob),可以在git cat-file -t的结果上使用rev-parse(但这可能不需要)。