2014-02-08 41 views
3

情况:我刚刚克隆了一个git repo,然后为回购配置了涂抹过滤器。在回购库中散布了.gitattributes个文件,指定在结帐时应对文件使用的过滤器。但是,由于我在结帐(克隆)后设置了筛选器,因此没有处理任何文件。git:创建涂抹过滤器后重新签出文件

我该如何告诉git通过回购,找到所有.gitattributes文件,并更新(重新签出,应用过滤器,无论什么)所有的文件上有一个涂抹过滤器?

回答

7

只需重新检查一切。

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

不起作用。不涂抹涂抹。我猜git足够聪明,知道这个文件没有被修改,所以它认为它不需要被检出并且忽略它。我能够让git重新签出文件的唯一方法就是触摸文件,然后检查出来。但我想要触摸整个回购中的每个文件。 – Patrick

+0

@Patrick奇怪,我已经做了几个月,现在已经成功:https://github.com/VonC/compileEverything/blob/master/gitlab/install_or_update_gitlab.sh.tpl#L64-L68。试试'git checkout HEAD -/path/to/your/repo' – VonC

+0

这样做,谢谢。我将它添加到我用来设置过滤器的脚本中,但只做了一些调整:1)在结帐前后添加'git stash save'和'git stash pop'(如果保存做了任何事情)。这是为了万一我正在处理任何事情。 2)'git checkout HEAD - “$(git rev-parse --show-toplevel)”'所以我不必硬编码路径。 – Patrick

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 

注: 再结账之前,保存未提交的修改,否则,您对这些污迹滤光器的文件,所有的修改都将被取代。