【问题标题】:Git cherry pick into a new subdirectoryGit 樱桃选择进入一个新的子目录
【发布时间】:2021-06-26 12:18:30
【问题描述】:
我经常不得不从旧项目 git cherry-pick 到新项目。新项目将所有文件托管在 /server/ 子目录中。这会抛出它认为文件应该是的所有樱桃选择,例如/path/to/project/myfile.php 而不是 /path/to/project/server/myfile.php
有没有办法用 Git 解决这个问题?
非常感谢。
【问题讨论】:
标签:
git
cherry-pick
git-cherry-pick
【解决方案1】:
如果旧项目的 git root 位于 /path/to/project_old 而新项目的 git root 位于 /path/to/project_new/server,则从一个项目到另一个项目的挑选很容易:
假设两者都是本地路径,您可以将 /path/to/project_old 作为远程添加到 /path/to/project_new/server(或直接从中克隆)并执行所有 git 命令,就好像 /path/to/project_old 将是一个 git 远程服务器:
希望这能解释这个想法:
cd /path/to/project_new
git clone /path/to/project_old server
cd server
git cherry-pick <commit-hash>
【解决方案2】:
因为精选是合并,Git 有时会自己解决这个问题。如果 Git 自己无法解决这个问题,您可以尝试调整重命名检测阈值级别:git cherry-pick -X find-renames=<em>value</em>。 value 可以用百分比表示,带有文字百分比字符,例如,50%(默认值)、75%(如果它正在查找实际上不存在的重命名,请收紧重命名查找有意义),25%(如果找不到重命名,则松开重命名查找)等等。或者,只要该值精确地表示为两位数,您就可以省略 % 字符:
git cherry-pick -X find-renames=25 <hash>
如果您的 Git 非常旧,find-renames 可能会拼写为 rename-threshold。请查阅您已安装的 Git 文档,特别是 git merge 的文档。
如果一直降低重命名阈值(至01;零仅表示“禁用”因此不起作用)没有帮助,不幸的是没有简单的方法来处理这个问题。不过,您可以将提交转换为补丁(例如,使用 git format-patch)并在生成的补丁中编辑路径名。