如何使用git filter.gitignore.clean在diff期间过滤两个分支

时间:2014-07-31 13:22:40

标签: git sed filter

情况

我将htm文件放入git。然后我使用git diff来比较它们。我不感兴趣的文件之间存在差异,例如meta或comments标签。

我通常使用这种方法:How to tell git to ignore individual lines, i.e. gitignore for specific lines of code

我到目前为止做了什么

以下是我采取的步骤:

  1. <project root>/.gitattributes
  2. 中创建了gitattributes文件
  3. 添加了一行定义要过滤的文件:
    • *.htm filter=gitignore,即在所有.htm文件上运行过滤器gitignore
  4. 我的gitconfig中定义过滤器:
    • $ git config --global filter.gitignore.clean "sed 's/<meta.*>//g'",即删除这些内容 行
    • $ git config --global filter.gitignore.smudge cat,即做 从repo中提取文件时没有任何内容
  5. 然后我对任意文件进行差异:git diff A..B -- file.htm > diff.txt
  6. 根据我目前所在的分支,我会得到不同的结果:

    • 在分支A上,我看到分支B的所有元标记仍然存在,并且它们显示为添加。
    • 在分支B上,我看到分支A的所有元标记仍然存在,并且它们显示为删除。

    问题

    我怎样才能做到这一点,无论我在哪个分支上,所有分支都应用过滤器?

1 个答案:

答案 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

您的存储库现在应该显示要提交的元标记的删除。