2017-06-21 136 views
2

從我所瞭解的當你git add一個文件,它只是在將文件添加到存儲庫之前對其進行分級,但爲什麼我可以在提交之前將它添加到git存儲庫中?爲什麼Git在將文件添加到臨時區域時將文件存儲在存儲庫中?

舉例來說,如果我創建一個新的Git倉庫,並創建一個名爲foo新的文件和內容的「hello world」加進去,然後git add foo,我看到.git文件夾內的objects子目錄一個新的項目。我甚至可以使用git cat-file -p命令查看objects文件中新文件的內容。

究竟是什麼已被添加到.git/objects文件夾? 在技術上做什麼文件升級?像在文件上運行git add之後發生的步驟一樣?如果我知道步驟,也許我會更好地理解它。

+0

我的猜測是,你只是看到狀態代表你當前分支的階段。這並不意味着實際提交已經完成。 –

+0

我編輯了答案,添加了說明添加到.git/objects的內容的步驟。 – VonC

回答

3

分期對象的路徑區域是存儲庫的一部分。

我認爲你是困惑倉庫的對象數據庫與歷史。只有提交是歷史的一部分,但所有對象Git句柄都是對象數據庫的一部分。

想一想:Git不會駐留在內存中,那麼它會在哪裏記錄臨時區域的一部分而不是其對象數據庫?

2

我甚至可以用git cat-file -p命令查看對象文件中新文件的內容。

git diff --cached

究竟是什麼已被添加到.git/objects文件夾?

請參閱 「Git Internals - Git Objects

你可以看到在對象目錄中的文件。這就是Git最初存儲內容的方式 - 作爲每個內容的單個文件,用內容及其標題的SHA-1校驗和命名。子目錄以SHA-1的前2個字符命名,文件名爲剩餘的38個字符。

爲什麼我可以在提交之前將它添加到git存儲庫中?

不要忘記,git add -p--patch),你可以之前提交補充文件的一部分(hunks)。

索引的目標仍然是(在git add的上下文中)準備下一次提交。
它反映了原來需要Git, as created by Linus Torvalds in 2005,這是整合補丁(這只是在第一次合併經理)

是什麼混帳補充的是,在一個文件

運行後會發生的步驟

雖然索引不包括任何文件內容時,.objects確實,鬆散(非填充)對象:

的步驟見Object Storage

  • Git構造一個頭,該頭以對象的類型開頭,在這種情況下爲blob。然後,它會添加一個空格,然後是內容大小,最後是空字節。Git會連接標頭和原始內容,然後計算新內容的SHA-1校驗和。
  • Git使用zlib壓縮新內容,
  • 最後,Git將zlib壓縮的內容寫入磁盤上的對象。 Git的確定你想要寫出來(的SHA-1的值作爲子目錄名的前兩個字符,最後38個字符作爲該目錄中的文件名)
相關問題