我經常需要使用 git 更新和推送一些影像,但問題是如果更改很小(例如,影像內容中的字母從“C”更改為“K”),git 不會檢測到某些更改(圖片的大小保持不變,但內容不同)。因此,我無法添加隨 git add 更改的影像......當我推送時,它說“一切都是最新的”。有沒有辦法強制推送未檢測到的檔案?
uj5u.com熱心網友回復:
該git push命令不推送檔案。那是因為 Git 不存盤檔案——無論如何都不是在這個級別。Git 是關于提交的,并且 Git 存盤的是提交,而不是檔案。提交然后存盤檔案,所以你可能會問有什么區別......區別很大。事實上,它解釋了人們在使用 Git 時遇到的大約一半問題。
您需要了解有關提交的資訊:
提交已編號。每個提交都會獲得一個唯一的哈希 ID,這是一個以十六進制表示的大而難看的亂數字。當我說unique 時,我的意思是:當您進行新提交時,您的新提交獲得的編號不允許用于任何Git 存盤庫中的任何其他提交。1
提交由兩部分組成:
每個提交存盤每個檔案的完整副本。這些完整的副本經過壓縮和重復資料洗掉,這可以防止存盤庫變得臃腫并使 Git 無法使用。不幸的是,正如Daniel Mann 在評論中指出的那樣,大型二進制檔案會干擾這一點,并且存盤庫可能變得無法管理,因此如果可能,請盡量避免在 Git 中存盤影像。
每個提交都存盤一些元資料,例如提交者的姓名和電子郵件地址。此處不詳述,但此元資料對 Git 自身的內部操作至關重要。
提交——以及所有其他內部 Git 物件——是完全不可變的。一旦你進行了提交,它就會永遠停留在這種狀態。 該哈希 ID 表示commit。如果您在提交中犯了錯誤,您可以使用 更正它
git commit --amend,但這--amend是一個謊言:您所做的是進行新的替換提交,將舊的提交推到一邊。兩次提交都會在存盤庫中保留一段時間。如果沒有用舊的提交(沒有任何作用),它最終“掉出”存盤庫。它通常也不會發送到任何其他 Git。并且通過重復資料洗掉,每個提交往往很小:在磁盤“塊”下,除了任何全新的檔案(包括影像二進制檔案)。因此,擁有一些額外的垃圾并不是什么大問題。
還有更多需要了解,但以上內容暫時適用。因為提交是檔案的不可變快照加上一些元資料,所以您實際上并不在提交上作業。相反,你讓Git中提取的檔案從提交,進入作業區。Git 將此稱為您的作業樹。在這里,您確實擁有檔案——真正的、普通的檔案,而不是奇怪的 Git 化的“blob 物件”,這些檔案并不是 Git 用來在提交中存盤檔案的真正檔案——您可以使用和處理它們。
當你修改或替換這些作業樹檔案之一時,你git add用來告訴 Git 你已經這樣做了。這不使用檔案的大小作為檔案已更改的指示符。2 它使用了大量關于檔案的元資料,因為它在 Git 從提交中提取檔案時就已經存在。如果任何元資料發生更改,Git 將看到該檔案已更改,并且愿意更新其(Git 的)index 中的檔案。
如果 Git沒有更新其索引中的檔案,則您遇到了以下幾種可能情況之一:
該檔案現在不在索引中,也不應該在索引中。運行
git check-ignore -v path/to/file.ext會告訴你為什么 Git 認為是這種情況。運行git ls-files --stage path/to/file.ext會告訴你該檔案的副本是在索引; 如果它什么也沒說,則該檔案不在索引中。該檔案在索引中,但用
--skip-worktree或標記--assume-unchanged。除非您使用 Git 的“稀疏結帳”模式,否則您必須自己執行此操作,因此您可能知道是否設定了這些。從技術上講,手動設定任一標志通常是濫用這些標志的用途,但人們確實會濫用它們以獲得各種效果,因此這里值得一提。由于某種原因,您正在使用的某些軟體正在處理檔案元資料。這可能是個壞主意,但是這樣做的軟體可以騙過 Git。
您在 Git 中發現了一個錯誤。這是不太可能的,但需要提到一種可能性,特別是對于 Git 2.34.0 錯誤和
.gitignore. ??
您可以通過多種方式解決這些問題:
.gitignore如有必要/適當調整檔案內容;- 清除標志(
git update-index再次使用),如果您使用git update-index; - “強制添加”檔案
git add -f; - 洗掉索引內容 (
git rm --cached) 并重新添加或強制添加; - 添加
--renormalize標志以繞過 Git 的聰明才智。
這些選項的某些組合通常會起作用。特別是,洗掉 with 會git rm --cached清除您手動設定的任何標志并破壞使 Git 快速運行的花哨元資料快取內容,然后git add -f繞過 any .gitignore,因此使用這兩個命令通常可以解決問題。使用git add --renormalize繞過 Git 的元資料快取,如果您有一些過于聰明的軟體,在修改檔案后不恰當地將檔案元資料設定回原位,這將起到作用。
索引副本更新后,未來git commit將進行新的提交,3然后您可以將git push其提交到另一個存盤庫。
1這就是為什么這個數字必須如此之大。如果發生碰撞,宇宙就會被摧毀,或者等待錯誤的政黨獲得政治權力,不,這是“這兩個 Git 存盤庫不允許相遇”。好吧,并不是那么激烈。盡管如此,這是一個糟糕的場景,沒有人想要它。
2這并不完全正確:如果改變大小,檔案絕對沒有改變。但這里的大小并不是最重要的。
3預提交鉤子可能會干擾這一點,如果你有的話。預推掛鉤可能會干擾git push臺階。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/368844.html
標籤:混帐
