只有一个子目录的Svn到Git

时间:2016-01-05 10:45:36

标签: git svn git-svn

我知道git-svn并使用它将SVN存储库迁移到Git中。

有一个回购我有一个特定的要求,我无法找到解决方案。该SVN repo包含多个实际项目作为子目录:

trunk/
    project1/
    project2/
    project3/
branches/
    branch1/
        project1/
        project3/
        project2/
...

依旧......

我想要做的是导入这些"子项目"在git中自己的repo - 显然,保留修订历史,分支,提交消息,标签等。

我可以使用--ignore-paths--include-paths开关一次只拉出其中一个子项目,但它们仍然会显示在相应的project1等子目录下。我真正想要的是project的内容位于每个分支(包括主干)的根目录中。

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:6)

我找到了解决方案。它不像git svn clone那么简单,但并不太难。所以,这就是我所做的(比如问题中的project1):

  1. 在git服务器上为project1
  2. 创建一个空的repo
  3. 将空仓库克隆到我的本地机器上:
    git clone git@git.server.com:group/project1.git
  4. 进入那个空的回购工作目录:
    cd project1
  5. Init git svn repo:
    git svn init --stdlayout --no-metadata https://svn.server.com/group
  6. 现在,魔法来了。如果此时我运行git config --local --list,我会得到以下内容(仅显示相关行):

    svn-remote.svn.fetch=trunk:refs/remotes/trunk
    svn-remote.svn.branches=branches/*:refs/remotes/branches/*
    svn-remote.svn.tags=tags/*:refs/remotes/tags/*
    

    我现在需要做的就是git config --local --edit并在正确的位置添加project1

    svn-remote.svn.fetch=trunk/project1:refs/remotes/trunk
    svn-remote.svn.branches=branches/*/project1:refs/remotes/branches/*
    svn-remote.svn.tags=tags/*/project1:refs/remotes/tags/*
    
  7. 现在您可以git svn fetch

  8. 设置分支和标签:

    for branch in `git branch -r | grep "branches/" | sed 's/ branches\///'`; do
        git branch $branch refs/remotes/branches/$branch
    done
    
    for tag in `git branch -r | grep "tags/" | sed 's/ tags\///'`; do
        git tag -a -m"Converting SVN tags" $tag refs/remotes/tags/$tag
    done
    
  9. 最后把它全部推到遥控器上:

    git push --all origin
    git push --tags origin
    
  10. 现在,如果您克隆您的仓库,您将在克隆仓库的根目录中获得project1的内容 - 正是我所寻找的。

相关问题