2013-10-24 23 views
2

说我有一个回购X:git“rebase”只有外部回购的几个提交?

<a very long history>-A-B-C-D-E 

而另一个人有一个回购Y:

<another very long history>-a-b-c-d-e-f-g-h-... 

我想 “变基” c-d我的回购协议,并得到:

<a very long history>-A-B-C-D-E-c'-d' 

其中c'是E plus diff(b..c),它的提交信息,作者日期,作者姓名和作者电子邮件地址与c完全相同,而d'是c'加diff(c..d) d。

我想要实现这一点,而不是从回购Y首先获取完整的<another very long history>-a-b-c-d-e分支。有没有插图?

+2

你可以问其他人向您发送补丁提交'C'和'd'(使用'git format-patch b..d') – knittl

+0

或樱桃挑选它 – phoet

+0

@phoet:樱桃采摘只在取得历史记录后才有效。 – knittl

回答

0

没有获取其他存储库的历史记录,我看不到另一个解决方案,而不是要求其他人通过邮件发送补丁。

请注意,如果她/他通过邮件发送,她/他仍然是提交的作者,但您是提交者!

+0

这有助于因为情况可能例如对7000修订版的repo分支进行版本1000和4000修改。不过,我想知道修订版本的哈希值是否已知(例如,在GitHub上看到),是否有办法从远程回购中获得它们的修补程序,而不会打扰作者? –

0

提取是必需的(git fetch --all),但您可以在远程ref上重新绑定。

比方说,你想变基在Y回购的分支“主”(Y是你git remote add Y http://url/to/Y/repo设置的名称):

git rebase Y/master 
2

肯定的是:做你的抓取--depth=3所以你只能提交bcd

你甚至不需要为这个简单的东西添加一个远程,更不用说克隆了。只要做到

git fetch --depth=3 u://r/l branch 
git cherry-pick FETCH_HEAD~2..FETCH_HEAD 

hvdpoints out,这样做深度的限制取标记你的仓库浅,这将禁止获取或从克隆。既然你没有真正发布浅历史(他们唯一的参考是FETCH_HEAD暂时的),你只需删除该文件与

rm .git/shallow # safe when no shallow histories are published 
+0

根据文档,'git fetch --depth'用于使用'git clone --depth'创建的仓库。但是,如果它也能在这里工作,那也是有道理的,在这种情况下,当然,这比我的答案简单得多。 – hvd

+0

@ hvd huh。它肯定会做文档所说的,但它也会执行上述操作。我认为克隆必须将'--depth'传递给'fetch',并且从来没有打扰过阅读它的文档。 – jthill

+2

我已经做了一些测试,我的答案不起作用。你会的。但是,它会将本地存储库标记为浅表。完成后,您需要删除'.git/shallow'文件。该文件的效果是,当提交的父项不存在时它不是错误,但有些操作不允许。完成后,不应该有父母不存在的任何可访问的提交,因此删除该文件应该是安全的。 – hvd