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

rai*_*ert 5 git sed filter

情况

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

我通常使用这种方法:如何告诉git忽略单独的行,即特定行代码的gitignore

我到目前为止做了什么

以下是我采取的步骤:

  1. 在中创建了gitattributes文件 <project root>/.gitattributes
  2. 添加了一行定义要过滤的文件:
    • *.htm filter=gitignore,即在所有.htm文件上运行过滤器gitignore
  3. 我的gitconfig中定义了过滤器:
    • $ git config --global filter.gitignore.clean "sed 's/<meta.*>//g'",即删除这些行
    • $ git config --global filter.gitignore.smudge cat,即从repo中提取文件时什么也不做
  4. 然后我在任意文件上做一个diff: git diff A..B -- file.htm > diff.txt

根据我目前所在的分支,我会得到不同的结果:

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

问题

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

小智 1

这些过滤器不关心您所在的分支。同样,git diff A..B -- file.htm不会依赖于当前分支,因为您直接通过分支头(提交)A 和 B 指定 git 存储库树。

引用man git-config

filter.<driver>.clean:用于在签入时将工作树文件的内容转换为 blob 的命令。

filter.<driver>.smudge:用于在检出时将 Blob 对象的内容转换为工作树文件的命令。

因此,您的 sed 脚本仅在您“将文件添加到 git”时运行。它不会改变现有的提交,也不应该影响它们之间的差异。看起来元标记仍然存在于分支 B 的文件中,因为它们是在您配置过滤器之前添加的。

如果您仍然可以修改分支 B,则可以在进行备份后尝试以下操作。

find . -name \*.htm -exec rm {}
git checkout B
git reset --hard
Run Code Online (Sandbox Code Playgroud)

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