?
This document uses PHP Chinese website manual Release
git-update-index - 將工作樹中的文件內(nèi)容注冊到索引
git update-index [--add] [--remove | --force-remove] [--replace] [--refresh] [-q] [--unmerged] [--ignore-missing] [(--cacheinfo <mode>,<object>,<file>)…] [--chmod=(+|-)x] [--[no-]assume-unchanged] [--[no-]skip-worktree] [--ignore-submodules] [--[no-]split-index] [--[no-|test-|force-]untracked-cache] [--really-refresh] [--unresolve] [--again | -g] [--info-only] [--index-info] [-z] [--stdin] [--index-version <n>] [--verbose] [--] [<file>…]
修改索引或目錄緩存。提到的每個文件都更新到索引中,并清除任何unmerged
或needs updating
狀態(tài)。
另請參閱 git-add [1] ,以更友好的方式對索引執(zhí)行一些最常見的操作。
git update-index
處理文件的方式可以使用各種選項進行修改:
--add
如果指定的文件不在索引中,則會添加它。默認行為是忽略新文件。
--remove
如果指定的文件在索引中但缺失,則將其刪除。默認行為是忽略已刪除的文件。
--refresh
查看當前索引,并通過檢查 stat()信息來檢查是否需要合并或更新。
-q
quiet。如果--refresh發(fā)現(xiàn)索引需要更新,則默認行為是錯誤的。git update-index
無論如何,這個選項會繼續(xù)。
--ignore-submodules
不要嘗試更新子模塊。此選項僅在通過 --refresh 之前通過。
--unmerged
如果 --refresh 在索引中發(fā)現(xiàn)未合并的更改,則默認行為是錯誤的。git update-index
無論如何,這個選項會繼續(xù)。
--ignore-missing
在 --refresh 時忽略丟失的文件
--cacheinfo <mode>,<object>,<path> --cacheinfo <mode> <object> <path>
直接將指定的信息插入索引。為了向后兼容,您還可以將這三個參數(shù)作為三個單獨的參數(shù),但鼓勵新用戶使用單參數(shù)表單。
--index-info
從標準輸入讀取索引信息。
--chmod=(+|-)x
設(shè)置更新文件的執(zhí)行權(quán)限。
--no-assume-unchanged
當指定此標志時,為路徑記錄的對象名稱不會更新。相反,該選項設(shè)置/取消路徑的“假定不變”位。當“假設(shè)不變”位打開時,用戶承諾不更改文件,并允許 Git 假定工作樹文件與索引中記錄的內(nèi)容匹配。如果你想改變工作樹文件,你需要取消設(shè)置該位以告訴 Git 。當在一個非常緩慢的 lstat(2)系統(tǒng)調(diào)用的文件系統(tǒng)(例如 cifs )上處理大項目時,這有時會很有幫助。
如果需要在索引中修改此文件,例如合并提交時,Git 將失?。ㄕ#┮虼?,如果假設(shè)未跟蹤的文件在上游發(fā)生更改,則需要手動處理該情況。
--really-refresh
喜歡--refresh
,但無條件地檢查統(tǒng)計信息,而不考慮“假定不變”設(shè)置。
--no-skip-worktree
當指定其中一個標志時,為路徑記錄的對象名稱不會更新。相反,這些選項設(shè)置和取消設(shè)置路徑的 “skip-worktree” 位。有關(guān)更多信息,請參見下面的 “Skip-worktree bit” 部分。
-g --again
git update-index
在索引條目與HEAD
提交不同的路徑上運行。
--unresolve
如果文件被意外清除,則在合并期間恢復文件unmerged
或needs updating
狀態(tài)。
--info-only
不要在對象數(shù)據(jù)庫中為所有跟隨此標志的 <file> 參數(shù)創(chuàng)建對象; 只需將他們的對象 ID 插入索引。
--force-remove
即使工作目錄仍然有這樣的文件,也可以從索引中刪除文件。(暗示 --remove。)
--replace
默認情況下,當path
索引中存在文件時,git update-index
拒絕嘗試添加path/file
。同樣,如果文件path/file
存在,path
則不能添加文件。使用 --replace 標志,與添加的條目發(fā)生沖突的現(xiàn)有條目將自動刪除警告消息。
--stdin
不要從命令行獲取路徑列表,請從標準輸入讀取路徑列表。路徑由 LF 分隔(即每行一個路徑)。
--verbose
報告索引中正在添加和刪除的內(nèi)容。
--index-version <n>
將結(jié)果索引寫入指定的磁盤格式版本中。支持的版本是2,3和4.當前的默認版本是2或3,取決于是否使用了額外的功能,例如git add -N
。
版本4執(zhí)行簡單的路徑名壓縮,可減少大型存儲庫中的索引大小30%-50%,從而縮短加載時間。版本4相對年輕(2012年10月首次發(fā)布于1.8.0)。其他 Git 實現(xiàn),如 JGit 和 libgit2 可能還不支持它。
-z
只對--stdin
或有意義--index-info
; 路徑用 NUL 字符而不是 LF 分隔。
--split-index --no-split-index
啟用或禁用拆分索引模式。如果分割索引模式已經(jīng)啟用并--split-index
再次提供,則 $ GIT_DIR / index 中的所有更改將被推回到共享索引文件。
這些選項會隨core.splitIndex
配置變量的值生效(請參閱 git-config [1] )。但是當更改與配置的值相反時會發(fā)出警告,因為配置的值將在下次讀取索引時生效,并且這將消除該選項的預期效果。
--untracked-cache --no-untracked-cache
啟用或禁用未跟蹤的緩存功能。--test-untracked-cache
啟用之前請使用。
這些選項會隨core.untrackedCache
配置變量的值生效(請參閱 git-config [1] )。但是當更改與配置的值相反時會發(fā)出警告,因為配置的值將在下次讀取索引時生效,并且這將消除該選項的預期效果。
--test-untracked-cache
只對工作目錄執(zhí)行測試以確??梢允褂梦锤櫟木彺妗H绻阏娴南胧褂盟?,你必須使用--untracked-cache
或者之后--force-untracked-cache
的core.untrackedCache
配置變量手動啟用未跟蹤的緩存。如果測試失敗,退出代碼為1,并顯示一條消息說明哪些功能無法正常工作,否則退出代碼為0并打印 OK 。
--force-untracked-cache
和...一樣--untracked-cache
。提供與在舊版本的 Git 的向后兼容性--untracked-cache
用來暗示--test-untracked-cache
,但此選項將無條件地啟用該擴展。
--
不要將更多的參數(shù)解釋為選項。
<file>
要采取行動的文件。請注意,開頭的文件將.
被丟棄。這包括./file
和dir/./file
。如果你不想要這個,那么使用更清晰的名字。這同樣適用于目錄結(jié)尾/
和路徑//
--refresh
不會計算新的 sha1 文件或?qū)⑺饕聻槟J?內(nèi)容更改。但它確實做的是“重賽”與索引文件的統(tǒng)計信息,這樣就可以刷新指數(shù)尚未修改的文件,但在統(tǒng)計項是過時的。
例如,你想在做完之后這樣做git read-tree
,將 stat 索引詳細信息與正確的文件關(guān)聯(lián)起來。
--cacheinfo
用于注冊不在當前工作目錄中的文件。這對于最小檢出合并很有用。
假設(shè)你有一個路徑為 mode 和 sha1 的文件,說:
$ git update-index --cacheinfo <mode>,<sha1>,<path>
--info-only
用于注冊文件而不將其放置在對象數(shù)據(jù)庫中。這對于僅狀態(tài)存儲庫很有用。
這兩個--cacheinfo
和--info-only
的行為類似:該指數(shù)已經(jīng)更新,但對象數(shù)據(jù)庫是沒有的。--cacheinfo
對象位于數(shù)據(jù)庫中但文件不在本地可用時非常有用。--info-only
文件可用時非常有用,但不希望更新對象數(shù)據(jù)庫。
--index-info
是一種更強大的機制,可讓您從標準輸入中提供多個條目定義,并專門為腳本設(shè)計。它可以采用三種格式的輸入:
模式SP sha1 TAB 路徑第一種格式是“git-apply --index-info”報告的內(nèi)容,并且用于在3路合并時重建用于偽合并基礎(chǔ)樹的部分樹。
模式 SP 類型 SP sha1 TAB 路徑第二種格式是將git ls-tree
輸出填充到索引文件中。
模式 SP sha1 SP 階段 TAB 路徑此格式用于將更高階段放入索引文件并匹配git ls-files --stage
輸出。
要將更高級的條目放置到索引中,首先應(yīng)通過為路徑輸入 mode = 0 條目來刪除路徑,然后以第三種格式提供必要的輸入行。
例如,從這個索引開始:
$ git ls-files -s100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0 frotz
您可以將以下輸入提供給--index-info
:
$ git update-index --index-info0 0000000000000000000000000000000000000000 frotz100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz
輸入的第一行提供0作為刪除路徑的模式; 只要格式良好,SHA-1 無關(guān)緊要。然后第二行和第三行輸入該路徑的階段1和階段2條目。在上述之后,我們最終得出這個結(jié)論:
$ git ls-files -s100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1 frotz100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2 frotz
Git 中的許多操作都依賴于您的文件系統(tǒng)來lstat(2)
實現(xiàn)高效的實現(xiàn),因此st_mtime
可以便宜地檢查工作樹文件的信息,以查看文件內(nèi)容是否已從記錄在索引文件中的版本發(fā)生更改。不幸的是,一些文件系統(tǒng)效率不高lstat(2)
。如果你的文件系統(tǒng)是其中的一個,你可以將“假設(shè)不變”位設(shè)置為你沒有改變的路徑,以便 Git 不要這樣檢查。請注意,在路徑上設(shè)置此位并不意味著Git 會檢查文件的內(nèi)容以查看它是否已更改 - 它使 Git 忽略任何檢查并假定它未更改。當你修改工作樹文件時,你必須在修改它們之前或之后,通過刪除“假定不變”位來明確告訴 Git 。
為了設(shè)置“不變”位,使用--assume-unchanged
選項。要取消設(shè)置,請使用--no-assume-unchanged
。要查看哪些文件具有“假定不變”位,請使用git ls-files -v
(請參閱 git-ls-files [1] )。
該命令查看core.ignorestat
配置變量。如果這是真的,路徑與更新git update-index paths...
,并與其他 Git 的更新路徑命令,同時更新索引和工作樹(例如git apply --index
,git checkout-index -u
和git read-tree -u
)被自動標記為“假設(shè)不變”。請注意,如果找到工作樹文件與索引匹配(假如您想將它們標記為“假定不變”),則“假設(shè)不變”位未設(shè)置。git update-index --refreshgit update-index --really-refresh
To update and refresh only the files already checked out:
$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
在與低效的文件系統(tǒng)core.ignorestat
設(shè)置
$ git update-index --really-refresh (1)$ git update-index --no-assume-unchanged foo.c (2)$ git diff --name-only (3)$ edit foo.c $ git diff --name-only (4)M foo.c $ git update-index foo.c (5)$ git diff --name-only (6)$ edit foo.c $ git diff --name-only (7)$ git update-index --no-assume-unchanged foo.c (8)$ git diff --name-only (9)M foo.c
強制 lstat(2)為匹配索引的路徑設(shè)置“不變”位。
標記要編輯的路徑。
這會執(zhí)行 lstat(2)并查找與路徑匹配的索引。
這會執(zhí)行 lstat(2)并發(fā)現(xiàn)索引與路徑不匹配。
注冊新版本以索引集“假定不變”位。
并假定它不變。
即使在你編輯它之后。
你可以在事后了解這個變化。
現(xiàn)在它檢查 lstat(2)并發(fā)現(xiàn)它已被更改。
Skip-worktree 位可以在一個(長)句子中定義:當讀取一個條目時,如果它被標記為 skip-worktree ,那么 Git 會假裝它的工作目錄版本是最新的并且讀取索引版本。
詳細說來,“reading” 是指檢查文件是否存在,讀取文件屬性或文件內(nèi)容。工作目錄版本可能存在或不存在。如果存在,其內(nèi)容可能與索引版本匹配。寫作不受此位影響,內(nèi)容安全仍然是第一要務(wù)。請注意,Git can
更新工作目錄文件,即標記為 skip-worktree ,如果這樣做是安全的(即工作目錄版本與索引版本匹配)
雖然這個位看起來與假定不變的位相似,但它的目標不同于假設(shè) - 未改變的位。當兩者都設(shè)置時,跳過工作樹也優(yōu)先于假定 - 不變的位。
此模式專為具有非常大的索引的存儲庫而設(shè)計,旨在減少重復寫入這些索引所需的時間。
在這種模式下,索引被分成兩個文件,$ GIT_DIR / index 和 $ GIT_DIR / sharedindex。<SHA-1> 。在 $ GIT_DIR / index(分割索引)中累計更改,而共享索引文件包含所有索引條目并保持不變。
當分割索引中的條目數(shù)達到由 splitIndex.maxPercentChange 配置變量(請參閱 git-config [1] )指定的水平時,分割索引中的所有更改將被推回到共享索引文件。
每次創(chuàng)建新的共享索引文件時,如果舊共享索引文件的修改時間比 splitIndex.sharedIndexExpire 配置變量(請參閱 git-config [1] )指定的修改時間早,則會刪除舊共享索引文件。
為避免刪除仍在使用的共享索引文件,每次創(chuàng)建或讀取基于共享索引文件的新拆分索引時,都會將其修改時間更新為當前時間。
該緩存旨在加速涉及確定未跟蹤文件的命令,如git status
。
該功能通過記錄正在工作的樹目錄的 mtime,然后省略讀取目錄和統(tǒng)計調(diào)用來針對 mtime 未更改的目錄中的文件。為此st_mtime
,如果目錄中的文件被添加,修改或刪除,底層操作系統(tǒng)和文件系統(tǒng)必須更改目錄字段。
您可以測試文件系統(tǒng)是否支持該--test-untracked-cache
選項。--untracked-cache
用于在 Git 的舊版本中隱式執(zhí)行該測試的選項,但不再是這種情況。
如果要啟用(或禁用)此功能,使用core.untrackedCache
配置變量(請參閱 git-config [1] )比在每個存儲庫中使用--untracked-cache
選項更容易git update-index
,尤其是如果您希望跨所有存儲庫使用此配置變量,因為您可以將配置變量設(shè)置為true
(或false
)$HOME/.gitconfig
一次,并使其影響您所觸摸的所有存儲庫。
當core.untrackedCache
配置變量發(fā)生變化時,在下一次命令讀取索引時,未追蹤的緩存將添加到索引中或從索引中刪除; 而在--[no-|force-]untracked-cache
使用時,未跟蹤的緩存立即添加到索引或從索引中刪除。
該命令授予core.filemode
配置變量。如果您的存儲庫位于可執(zhí)行位不可靠的文件系統(tǒng)上,則應(yīng)將其設(shè)置為false
(請參閱 git-config [1])。這會導致該命令忽略文件系統(tǒng)中索引和文件模式中記錄的文件模式差異,如果它們僅在可執(zhí)行位上不同。在這樣一個不幸的文件系統(tǒng)上,你可能需要使用git update-index --chmod=
。
非常相似,如果core.symlinks
配置變量設(shè)置為false
(參見 git-config [1]),符號鏈接將作為純文件檢出,并且此命令不會修改從符號鏈接到常規(guī)文件的記錄文件模式。
該命令查看core.ignorestat
配置變量。參見Using "assume unchanged" bit
上面的部分。
該命令還查看core.trustctime
配置變量。當 inode 更改時間通過 Git 外部的某些東西(文件系統(tǒng)搜尋器和備份系統(tǒng)使用 ctime 標記處理的文件)定期修改時(參見 git-config [1] ),它會很有用。
未跟蹤的緩存擴展可以通過core.untrackedCache
配置變量啟用(請參閱 git-config [1] )。