怎么编译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
编译源码
-
下载源码:https://github.com/git-for-windows/git
-
下载编译工具:https://github.com/git-for-windows/git-sdk-64
-
打开
git-sdk-64中工具git-bash.exe// 1.打开到源码工程 // 2.make 编译工程,首次编译较久 // 3.make install 生成可执行文件 cd g:/git-main make make install -
在
git-sdk-64工具目录下找到生成的git.exe,比如我安装的目录C:\git-sdk-64\mingw64\bin -
测试编译使用的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
- 完成后,备份并替换电脑原来的git
C:\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.c的find_renames函数。

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



-
关于目录的rename对比,是根据目录历史rename记录:

- 这里原始目录刚好有两文件在前面检查rename时,认为从
client/Assets/Plugins/JSZX_tools/VXExplorer/Editor/PreviewWindow/ParticleSystemPreview/Editor/移动到了client/Assets/JoyBoxSdk/Bean/,所以认为是目录改名了。虽然也有rename到别的目录,但会算移到哪个目录数量最多,就认定最多的目录。
- 这里原始目录刚好有两文件在前面检查rename时,认为从
确认异常规律
- 看日志full history,是本地存在过但delete了,远端分支还在且修改了。

修复后结果
-
不要让git猜rename


-
测试正常修改rename文件提交正常
rename开关
-
似乎不支持
git config merge.renames false和git 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
2万+

被折叠的 条评论
为什么被折叠?



