2012-10-12 203 views
3

我创建了一个远程仓库的本地副本。由于一些旧的错误提交数据导致麻烦,我不得不重写(过滤分支)本地回购历史记录。所以现在我有一个远程回购的克隆,除了提交哈希都是不同的。没有历史的Git pull

有没有办法让本地回购协议仍然可以与远程协同工作,以便从中提取未来的提交?它永远不会推动,这不是一个问题。如果我运行git pull,它会尝试将其全部原始历史记录拉出来,这是不需要的,并且会重新破坏本地回购。

+0

因此,这是错误的提交数据,并且您仍然希望从上游接收更新,但是您*不希望推送“良好”提交数据?你能解释一下你的情况吗?是什么让历史如此糟糕以至于如果你从不推动,你需要重写它? –

+0

我不控制远程回购,它是一个公共项目。维护它的人不希望由于某种原因修复不良历史。当我想将项目推送到新的远程设备时,这些无效的名称/电子邮件会导致一些旧的提交出现问题。 – Ryan

+0

对过时的名称/电子邮件的适当回应是使用邮件地图文件,而不是伪造历史记录。如果你能提供帮助,历史应该永远不会被重写。 –

回答

2

如果你关心的只是拉动,那么是的。你可以做的是获取远程仓库。然后确定远程回购中与您最新的本地提交相匹配的提交。然后将该远程提交合并到本地,并使用-s ours标志(设置ours策略)。这将产生一个将两个历史记录连接在一起的合并提交,同时只使用本地历史记录中的树(因此没有合并冲突)。

通过此合并,您现在可以安全地从远程存储库中获取git pull,并且它只会尝试合并提交中比您刚创建的虚拟合并更新的提交。

请注意,您仍然必须保留远程回购的整个历史记录,并且可以将其作为您的虚拟合并的第二个父级访问。但它不会影响你的本地树。

+0

感谢您的信息。你能解释一下实际的合并过程/命令吗?在git中不是很有经验,从来没有像这样合并过。 – Ryan

+0

@Ryan:一旦你确定了远程提交符合你最新的本地提交,就像'git merge -s我们的$ SHA1'(其中'$ SHA1'是远程提交)一样简单。 –

+0

谢谢你的信息:)你提到,远程回购的历史将不得不作为第二个父母。这是否意味着我仍然无法将我的重写/合并本地推到我自己的遥控器上? – Ryan