Git使用适当的合并工具手动合并二进制文件,git mergetool是如何工作的?

oknrviil  于 2023-11-15  发布在  Git
关注(0)|答案(1)|浏览(96)

我有一个包含CodeSys 2.3源代码文件的Git repo。这是一个专有的二进制文件,无法使用Git内置的工具轻松合并。当我尝试合并时,自动合并失败,我需要手动解决冲突。最好有一个本地文件的副本和一个包含建议更改的文件的副本,并使用CodeSys内置的比较工具合并两者。
类似问题:How do I merge a binary file?
这个问题的答案建议使用类似git checkout --ours binary.dat的东西来选择文件的一个版本。通常情况下,我不想选择文件的一个版本而不是另一个版本,但我想使用CodeSys IDE将两者结合起来。
Git手册中似乎有一个答案:https://git-scm.com/book/en/v2/Git-Tools-Advanced-Merging,在“手动文件重新合并”一节中。git show命令用于获取文件的“我们的”和“他们的”副本,并创建一个文件,并在文件名后添加一个标识符。
书中的例子:

$ git show :1:hello.rb > hello.common.rb
$ git show :2:hello.rb > hello.ours.rb
$ git show :3:hello.rb > hello.theirs.rb

字符串
我遇到了这个方法的问题,因为它会产生一个无法在CodeSys IDE中打开的损坏文件。原来这只是Windows PowerShell处理二进制数据流的方式的问题。在Windows. exe中运行命令工作。cmd /c "git show :3:hello.rb" > hello.theirs.rb
如果我使用git mergetool并设置mergetool.keepBackup = true,则会创建一组文件,其中一个文件是:filename_REMOTE_number. pro。这是正确的文件。不幸的是,mergetool失败并抱怨,因为vindiff无法打开这些文件。

**Question 1:**如何自动生成二进制文件的额外副本?理想情况下,我会创建一个git alias命令,用于搜索索引中所有存在合并冲突的文件,并将file-name.INCOMING.pro输出到工作文件夹中。
**问题1.2:**如何在不使用mergetool的情况下创建mergetool创建的REMOTE和RESSOR文件?
问题2::1:hello.rb > hello.common.rb路径是如何工作的?我无法添加通配符,如'*'而不会出错。
**附加问题:**为什么这些文件在索引中?我以为索引是暂存区的另一个名称。这些文件根本没有“暂存”,甚至没有在工作树中?有人能告诉我这个索引中有什么吗?它和暂存区一样吗?

vqlkdk9b

vqlkdk9b1#

我找到了问题1的答案:

Get-ChildItem -Include *.pro -Exclude REMOTE.* -Name | foreach ($_) {"git show `":3:{0}`" > `"REMOTE.{0}`"" -f $_ | cmd.exe }|Select-String -Pattern "fatal*"

字符串
步骤1是找到需要处理的二进制文件。幸运的是,所有文件都有.pro扩展名,并且通常每个repo中只有一个。因此,我们可以使用Cmdlet Get-ChildItem来查找文件的名称。这也排除了使用此命令创建的任何文件。

Get-ChildItem -Include *.pro -Exclude REMOTE.* -Name


现在,对于“Get-ChildItem”返回的每个名称,我们要格式化正确的git命令。git文档描述了如何在合并过程中选择正确的版本:https://git-scm.com/docs/gitrevisions.html#_specifying_revisions。第3阶段(由**:3:**表示)是要合并的分支的版本。

foreach ($_) {"git show `":3:{0}`" > `"REMOTE.{0}`"" -f $_ | cmd.exe }


然后,这些字符串将通过管道传输到https://brianreiter.org/2010/01/29/powershells-object-pipeline-corrupts-piped-binary-data/. exe以执行,因为PowerShell在二进制数据方面存在一些问题。
然后,将过滤Xbox.exe的输出,以捕获和显示任何错误。

相关问题