情况
我将htm文件放入git。然后我使用git diff来比较它们。我不感兴趣的文件之间存在差异,例如meta或comments标签。
我通常使用这种方法:How to tell git to ignore individual lines, i.e. gitignore for specific lines of code
我到目前为止做了什么
以下是我采取的步骤:
<project root>/.gitattributes
*.htm filter=gitignore
,即在所有.htm文件上运行过滤器gitignore $ git config --global filter.gitignore.clean "sed 's/<meta.*>//g'"
,即删除这些内容
行$ git config --global filter.gitignore.smudge cat
,即做
从repo中提取文件时没有任何内容git diff A..B -- file.htm > diff.txt
根据我目前所在的分支,我会得到不同的结果:
问题
我怎样才能做到这一点,无论我在哪个分支上,所有分支都应用过滤器?
答案 0 :(得分:1)
这些过滤器不关心您所在的分支。类似地,git diff A..B -- file.htm
将不依赖于当前分支,因为您通过分支头(提交)A和B直接指定git存储库树。
引用man git-config
filter。&lt; driver&gt; .clean:用于在签入时将工作树文件的内容转换为blob的命令。
filter。&lt; driver&gt; .smudge:用于在结帐时将blob对象的内容转换为worktree文件的命令。
所以你的sed脚本只在“向git添加文件”时才会运行。它不会改变现有的提交,也不应该影响它们之间的差异。看起来元标记仍存在于分支B的文件中,因为它们是在配置过滤器之前添加的。
如果仍然可以修改分支B,则可以在备份后尝试以下操作。
find . -name \*.htm -exec rm {}
git checkout B
git reset --hard
您的存储库现在应该显示要提交的元标记的删除。