`git checkout-index -u`或`--index`有什么作用?

时间:2017-04-05 18:31:54

标签: git

git checkout-index命令将文件从索引复制到工作树。

该文档包含有关其-u--index命令行参数的含糊不清的评论:

  

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

什么是“统计信息?”更新它与不更新之间有什么区别?

我发现在简单的实验中,git checkout-index只是将文件写入工作树,正如您所期望的那样;我发现使用-u / --index与不使用它之间没有任何区别。

2 个答案:

答案 0 :(得分:3)

git-checkout-index将数据索引复制到工作树。 git-update-index工作树复制到索引。

这些是低级命令,需要明确告知该做什么 这个选项完全存在用户界面设计的奇迹是一个有用的选项,可以确保git的索引在执行操作后反映工作树的一致视图。

具体来说,这会(至少)更新不会贡献给git存储库的元数据,而是用于确定文件是否未更改。请参阅How to get a human-readable dump of .git/index?What does the git index contain EXACTLY?

415e96c中添加。

举一个例子,我将跟随t/t2002-checkout-cache-u.sh,它先运行命令,然后运行-u(再次,' s"相当于git update-index - 在签出的条目")上刷新。

1)准备:

echo frotz >path0 &&
git update-index --add path0 &&
t=$(git write-tree)

2)没有-u,git checkout-index会污染统计信息。

rm -f path0 &&
git read-tree $t &&
git checkout-index -f -a &&
git diff-files --exit-code

diff-files的输出:

:100644 100644 8e4020bb5a8d8c873b25de15933e75cc0fc275df 0000000000000000000000000000000000000000 M  path0
--> 1

查看索引中的内容:

$ git ls-files --debug
path0
  ctime: 0:0
  mtime: 0:0
  dev: 0    ino: 0
  uid: 0    gid: 0
  size: 0   flags: 0

3)使用-u,git checkout-index从新文件中获取统计信息。

rm -f path0 &&
git read-tree $t &&
git checkout-index -u -f -a &&
git diff-files --exit-code

(返回0)

现在stat(2)就在那里:

$ git ls-files --debug
path0
  ctime: 1491479474:0
  mtime: 1491479474:0
  dev: 16777220 ino: 50556411
  uid: 501  gid: 20
  size: 6   flags: 0

除了记录的统计信息之外,输出中还有一个有趣的位。为什么git-diff-files说工作树和索引之间存在差异?

手册说输出中的字段是

  

sha1 for" dst&#34 ;; 0 {40}如果创建,未合并或"查看工作树"。

     

< SHA1>如果文件系统上的文件是新的并且它与索引不同步,则显示为全0。

所以这个测试用例说明了git使用元数据信息的一种方式:比较工作树和索引中的文件。如果统计信息看起来陈旧(或全部为零),则文件可能已更改。由于git-read-tree只写入索引而不是工作树,因此必然会使统计信息无效。如果统计信息有效,git-diff-files可以放心地为该条目提供blob ID。

答案 1 :(得分:0)

虽然git-checkout-index确实将数据从索引复制到工作树,但是在Git 2.30(Q1 2021)之前存在一个令人讨厌的错误:“ git checkout-indexman始终没有发出退出状态的错误信号。

请参见commit 7e41061commit 0b809c8Jeff King (peff)(2020年10月27日)。
(由Junio C Hamano -- gitster --commit 92d6bd2中合并,2020年11月9日)

checkout-index:传播错误以退出代码

签名人:杰夫·金

如果在检出显式路径时遇到错误,我们将向stderr打印一条消息,但实际上不会以非零代码退出。

虽然这是一个管道命令,但行为一直追溯到33db5f4d90(添加一个“ checkout-cache”命令,其名称与建议相同。,2005-04-09,Git v0.99 ),这几乎可以肯定是一个疏忽:

  • 我们 do 返回checkout_file()的退出代码;来电者根本就没看过
  • 检出所有路径(使用“ -a”时出错)会导致退出代码非零。
  • 不使用退出代码来产生错误是非常不寻常的,因为否则调用者不知道命令会失败,除非通过刮除stderr

为使测试简单易行,我们可以使用最明显的错误:要求签出根本不在索引中的路径。