2012-02-10 35 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。

相關問題