我知道git-svn并使用它将SVN存储库迁移到Git中。
有一个回购我有一个特定的要求,我无法找到解决方案。该SVN repo包含多个实际项目作为子目录:
trunk/
project1/
project2/
project3/
branches/
branch1/
project1/
project3/
project2/
...
依旧......
我想要做的是导入这些"子项目"在git中自己的repo - 显然,保留修订历史,分支,提交消息,标签等。
我可以使用--ignore-paths
和--include-paths
开关一次只拉出其中一个子项目,但它们仍然会显示在相应的project1
等子目录下。我真正想要的是project
的内容位于每个分支(包括主干)的根目录中。
有办法做到这一点吗?
答案 0 :(得分:6)
我找到了解决方案。它不像git svn clone
那么简单,但并不太难。所以,这就是我所做的(比如问题中的project1
):
project1
git clone git@git.server.com:group/project1.git
cd project1
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
的内容 - 正是我所寻找的。 p>