你能举个例子,我如何添加旧svn的路径并从中创建一个git文件夹,其中包含整个历史记录和所有分支/标签?
我发现this site值得一试吗?它使用svnpull
,我的系统上不能使用repopuller
代替吗?
我用
安装了reposurgeonapt-get install --no-install-recommends xmlto asciidoc unp
wget http://www.catb.org/~esr/reposurgeon/reposurgeon-3.7.tar.gz
unp reposurgeon-3.7.tar.gz
cd reposurgeon-3.7
make
make install
(我会在没有建议的情况下安装,因为这里不需要大约700MB)
答案 0 :(得分:2)
该网站似乎有点过时了。
现在svnpull被repopuller取代了。如果你在同一台服务器上,你也不需要它。
我改编了剧本:
nano /usr/local/sbin/reposurgeon-convert-svn2git
并输入:
#!/bin/bash
PROJECT=myproject
svnrepo=svn+ssh://rubo77@myserver.de/var/svn-repos/$PROJECT
# or something like svnrepo=https://svn.origo.ethz.ch/$PROJECT
gitrepo=/tmp/$PROJECT-git
cd /tmp
# start over with:
#rm $PROJECT-mirror/ $PROJECT-git/ -Rf
echo
echo pull/copy the repository...
#repopuller $svnrepo
# or copy it if it is on the same server:
cp -av /var/svn-repos/$PROJECT /tmp/$PROJECT-mirror
echo
echo start conversion...
reposurgeon <<EOF
read /tmp/$PROJECT-mirror
prefer git
edit
references lift
rebuild $gitrepo
EOF
echo ...finished
# now filter out all falsly generated .gitignore files:
cd $gitrepo/
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch $(find . -name .gitignore|xargs )" \
--prune-empty --tag-name-filter cat -- --all
我使用 filter-branch 过滤掉github has documented之类的.gitignore文件,否则,他们会在所有代码中创建提交(请参阅下面的注释)。完成后,您必须创建一个新的.gitignore文件。
这可能需要一段时间,因此您应该在tmux
或screen
内启动
tmux
bash /usr/local/sbin/reposurgeon-convert-svn2git
请注意,所有标签都符合git。
我收到了错误
reposurgeon% reposurgeon: exporting...fatal: Branch name doesn't conform to GIT standards: refs/tags/version 3.6.2
所以我清理了svn存储库并删除了这个分支,因此所有标记和分支都符合:
svn rm "$svnrepo/tags/version 3.6.2"
并使用此脚本从所有历史记录中删除它: How do I remove an SVN tag completely that contains spaces?
然后我开始使用脚本:
rm $PROJECT-mirror/ $PROJECT-git/ -Rf
bash /usr/local/sbin/reposurgeon-convert-svn2git
注意:强>
在不删除.gitignore
文件的情况下,git与SVN中的内容完全相同除了一件事:所有标记在日期中在确切日期排序他们被标记,而不是他们开始广告的提交。似乎在转换过程中将.gitignore
文件添加到每个分支和标记中,但该.gitignore文件导致在这些标记内部提交标记创建的时间戳。
新标签没问题,它们出现在它们所属的修订版中。 (见Convert an SVN repository to git with reposurgeon without creating .gitignore files?)