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

我有两个存储库,一个是图书馆的主要回购站,另一个是使用该图书馆的项目。

如果我在从属项目中修复了这个问题,我想要一个简单的方法把这个补丁应用到上游。

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

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

我尝试在playlick项目上使用git format-patch -- lib/playdar.js ,然后在主playdar回购站上进行git am ,但是修补程序文件中的不同文件位置引发了错误。

有没有一种简单的方法来将补丁从给定文件上的给定提交应用到别处的任意文件?

对于奖励积分,如果你想要应用补丁的文件不在git仓库中怎么办?

如果手动编辑补丁文件是不可行的,可以使用标准选项( git applygit format-patch和GNU patch )来完成。

  1. -p<n>从补丁中的path中删除n前导目录。

  2. 在处理-p ,– --directory=<root>在应用之前预先将root用于修补程序中的每个path。

因此,对于您的示例,要获取最初位于static/playdar.js并将其应用于lib/playdar.js ,您将运行:

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

git format-patch patch生成git format-patch只是一个文本文件 – 您可以编辑diff标头,以便修改不同的path。

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

 diff --git a/lib/playdar.js b/lib/playdar.js index 1234567..89abcde -- a/lib/playdar.js ++ b/lib/playdar.js 

所有你需要做的就是将lib/playdar.js改为static/playdar.js ,然后通过git am"运行补丁git am"

对于没有git人来说,这个补丁应该可以通过标准的GNU补丁工具读取,但是在这种情况下不要用-M-C等选项来运行format-patch来生成重命名补丁,因为对他们的支持不是普遍的。

假设这两个项目都是git项目,这听起来像子模块将是最适合你的。 这允许一个git项目dynamic地链接到另一个git项目,本质上是在另一个git仓库中烘焙一个git仓库,两者都有自己独特的生活。

换句话说,在“项目”中添加“主回购”作为子模块。 每当你在“main repo”中提交/推送新的东西,你只要git pull他们git pull回到“项目”。

为了完成Henrik的回答 ,并为了获得积分

如果你想要应用补丁的文件不在git仓库中怎么办?

如果你有权访问git仓库补丁文件的候选目录,那么你可以先将目录/文件树转换成git仓库本身! (' git init ':毕竟git仓库在根目录下只是一个.git)。
然后,您将该回购作为您的主项目的子模块。

您可以添加一个新的远程并从中拉出。 文章的细节。

 $ cd <path-to-repoB> $ git remote add repoA <git-URL-for-repoA> $ git pull repoA 

我认为子树是解决您的问题的最佳解决scheme

教程1

Tuorial 2

您可以暂时删除(重命名)主存储库。

 cd to/main/project mv .git .git_ cd to/sub/project git apply patchname cd - mv .git_ .git