如何适用个混贴从一个储存库的另一个?
-
06-09-2019 - |
题
我有两个资料库,一个是主要的回购,用于图书馆,另一个项目使用,图书馆。
如果我做了一个修复的,在服从项目,我想一个简单的方法来适用,后贴上游。
该文件的位置是不同的,在每个储存库中。
- 主要的回购:
www.playdar.org/static/playdar.js
- 项目:
playlick.com/lib/playdar.js
我试图使用 git format-patch -- lib/playdar.js
在playlick项目,然后 git am
在主playdar回购协议,但不同的文件的地点的补丁文件提出了一个错误。
是有一个简单的方法来适用的贴从给提交给定文件的另一个任意文件其他地方?
积分么,如果你想要的文件适用贴片是不是在个混库?
解决方案
如果手工编辑补丁文件是出的问题或不可行,这可以与标准的选择(可提供 git apply
, git format-patch
和GNU patch
).
-p<n>
删除n
领导目录中的路径贴。后处理
-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/'
其他提示
贴片生产 git format-patch
只是一个简单文本的文件-你可以编辑的差异头,使它修改一条不同的道路。
因此,举例来说这会产生这样的事情:
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"
贴应该是可读通过的标准GNU修补用的人没有 git
-但是不要跑 format-patch
与 -M
, -C
等等。选项产生重命名增补程序中那种情况下,因为对他们的支持不是普遍的。
假定这两个项目都导,这听起来像这样 子 将是非常适合你。此允许个混项目的动态链接到另一个git项目,基本上烤个混回购的权利在另一个混帐回购协议,这两个具有自己独特的生活。
换句话说,添加"主要的回购协议"作为一个模块中的"项目"。只要你承诺/推动新的东西在"主要的回购协议",你只是 git pull
他们回到"项目"。
来完成 亨里克的答案, 和去的奖励点
什么如果你想要的文件适用贴片是不是在个混库?
如果你有访问的目录的文件的候选人贴来自一个内容代码你可以先把这棵树的目录/文件变成一个混帐库本身!('git init
':一个版本库只需一个.git内的一个根本目录后,所有)。
然后你会设置,回购作为一个模块为你的主要项目。
你可以添加一个新的远程和拉。 文章中有详细信息。
$ cd <path-to-repoB>
$ git remote add repoA <git-URL-for-repoA>
$ git pull repoA
你可以只删除(重新命名)暂时的主要仓库。
cd to/main/project
mv .git .git_
cd to/sub/project
git apply patchname
cd -
mv .git_ .git
使用 --relative
选择 format-patch
可以改善的抽象(隐藏不相关的详细信息存储库,从而修补程序产生的)。
[repository-with-changes]
git format-patch --relative=(path-to-library) (base-commit-for-patch) ## 'HEAD~1'
我已经找到了 --3way
选项,以申请时需要的补(避免 does not exist in index
错误)--你的里程可能会有所不同。使用 --directory=(...)
是只可能必要的,如果你的目标的道路不是根的仓库。
[repository-to-update]
git am --3way --directory=(path-to-library) (patch-file)
format-patch
将创造一个补丁文件承诺的当前支,因为'基地'.该文件
--relative
选项似乎是 失踪在某些情况下, 但它似乎反正工作(为的版本2.7.4).