如何导入svn分支和标签到git-svn?

我有一个中心的SVN仓库,我必须承诺,但是我对git充满热情(就像我认识的任何其他开发人员一样)。 案件众所周知。

然后我读了一下git-svn并试了一下。 由于我不需要完整的历史,仅仅两个月左右,我就这样做了:

git svn clone -r 34000 -s https://svn.ourdomain.com/svn/repos/Project/SubProject

子项目像往常一样,有子目录trunktagsbranches 。 大。

然后,为了得到最后的修订,我做了

git svn rebase

稍后有些下载,很好。 最后一次修订,日志等。好的,现在我将切换到我的function分支。

$ git branch
* master

$ git branch -r
trunk

$ git branch -a
* master
remotes/trunk

问题是:我的分支在哪里? 我做错了什么? 我应该怎么做才能让我的分支机构在新的git回购?

git-svn,无论我在哪里阅读,都明智地处理分支和标签,但行为不是我所期望的。 谢谢!

编辑 :我刚刚发现, git svn fetch将做到这一点。 但它会得到所有修订,这是我不喜欢的东西。

你需要几个步骤。

  1. 提供适当的树干,分支机构和标签文件夹名称和提取svn回购:

     git svn init -t tags -b branches -T trunk https://mysvn.com/svnrepo git svn fetch 
  2. 由于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 
  3. 删除标签分支

     git for-each-ref --format="%(refname:short)" refs/remotes/tags | cut -d / -f 2- | while read ref do echo git branch -rd $ref done 
  4. 由于上一步标记的标签指向提交“创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 
  5. 我们现在要做的就是删除旧的标签。

这在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/tagsrefs/remotes/origin/tags refspath我使用git版本2.1.1cygwinterminal。

 $ 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邮件列表给了我提示。