## 名称

git-checkout-index - 将索引中的文件复制到工作树上

## 概要

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

## 描述

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

## 选项

-u --index

更新索引文件中检出条目的统计信息。

-q --quiet

如果文件存在或不在索引中，请保持安静

-f --force

强制覆盖现有文件

-a --all

检出索引中的所有文件。不能与明确的文件名一起使用。

-n --no-create

不要签出新文件，只刷新已经签出的文件。

--prefix=<string>

在创建文件时，请将<string>（通常是一个包含尾部/的目录）

--stage=<number>|all

而不是检查未合并的条目，从命名的阶段复制文件。<number>必须介于1和3之间。注意：--stage = all自动表明--temp。

--temp

将文件复制到工作目录而不是将内容写入临时文件。临时名称关联将写入 stdout。

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

1. tempname TAB路径RS

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

2. stage1temp SP stage2temp SP stage3tmp TAB路径RS

第二种格式是什么时候使用`--stage=all`。如果在索引`.`中存在阶段条目或者没有阶段条目，则三个阶段临时字段（stage1temp，stage2temp，stage3temp）会列出临时文件的名称。只有阶段0条目的路径将始终从输出中省略。

在这两种格式中，默认情况下 RS（记录分隔符）都是换行符，但如果在命令行上传递-z，则将为空字节。临时文件名总是安全的字符串; 他们将永远不会包含目录分隔符或空白字符。路径字段总是相对于当前目录，并且临时文件名始终相对于顶级目录。

如果被复制到临时文件的对象是符号链接，则该链接的内容将被写入普通文件。终端用户或瓷器会使用这些信息。

## 示例

仅更新和刷新已检出的文件

    $ 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`文件中的副本。