简体中文 ▾ 主题 ▾ 最新版本 ▾ git-checkout-index 最后更新于 2.43.0

名称

git-checkout-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

不是检出未合并的条目,而是从指定的暂存区复制文件。<数字> 必须在 1 到 3 之间。注意:--stage=all 会自动隐含 --temp。

--temp

不将文件复制到工作目录,而是将内容写入临时文件。临时文件名的对应关系将写入标准输出。

--ignore-skip-worktree-bits

检出所有文件,包括设置了 skip-worktree 位的文件。

--stdin

不从命令行获取路径列表,而是从标准输入读取路径列表。路径默认由换行符(LF)分隔(即每行一个路径)。

-z

仅在配合 --stdin 时有意义;路径由 NUL 字符而不是 LF 分隔。

--

不再将任何后续参数解释为选项。

标志的顺序曾经很重要,但现在不再重要了。

直接运行 git checkout-index 不会做任何事情。你可能想用 git checkout-index -a。如果你想强制执行,则需要 git checkout-index -f -a

这里的目标不是直观性,而是可重复性。“无参数即无操作”这种行为的原因在于,在脚本中你应该能够执行:

$ 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 会为每个正在检出的索引条目创建一个临时文件。索引将不会通过状态信息进行更新。如果调用者需要所有未合并条目的所有阶段,以便外部合并工具可以处理这些未合并的文件,那么这些选项会非常有用。

标准输出将写入一个列表,提供临时文件名与跟踪路径名的对应关系。列表格式有两种变体:

  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 条目的路径将始终从输出中省略。

在这两种格式中,RS(记录分隔符)默认是换行符,但如果命令行中传递了 -z,则为 null 字节。临时文件名始终是安全字符串;它们永远不会包含目录分隔符或空格字符。路径字段始终相对于当前目录,临时文件名始终相对于顶层目录。

如果被复制到临时文件的对象是符号链接,则链接的内容将被写入一个普通文件。最终用户或 Porcelain(上层工具)需自行决定如何利用此信息。

示例

仅更新和刷新已检出的文件
$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
使用 git checkout-index “导出整个树”

前缀功能基本上使 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] 套件的一部分