如何将Git补丁应用于具有不同名称和path的文件?

我有两个存储库。 其中之一是对文件./hello.test进行更改。 我提交更改并使用git format-patch -1 HEAD创build一个补丁。 现在,我有第二个存储库,其中包含一个文件,其内容与hello.test相同,但放置在不同的目录下: ./blue/red/hi.test 。 我如何去应用上述补丁到hi.test文件? 我试过git am --directory='blue/red' < patch_file但是当然抱怨这些文件的命名不一样(我以为Git不关心它?)。 我知道我可以编辑差异来应用到特定的文件,但我正在寻找一个命令解决scheme。

你可以使用git diff来创build补丁,然后使用patch工具来应用它,它允许你指定你想应用diff的文件。

例如:

 cd first-repo git diff HEAD^ -- hello.test > ~/patch_file cd ../second-repo patch -p1 blue/red/hi.test ~/patch_file 

有一个简单的解决scheme,不涉及手动补丁编辑或外部脚本。

在第一个仓库中(这也可能导出一系列的提交,如果你只想select一个提交,则使用-1 ):

 git format-patch --relative <committish> --stdout > ~/patch 

在第二个存储库中:

 git am --directory blue/red/ ~/patch 

而不是在git format-patch中使用--relative ,另一个解决scheme是在git am使用-p<n>选项从修补程序的path中剥离n目录,如类似问题的答案中所述 。

也可以运行没有--stdout git format-patch --relative <committish> ,它会生成一组.patch文件。 这些文件,然后可以直接馈送到git am git am --directory blue/red/ path/to/*.patch

用一个脚本来回答我自己的问题: https : //github.com/mprpic/apply-patch-to-file

它不会手动修改补丁文件,而是提示用户input目标文件,修改补丁,并将其应用于当前所在的补丁。