gpt4 book ai didi

git - 这个 git smudge/clean 过滤器有什么问题?

转载 作者:太空狗 更新时间:2023-10-29 12:56:44 31 4
gpt4 key购买 nike

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

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

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. 两个过滤器的末尾都有 %
    这没有特殊含义,将作为额外参数传递给 sed,这可能会产生错误(除非您有一个名为 % 的文件)。
    过滤器应该是“流式”的(从标准输入读取并写入标准输出)。它们的定义可以包括%f,但它不应该真正被当作一个文件来读取或写入; Git 负责这部分工作,过滤器应该只从标准输入读取并写入标准输出。

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

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

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

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

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

如果你想查看索引的实际内容(例如检查 clean 过滤器生成的内容),你可以使用 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'"

关于git - 这个 git smudge/clean 过滤器有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5380634/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com