情况:我从github项目获得了一个tar.gz版本,但是想要确定这是从哪个提交中提取的。它看起来并没有被标记,或者它自己从提交信息中显而易见。在git中查找第一次提交文件
所以我可以计算sha1的文件,但是想弄清楚它们属于哪个提交?
调用git向导!
情况:我从github项目获得了一个tar.gz版本,但是想要确定这是从哪个提交中提取的。它看起来并没有被标记,或者它自己从提交信息中显而易见。在git中查找第一次提交文件
所以我可以计算sha1的文件,但是想弄清楚它们属于哪个提交?
调用git向导!
由于git存储的散列不仅包含文件内容(理论上,散列冲突总是发生),所以为了确保您获得了所需的正确版本的文件比较内容。
for rev in $(git log --format=%H -- /path/to/file); do
git diff --quiet $x:/path/to/file my-current-file;
if [[ $? -eq 0 ]]; then
echo $x;
fi
done
英文:以相反的顺序遍历修改文件的修订版本。对于每个这样的修订版本,将文件的版本与树外文件进行比较。如果这两个文件相同,则打印修订散列。
如果你想为整个压缩包做到这一点,你可以做同样的,但diff的整个树,而不是一个单一的文件(省略了文件路径作为参数传递给git log
) - 随便用宽容的差异比较选项你喜欢。
您需要匹配tar中的所有文件以找出tar的来源。 – 2012-02-10 19:50:17
@AdamDymitruk我在这个答案的最后添加了一条注释。 – Borealid 2012-02-10 19:50:48
在这种情况下,可能需要很长时间才能找到。但是你摆脱了文件属性的不明确性。 – 2012-02-10 19:51:04
由于文件属性,此方法可能会非常棘手。假设他们没有改变,或者你看看回购商店的存货,确保它们是一样的。将其提交到存储库,然后查看树的散列。
git show -s --pretty=format:%T HEAD
现在走在回购的所有提交,看看他们是否有任何一个相同的哈希树。
git log --all --format=%H
会给你所有的提交散列。现在管这个展现树哈希
git log --all --format=%H \
| xargs -n 1 git show -s --pretty='format:%H %T' \
| gerp <hash of your tree>
如果焦油恰好含有相同的结构,包括权限,则输出将显示具有相同的树中提交的SHA1s。
搜索顶级树SHA1将是FAST。
为什么downvotes?这是一个有趣的问题。他有源自Git存储库的文件,但目前不受版本控制,他想知道它们对应的版本。这是一个公平的问题。 – eykanal 2012-02-10 18:03:08
Upvoted。这是一个很好的问题,揭示了Git存储历史的真棒方式。 – 2012-02-10 19:34:26
感谢您的两个很好的答案。在提出这个问题时,我假设tar.gz是一个确切的导出回购 - 但尝试这两种方法,它似乎只有一个提交非常接近,不同之处在于似乎已手动的README文件编辑发布。所以给予差异基础的答案,但这并不是说其他也不是一个很好的答案。再次感谢。 – bee 2012-02-10 21:51:09