首页 > 解决方案 > 有没有办法让 git add --patch 跳过所有单行更改?

问题描述

我的团队从我们使用的工具 (Postman) 签入导出的 JSON 文件,以便我们可以轻松共享配置。在最近对该工具的更改中,每次导出时所有 ID(只是 GUID)都会更改。这意味着我们的差异有数百个单行无意义的更改(GUID 更改),然后是我们所做的实际有意义的更改/添加。

如果我们按原样检查,那么变基真的很棘手,因为 ID 似乎是完全随机的,所以我们会得到大量无意义的合并冲突。审查也很烦人,因为我们想要审查的更改被隐藏在数百个其他无意义的更改之下。但是使用git add --patch基本上是不可能的,因为您必须跳过数百个补丁,然后选择您想要的一个,它可能在文件底部附近。

我想知道是否有任何聪明的脚本技巧可以用来让它自动丢弃所有的单行代码,并且只问我关于超过一行的补丁。我们想要的实际补丁几乎总是比一行长,所以这几乎总是有效的,并且更容易使用。

标签: git

解决方案


我假设文件列表已明确建立:*.json文件,存在于一些清晰可识别的目录中,可能具有特定的名称结构......(意思是:您可以轻松地定位这些文件.gitattributes

如果是这种情况:您的用例非常适合filter(带有一clean / smudge对脚本)在将这些文件添加到 git 时用固定值替换不断移动的行。


这是文档的链接:git 属性

相关图形描述:

图 144.“污迹”过滤器在结账时运行。 图 144.“污迹”过滤器在结账时运行。 图 145. 暂存文件时运行“干净”过滤器。 图 145. 暂存文件时运行“干净”过滤器。

要运行的目标“过滤器”脚本应该在 git 的配置中定义,
通过这个过滤器的文件应该在一个.gitattributes文件中定义。

您需要在每台机器上设置一次以下配置:

  • 部署一个脚本,我们称之为它normalize-postman-ids,它会在git adding 演示文件时使用,

  • 可能是第二个脚本,我们称之为它insert-valid-postman-ids,它将在git checkout提交时使用,

  • 在文件中添加一个部分,该部分.git/config将描述所谓的 filer :

     [filter "postman-ids"]
         clean = path/to/normalize-postman-ids
    
         # if the values stored in git can be used straight away:
         smudge = cat
         # if you need some action on checkout:
         smudge = path/to/insert-valid-postman-ids
    

您需要更新并提交.gitattributes您的 repo 文件:

  • .gitattributes文件中,定位应过滤的文件:

    # .gitattributes :
    postman*.json filter=postman-ids
    

推荐阅读