如何将平面svn repo迁移到git repo

时间:2014-04-04 19:47:39

标签: git svn version-control git-svn svn2git

我有一个平坦的svn存储库,如下所示:

my_repo/
├── file1.c
├── file2.c
├── file3.c
└── README

此repo没有分支或标记,我想要做的就是将其转换为git存储库并维护提交历史记录。

我试过了:

git svn clone --trunk=/ -A users.txt svn+ssh://user@svn.example.com/projects/my_repo dest_dir

然而,当我导航到dest_dir并执行git svn fetch时,我认为这会起作用,但它似乎无法获取任何内容。使用git log产生:

fatal: bad default revision 'HEAD'

如果我使用svn checkout svn+ssh://user@svn.example.com/projects/my_repo 它返回:

A    my_repo/file1.c
A    my_repo/file2.c
A    my_repo/file3.c
A    my_repo/README
Checked out revision 57.

因此存储库是活动且可访问的。

我尝试了各种工具,包括subgit,它给了我这个错误:svn: E170003: 'stat' not implemented我认为这是因为托管存储库的服务器使用旧版本的subversion。我对没有控制服务器,因此无法执行更新。

我也尝试使用命令

使用svn2git

svn2git svn+ssh://user@svn.example.com/projects/my_repo --rootistrunk -authors users.txt --verbose

但是这给了我另一个错误:

E: 'svn+ssh:/user@svn.example.com/projects/my_repo' is not a complete URL and a separate URL is not specified command failed

这让我很难过,我不知道为什么它不起作用。基本上我想知道如何在保持历史的同时将我的svn repo变成一个git repo。希望有人可以帮助我,或指出我正确的方向。从来没有意识到将这个简单的回购转移到git会很困难!

由于

3 个答案:

答案 0 :(得分:2)

问题在于svn2git的{​​{1}}参数。而不是那样,试试这个:

--rootistrunk

答案 1 :(得分:1)

我遇到了同样的问题。不是标准的svn存储库:没有主干,没有标签,没有早午餐。我检查了svn2git的所有可能选项,但没有成功。 因为svn2git只是git svn的ruby包装器,所以我直接尝试了git svn并且没关系。 这就是我所做的。

初始化空git dir并提供svn存储库路径以及trunk,tags和brunches的相对路径。在我的情况下它是/因为我没有任何这些。

1. git svn init http://svnmydomain.com/urlpart/projectname --trunk=/ --tags=/ --branches=/

如果svn repo受密码保护,你将不得不为上面的命令提供用户名和密码参数,但在大多数情况下,它不会起作用,因为它有点儿错误。而是在当前文件夹中svn checkout。 git svn将使用svn现金并且不会要求您输入密码。

检查git config是否正常。型

2. git config --list

你应该看到这个:

svn-remote.svn.url=http://svnmydomain.com/urlpart    
svn-remote.svn.fetch=urlpart/projectname:refs/remotes/origin/trunk
svn-remote.svn.branches=urlpart/projectname/*:refs/remotes/origin/*
svn-remote.svn.tags=urlpart/projectname/*:refs/remotes/origin/tags/*

如果git config不正确,请执行

手动修复
git config <key> <value>

现在当git config正常时你应该从svn获取数据并将其推送到git服务器

3. git svn fetch
4. git remote add origin git@gitdomain:url/gitproject.git
5. git add .
6. git commit -m "merge from svn"
7. git push origin master

如果有些人继续在svn中工作,你需要不断地与git同步svn。要做到这一点,请输入:

8. git svn rebase
9. git push origin master 

答案 2 :(得分:0)

在使用git v2.20.1之后,使用旧的“扁平” SVN存储库也遇到了相同的问题: (遵循http://www.sailmaker.co.uk/blog/2013/05/05/migrating-from-svn-to-git-preserving-branches-and-tags-3/上的食谱)

git svn init <SVN https URL> --stdlayout --prefix=svn/ -T /
git svn fetch --all