English ▾ 主題 ▾ 最新版本 ▾ git-checkout-index 最後更新於 2.43.0

名稱

git-checkout-index - 從索引 (index) 複製檔案至工作目錄

概要

git checkout-index [-u] [-q] [-a] [-f] [-n] [--prefix=<string>]
		   [--stage=<number>|all]
		   [--temp]
		   [--ignore-skip-worktree-bits]
		   [-z] [--stdin]
		   [--] [<file>…​]

描述

將所有列出的檔案從索引複製到工作目錄(不會覆寫現有檔案)。

選項

-u
--index

更新索引檔中已簽出項目的狀態資訊。

-q
--quiet

若檔案已存在或不在索引中,保持安靜(不輸出訊息)

-f
--force

強制覆寫現有檔案

-a
--all

簽出索引中的所有檔案,但設定了 skip-worktree 位元的檔案除外(參閱 --ignore-skip-worktree-bits)。不可與明確指定的檔案名稱同時使用。

-n
--no-create

不簽出新檔案,僅重新整理已簽出的檔案。

--prefix=<字串>

建立檔案時,於前方加上 <字串>(通常是一個包含結尾 / 的目錄)

--stage=<數字>|all

不要簽出未合併 (unmerged) 的項目,而是從指定的階段 (stage) 複製檔案。<數字> 必須介於 1 到 3 之間。注意:--stage=all 會自動隱含 --temp。

--temp

不要將檔案複製到工作目錄,而是將內容寫入暫存檔。暫存名稱的關聯會寫入 stdout。

--ignore-skip-worktree-bits

簽出所有檔案,包含設定了 skip-worktree 位元的檔案。

--stdin

不要從命令列讀取路徑清單,改為從標準輸入讀取路徑清單。路徑預設由 LF(即每行一個路徑)分隔。

-z

僅在配合 --stdin 時有意義;路徑改由 NUL 字元而非 LF 分隔。

--

不要將後續的任何參數解釋為選項。

標誌的使用順序曾經很重要,但現在已不再重要。

單獨執行 git checkout-index 不會執行任何動作。您大概是指 git checkout-index -a。若您想要強制執行,則應使用 git checkout-index -f -a

此處的目標不是直覺性,而是可重複性。「無參數即無工作」這種行為的原因在於,您在指令稿 (scripts) 中應該能夠執行:

$ find . -name '*.h' -print0 | xargs -0 git checkout-index -f --

這將會強制將所有現有的 *.h 檔案以其快取副本取代。如果空的命令列隱含「全部」,這會強制重新整理索引中的所有內容,這並非原本的目的。但由於 git checkout-index 接受 --stdin,使用以下方式會更快:

$ find . -name '*.h' -print0 | git checkout-index -f -z --stdin

-- 當您知道其餘內容為檔案名稱時是一個好習慣;它能防止檔案名稱為例如 -a 時產生的問題。在指令稿中使用 -- 是良好的方針。

使用 --temp 或 --stage=all

當使用 --temp(或由 --stage=all 隱含)時,git checkout-index 會為每個正在簽出的索引項目建立一個暫存檔。索引不會透過狀態 (stat) 資訊更新。如果呼叫者需要未合併項目的所有階段,以便將這些檔案交由外部合併工具處理,這些選項將非常有用。

輸出將會寫入至 stdout,提供暫存檔名與追蹤路徑名稱的關聯。輸出格式有兩種變化:

  1. tempname TAB path RS

    第一種格式在省略 --stage 或未設為 --stage=all 時使用。tempname 欄位是存放檔案內容的暫存檔名,path 是索引中追蹤的路徑名稱。僅輸出所請求的項目。

  2. stage1temp SP stage2temp SP stage3tmp TAB path RS

    第二種格式在設為 --stage=all 時使用。三個階段暫存欄位(stage1temp, stage2temp, stage3temp)列出對應階段的暫存檔名,若索引中該階段無項目則為 .。僅有第 0 階段 (stage 0) 的路徑將永遠不會出現在輸出中。

在兩種格式中,RS(記錄分隔符)預設為換行字元,但若命令列傳入了 -z 參數,則會改為 Null 字元。暫存檔名永遠是安全的字串;它們絕不會包含目錄分隔符或空白字元。path 欄位永遠是相對於目前目錄,而暫存檔名永遠是相對於頂層目錄。

如果被複製到暫存檔的物件是符號連結,連結的內容將被寫入到一個一般檔案中。最終使用者或上層工具 (Porcelain) 應自行決定如何利用此資訊。

範例

更新並重新整理僅已簽出的檔案
$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
使用 git checkout-index 來「匯出整個樹狀目錄」

prefix 功能基本上讓使用 git checkout-index 作為「匯出為樹狀目錄」功能變得相當簡單。只需將所需的樹狀目錄讀入索引,並執行:

$ git checkout-index --prefix=git-export-dir/ -a

git checkout-index 將會把索引「匯出」到指定的目錄。

最後的「/」很重要。匯出的名稱字面上僅是在前面加上指定的字串。請參考以下範例作為對照。

以字首匯出檔案
$ git checkout-index --prefix=.merged- Makefile

這會將目前快取的 Makefile 副本簽出為 .merged-Makefile 檔案。

GIT

git[1] 套件的一部分