我们有两个Subversion存储库,每个存储库都有一个项目.所以:
svn://server/svn/project_a
svn://server/svn/project_b
Run Code Online (Sandbox Code Playgroud)
它们是单独的项目,位于具有完全独立的提交历史的单独存储库中.项目A有r1, r2, ... r100,项目B有r1, r2, ... r400
我们最终希望将这两个SVN存储库合并到一个Git存储库中.无论合并是在Git中进行,还是应该先在第三个临时SVN存储库中进行,我们最终都希望看到:
git://server/svn/projects/
Run Code Online (Sandbox Code Playgroud)
这是一个包含项目A和项目B的存储库.它们将存储在单独的文件夹中,例如:
git://server/svn/projects/project_a
git://server/svn/projects/project_b
Run Code Online (Sandbox Code Playgroud)
所以不会有任何"合并"两者的冲突.我们能够完美地使用这个答案将单个SVN项目转移到单个Git项目中,并包含提交历史记录.
我们想将两个SVN项目A和B合并到一个Git存储库中,但我们希望按日期合并提交.即:
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 ...
Run Code Online (Sandbox Code Playgroud)
这可能吗?我们应该将两个SVN存储库合并为一个,然后导入Git吗?或者更容易将它们分开,并在Git导入期间执行合并?
所以我尝试了Craig的方法,但这最终让我在组合存储库上留下了一些不尽如人意的历史.我发现将所有svn repos结帐到单独的git,然后将它们分支在一起创造了一个很好的历史,三个分支相遇.
首先,您要执行"authors"步骤来创建authors.txt:
someguy = Some Guy <someguy@yourcompany.com>
...
(no author) = no_author <no_author@no_author>
Run Code Online (Sandbox Code Playgroud)
现在你必须使用git检查所有svn repos:
mkdir proja projb projc ...
Run Code Online (Sandbox Code Playgroud)
现在,您必须为每个项目重复以下操作,并且由于您的存储库可能不是一个单独的文件夹,请执行额外的提交:
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"
Run Code Online (Sandbox Code Playgroud)
然后我去制作了我的新组合仓库,其中我为每个子项目使用了不同的分支:
mkdir ../superproj
cd ../supeproj
git init
git commit --allow-empty #so that we have a master branch
git branch proja projb projc...
Run Code Online (Sandbox Code Playgroud)
每个子项目都需要重复以下步骤:
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
Run Code Online (Sandbox Code Playgroud)
最后,您可以将整个事物组合到您的主人身上
git checkout master
git merge proja projb projc... #it all comes together
git push whereeveryouwant
Run Code Online (Sandbox Code Playgroud)
这就是我们最终所做的:
步骤 1:将 SVN 存储库合并为临时 SVN 存储库
这需要访问 SVN 存储库(而不是工作副本):
首先,为要合并的每个存储库创建转储文件:
svnadmin dump project_a > dumps/a.dmp
svnadmin dump project_b > dumps/b.dmp
svnadmin dump project_c > dumps/c.dmp
Run Code Online (Sandbox Code Playgroud)
然后,创建一个新的存储库来容纳合并的存储库:
svnadmin create svn-temp-project
Run Code Online (Sandbox Code Playgroud)
请注意,您必须将此存储库检出到工作副本中,并创建项目子目录,否则转储的加载将不起作用:
svn co file:///var/svn/svn-temp-project svn-temp-project-wc
cd svn-temp-project-wc
mkdir project_a
mkdir project_b
mkdir project_c
svn add . --force
svn ci -m "Added initial project directories."
Run Code Online (Sandbox Code Playgroud)
然后,您可以将每个单独的转储文件加载到其自己的特定(!!)项目目录中:
svnadmin load svn-temp-project --parent-dir project_a < dumps/a.dmp
svnadmin load svn-temp-project --parent-dir project_b < dumps/b.dmp
svnadmin load svn-temp-project --parent-dir project_c < dumps/c.dmp
Run Code Online (Sandbox Code Playgroud)
您现在拥有一个 3 合并的 SVN 存储库。
步骤2:将3合并的SVN存储库迁移到Git存储库
以下步骤可以在本地计算机上执行 - 不需要在您的服务器上执行。
首先,创建一个authors.txt 文件,git-svn 可以使用该文件来确定每个提交的作者。我用了:
someguy = Some Guy <someguy@yourcompany.com>
...
(no author) = no_author <no_author@no_author>
Run Code Online (Sandbox Code Playgroud)
有了这个作者文件,您就可以:
cd projects/
mkdir my-git-repository
cd my-git-repository
git svn init https://svn.mycompany.com/svn/svn-temp-project --no-metadata
git config svn.authorsfile ../authors.txt
git svn fetch
Run Code Online (Sandbox Code Playgroud)
第 3 步:清理
此方法非常适合合并提交历史记录,但最终会得到类似 SVN 的目录:
repo/project_a/trunk
repo/project_a/branches
repo/project_a/tags
repo/project_b/trunk
repo/project_b/branches
repo/project_b/tags
...
Run Code Online (Sandbox Code Playgroud)
因此,在推送之前,您应该将所有标签/分支迁移到 Git。我们没有这样做。我们的标签没有必要保留,因为我们有其他来源来检索它们,并且我们没有这些项目的任何分支。
删除branches和tags目录后,我们将内容trunk/向下一级删除,因此所有内容都位于项目特定的“根”级别。
| 归档时间: |
|
| 查看次数: |
6656 次 |
| 最近记录: |