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

Is there a possibility in git to ignore only specific changes within a file, e.g. numbers?

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

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

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

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

有什么方法可以告诉git,括号中的这些变化被忽略,而其他所有变化都没有?

我已经阅读了一些关于 git 属性和过滤器的内容,但没有找到如何让它解决我的问题。

Filters 使您能够完全按照自己的意愿行事,所以您走在了正确的轨道上。

来自documentation

It turns out that you can write your own filters for doing substitutions in files on commit/checkout. These are called “clean” and “smudge” filters.

您想要的是 Gui.cfg 文件的 clean 过滤器,它将替换匹配此模式的任何行:

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

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

提交文件之前。

由于 clean 过滤器 运行 恰好 在匹配文件暂存 之前,这将具有 "undoing" window 大小修改,同时仍然允许文件中的任何其他更改。

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

Gui.cfg filter=undoCameraWindowSize

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

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

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

命令本身是:

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

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