这个git涂抹/清洁过滤器有什么问题?

时间:2011-03-21 16:33:18

标签: git filter sed gitattributes

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

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

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

我已在我的.git / info / attributes

中设置此过滤器
  

*。sln filter = 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文件位于同一目录中

1 个答案:

答案 0 :(得分:17)

我在这里看到一些问题:

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

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

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

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

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

  6. 添加,更改或删除过滤器后,您可能需要触摸,修改或删除您的工作树文件,然后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'"