当前位置:  开发笔记 > 运维 > 正文

只有一个子目录的Svn到Git

如何解决《只有一个子目录的Svn到Git》经验,为你挑选了1个好方法。

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

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

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

等等...

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

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

有没有办法做到这一点?



1> Aleks G..:

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

    在git服务器上创建一个空的repo for project1

    将空仓库克隆到我的本地机器上:
    git clone git@git.server.com:group/project1.git

    进入那个空的repo工作目录:
    cd project1

    Init git svn repo:
    git svn init --stdlayout --no-metadata https://svn.server.com/group

    现在,这就是神奇的来源.如果此时我跑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/*
    

    现在你可以 git svn fetch

    设置分支和标签:

    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
    

    最后将它全部推送到遥控器:

    git push --all origin
    git push --tags origin
    

现在,如果您克隆您的仓库,您将获得project1克隆仓库的根目录中的内容- 正是我正在寻找的内容.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有