git checkout-index
命令将文件从索引复制到工作树。`git checkout-index -u`或`--index`做什么?
文档包括关于其-u
或--index
命令行参数的隐蔽备注:
-u
--index
为索引中检验出的条目更新统计信息文件。
什么是“统计信息?”更新它并不更新它有什么区别?
我发现在简单的实验中,git checkout-index
只是将文件写入工作树,正如您所期望的那样;我看不到使用-u
/--index
而不使用它的任何区别。
git checkout-index
命令将文件从索引复制到工作树。`git checkout-index -u`或`--index`做什么?
文档包括关于其-u
或--index
命令行参数的隐蔽备注:
-u
--index
为索引中检验出的条目更新统计信息文件。
什么是“统计信息?”更新它并不更新它有什么区别?
我发现在简单的实验中,git checkout-index
只是将文件写入工作树,正如您所期望的那样;我看不到使用-u
/--index
而不使用它的任何区别。
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
(再次,这是“相当于git update-index - 在检出条目上刷新”) 。
1)制备:
echo frotz >path0 &&
git update-index --add path0 &&
t=$(git write-tree)
2)无-u,GIT中结帐索引污迹STAT信息。
rm -f path0 &&
git read-tree $t &&
git checkout-index -f -a &&
git diff-files --exit-code
输出的DIFF-文件:
: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的结帐指数回升的新文件统计信息。
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为 “DST”; 0 {40}如果创建,不合并或“看工作树”。
<如果一个文件是文件系统上的新文件,并且它与索引不同步,则sha1>显示为全0。
所以这个测试用例说明了git使用元数据信息的一种方式:比较工作树和索引中的文件。如果统计信息看起来过时(或全零),那么文件可能已经改变。由于git-read-tree
只写入索引,而不是写入工作树,因此必须使stat信息无效。如果统计信息有效,git-diff-files
可以自信地给出该条目的blob ID。
您是否看到'.git/index'的mtime变化? –