我们有几个存储库,我们称它们为 RA 和 RB,它们相似但不相同。 RA 是 SVN 存储库的导出,在导出过程中提取了一些库,而 RB 是相同的存储库,但库仍在存储库的历史记录中提交。 RA是使用子模块的尝试,但子模块的流程不太适合我们的工作流程。 RB 的最新提交仍然是我们将项目导出到 RA 的时间点。
RA-a-b-c-d-e-f-g...
RB-no new commits
现在我们正在尝试将自 RA 到 RB 以来发生的所有更改变基,以获得与之前相同的项目布局,即库只是代码的一部分。最大的警告是必须保留历史记录,否则合并确实可以正常工作。这看起来微不足道,特别是因为 RB 没有新的提交,所以理论上它们的起点是相同的,尽管它们的提交历史不同,但它们不共享任何 SHA。
RA-a-b-c-d-e-f-g...
| | | | | | |
V V V V V V V
RB-a-b-c-d-e-f-g...
我尝试过的是:
cd RB
git add remote remoteRA ../RA
git fetch --all
git lfs install
git lfs fetch --all
git rebase -X theirs --onto master <RB-HEAD-commit> <RA-HEAD-commit>
# Also tried the same but with git merge instead of rebase
我希望它几乎能正常工作,我遇到了一些小的合并冲突,例如库更改为子模块和一些冲突的子模块 SHA,但 git lfs 没有什么大问题和一些小问题,这些问题或多或少可以通过获取或 GIT_LFS_SKIP_SMUDGE=1。我本以为,既然历史已经“一成不变”,它会处理得更优雅一点,但这不是最大的问题。自从我们开始使用子模块以来,我最终得到了一堆额外的子模块文件夹,其中包含
<submodule-name>~<submodule-SHA>
,例如 Libs/LibraryOne~9d47f69c...
。在执行 rebase 时,git 似乎可以处理子模块,但我最终仍然会得到这个完全毁坏的历史记录,其中充满了错误命名的子模块文件夹。
我不确定如何继续。由于我要将子模块重新集成到具有历史记录的项目中,因此也许可以将库完全过滤掉,因为子模块是一种方法,然后再次将子模块与历史记录重新集成?那么问题就变成历史记录几乎毫无用处,因为我们不知道哪个提交有哪个子模块提交。
我之前描述的过程确实可以集成子模块,但是我们得到了大约。 35000 次提交,其中许多提交在每个已更改的库中都有重复,而不是我们之前在 SVN 中拥有的干净提交历史记录。因此,我最好按照描述的那样,将其重新设置为新导出 RB 的基础。
这似乎也很奇怪,因为
git merge --allow-unrelated-histories remoteRA/master
似乎是我打开的每一篇帖子的推荐方式,但我没有保存历史记录,这一切最终都作为一个提交......
希望比我更精通 git 的人至少可以将我推向正确的方向。
看起来 rebase 命令不太正确。目前尚不完全清楚
master
在您的问题中指的是什么,但我们可以通过使用您提供的提交 ID 来回避这个问题:
cd RB
git remote add remoteRA ../RA # Note "remote add" instead of "add remote"
git fetch --all
# For sanity purposes, create a new branch
git switch -c testing remoteRA/g # point "testing" to the current remote
# Now rewrite ONLY a through g
git rebase RA testing --onto RB
用言语来说,
获取所有可通过
访问但无法通过提交 IDtesting
访问的提交(这会留下RA
到a
),并将这 7 个提交逐一重播到g
上.RB
请注意,如果除了存储库名称之外,您还调用您的分支
RA
和 RB
,那么您可以在措辞中重申这一点,例如:
git rebase RA testing --onto <RB-HEAD-commit>
这里
testing
指向 <RA-HEAD-commit>
,所以如果你没有使用临时 testing
分支,它将是:
git rebase RA <RA-HEAD-commit> --onto <RB-HEAD-commit>
如果你像之前使用
--onto
那样重新排序,那么它会变成:
git rebase --onto <RB-HEAD-commit> RA <RA-HEAD-commit>
请注意,
RA
是a
的父级,因此与:相同
git rebase --onto <RB-HEAD-commit> a~1 <RA-HEAD-commit>
我怀疑你能否通过名称引用提交
RA
或 a~1
,除非你仍然有一个分支指向该提交。
旁注:根据问题的措辞,我猜您在变基期间不会发生冲突,在这种情况下,不需要使用
-X theirs
。