8

我想在我的 git 存储库中应用此过滤器,以在结帐期间从解决方案文件中删除一个部分,并在提交期间添加此部分。

这是我要删除或添加的部分:

GlobalSection(SubversionScc) = preSolution
    Svn-Managed = True
    Manager = AnkhSVN - Subversion Support for Visual Studio
EndGlobalSection

我已经在我的 .git/info/attributes 中设置了这个过滤器

*.sln 过滤器=SourceControlProvider

我已将这些命令添加到我的配置中

$ git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d' %"
$ git config filter.SourceControlProvider.clean "sed -n -e '/^Global$/ r ankhsvnsection ' < %"

好吧,它不起作用。我做错了什么?

ankhsvnsection 是一个文本文件,与 *.sln 文件位于同一目录中

4

1 回答 1

18

我在这里看到一些问题:

  1. %在两个过滤器的末尾都有。
    这没有特殊含义,将作为额外参数传递给sed,这可能会产生错误(除非您有一个名为 的文件%)。
    过滤器应该是“流式”的(从标准输入读取并写入标准输出)。它们的定义可以包括%f,但不应真正将其视为要读取或写入的文件;Git 做了那部分,过滤器应该只从标准输入读取并写入标准输出。

  2. 您的干净过滤器尝试将标准输入从%f.
    输入数据已经在标准输入上,无需重定向。

  3. clean 过滤器中的sed程序使用该r命令访问另一个文件。
    过滤器似乎是从工作树的根目录运行的,但我不确定这是否得到保证。

  4. 清洁过滤器中的sed命令使用-n. 它唯一的输出将是ankhsvnsection文件的内容(假设输入有Global一行)。

  5. 某些版本的sed(至少是 Mac OS X 中的(旧)BSD 版本)不允许在r命令的文件名之后使用空格(即ankhsvnsection在 clean 过滤器的sed程序中的空格)。

添加、更改或删除过滤器后,您可能需要在 Git 应用过滤器之前触摸、修改或删除工作树文件。Git的索引记录了工作树文件的修改时间;如果它们没有改变,那么 Git 将转换git checkout -- filegit add file无操作。

如果您想查看索引的实际内容(例如检查干净的过滤器产生了什么),您可以使用git show :0:path/from/repo/root/to/file. 您通常不能git diff用于此,因为它也应用过滤器。

这些对我有用:

git config filter.SourceControlProvider.smudge "sed -e '/GlobalSection(SubversionScc)/,/EndGlobalSection/d'"
git config filter.SourceControlProvider.clean "sed -e '/^Global\$/ r ankhsvnsection'"
于 2011-03-22T10:31:55.893 回答