Skip to content

git-checkout-index

命令名称 - 将文件从索引复制到工作树

概要

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

描述

将所有列出的文件从索引复制到工作目录(不覆盖现有文件)。

选项

  • -u / --index - 更新索引文件中已检出条目的 stat 信息。

  • -q / --quiet - 如果文件存在或不在索引中则保持安静。

  • -f / --force - 强制覆盖现有文件。

  • -a / --all - 检出索引中除设置了 skip-worktree 位的文件以外的所有文件(参见 --ignore-skip-worktree-bits)。不能与显式文件名一起使用。

  • -n / --no-create - 不检出新文件,仅刷新已检出的文件。

  • --prefix=<string> - 创建文件时,在前面加上 <string>(通常是包含尾部 / 的目录)。

  • --stage=<number>|all - 不是检出未合并的条目,而是从指定的阶段复制文件。<number> 必须在 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

直觉不是这里的目标。可重复性才是。"无参数意味着不做任何工作"行为的原因是,从脚本中您应该能够执行:

$ 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,提供临时文件名与跟踪路径名的关联。列表格式有两种变体:

. tempname TAB path RS

第一种格式在省略 --stage 或不是 --stage=all 时使用。字段 tempname 是保存文件内容的临时文件名,path 是索引中的跟踪路径名。仅输出请求的条目。

. stage1temp SP stage2temp SP stage3tmp TAB path RS

第二种格式在使用 --stage=all 时使用。三个阶段临时字段(stage1temp、stage2temp、stage3temp)列出了索引中存在阶段条目时的临时文件名,如果不存在阶段条目则为 .。只有阶段 0 条目的路径将始终从输出中省略。

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

如果复制到临时文件的对象是符号链接,链接的内容将写入普通文件。由最终用户或 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) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布