2017-04-05 212 views
0

git checkout-index命令將文件從索引複製到工作樹。`git checkout-index -u`或`--index`做什麼?

文檔包括關於其-u--index命令行參數的隱蔽備註:

-u
--index
爲索引中檢驗出的條目更新統計信息文件。

什麼是「統計信息?」更新它並不更新它有什麼區別?

我發現在簡單的實驗中,git checkout-index只是將文件寫入工作樹,正如您所期望的那樣;我看不到使用-u/--index而不使用它的任何區別。

+0

您是否看到'.git/index'的mtime變化? –

回答

2

git-checkout-index複製數據索引工作樹。 git-update-index複製元數據工作樹該索引。

這些是需要明確告訴做什麼的低級命令。
這個選項完全存在的是用戶界面設計的一個奇蹟一個有用的選項,以確保git的索引反映操作執行後的工作樹的一致視圖。

具體來說,此更新(至少)不會貢獻給git存儲庫的元數據,而是用於確定文件是否未更改。見How to get a human-readable dump of .git/index?What does the git index contain EXACTLY?

新增於415e96c。通過一個例子,我將跟着t/t2002-checkout-cache-u.sh,它首先運行命令沒有,然後與-u(再次,這是「相當於git update-index - 在檢出條目上刷新」) 。

1)製備:

echo frotz >path0 && 
git update-index --add path0 && 
t=$(git write-tree) 

2)無-u,GIT中結帳索引污跡STAT信息。

rm -f path0 && 
git read-tree $t && 
git checkout-index -f -a && 
git diff-files --exit-code 

輸出的DIFF-文件:

:100644 100644 8e4020bb5a8d8c873b25de15933e75cc0fc275df 0000000000000000000000000000000000000000 M path0 
--> 1 

看看有什麼索引:

$ git ls-files --debug 
path0 
    ctime: 0:0 
    mtime: 0:0 
    dev: 0 ino: 0 
    uid: 0 gid: 0 
    size: 0 flags: 0 

3)-u,git的結帳指數回升的新文件統計信息。

rm -f path0 && 
git read-tree $t && 
git checkout-index -u -f -a && 
git diff-files --exit-code 

(返回0)

現在的stat(2)有:

$ git ls-files --debug 
path0 
    ctime: 1491479474:0 
    mtime: 1491479474:0 
    dev: 16777220 ino: 50556411 
    uid: 501 gid: 20 
    size: 6 flags: 0 

除了被記錄的統計信息,有一個在輸出另一個有趣的一點。爲什麼git-diff-files表示工作樹和索引之間存在差異?

手冊說,在輸出域是

SHA1爲 「DST」; 0 {40}如果創建,不合並或「看工作樹」。

<如果一個文件是文件系統上的新文件,並且它與索引不同步,則sha1>顯示爲全0。

所以這個測試用例說明了git使用元數據信息的一種方式:比較工作樹和索引中的文件。如果統計信息看起來過時(或全零),那麼文件可能已經改變。由於git-read-tree只寫入索引,而不是寫入工作樹,因此必須使stat信息無效。如果統計信息有效,git-diff-files可以自信地給出該條目的blob ID。