如何将一个扁平的svn仓库迁移到git仓库

5

我有一个扁平的 SVN 代码库,它看起来像这样:

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

该存储库没有分支或标签,我要尝试的是将其转换为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'未实现,我认为这是因为托管存储库的服务器正在使用旧版本的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'不是完整的URL,也没有指定单独的URL,命令失败
这让我感到困惑,我不知道为什么它不起作用。基本上,我想知道如何在保留历史记录的同时将我的svn存储库转换为git存储库。希望有人能帮我或指点我方向。从没想到这么难将这个简单的存储库转换为git!
谢谢

你确定 git svn clone 没有出错吗?它应该是可以工作的。另外,在执行了 git svn clone 之后,如果你进入目录并运行 git svn fetch,会发生什么呢? - janos
你的SVN服务器确实相当老旧。考虑使用svnsync工具将所有SVN修订版本获取到本地机器,然后尝试将此本地存储库导入Git。 - vadishev
3个回答

3
问题出在svn2git--rootistrunk参数上。不要使用这个参数,可以尝试以下方法:
svn2git svn+ssh://user@svn.example.com/projects/my_repo --trunk / --notags --nobranches --authors users.txt --verbose

3

我遇到了同样的问题。这不是标准的svn仓库,没有主干、标签或分支。我尝试了svn2git的所有可能选项,但都没有成功。

由于svn2git只是git svn的ruby包装器,所以我直接尝试了git svn,结果可以正常工作。下面是我做的事情:

初始化一个空的git目录,并指定svn仓库路径以及主干、标签和分支的相对路径。在我的情况下,路径为“/”,因为我没有任何这些东西。

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 配置完成后,您应该从 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上工作,你需要不断地将svn与git同步。操作如下:

8. git svn rebase
9. git push origin master 

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接