git checkout-index
名称
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
文件中的副本。