我知道git-svn并使用它将SVN存储库迁移到Git中.
有一个回购我有一个特定的要求,我找不到解决方案.该SVN repo包含多个实际项目作为子目录:
trunk/ project1/ project2/ project3/ branches/ branch1/ project1/ project3/ project2/ ...
等等...
我想要做的是在git中自己的repo中导入这些"子项目" - 显然,保留修订历史,分支,提交消息,标签等.
我可以使用--ignore-paths
和--include-paths
切换到一次只拉出其中一个子项目,但它们仍然会出现在相应的project1
子目录下.我真正想要的是project
在每个分支(包括主干)的根目录中的内容.
有没有办法做到这一点?
我找到了解决方案.它不是那么简单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
克隆仓库的根目录中的内容- 正是我正在寻找的内容.