
如何確保當我從另一個 git 附件儲存庫克隆、同步和獲取內容時,我已經設定了相同的鏡像?
我過去使用過像 unison 這樣的工具來進行文件與文件的比較,但這是時間和內存密集型的。
還有其他選擇可以讓我進行健全性檢查嗎?這樣做的主要動機是我剛剛克隆了一個現有的儲存庫,它更小。我希望它更小,因為舊存儲庫有未使用或未引用的對象,但它的大小有很大不同。
所以,我想檢查一下我是否可以運行。
答案1
Git 有一個內建的健全性檢查 ( git fsck
),可以指出 git 元資料結構的一般問題。還有一個垃圾收集器 ( git gc
) 可以刪除懸空和其他多餘的東西。
至於資料完整性…基本上這是git提供的保證,你放進去的資料就是你拿出來的資料。如果git log
(甚至只是最後一次提交的雜湊值)相同,那麼資料也相同。 git 中的每個步驟都會根據資料、元資料和先前的資料進行校驗和;它有點像區塊鏈,如果資料在任何地方發生變化,那麼校驗和也會發生變化。如果校驗和不匹配,git 會在結帳時抱怨很多。
Linus Torvalds 有一篇關於 git 的老演講(2007-2008 年?),你可以在 Youtube 上觀看,IIRC 他還談到了事物的數據完整性方面。這裡還有一些文檔:https://git-scm.com/book/en/Git-Internals-Git-Objects
實際上,人們並不擔心這個問題,因為 git 神奇地解決了這個問題。您只需執行“git status”即可查看是否需要拉取/推送/提交更改以跟上來源。
額外的空間使用也可能有其他原因......git stash
如果您曾經使用過它,可能會佔用空間。
這也是克隆儲存庫中存在差異的地方:git 不關心從未提交的本地內容。如果它沒有被提交,那麼對於克隆來說它就不存在。
答案2
我透過執行以下操作驗證了 gitannex 是否如預期般運作:
- 取得一個排序的、唯一的文件列表,包括 .git 內容(這確保我們擁有所有 git 附件內容)
- 取得一個排序的、唯一的連結列表,包括 .git 內容(這確保我們擁有相同的儲存庫結構)
- 比較檔案列表,忽略附件/傳輸目錄,git物件可能不同,git附件內容應該相同
- 比較連結列表,應該是相同的
- 運行 gitannex fsck 或比較所有檔案的校驗和(這是檔案系統問題)
這可行,但可能有點費力/時間密集。此外,由於鏡像只是部分副本,該過程可能會進一步複雜化。對於這些鏡子,您只需比較您期望擁有的內容。