git checkout-index
命令将文件从索引复制到工作树。
该文档包含有关其-u
或--index
命令行参数的含糊不清的评论:
-u
的 - 索引
更新索引文件中已检出条目的统计信息。
什么是“统计信息?”更新它与不更新之间有什么区别?
我发现在简单的实验中,git checkout-index
只是将文件写入工作树,正如您所期望的那样;我发现使用-u
/ --index
与不使用它之间没有任何区别。
答案 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-index
” (man) 始终没有发出退出状态的错误信号。
请参见commit 7e41061的commit 0b809c8,Jeff 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
为使测试简单易行,我们可以使用最明显的错误:要求签出根本不在索引中的路径。