我有.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索引中。这是为什么?
答案 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
等内容,则会有更多细微之处。