git:创建涂抹过滤器后重新签出文件

时间:2014-02-08 21:52:38

标签: git

情况:我刚刚克隆了一个git repo,然后我为repo配置了涂抹过滤器。在repo周围散布着.gitattributes个文件,这些文件指定了在结帐时应该在文件上使用的过滤器。但是因为我在结帐(克隆)之后设置了过滤器,所以没有处理任何文件。

如何告诉git通过repo,查找所有.gitattributes个文件,并更新(重新检出,应用过滤器,等等)所有带有污迹过滤器的文件?

2 个答案:

答案 0 :(得分:12)

只需重新检查所有内容。

cd /path/to/your/repo
git stash save
rm .git/index
git checkout HEAD -- "$(git rev-parse --show-toplevel)"
git stash pop

涂抹过滤器将应用于新结帐。

注意,如this answer所示,您需要删除索引才能强制过滤器再次运行。

Alexander Amelkin评论below

  

我创建了一个别名“reattr”来执行所有这些步骤,现在我很高兴。

reattr = !sh -c "\"git stash save; rm .git/index; git checkout HEAD -- \\\"$(git rev-parse --show-toplevel)\\\"; git stash pop\""

(可读性多行)

reattr = !sh -c "\"git stash save; \
                   rm .git/index; \
                   git checkout HEAD -- \\\"$(git rev-parse --show-toplevel)\\\"; \
                   git stash pop\""

答案 1 :(得分:2)

您可以删除Git索引并让Git重新扫描它以了解更改。然后你可以检查出所有带有污迹过滤器的文件。

# remove Git index
rm .git/index

# rescan index
git reset HEAD -- .

# checkout all the files which have a smudge filter on them
git ls-files --modified | grep -v .gitattributes | awk '{print "git checkout HEAD -- \""$1"\""}' | bash

注意: 在重新结帐之前保存未提交的更改,否则,将覆盖对这些涂抹滤镜应用文件的所有修改。