情况:我刚刚克隆了一个git repo,然后为回购配置了涂抹过滤器。在回购库中散布了.gitattributes
个文件,指定在结帐时应对文件使用的过滤器。但是,由于我在结帐(克隆)后设置了筛选器,因此没有处理任何文件。git:创建涂抹过滤器后重新签出文件
我该如何告诉git通过回购,找到所有.gitattributes
文件,并更新(重新签出,应用过滤器,无论什么)所有的文件上有一个涂抹过滤器?
情况:我刚刚克隆了一个git repo,然后为回购配置了涂抹过滤器。在回购库中散布了.gitattributes
个文件,指定在结帐时应对文件使用的过滤器。但是,由于我在结帐(克隆)后设置了筛选器,因此没有处理任何文件。git:创建涂抹过滤器后重新签出文件
我该如何告诉git通过回购,找到所有.gitattributes
文件,并更新(重新签出,应用过滤器,无论什么)所有的文件上有一个涂抹过滤器?
只需重新检查一切。
cd /path/to/your/repo
git stash save
rm .git/index
git checkout HEAD -- "$(git rev-parse --show-toplevel)"
git stash pop
涂抹过滤器将应用于新的结帐。
请注意,如this answer所示,您需要删除索引以强制过滤器再次运行。
我已经创建了一个别名“
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\""
您可以删除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
注: 再结账之前,保存未提交的修改,否则,您对这些污迹滤光器的文件,所有的修改都将被取代。
不起作用。不涂抹涂抹。我猜git足够聪明,知道这个文件没有被修改,所以它认为它不需要被检出并且忽略它。我能够让git重新签出文件的唯一方法就是触摸文件,然后检查出来。但我想要触摸整个回购中的每个文件。 – Patrick
@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
这样做,谢谢。我将它添加到我用来设置过滤器的脚本中,但只做了一些调整:1)在结帐前后添加'git stash save'和'git stash pop'(如果保存做了任何事情)。这是为了万一我正在处理任何事情。 2)'git checkout HEAD - “$(git rev-parse --show-toplevel)”'所以我不必硬编码路径。 – Patrick