将git存储库迁移到现有SVN存储库的分支

时间:2015-03-20 10:49:00

标签: git svn

最近,我一直在为我的公司开发一个Java项目。对于这个项目,他们选择使用SVN作为版本控制系统。但是,在开始时,我没有任何访问此SVN存储库的权限。因此,我一直在我自己的计算机上本地工作,在这个存储库的一些快照上,这是由首席开发人员提供给我的。由于我对git有很多经验(并且没有使用SVN),我一直在使用git来跟踪我对项目所做的更改。

目前,现在是将我的更改集成到现有SVN存储库的时候了。根据首席开发人员的说法,我必须将我的更改推送到SVN存储库的个人分支,以便他可以在将更改合并到主分支之前检查我的更改。

实现这一目标的最佳策略是什么?从git生成一组与SVN兼容的补丁是否是一个好主意?这将允许我从SVN查看最新版本并逐步尝试应用我所做的每个git提交。

另一个想法是将我的git存储库导入本地SVN存储库,然后尝试将此本地SVN存储库迁移到远程SVN存储库的分支。但是,我不知道这是否可行。

非常感谢任何帮助!!

1 个答案:

答案 0 :(得分:0)

如果该项目有进一步工作的可能性,我强烈建议使用git-svn。这样你就可以在本地保留git的大部分功能(合并除外 - 仅限于/从svn转换),同时仍然通过svn进行协作。

步骤可能如下,但我是从内存写的,没有svn可以检查。

首先,克隆svn项目。 -s假定标准为./trunk ./branches/* ./tags结构:

git svn clone -s <path to SVN> sync_repo
cd sync_repo

现在我们需要找到你将要应用你的工作的git点。理想情况下,您应该知道svn修订版,团队负责人最初为您提供的快照,您可以使用该快照:

 git svn find-rev r<svn revision>
 git branch my_git_reintegration <SHA1 we've just found, otherwise svn/trunk or some other reasonable revision>

接下来,我们需要从您当地的git中提取您的更改:

git remote add my_origin <path to your original git repo>
git fetch my_origin

并在新分支的基础上修改您的更改:

git rebase my_git_reintegration my_origin/master 

如果您在选择my_reintegration点时很幸运,那么在rebase期间您应该没有合并冲突。在变基之后,我们将相应地移动my_reintegration

git push . HEAD:my_reintegration 

此时你有my_reintegration包含你的git更改,但可能在过时的svn提交之上。接下来,让我们创建一个新的svn分支,您将推动您的贡献。我假设你将分支干线:

git checkout origin/trunk 
git svn branch my_svn_integration_branch
#those might be not necessary, but just in case 
git svn fetch

现在让我们将原始更改重新定义到此分支并将其推送到svn:

git rebase origin/my_svn_integration_branch my_git_reintegration
#possibly resolve conflicts
#just for a safety, check the svn branch we target - should be my_svn_integration_branch
git svn info
#go!
git svn dcommit

此时您应该在svn的my_svn_integration_branch进行更改,您可以删除原始的git存储库并继续使用此存储库。