如何导入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到cygwinterminal。 
 $ 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邮件列表给了我提示。