重命名目标文件的git cherry-pick

Iva*_*lov 10 git

我有两个不同版本的分支 - 一个用于当前开发,另一个是长期支持几年.结果他们显着不同.我有一些文件存在于两个分支中,但在开发中重命名.其中一个修复最初是在开发分支中进行的,但后来发现在支持分支中也是必需的.但是,cherry-pick报告该文件在支持分支中不存在(因为它在开发中被重命名并且在支持中具有不同的名称).

这个特定文件的内容是类似的,所以看起来补丁应该应用得很好 - 如果我可以直接git它应该应用它的文件.有没有办法(最好在命令行中)手动指导git做我需要的东西?

Yir*_*kha 16

cherry-pick命令使用与merge命令相同的合并策略.默认的递归合并策略能够在正常情况下检测重命名,但如果文件在这种情况下分歧过多,它可能会失败.

除了在另一个答案中概述的低级别索引黑客攻击之外,可能只需通过摆弄策略选项就可以使其工作,例如增加将类似文件视为重命名版本的阈值(默认为50%) :

git cherry-pick -Xrename-threshold=20% 0123sourcecommithash
Run Code Online (Sandbox Code Playgroud)

否则你也可以手动方式,即

git format-patch 0123sourcecommithash -1
Run Code Online (Sandbox Code Playgroud)

然后编辑创建0001-Commit-message-here.patch以更改文件路径并再次应用于目标分支:

git am 0001-Commit-message-here.patch
Run Code Online (Sandbox Code Playgroud)

它将保留所有原始提交消息,作者姓名,日期等,并可能作为一个简单的一次性解决方案.


Iva*_*lov 5

想起来了,在哪见过类似的。就在这里。链接脚本也有帮助。

使用脚本,您可以使用一行代码来完成:

$ git merge-associate Old/Path/Original.txt :1:New/Path/Renamed.txt :3:New/Path/Renamed.txt
Run Code Online (Sandbox Code Playgroud)

git merge-file支持的:stage:filepath语法相同,无需git show :1:New/Path/Renamed.txt > 1.txt; git show :3:New/Path/Renamed.txt > 3.txt在 Git 常见问题解答中描述的所有大惊小怪。