2017-07-18 30 views
1

當您在工作目錄中更改文件時,git確切知道文件發生了更改。它是如何知道的?git如何知道本地回購中有何變化?

Q1)它是否在提交時計算校驗和並在事件驅動的更改中重新計算它,例如在工作目錄中創建的新文件。 Q2)您的本地驅動器除了工作目錄文件之外,是否將文件的其餘部分保留在某個位置,這些位置隨着包含更多項目而增長?我的驅動器似乎更完整C:\Users\<USER NAME>\Downloads\.git\objects與我試圖跟蹤的新文件夾的添加,現在我想撤消我試圖跟蹤的文件夾,如何回收該空間。 我試圖做一些GIT的幻想喜歡跟蹤我的本地項目文件和其他文件的變化,所以我看到已更改文件,並更新我的備份只有這些文件。

回答

5

Git根據文件內容計算散列並在提交時存儲快照。散列既用作內容的標識符,又是將快照與更高版本進行比較的簡單方法。

所以如果你有一個文件的提交版本和一個工作拷貝版本,那麼所有Git所要做的就是計算工作文件的散列值,並將其與來自已提交快照的已經計算的散列值進行比較。如果哈希值不一樣,那麼它知道某些東西已經改變。此計算僅在您詢問時纔會發生(例如git statusgit diff)。它並不是經常自行檢查。

Git將所有內容存儲在存儲庫中。這通常位於項目根目錄的.git/目錄中。整個存儲庫的歷史和內容都在裏面,所以取決於你的歷史包含的內容,有時它們確實很大。這實際上是依賴於項目的。 Git善於壓縮內容,但如果你添加大的預壓縮文件,它只能做很多事情來縮小它們。

你在問題中提到的.git/objects/目錄是git存儲庫中的主要內容存儲。所有文件快照和元數據(如目錄結構,提交對象,標籤)都存儲在那裏。所以它是存儲庫文件夾的最大部分是正常的。

製作git倉庫很簡單 - 只需刪除.git文件夾即可。但是,這是一種無法撤消的破壞性行爲。只有在丟失存儲庫歷史記錄的情況下才能刪除它(或者,如果您已經在GitHub或備份副本等其他位置創建了副本,並且依賴於其他副本,則可以)。

相關問題