我想在我的 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 文件位于同一目录中
我在这里看到几个问题:
你有%
在两个过滤器的末端。
这没有特殊含义,将作为额外参数传递给sed,这可能会生成错误(除非您有一个名为%
).
过滤器应该是“流式”的(从标准输入读取并写入标准输出)。他们的定义可以包括%f
,但它不应该真正被视为一个文件来读取或写入; Git 完成了这部分工作,过滤器应该只从 stdin 读取并写入 stdout。
您的干净过滤器尝试重定向标准输入%f
.
输入数据已经在标准输入上,无需重定向。
The sed清洁过滤器中的程序使用r
命令访问另一个文件。
过滤器似乎是从工作树的根运行的,但我不确定这是否得到保证。
The sedclean 过滤器中的命令使用-n
。它唯一的输出将是ankhsvnsection
文件(假设输入有Global
line).
某些版本的sed(至少 Mac OS X 中的(旧)BSD 版本)不允许在文件名后有空格r
命令(即后面的空格ankhsvnsection
在干净的过滤器中sed程序)。
添加、更改或删除过滤器后,您可能需要touch在 Git 应用过滤器之前,修改或删除您的工作树文件。 Git的索引记录了工作树文件的修改时间;如果它们没有改变,那么 Git 会翻译git checkout -- file
and git 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'"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)