情況:我從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