Git clean筛选器-检索原始行、Git污迹,但不检索原始行

Git clean筛选器-检索原始行、Git污迹,但不检索原始行,git,Git,为了结帐/diff/stage等目的,我想完全忽略一些行: set(ROOT /path/to/something/name_suffix) set(ROOT /path/to/something/othername_suffix) 偶尔(但不总是)我会把它当作 set(ROOT /some/other/private/path/name) set(ROOT /some/other/private/path/othername) 忽略意味着: ~smudge:如果我签出它,什么都不会做。如果

为了结帐/diff/stage等目的,我想完全忽略一些行:

set(ROOT /path/to/something/name_suffix)
set(ROOT /path/to/something/othername_suffix)
偶尔(但不总是)我会把它当作

set(ROOT /some/other/private/path/name)
set(ROOT /some/other/private/path/othername)
忽略意味着:

  • ~smudge:如果我签出它,什么都不会做。如果它与索引匹配,它将保持不变。如果它被改变了,它将保持不变
  • 清洁:不考虑用于diff或git add
  • 我所拥有的:

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

  • 我还没有实现git clean,因为我目前看到的唯一方法是对原始后缀进行硬编码的脚本,或者分析
    git diff
    以查看最初提交的内容(问题是
    \u后缀
    ,我无法从工作树中分辨出它是什么。原始路径可以硬编码,它不会更改),并将其替换为索引的路径。我不希望我的专用路径包含
    \u后缀
    目录

    这里有两件事:

  • git smudge是否可能——如果它确实与原来完全相同,则不将原始行更改为个人行
  • 是否有其他清洁过滤器的解决方案

  • 涂抹脚本应将捕获的组保存在同名文件中,扩展名为
    .smudge
    (例如)和
    .gitignore
    包括
    *.smudge

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


    您可以。(请参见)

    您的smudge脚本应将捕获的组保存在同名文件中,扩展名为
    .smudge
    (例如)和
    .gitignore
    包括
    *.smudge

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


    您可以。(请参阅)

    正如VonC建议的那样:您实际上可以将正在处理的文件的名称传递到清理/涂抹脚本

    让污迹过滤器“保留”目标线的当前状态的一种方法是:

    • 从磁盘读取
      %f
      的当前内容,并确定要保留的行
    • 在标准中替换要保留的行
    您可以使用
    sed
    ,或任何可编写脚本的方式来替换文本


    请注意,一般来说,如果从一个分支切换到另一个分支,目标文件可能与您预期的不同——它是否存在于当前工作树中?它的格式是否在两个分支之间更改


    话虽如此,上述内容仍应涵盖您的大多数用例。

    正如VonC所建议的那样:您实际上可以将正在处理的文件的名称传递给清理/涂抹脚本

    让污迹过滤器“保留”目标线的当前状态的一种方法是:

    • 从磁盘读取
      %f
      的当前内容,并确定要保留的行
    • 在标准中替换要保留的行
    您可以使用
    sed
    ,或任何可编写脚本的方式来替换文本


    请注意,一般来说,如果从一个分支切换到另一个分支,目标文件可能与您预期的不同——它是否存在于当前工作树中?它的格式是否在两个分支之间更改


    话虽如此,上述内容仍应涵盖您的大多数用例。

    谢谢,这是答案的一半。我将等待看是否有人捕捉到“涂抹”部分。取消删除-如果原始行未更改(而不是涂抹),我希望涂抹在签出时不做任何操作.BTW,我喜欢这个解决方案,特别是因为我们可以使用
    .smudge
    文件名,这样它就不会出现在ls中。@kabanus“如果原始行没有改变”?但是当您签出该文件时,原始行根据定义是不变的…我并不完全了解您的用例。如果我有污点过滤器,即使原始行没有改变,它也会在签出后更改。如果我将“aaa”污点为“bbb”,并且我的索引和工作区都包含“aaa”,则在
    git签出后
    它将更改“aaa”到“bbb”。用例是,我通常会使用全局路径,通常是我的私有路径,除非我明确更改它,否则我不想担心它。谢谢,这是答案的一半。我将等待,看看是否有人捕捉到“污迹”部分。取消删除-如果原始行不变,我希望污迹在签出时不做任何操作(而不是弄脏它)。顺便说一句,我喜欢这个解决方案,特别是因为我们可以使用
    。弄脏
    文件名,这样它就不会出现在ls中了。@kabanus“如果原始行不变的话“?但是当您签出该文件时,原始行根据定义是不变的……我并不完全了解您的用例。如果我有污点过滤器,即使原始行没有改变,它也会在签出后更改。如果我将“aaa”污点为“bbb”,并且我的索引和工作区都包含“aaa”,则在
    git签出
    后,它将更改“aaa”至“bbb”"。使用案例是,我通常会使用全局路径,通常是我的私有路径,除非我明确更改它,否则我不想担心。这让我想到让sed跳过污迹上包含原始根路径的行,谢谢。这让我想到让sed跳过包含原始根路径的行在污迹上,谢谢。
    smudge = "sed 's#set\\(ROOT\\) .*/\\([a-z]*\\).*)#\\1 /some/other/private/path/\\2)#'"