git - 将两个独立的 SVN 存储库 merge 为一个 Git 存储库

标签 git svn merge

我们有两个 Subversion 存储库,每个存储库都有一个项目。所以:

svn://server/svn/project_a
svn://server/svn/project_b

它们是独立的项目,位于独立的存储库中,具有完全独立的提交历史。项目 A 有 r1, r2, ... r100,项目 B 有 r1, r2, ... r400

我们最终希望将这两个 SVN 存储库 merge 为一个 Git 存储库。 merge 是可以在 Git 中进行,还是应该先在第三个临时 SVN 存储库中进行,我们最终希望看到:

git://server/svn/projects/

这是一个包含项目 A 和项目 B 的存储库。它们将存储在单独的文件夹中,例如:

git://server/svn/projects/project_a
git://server/svn/projects/project_b

因此“merge ”两者不会有任何冲突。我们能够使用 this answer完美地将单个 SVN 项目转换为单个 Git 项目,并包含提交历史记录。

我们想将我们的两个 SVN 项目 A 和 B merge 到一个 Git 存储库中,但我们希望按日期 merge 提交。即:

8b8dad: Project A, r1 (first commit in Git)
dbdffe: Project B, r1 (child of previous)
0ae7f7: Project B, r2 ...
615b51: Project A, r2 ...
916e59: Project A, r3 ...
85f241: Project B, r3 ...

这可能吗?我们是否应该将两个 SVN 存储库 merge 为一个,然后导入到 Git 中?还是将它们分开并在 Git 导入期间执行 merge 更容易?

最佳答案

所以我尝试了 Craig 的方法,但这最终让我对组合存储库的历史记录有些不满意。我发现将所有 svn 存储库 checkout 到单独的 git 存储库中,然后将它们分支在一起,形成了三个分支相遇的美好历史。

因此,首先执行“作者”步骤来创建 authors.txt:

someguy = Some Guy <someguy@yourcompany.com>
...
(no author) = no_author <no_author@no_author>

现在你必须使用 git 检查所有 svn 仓库:

mkdir proja projb projc ...

现在您必须为每个项目重复以下操作,并且由于您的存储库可能不是一个单独的文件夹,因此请执行额外的提交:

cd proja
git svn init https://svn.mycompany.com/svn/proja --no-metadata
git config svn.authorsfile ../authors.txt
git svn fetch

#here comes the additional part:
mkdir -p proja                  #proja/proja
git mv -k * proja               #move everything in there
git commit -m "subtree proja"

然后我创建了新的组合存储库,其中我为每个子项目使用了不同的分支:

mkdir ../superproj
cd ../supeproj
git init
git commit --allow-empty        #so that we have a master branch
git branch proja projb projc...

需要为每个子项目重复以下内容:

git checkout proja
git remote add proja_rm ../proja
git pull proja_rm              #probably add a branch (e.g. master)
git remote rm proja_rm         #cleanup

最后你可以将整个东西组合到你的 master 中

git checkout master
git merge proja projb projc...  #it all comes together
git push whereeveryouwant

关于git - 将两个独立的 SVN 存储库 merge 为一个 Git 存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16369603/

相关文章:

git - 来自 msysgit(也称为 Windows 上的 Git)的 MinGW 和来自 MinGW.org 的 MinGW 之间的区别

没有提交消息的 Git 提交

合并重命名文件夹时发生 SVN 树冲突

linux - 以前从 yum 安装时如何从源更新 subversion (svn)

svn - 你能强制 subversion 创建一个文件,然后忽略其中的内容吗?

Git "Cannot merge binary files"持续集成构建错误

R:合并data.table并填写NA

git - 使用 git 维护项目骨架的最佳方法

git - 忽略根目录下的所有文件,除了一些特定的文件、目录

svn - 将外部项目添加到颠覆存储库