将本地svn仓库转换为git

29

我搜索了相关问题,但没有找到与我的具体情况匹配的内容:我有一些旧的存储库归档,它们来自几年前被关闭的一个SVN服务器。 它们是服务器上原始存储库结构的tar包。 我想做的是将它们转换为git存储库,作为未来工作/恢复项目的基础。 我已经阅读了几篇有关转换过程的教程,我认为我可以弄清作者的转换、分支映射等,但它们都假设你有一个SVN服务器和存储库的url。 我需要安装和设置SVN服务器才能进行此转换吗,还是我可以让git clonesvn2git(或其他工具)指向我拥有的repo dump?


1
VisualSVN Server的标准版是免费的,所以有备用计划。 - Dialecticus
我认为安装原始的SVN服务器会比那个容易得多。 - R.. GitHub STOP HELPING ICE
5个回答

39

为了导入您的转储,请在本地安装Subversion,然后使用git-svn软件包。

您可以使用 git svn clone file:///path/to/svn/repo /path/to/empty/dir 命令。


1
我昨晚已经尝试过并且让它工作了,但这是正确的答案。谢谢并+1/接受!欢迎来到SO. :-) - R.. GitHub STOP HELPING ICE

9

检索所有Subversion贡献者的列表:

svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt

使用git-svn克隆Subversion存储库:

git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp

将svn:ignore属性转换为.gitignore:

cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'

将存储库推送到裸的git存储库

git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk

然后将临时仓库推送到新的裸仓库。
cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare

将“trunk”分支重命名为“master”:

cd ~/new-bare.git
git branch -m trunk master

清理分支和标签:

cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";
  git branch -D "tags/$ref";
done

参考资料:http://john.albin.net/git/convert-subversion-to-git


另请参阅如何从Subversion存储库中git-svn克隆最后n个修订版本?,其中描述了如何选择性地将svn克隆到git。 - Richard Chambers

2
  1. 所有的svn -> git转换器都需要实时的Subversion库,
  2. 树形复制库不是转储,而是通常的文件级备份。

您需要:

  1. 安装和配置任何Subversion服务器(如果您的转换器无法处理SVN的file:///协议,则不需要 - 只需解压tarball并使用svn客户端检查存储库)
  2. 了解git-svn
  3. 使用git-svn

0
  1. 在您的服务器上获取转储文件:

    svnadmin dump "存储库路径或URL" > import.bkp
    
    git svn clone "后备"
    
  2. 进入克隆路径,然后打开git bash并运行以下命令:

    git svn show-ignore > .gitignore
    
    git add .gitignore
    
    git commit -m "带消息"
    
    git check in "git url"
    

1
你能详细说明一下 git svn clone "back" 命令的作用吗?我不明白 svnadmin dump 和这个命令之间有什么关系?你是不是在使用 git svn clone 命令之前备份了 svn 仓库,以防出现问题? - John Zabroski

0

reposurgeon 工具支持将 SVN 转储文件直接(且非常快速地)转换为 Git 存储库。


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