重写提交历史后更新子模块
Update submodule after rewriting commit history
所以这是你需要知道的:
- Repo A 是一个大型遗留 repo,在其他几个项目中用作 GitHub Enterprise 上的子模块。
- 在将 Repo A 迁移到 GitLab 时,我们发现历史深处的一些提交的数据已损坏并导致迁移失败。
- 为了删除这些损坏的文件,我们不得不围绕损坏的提交重写 git 历史记录。
- Repo B 使用 Repo A 作为子模块。
我一直在尝试通过执行以下操作来更新 Repo B:
- 从 GitLab 克隆 Repo B
- 更新 .gitmodules 中的路径以指向 Repo A
的新 (GitLab) 位置
git submodule init
- 确认 Repo A 的 url 是正确的并指向新的 (GitLab) Repo A
cd repo-b/repo-a
git checkout $hash
其中 $hash
与我们过去指向的 Repo A 中的提交完全相同,但使用新哈希,因为历史已被重写。
我不断收到此错误:
fatal: reference is not a tree: 01b517847508dd5942887950e4a5ab1468bb21b4
我不知道我做错了什么,every answer I've seen 似乎暗示我 应该 能够检查子模块中的特定哈希并且然后将更改提交到 repo。
另外,为了澄清,我做了确认我的散列是正确的并且通过在新的 (GitLab) Repo A 中检查它存在,所以它就在那里。
我找到了解决办法!我无法解释 为什么 它有效,但它修复了错误。
我之前曾在第 3 步和第 5 步之间使用 git submodule update
尝试过此操作,但似乎没有用。然而:
git submodule init
git submodule update --checkout
实际上是否允许哈希校验在子模块中成功。
所以这是你需要知道的:
- Repo A 是一个大型遗留 repo,在其他几个项目中用作 GitHub Enterprise 上的子模块。
- 在将 Repo A 迁移到 GitLab 时,我们发现历史深处的一些提交的数据已损坏并导致迁移失败。
- 为了删除这些损坏的文件,我们不得不围绕损坏的提交重写 git 历史记录。
- Repo B 使用 Repo A 作为子模块。
我一直在尝试通过执行以下操作来更新 Repo B:
- 从 GitLab 克隆 Repo B
- 更新 .gitmodules 中的路径以指向 Repo A 的新 (GitLab) 位置
git submodule init
- 确认 Repo A 的 url 是正确的并指向新的 (GitLab) Repo A
cd repo-b/repo-a
git checkout $hash
其中$hash
与我们过去指向的 Repo A 中的提交完全相同,但使用新哈希,因为历史已被重写。
我不断收到此错误:
fatal: reference is not a tree: 01b517847508dd5942887950e4a5ab1468bb21b4
我不知道我做错了什么,every answer I've seen 似乎暗示我 应该 能够检查子模块中的特定哈希并且然后将更改提交到 repo。
另外,为了澄清,我做了确认我的散列是正确的并且通过在新的 (GitLab) Repo A 中检查它存在,所以它就在那里。
我找到了解决办法!我无法解释 为什么 它有效,但它修复了错误。
我之前曾在第 3 步和第 5 步之间使用 git submodule update
尝试过此操作,但似乎没有用。然而:
git submodule init
git submodule update --checkout
实际上是否允许哈希校验在子模块中成功。