Git clean 过滤器 - 检索原始行,git smudge 但不是原始行

kab*_*nus 2 git

为了结帐/差异/阶段等目的,我想完全忽略一些行:

set(ROOT /path/to/something/name_suffix)
set(ROOT /path/to/something/othername_suffix)
Run Code Online (Sandbox Code Playgroud)

偶尔(但并非总是)我会把它作为

set(ROOT /some/other/private/path/name)
set(ROOT /some/other/private/path/othername)
Run Code Online (Sandbox Code Playgroud)

忽略的意思是:

  1. ~smudge:如果我签出它,什么也没做。如果它与索引匹配,它将保持不变。如果改变了,它将保持不变。
  2. clean:它不会被考虑用于 diff 或 git add 的目的。

我拥有的:

  1. Git 过滤器会弄脏我的私人路径 - 问题是如果我有原始行,在签出时它将恢复到我更改的行(带有个人路径):

    smudge = "sed 's#set\\(ROOT\\) .*/\\([a-z]*\\).*)#\\1 /some/other/private/path/\\2)#'"
    
    Run Code Online (Sandbox Code Playgroud)

我还没有实现 git clean ,因为我目前看到的唯一方法是硬编码原始后缀的脚本或分析git diff以查看最初提交的内容的脚本(问题是_suffix,我不知道工作树中的内容。原始路径可以硬编码,不会改变),并将其替换为索引的内容。我不希望我的私人路径包含_suffix目录。

这里有两件事:

  1. 如果 git smudge 确实与原来的行完全一样,则不将原始行更改为个人行是否可能?
  2. 清洁过滤器还有其他解决方案吗?

Von*_*onC 5

您的涂抹脚本应将捕获的组保存在同名的文件中,并带有.smudge扩展名(例如)和.gitignore包含内容*.smudge.

这样,您的 clean 过滤器脚本就可以从 xxx.smudge 中读取原始值,并通过反向操作将文件恢复为其原始内容sed

您可以使用 将文件名传递给脚本%f。(看.gitattributes#filters