2017-04-05 236 views
0

git checkout-index命令将文件从索引复制到工作树。`git checkout-index -u`或`--index`做什么?

文档包括关于其-u--index命令行参数的隐蔽备注:

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

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

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

+0

您是否看到'.git/index'的mtime变化? –

回答

2

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。

相关问题