2016-09-13 77 views
0

我一直在尋找git update-index的手冊頁。我只是不明白-g通過時會發生什麼。該選項選擇索引中與HEAD不同的文件。但是對這些文件做了什麼?「git update-index -g」究竟是什麼,沒有其他選擇呢?

網上很多討論關於--assume-unchanged,但我想了解基本功能。

P.S .:我想我明白索引是做什麼的,git addgit reset是如何工作的。

回答

2

從我閱讀手冊頁時,它什麼都不做。因爲:

Modifies the index or directory cache. Each file mentioned is updated 
    into the index and any unmerged or needs updating state is cleared. 

「每個文件」是空集,如果沒有文件參數,我找不到任何地方,特殊的語義被分配到空的情況。

然而,git update-index並檢查它是否處於GIT中回購:

~$ git update-index 
fatal: Not a git repository (or any of the parent directories): .git 
~$ echo $? 
128 

因此,git update-index不帶參數至少執行健全性檢查,並提供一條錯誤消息和終止狀態。如果它確實沒有其他的東西,它可以在腳本中用來檢查它們是否在git倉庫中。請注意,其他命令如git rev-parse也可以不帶參數。

如果通過「無參數」表示「沒有選項,但帶有文件參數存在」,那麼它所做的就是對那些已經在git中的指定文件執行動作。遇到未跟蹤文件的文件參數時,它會給出錯誤診斷,因爲未指定--add。它以失敗的終止狀態退出並且索引未修改。

所以基本上沒有選擇它提供了一個完整性檢查:或者它能夠對所有指定的文件進行操作,否則它不會執行任何操作。這樣可以防止意圖只用於跟蹤文件時的情況。

-g/--again的目的是提供重複上已經上演這些文件git update-index,經過修改的一種方式。它對這些文件的作用是再次更新它們,以便索引與工作副本匹配。

您可能會遇到HEAD提交,暫存索引和工作副本中給定文件不同的情況。這種情況發生在對文件進行破解時,然後使用git add(或git update-index)對其進行分級,此時索引與工作副本相同;然後你再次攻擊它。現在它與索引不同,與HEAD不同。通過再次將其更新爲索引,可以將索引與工作副本同步,因此唯一不同的是HEAD

請注意,當您執行git diff時,會將工作文件與索引進行比較。要查看索引到頭部的差異,請執行git diff --cached,並且使用git diff HEAD。這樣你就可以在一個文件上進行攻擊,然後再對其進行打包,然後再次對其進行攻擊,git diff會向您顯示上演和正在進行的最新黑客攻擊。原始黑客是git diff --cached,整體合併黑客是git diff HEAD。有了這個,你可以探索git update-index有什麼影響。

似乎-g與文件參數都非常有用:git update-index -g file-j file-k意味着「在所有已上演修改這樣做,也是在新砍死file-jfile-k東西做update-index」。

+0

謝謝。 「通過再次將其更新爲索引,將索引與工作副本同步」正是我無法理解的。 – Arkadiy