5

我有一个扁平的 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我认为这是因为托管存储库的服务器使用的是旧版本的颠覆。我无法控制服务器,因此无法执行更新。

我也尝试过使用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 存储库变成 git 存储库。希望有人可以帮助我,或者指出我正确的方向。从未意识到将这个简单的 repo 转移到 git 会如此困难!

谢谢

4

3 回答 3

3

问题在于svn2git' 的--rootistrunk论点。取而代之的是,试试这个:

svn2git svn+ssh://user@svn.example.com/projects/my_repo --trunk / --notags --nobranches --authors users.txt --verbose
于 2014-10-29T11:55:18.560 回答
2

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

初始化空 git dir 并给出 svn 存储库路径以及主干、标签和早午餐的相对路径。就我而言,它是 / 因为我没有这些。

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

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

检查 git 配置是否正常。类型

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 中工作,你需要不断地同步 svn 和 git。要做到这一点,请键入:

8. git svn rebase
9. git push origin master 
于 2016-11-25T12:46:12.583 回答
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
于 2019-09-05T09:08:40.073 回答