如何导入svn分支和标签到git-svn?
我有一个中心的SVN仓库,我必须承诺,但是我对git充满热情(就像我认识的任何其他开发人员一样)。 案件众所周知。
然后我读了一下git-svn并试了一下。 由于我不需要完整的历史,仅仅两个月左右,我就这样做了:
git svn clone -r 34000 -s https://svn.ourdomain.com/svn/repos/Project/SubProject
子项目像往常一样,有子目录trunk
, tags
和branches
。 大。
然后,为了得到最后的修订,我做了
git svn rebase
稍后有些下载,很好。 最后一次修订,日志等。好的,现在我将切换到我的function分支。
$ git branch
* master
$ git branch -r
trunk
$ git branch -a
* master
remotes/trunk
问题是:我的分支在哪里? 我做错了什么? 我应该怎么做才能让我的分支机构在新的git回购?
git-svn,无论我在哪里阅读,都明智地处理分支和标签,但行为不是我所期望的。 谢谢!
编辑 :我刚刚发现, git svn fetch
将做到这一点。 但它会得到所有修订,这是我不喜欢的东西。
你需要几个步骤。
-
提供适当的树干,分支机构和标签文件夹名称和提取svn回购:
git svn init -t tags -b branches -T trunk https://mysvn.com/svnrepo git svn fetch
-
由于svn中的标签是真正的分支,所以从标签分支创buildgit标签:
git for-each-ref --format="%(refname:short) %(objectname)" refs/remotes/tags | cut -d / -f 3- | while read ref do echo git tag -a $ref -m 'import tag from svn' done
-
删除标签分支
git for-each-ref --format="%(refname:short)" refs/remotes/tags | cut -d / -f 2- | while read ref do echo git branch -rd $ref done
-
由于上一步标记的标签指向提交“创build标签”,我们需要派生“真实”标签,即“创build标签”提交的父项。
git for-each-ref --format="%(refname:short)" refs/tags | while read ref do tag=`echo $ref | sed 's/_/./g'` # give tags a new name echo $ref -\> $tag git tag -a $tag `git rev-list -2 $ref | tail -1` -m "proper svn tag" done
-
我们现在要做的就是删除旧的标签。
这在Vanuan的答案上面,但它保留了新的git
标签中的原始svn
标签的消息 。
$ git for-each-ref --format="%(refname:short) %(objectname)" refs/remotes/tags \ | while read BRANCH REF do TAG_NAME=${BRANCH#*/} BODY="$(git log -1 --format=format:%B $REF)" echo "ref=$REF parent=$(git rev-parse $REF^) tagname=$TAG_NAME body=$BODY" >&2 git tag -a -m "$BODY" $TAG_NAME $REF^ &&\ git branch -r -d $BRANCH done
这是上面的nicolai.rostov的答案相同,但我只是改变refs/remotes/tags
的refs/remotes/origin/tags
refspath我使用git版本2.1.1
到cygwin
terminal。
$ git for-each-ref --format="%(refname:short) %(objectname)" refs/remotes/origin/tags \ | while read BRANCH REF do TAG_NAME=${BRANCH#*/} BODY="$(git log -1 --format=format:%B $REF)" echo "ref=$REF parent=$(git rev-parse $REF^) tagname=$TAG_NAME body=$BODY" >&2 git tag -a -m "$BODY" $TAG_NAME $REF^ &&\ git branch -r -d $BRANCH done
你说你没有在你的结帐分行。
这可能是一个问题,您的SVN回购的布局。
“标准布局”是:
branches/
tags/
trunk/
如果你有这样的布局:
branches/user1/
branches/user2/
然后,当你做git svn fetch / clone的时候,你会失去你的分支。
要解决这个问题,你应该给出这个论点
--branches=branches/*/*
git clone。
如果你想在从svn导入后做一个git分支时看到你的分支,你应该使用ruby脚本svn2git(和git2svn)
这比git svn clone更好,因为如果你在svn中有这样的代码:
trunk ... branches 1.x 2.x tags 1.0.0 1.0.1 1.0.2 1.1.0 2.0.0
git-svn
将通过提交历史来构build一个新的git仓库。
它会导入所有分支和标签作为远程SVN分支,而你真正想要的是git-native本地分支和git标签对象。 所以导入这个项目后,你会得到:
$ git branch * master $ git branch -a * master 1.x 2.x tags/1.0.0 tags/1.0.1 tags/1.0.2 tags/1.1.0 tags/2.0.0 trunk $ git tag -l [ empty ]
svn2git
完成你的项目后,你会得到这个:
$ git branch * master 1.x 2.x $ git tag -l 1.0.0 1.0.1 1.0.2 1.1.0 2.0.0
我有同样的问题 – 我指定修订时,标签和分支丢失:
$ git svn clone -r 34000 -s https://...
修复是指定一个修订范围, -r 34000:HEAD
:
$ git svn clone -r 34000:HEAD -s https://...
git邮件列表给了我提示。