将本地svn repo转储转换为git

时间:2013-04-14 22:37:39

标签: git svn version-control svn2git

我搜索了相关的问题,但是找不到与我的具体情况相符的任何内容:我有一些来自SVN服务器的旧存储库档案,这些档案在几年前被删除了。它们是服务器上原始存储库结构的tarball。我想要做的是将它们转换为git存储库,作为未来工作/恢复项目的基础。我已经阅读了几个关于转换过程的教程,我想我可以找出作者转换,分支映射等,但他们都假设你有一个SVN服务器和一个存储库的URL。我是否需要安装和设置SVN服务器才能执行此转换,或者我是否可以通过某种方式在我的repo转储中指向git clonesvn2git(或其他工具)?

5 个答案:

答案 0 :(得分:27)

在本地安装subversion以便导入转储,然后使用git-svn包。

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

答案 1 :(得分:4)

检索所有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

答案 2 :(得分:2)

  1. 全部(?)svn - &gt; git转换器需要实时的Subversion存储库,
  2. 存储库的树拷贝不是转储,它通常是文件级备份。
  3. 你有:

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

答案 3 :(得分:0)

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

    svnadmin dump "repopath or url" > import.bkp
    
    git svn clone "back" 
    
  2. 转到克隆路径,然后打开git bash和 运行这些命令:

    git svn show-ignore > .gitignore
    
    git add .gitignore
    
    git commit -m "with message"
    
    git check in "git url"
    

答案 4 :(得分:0)

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