git:将一个仓库中的commit提交给另一个仓库
我在本地机器上有一个repo1
和repo2
。 他们是非常相似的,但后者是某种其他分支( repo1
不再维护)。
/path/to/repo1 $ git log HEAD~5..HEAD~4 <some_sha> Add: Introduce feature X
如何将<some_sha>
的commit <some_sha>
repo1
应用于repo2
?
我需要准备一些补丁吗,还是可以在回购之间进行一些cherry-pick
?
如何做同样的,但提交的范围?
作为一个黑客,你可以尝试在GitTips页面的两个不同的仓库中修改比较提交的配方 ,即:
GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects \ git cherry-pick $(git --git-dir=../repo/.git rev-parse --verify <commit>)
其中../repo
是另一个存储库的path。
使用现代Git,您可以使用多个版本和修订范围与樱桃select 。
$(git --git-dir=../repo/.git rev-parse --verify <commit>)
在这里翻译<commit>
(例如HEAD
,或者v0.2
或者v0.2
,是您复制的第二个存储库中的值)转换为提交的SHA-1标识符。 如果你知道你想要select的SHA-1,那就没有必要了。
但是, 注意 Git可以跳过从源存储库复制对象,因为它不知道备用对象存储库只是一个操作。 您可能需要从第二个存储库复制对象:
GIT_ALTERNATE_OBJECT_DIRECTORIES=../repo/.git/objects git repack -a -d -f
这将从第二个存储库借用的对象放在原始存储库中
没有testing。
一个不那么hacky的解决scheme是遵循knittl的答案 :
- 转到第二个存储库,您想要复制提交,并使用
git format-patch
从提交中提交git format-patch
- 或者,将补丁(0001- *等)复制到存储库
- 使用
git am --3way
来应用补丁
你可能想要使用git format-patch
,然后把你的补丁应用到你的版本库。
/path/to/1 $ git format-patch sha1^..sha1 /path/to/1 $ cd /path/to/2 /path/to/2 $ git am -3 /path/to/1/0001-…-….patch
或者,在一行中:
/path/to/2 $ git --git-dir=/path/to/1/.git format-patch --stdout sha1^..sha1 | git am -3
如果您将第二个回购作为第一个回收(然后fetch
),您可以做cherry-pick
。
我写了一个小脚本来应用diff的diff输出diff https://github.com/raghakh/android-dev-scripts/commit/a57dcba727d271bf2116f981392b0dcbb22734d0