我知道git-svn并使用它将SVN存储库迁移到Git中.
有一个回购我有一个特定的要求,我找不到解决方案.该SVN repo包含多个实际项目作为子目录:
trunk/
project1/
project2/
project3/
branches/
branch1/
project1/
project3/
project2/
...
Run Code Online (Sandbox Code Playgroud)
等等...
我想要做的是在git中自己的repo中导入这些"子项目" - 显然,保留修订历史,分支,提交消息,标签等.
我可以使用--ignore-paths和--include-paths切换到一次只拉出其中一个子项目,但它们仍然会出现在相应的project1子目录下.我真正想要的是project在每个分支(包括主干)的根目录中的内容.
有没有办法做到这一点?
我找到了解决方案.它不是那么简单git svn clone,但也不是太难.所以,这就是我所做的(比如,project1在问题的场景中):
project1git clone git@git.server.com:group/project1.gitcd project1git 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/*
Run Code Online (Sandbox Code Playgroud)
我现在需要做的就是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/*
Run Code Online (Sandbox Code Playgroud)现在你可以 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
Run Code Online (Sandbox Code Playgroud)最后将它全部推送到遥控器:
git push --all origin
git push --tags origin
Run Code Online (Sandbox Code Playgroud)现在,如果您克隆您的仓库,您将获得project1克隆仓库的根目录中的内容- 正是我正在寻找的内容.