在git中找到第一个文件提交

时间:2012-02-10 17:49:55

标签: git

情况:我有一个来自github项目的tar.gz版本,但想知道从哪个提交中获取。它似乎没有被标记,或者在提交消息本身中显而易见。

所以我可以计算文件的sha1,但想知道这些属于哪个提交?

调用git向导!

2 个答案:

答案 0 :(得分:2)

由于文件属性,此方法可能很棘手。假设它们没有变化或者你看看repo存储的内容,确保它们是相同的。将此提交到存储库,然后查看树的哈希值。

git show -s --pretty=format:%T HEAD

现在遍历repo中的所有提交,看看它们中是否有一个具有相同哈希值的树。

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>

如果tar包含完全相同的结构(包括权限),则输出将显示具有相同树的提交的SHA1。

搜索顶级​​树SHA1将是快速的。

答案 1 :(得分:2)

由于git-stored哈希不仅仅包含文件内容(理论上,无论如何都会发生哈​​希冲突),为了确保您拥有正确的文件版本,您需要比较内容。

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

英文:以相反的顺序迭代更改文件的修订版。对于每个此类修订,使用outside-the-tree文件将文件的版本区分开来。如果两个文件相同,则打印修订版哈希。

如果要为整个tarball 执行此操作,您可以执行相同的操作但是将整个树而不是单个文件进行区分(并将文件路径省略为{{1}的参数}) - 使用你喜欢的任何容忍差异选项。