将一个存储库历史记录的一部分重新设置到类似但不同的存储库之上

问题描述 投票:0回答:1

我们有几个存储库,我们称它们为 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 的人至少可以将我推向正确的方向。

git git-merge git-rebase git-lfs
1个回答
0
投票

看起来 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

用言语来说,

获取所有可通过

testing
访问但无法通过提交 ID
RA
访问的提交(这会留下
a
g
),并将这 7 个提交逐一重播到
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

© www.soinside.com 2019 - 2024. All rights reserved.