我有一个平坦的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会很困难!
由于
答案 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