2012-02-10 84 views
10

情况:我从github项目获得了一个tar.gz版本,但是想要确定这是从哪个提交中提取的。它看起来并没有被标记,或者它自己从提交信息中显而易见。在git中查找第一次提交文件

所以我可以计算sha1的文件,但是想弄清楚它们属于哪个提交?

调用git向导!

+2

为什么downvotes?这是一个有趣的问题。他有源自Git存储库的文件,但目前不受版本控制,他想知道它们对应的版本。这是一个公平的问题。 – eykanal 2012-02-10 18:03:08

+0

Upvoted。这是一个很好的问题,揭示了Git存储历史的真棒方式。 – 2012-02-10 19:34:26

+0

感谢您的两个很好的答案。在提出这个问题时,我假设tar.gz是一个确切的导出回购 - 但尝试这两种方法,它似乎只有一个提交非常接近,不同之处在于似乎已手动的README文件编辑发布。所以给予差异基础的答案,但这并不是说其他​​也不是一个很好的答案。再次感谢。 – bee 2012-02-10 21:51:09

回答

2

由于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) - 随便用宽容的差异比较选项你喜欢。

+0

您需要匹配tar中的所有文件以找出tar的来源。 – 2012-02-10 19:50:17

+0

@AdamDymitruk我在这个答案的最后添加了一条注释。 – Borealid 2012-02-10 19:50:48

+0

在这种情况下,可能需要很长时间才能找到。但是你摆脱了文件属性的不明确性。 – 2012-02-10 19:51:04

2

由于文件属性,此方法可能会非常棘手。假设他们没有改变,或者你看看回购商店的存货,确保它们是一样的。将其提交到存储库,然后查看树的散列。

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。