为什么'git status'会忽略.gitattributes清理过滤器?

时间:2013-11-06 09:15:17

标签: git gitattributes

我有.gitattributes clean filter在提交之前删除文件中的所有注释。

$ cat .git/config
[filter "cleancomments"]
    clean = "grep -v '^#'"

$ cat .gitattributes
*   filter=cleancomments

我有一个文件'test',其中包含以下内容(在存储库中提交):

This is a file with random content

现在我对'test'进行修改并添加注释:

This is a file with random content
# and some comments
# like this

git status现在告诉我:

modified:   test

git diff为空(应该如此)。

我不完全清楚为什么git status不使用过滤器来决定文件是否被修改,但我认为这是它的实现方式。

对我来说真正神秘的是:

如果我这样做:

git add test

然后突然文件'test'不再被标记为已修改,并且它不会出现在git索引中。这是为什么?

1 个答案:

答案 0 :(得分:7)

git add将文件添加到索引 1 ,但首先通过任何必需的过滤器运行它。

索引包含文件的磁盘名称和“真实名称”(其git散列为“blob”)以及目录stat值和一对git散列值(原始和已过滤),以及根据需要还有一些其他的东西。一旦add - ed,git status可以从索引数据中判断出文件现在在索引中是“最新的”,并且当blob的哈希匹配时,索引本身在存储库中是最新的HEAD提交哈希。

如果你再修改一些文件,一些关键的stat数据会发生变化,让git认为索引已经过时了,而git status会再次认为它需要{{1} }} - 编 2

这里的一般想法似乎是git add没有写任何东西(甚至索引)。如果git status更新work-dir / cleaning-entry配对可能会很好,但似乎没有。


1 更确切地说,git update-index --refresh计算散列 - 因此也就是回购中的“真实名称” - 然后将对象添加到回购中,当且仅当它不存在时。哈希值现在已知,可以根据需要存储在索引中。在进行过滤和散列之前,哈希值是未知的,即git add不知道它。

2 如果您使用git status和/或--assume-unchanged等内容,则会有更多细微之处。