不带历史记录的 Git 拉取

3
我创建了远程代码库的本地副本。由于一些旧的坏提交数据造成麻烦,我不得不重写(过滤-分支)本地代码库历史记录。因此,现在我有一个远程代码库的克隆版本,除了提交哈希值都已经改变。
是否有任何方法让本地代码库仍然可以与远程代码库配合,以便从远程代码库中拉取未来的提交?它永远不会被推送,所以这不是问题。如果我运行git pull,则尝试拉取其整个原始历史记录,这是不需要的,并且会重新损坏本地代码库。

那么,这是糟糕的提交数据,但您仍然希望从上游接收更新,但您不想推送“好”的提交数据?您能否更详细地解释一下您的情况?如果您从未推送过,为什么历史记录会如此糟糕以至于需要重写它? - Will Palmer
我无法控制远程仓库,它是一个公共项目。维护它的人因某些原因不希望修复不良历史记录。一些旧提交中存在无效的名称/电子邮件,在我想将项目推送到新的远程时会引起问题。 - Ryan
适当的应对过时的名称/电子邮件的方法是使用mailmap文件,而不是伪造历史记录。如果可以避免,几乎永远不应该重写历史记录。 - Will Palmer
1个回答

2
如果你只关心拉取最新内容,那么可以这样做:获取远程仓库的内容,然后找到与本地最新提交相匹配的远程提交。使用 -s ours 标志(设置 ours 策略)将该远程提交合并到本地提交中。这将产生一个合并提交,将两个历史记录连接在一起,同时仅使用本地历史记录中的树(因此不会出现合并冲突)。
有了这个合并提交,你现在可以安全地从远程仓库执行 git pull 命令,它只会尝试合并比你刚创建的虚拟合并更新的提交。
请注意,你仍然需要保留整个远程仓库的历史记录,并且它将作为虚拟合并的第二个父提交而可访问。但它不会影响你的本地树。

谢谢您提供的信息。您能否详细解释一下实际的合并过程/命令?我在git方面经验不是很丰富,也从未进行过这样的合并。 - Ryan
@Ryan:一旦你确定了与本地最新提交相匹配的远程提交,那么只需要执行 git merge -s ours $SHA1 即可(其中 $SHA1 是远程提交的哈希值)。 - Lily Ballard
谢谢您提供的信息 :) 您提到远程仓库的历史记录需要保留为第二个父级。这是否意味着我仍然无法将重写/合并后的本地代码推送到自己的远程仓库? - Ryan
@Ryan:没错,你不能把代码推送到公共仓库,否则会将你的奇怪历史记录暴露给外界。我的意思是,如果你想的话,你是可以推送的,但最好不要与其他人分享。我建议只在需要同步多个本地仓库副本(例如在不同的机器上)时才使用此类推送。 - Lily Ballard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接