情況:我有兩個目錄來自同一個 github 倉庫,但在不同時間以 .zip(或者是 .tar.gz)形式下載。
問題。我怎樣才能在這兩個目錄中找到提交哈希值?它是否存盤在任何地方?
背景。我在寫一些代碼的時候,走神了,我已經忘了為什么會有兩個不同的目錄。這些目錄顯然是不同的(使用 diff -r dir1 dir2),而且這些差異不僅僅是我的小黑客。這兩個目錄都有一個setup.cfg檔案,都包含版本=0.3.5這一行,所以這兩個目錄是同一個版本/"發行版",但不是同一個提交散列。我想知道提交哈希值是什么/曾經是什么。
uj5u.com熱心網友回復:
如果它被下載為zip或tar檔案,它就不是一個提交檔案,哈希值很可能已經消失。 我相信GitHub會把原始的哈希ID粘到一個擴展頭中,因為他們使用git archive來做:
在[使用提交哈希ID來建立檔案的情況下]... 此外,如果使用tar格式,提交ID被存盤在全域擴展的pax頭中;它可以用git get-tar-commit-id來提取。在ZIP檔案中,它被存盤為一個檔案注釋。
你將需要原始的tar或zip檔案來測驗。 如果它是未壓縮的:
git get-tar-commit-id < archive
如果它已經被壓縮了,用zcat或gunzip或任何適合你的系統的東西來解壓:
gunzip < foo.tar.gz | git get-tar-commit-id
例如。
如果你沒有原始存檔,或者它沒有ID怎么辦?
一般來說,從提取的原始碼樹到某個特定的提交并沒有唯一的映射。 在某種意義上,這并不重要:如果你能獲得一個源樹的Gittree哈希值,并能找到所有具有該樹哈希值的提交,那么所有這些提交都是產生該歸檔的提交。 但是,git archive可能會在檔案內容中省略、增加或進行替換。
找到一組檔案的實際樹狀哈希值是不容易的,盡管我有一個程式可以做到這一點這里。 通過閱讀源代碼來了解它可以作業的條件。 一旦你掌握了這些,你就可以用git rev-parse搜索那些在提交物件中把它作為tree的提交:
git rev-list $start_points |
while read $chash; do
thash=$(git rev-parse $chash^{tree})
[$thash = $searchfor ] && echo "在提交$chash中發現樹"
done
例如(未經測驗,你需要填入一些變數)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/325284.html
標籤:
