tags:

views:

101

answers:

2

What is the correct way to make the remote branches/tags that exist after a git-svn init/git-svn fetch into local Git branches/tags before pushing to my remote Git repo and abandoning SVN altogether.

I have:

  • Run git svn init
  • Updated the svn-remote "svn" section of my .git/config file to the following:

    url = file:///Users/Developers/git_transition/svn_repo
    fetch = cascade/trunk:refs/remotes/svn/trunk
    branches = cascade/branches/{5.0GA_CLEANUP,drag-n-drop-def-builder,help-text,hib-annotations,hibernate-annotations,image-editor,ldapconfig,liquibase,move-rename-prototype,progress-bar,progress-bar2,quartz-upgrade,recyclebin,rendering_metrics,shuttle_upgrade,spring3,web-services-no-nuller}:refs/remotes/svn/*
    branches = cascade/branches/{6.x,5.x,4.x,3.x,archive}/*:refs/remotes/svn/*
    tags = cascade/tags/{3.7.x,4.x,5.x,6.x,old-releases}/*:refs/remotes/svn/tags/*
    
  • Run git svn fetch

Does git-svn clone do something beyond init/fetch that turns these branches/tags into local ones?

I tried the advice on Pro Git but there was nothing in the .git/refs/remotes/svn/ directory except the empty 6.x, 5.x, 4.x, 3.x, tags, and archive directories. I did verify that the remote branches are there with git branch -r.

Someone suggested that I needed to systematically checkout all of the remote branches as local ones: git checkout -b <local_branch_name> <svn_remote_branch_name> but I haven't gotten a definitive answer anywhere.

I have been able to conver the tags by using this script:

git for-each-ref --format="%(refname)" refs/remotes/svn/tags/6.x |
grep -v @ | while read tag; do GIT_COMMITTER_DATE="$(git log -1
--pretty=format:"%ad" "$tag")" GIT_COMMITTER_EMAIL="$(git log -1
--pretty=format:"%ce" "$tag")" GIT_COMMITTER_NAME="$(git log -1
--pretty=format:"%cn" "$tag")" git tag -m "$(git log -1
--pretty=format:"%s%n%b" "$tag")" ${tag#refs/remotes/svn/tags/6.x/}
"$tag"; done

for each of the tags folders.

A: 

For a one-shot operation like this, before leaving behind a SVN repo, I like to clone it using the ruby script svn2git

=== Examples

Say I have this code in 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 will go through the commit history to build a new git repo.
It will import all branches and tags as remote svn branches, whereas what you really want is git-native local branches and git tag objects.
So after importing this project I'll get:

  $ 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 ]

After svn2git is done with your project, you'll get this instead:

  $ 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
VonC
Thanks, I looked at svn2git but didn't see an easy way to configure it to look for branches/tags in all the places that I mentioned in my config. What underlying commands does svn2git use to turn remote branches into local ones?
Bradley
@Bradley: any remote svn branch will be created as a local Git branch after that script is run. The idea is not using a 'git-svn' clone, but making a *new* Git repo cloning the svn repo through the script. Leave your current Git repo (from the git-svn clone) aside.
VonC
Am I able to specify the varied branch/tag locations in the SVN repo that I mentioned in my .git/config file when running the script.
Bradley
A: 

According to an answer on Git mailing list, I don't need to convert these branches into local ones before pushing them to my remote repo. I just need to do:

git push <remote_git_repo_name> svn/<branch-name>:refs/heads/<branch-name>
Bradley