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

mrt*_*181 7 git sed filter gitattributes

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

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

GlobalSection(SubversionScc) = preSolution
    Svn-Managed = True
    Manager = AnkhSVN - Subversion Support for Visual Studio
EndGlobalSection
Run Code Online (Sandbox Code Playgroud)

我在.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 ' < %"
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*sen 17

我在这里看到一些问题:

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

  2. 您的干净过滤器尝试重定向stdin %f.
    输入数据已经在stdin上,不需要重定向.

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

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

  5. 某些版本的sed(至少是Mac OS X中的(旧)BSD版本)不允许在r命令文件名之后的空格(即ankhsvnsection清洁过滤器的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'"
Run Code Online (Sandbox Code Playgroud)

  • @sehe:我的*sed*抱怨问题的清洁过滤器中使用的程序:`sed:1:"/ ^ Global\$/r ankhsvnse ...":读取命令后的空格.唯一的"远射"是关于过滤器cwd的警告; 其他一切都是为了让过滤器正常工作(无论如何在我的系统上). (3认同)