Git 多个遥控器上的不同历史记录

Git different history on multiple remotes

我正在使用两个远程服务器。

是否可以创建不同的历史起点?

例如:

Remote 1: commit1 -> commit2 -> commit3 -> commit4

Remote 2: commit3 -> commit4

在这种情况下,我希望 commit3 成为远程 2 上的历史起点。

如果您想在同一个本地存储库上执行此操作,则不能。

如果您克隆存储库两次,则可以。为第一个遥控器保留第一个克隆,第二个克隆将用于第二个遥控器。 在第二个克隆中,您需要重写历史记录:https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History

这是我唯一想到的解决方案。同一个存储库 (local/remote) 不能有不同的历史记录。

在您描述的情况下,Repo 2 是一个 "shallow" 存储库。如果你有 Repo 1

A -- B -- C -- D

然后你可以将 repo 2 创建为

git clone --mirror --depth=2 --no-single-branch file://localhost/path/to/repo1 repo2

现在 Repo 2 是

C -- D

在此 repo 中,您可以看到 C 有一个父级,并且您可以看到 B 的 SHA ID 被列为 C 的父级;但是提交 B 本身(及其历史记录)不存在。

我使用 mirror 因为您将其描述为第二个遥控器。所以这使得它裸露并将分支设置为本地分支而不是远程分支引用。您可以根据需要创建一个不是镜像的浅层存储库(有或没有 --bare)。真正的关键是 depth 参数。

默认情况下 depth 仅复制单个分支 并且 将存储库配置为仅在提取时更新该特定分支的引用。 no-single-branch 恢复映射所有引用的正常行为。也就是说,如果 Repo1 中有大量或复杂的历史记录,那么准确获取您想要包含的内容可能不像我在此处展示的那样容易。

请注意,如果您使用本地路径,depth将被忽略;这就是为什么我在上面使用 file:// url。

这绝对是一个特例。提交的身份对其完整历史进行编码(这是查看为什么 C 必须 "know" 其父 SHA ID 的一种方式),因此通常具有不同的历史意味着具有不同的提交(可能碰巧有Repo 1 中的 TREEs) 与 Repo 2 中的相似;所以他们不能作为一个单一的、连贯的本地仓库的遥控器共存。但在您只想排除某个点的最早历史的特定情况下,现代 git 提供了此解决方案。