svn to Git 只有一个子目录

Svn to Git of only one subdirectory

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

对于一个回购协议,我有一个特定的要求,但我找不到解决方案。该 SVN 存储库包含多个实际项目作为子目录:

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

等等...

我想要做的是将这些 "sub-projects" 中的每一个都导入到 git 自己的仓库中 - 显然,保留修订历史、分支、提交消息、标签等

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

有办法吗?

我找到了解决办法。它不像git svn clone那么简单,但也不是太难。所以,这就是我所做的(例如,对于问题场景中的 project1):

  1. 在 git 服务器上为 project1
  2. 创建一个空存储库
  3. 将空的 repo 克隆到我的本地机器上:
    git clone git@git.server.com:group/project1.git
  4. 进入那个空的 repo 工作目录:
    cd project1
  5. 初始化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
    

现在,如果您克隆您的存储库,您将在克隆存储库的根目录中获得 project1 的内容 - 正是我要找的内容。