Git 源码编译,冲突对比异常排查

怎么编译git:https://stackoverflow.com/questions/28848870/how-to-build-git-on-windows
支持rename的git源码: https://github.com/ZeroChiLi/git
支持rename的git.exe: https://download.youkuaiyun.com/download/l773575310/90373761

编译源码

  1. 下载源码:https://github.com/git-for-windows/git

  2. 下载编译工具:https://github.com/git-for-windows/git-sdk-64

  3. 打开git-sdk-64中工具git-bash.exe

    // 1.打开到源码工程
    // 2.make 编译工程,首次编译较久
    // 3.make install 生成可执行文件
    
    cd g:/git-main
    make
    make install
    
  4. git-sdk-64工具目录下找到生成的git.exe,比如我安装的目录C:\git-sdk-64\mingw64\bin

  5. 测试编译使用的git,可以改版本名称GIT-VERSION-GEN文件,编译安装后使用git version查看结果
    在这里插入图片描述
    在这里插入图片描述

  • 编译测试
# 测试用编译为的git.exe操作工程
git --git-dir=g:/m71_tw/.git --work-tree=g:/m71_tw merge remotes/origin/publish
git --git-dir=g:/m71_tw/.git --work-tree=g:/m71_tw cherry-pick 3796ae492f99d463ba7fee1a06bfd8d47d23e7fd
  • 完成后,备份并替换电脑原来的gitC:\Program Files\Git\mingw64\bin\git.exe

异常冲突排查

  • 合并版本或者pick提交时,有时会出现对比两个不是一回事的对象,其中一个规律就是两个分支中其中一个是不存在这个文件的(包括曾经存在,但删除了)。

  • merge冲突异常:
    在这里插入图片描述

    // merge 后冲突日志,本地不存在的cs文件提示冲突,
    CONFLICT (file location): client/Assets/Plugins/JSZX_tools/VXExplorer/Editor/PreviewWindow/ParticleSystemPreview/Editor/PreviewReimportListener.cs added in remotes/origin/publish inside a directory that was renamed in HEAD, suggesting it should perhaps be moved to client/Assets/JoyBoxSdk/Bean/PreviewReimportListener.cs.
    CONFLICT (file location): client/Assets/Plugins/JSZX_tools/VXExplorer/Editor/PreviewWindow/ParticleSystemPreview/Editor/PreviewReimportListener.cs.meta added in remotes/origin/publish inside a directory that was renamed in HEAD, suggesting it should perhaps be moved to client/Assets/JoyBoxSdk/Bean/PreviewReimportListener.cs.meta.
    
  • pick 冲突异常,导致pick不到实际要的prefab:
    在这里插入图片描述
    在这里插入图片描述

源码排查

在这里插入图片描述

find_renames方法模糊查rename

  • update_dir_rename_counts记录了需要rename的列表,打印日志发现就是这里把两个不关联的对象认为是rename了。merge-ort.cfind_renames函数。
    在这里插入图片描述

  • 结合上下文和GPT一下,了解到这个方法实际对两个分支,分别只有自己分支有的内容依次对比,看看哪两个对象更像,就认为他是改名了。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 关于目录的rename对比,是根据目录历史rename记录:
    在这里插入图片描述

    • 这里原始目录刚好有两文件在前面检查rename时,认为从client/Assets/Plugins/JSZX_tools/VXExplorer/Editor/PreviewWindow/ParticleSystemPreview/Editor/ 移动到了client/Assets/JoyBoxSdk/Bean/,所以认为是目录改名了。虽然也有rename到别的目录,但会算移到哪个目录数量最多,就认定最多的目录。

确认异常规律

  • 看日志full history,是本地存在过但delete了,远端分支还在且修改了。

在这里插入图片描述

修复后结果

  • 不要让git猜rename
    在这里插入图片描述
    在这里插入图片描述

  • 测试正常修改rename文件提交正常


rename开关

  • 似乎不支持git config merge.renames falsegit config diff.renames,但支持git config merge.directoryrenames

    在这里插入图片描述

  • 自己另外加上git config merge.renames false ,支持merge时候不检查rename


源码工程文件

  • 2.46.2 加上支持开关检查merge或pick 的rename检查:git config --global merge.renames false

  • C:\Program Files\Git\mingw64\bin\git.exe

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值