tags:

views:

509

answers:

3

I'm quite new to git and I'm trying to move a svn repository to git. I followed the guide below so now I have a git repo on my server
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/

So, if I do "git branch" git replies "* master" and if I do "git branch -r" i get a list of all the branches in the svn repository.

My last svn-checkins have been in one of the branches, but when I did the "git svn clone"-stuff my commits in that branch (they have not been merged into the trunk yet) are visible in my (git) master branch. What am I missing here?

Also, if I on my development machine do "git clone " I get the files alright. But if I do "git branch -r" I can only see the master branch and not the remote branches".

Since we're getting rid of the svn-repo all together I would like to have all the svn branches in the git-repo so that they can be accessed from the developer clients.

Again, I'm not a total git newbie but not far from it. So if there is something fundamental I'm missing here please tell me.

Update
After doing some RTFM (man git-svn) I solved the first problem with branch stuff present in the master branch

reset --hard remotes/trunk

Now the trunk and the master branch are the same. Now, next is to figure out how to get the branches from the development clients.

Update 2
I got it working by combining the url above and the url that Scott pointed to. So, from the beginning.

I first created an empty repository on the server, they are kept in /usr/local/git-repos on our server:

server> cd /usr/local/git-repos
server> mkdir my_project.git
server> cd my_project.git
server> git init

Then i cloned the svn-repository to my dev-machine (note, that on our svn server the "branches" dir is called "branch" witout the 's'):

dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project

Then some clean-up to get the tags and branches in order:

dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
dev> rm -Rf .git/refs/remotes/tags
dev> cp -Rf .git/refs/remotes/* .git/refs/heads/
dev> rm -Rf .git/refs/remotes

Now add my server as a remote repository:

dev> git remote add origin jorgen@<our_server>:/usr/local/git-repos/my_project.git

Finally, push all branches and tags up to the server:

dev> git push origin --all

Phew, now there you have it, now I can get rid of that svn-repo.

Update 3
Checkout ebneters post below for an easier way of doing it...

+4  A: 

There is a fairly detailed explanation on how to do a pretty good SVN import that explains how to convert the branches properly here:

http://progit.org/book/ch8-2.html

The short answer is to run this:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/
$ rm -Rf .git/refs/remotes

Hope that's helpful.

Scott Chacon
+2  A: 

Another good way to do this, just for the record, is to use svn2git — I'm in the middle of converting several rather large repositories and it has been a godsend. It automates all of the steps needed to take care of branches and convert svn tags to real git tags.

ebneter
Ah, that would have saved me alot of work. But hey, at least I know more about git now than before... :)
Jörgen Lundberg
A: 

Scott's solution didn't work for me. I suspect something may have changed in a recent version of git-svn since he posted that (and since the linked book was written), as it seems to aggressively garbage-collect as soon as the clone is complete. But this is just a guess as to why it didn't work. I'm using git 1.6.5.6.

Specifically, my .git/refs/remotes directory was completely empty except for a tags directory, which was also empty. So there is nothing I can copy to make it right.

After some poking around, I was able to fix this by checking the file .git/packed-refs and doing search-and-replace on the following (in this order):

refs/remotes/tags => refs/tags
refs/remotes => refs/heads

If your editor is vim, you can do it with these two commands:

:%s/refs\/remotes\/tags/refs\/tags/g
:%s/refs\/remotes/refs\/heads/g

svn2git 1.3.1 also did not produce a usable result for me (did not import any commits after a certain point several months ago, and branches all showed the same commits). For now I have given up on svn2git and have had the most success using git-svn combined with the above.

Wishful thinking: sure would be nice if git-svn simply added a command like 'abandon' or 'migrate' that would automate this process in a future-proof way.

David