使用脚本自动解决二进制文件中的git冲突

时间:2016-08-29 14:08:01

标签: git merge-conflict-resolution

我们在很多存储库上都有很多分支,而且它们都有二进制文件(我知道它很糟糕 - 但我们必须把它们放进去)。这意味着几乎每个合并或同步都会在这些文件中发生冲突。

我们已经创建了一个脚本,它编译项目并创建这些文件,现在我们只是在发生冲突时运行它,它会用正确的文件覆盖冲突文件,并将这些文件标记为已解决。

这很棒且省时,但现在我想知道是否有办法让git自己做。意思是,而不是' - ''或' - 他们',选择更复杂的逻辑来解决特定的冲突文件(运行覆盖它们的脚本)

有办法做到这一点吗?谢谢!

1 个答案:

答案 0 :(得分:0)

将脚本包装到自定义合并驱动程序中,并将二进制文件标记为与该驱动程序合并。阅读gitattributes documentation了解更多详情;以下是一个略有编辑的相关摘录:

  

执行三向合并

     

merge属性合并会影响文件的三个版本   在git merge期间需要文件级合并时合并   其他命令,例如git revertgit cherry-pick

     

当此属性设置为字符串时,使用执行3向合并   指定的自定义合并驱动程序内置的3路合并驱动程序可以   通过询问" text"明确指定驱动程序;内置的   "采取当前分支"可以使用"二进制"来请求驱动程序。

     

定义自定义合并驱动程序

     

合并驱动程序的定义在.git/config文件中完成,   不在gitattributes文件中。

     

要定义自定义合并驱动程序filfre,请在您的部分添加一个部分   $GIT_DIR/config文件(或$HOME/.gitconfig文件),如下所示:

[merge "filfre"]
  name = feel-free merge driver
  driver = filfre %O %A %B %L %P
  recursive = binary
     

merge.*.name变量为驱动程序提供了一个人类可读的名称。

     

merge.*.driver变量的值用于构造命令   运行以合并祖先的版本(%O),当前版本(%A)和   其他分支机构'版本(%B)。这三个令牌被替换   使用包含这些内容的临时文件的名称   构建命令行时的版本。此外,%L将是。{1}}   替换为冲突标记大小(请参阅conflict-marker-size   属性)。

     

合并驱动程序应该在合并中留下合并的结果   通过覆盖它以%A命名的文件,如果是,则以零状态退出   它设法干净地合并它们,或者如果有冲突则非零。

因此,假设您的合并驱动程序名为recompile_merge并且您希望将其应用于* .o文件,则需要在gitattributes文件中添加以下条目:

 *.o merge=recompile_merge

一个可能的问题是确保在必须以自定义方式合并的二进制文件之前合并相应的源文件。