git是否有可能仅忽略文件中的特定更改,例如数字?

时间:2019-08-12 06:02:13

标签: git gitattributes

我有一个用于GUI的配置文件“ Gui.cfg”,如下所示:

GROUP camera
 gui.drivers.CameraGui 1 (,,,,)
 gui.drivers.CameraGui 2 (,,,,)

当我打开GUI和Camera 1或Camera 2元素时,“ Gui.cfg”会更改并添加窗口大小,例如

GROUP camera
 gui.drivers.CameraGui 1 (25,0,430,477,0)
 gui.drivers.CameraGui 2 (393,6,426,473,0)

有什么办法告诉git,括号中的这些更改会被忽略,而其他所有更改都不会吗?

我已经阅读了一些有关gitattributes和过滤器的信息,但没有找到如何使它解决我的问题的方法。

1 个答案:

答案 0 :(得分:3)

Filters使您能够完全按照自己的意愿去做,因此您处在正确的轨道上。

来自documentation

  

事实证明,您可以编写自己的过滤器以在提交/签出时在文件中进行替换。这些被称为“干净”和“污迹”过滤器。

您想要的是clean文件的Gui.cfg过滤器,它将替换与该模式匹配的所有行:

gui.drivers.CameraGui <anynumber> (<anycharacter>)

使用

gui.drivers.CameraGui <matchednumber> (,,,,)

在提交文件之前。

由于clean筛选器仅在暂存匹配文件之前运行 ,因此具有“撤消”窗口大小修改的效果,同时仍然允许对窗口大小进行任何其他更改。文件。

让我们先告诉Git我们想通过名为Gui.cfg的过滤器来运行undoCameraWindowSize文件,方法是将此行添加到.gitattributes

Gui.cfg filter=undoCameraWindowSize

然后,我们实现undoCameraWindowSize过滤器通过将其定义为clean过滤器来告诉Git我们希望在暂存文件之前运行它:

git config --global filter.undoCameraWindowSize.clean 'sed -E "s/gui\.drivers\.CameraGui\s([0-9]+)\s\(.*\)/gui.drivers.CameraGui \1 (,,,,)/"'

在这里,我们使用sed运行正则表达式,并将匹配的文本替换为另一个字符串。

命令本身是:

sed -E "s/gui\.drivers\.CameraGui\s([0-9]+)\s\(.*\)/gui.drivers.CameraGui \1 (,,,,)/"

请注意我们如何使用捕获组 ([0-9]+)来匹配摄像机编号,然后使用\1在替换字符串中引用该摄像机编号。