如何将git补丁从一个存储库应用到另一个存储库?

Jam*_*are 77 git patch git-submodules git-patch

我有两个存储库,一个是库的主要仓库,另一个是使用该库的项目.

如果我修复了subservient项目,我想要一个简单的方法将该补丁应用到上游.

每个存储库中文件的位置都不同.

  • 主要回购: www.playdar.org/static/playdar.js
  • 项目: playlick.com/lib/playdar.js

我尝试git format-patch -- lib/playdar.js在playlick项目上使用,然后git am在主playdar repo上,但补丁文件中的不同文件位置引发了错误.

有没有一种简单的方法可以将给定文件中给定提交的补丁应用到其他地方的另一个任意文件?

对于奖励积分,如果您要应用补丁的文件不在git存储库中,该怎么办?

ver*_*nzt 105

如果手动编辑补丁文件是不可能或不可行的,这可以用标准的选项(可用来完成git apply,git format-patch而GNU patch).

  1. -p<n>n从修补程序中的路径中删除前导目录.

  2. 处理后-p,在应用之前--directory=<root>预先添加root到修补程序中的每个路径.

因此,对于您的示例,要获取最初打开static/playdar.js并应用它的补丁lib/playdar.js,您将运行:

$ cat patch_file | git am     \ 
          -p1                 \ # remove 1 leading directory ('static/')
         --directory='lib/'     # prepend 'lib/'
Run Code Online (Sandbox Code Playgroud)


ara*_*nid 37

生成的补丁git format-patch只是一个文本文件 - 您可以编辑差异标题,以便修改不同的路径.

所以例如它会产生这样的东西:

diff --git a/lib/playdar.js b/lib/playdar.js
index 1234567..89abcde
-- a/lib/playdar.js
++ b/lib/playdar.js
Run Code Online (Sandbox Code Playgroud)

所有你需要做的是改变lib/playdar.jsstatic/playdar.js,然后通过运行该补丁git am"

这个补丁应该是标准的GNU补丁程序为没有谁的人可读git---但不运行format-patch-M,-C等选项来生成重命名在这种情况下补丁,因为对他们的支持是不具有普遍性.