Migrating a project from SVN to GIT
I assume that you have read Chapter 1 - and worked out an example all by yourself
Initial SVN Setup
I assume that in the past you have the same setup as discussed in Chapter 1: a central repository on a shared server, say
The big picture
Actually, this process involves several steps:
- Setup a proper SVN server. This is needed because SVN migration from files often fails.
- Clone the SVN repository into a regular (read: local) GIT repository. The GIT repository will have the complete history (like all local GIT repositories do), but other users won't be able to check out from THAT. Therefore:
- Create a bare GIT repository (the one that will be used to host the repository on the server), and push the local to the 'scheduled-to-be-remote' bare repository.
Setting up a proper SVN server
There are a couple of SVN-to-GIT migration tutorials out there, but when following most of them I ran into the same project: file-based repositories on Windows are considered semi-broken by Linux-Lovers and thus migrating them directly failed for me, each and every single time. Instead, I have come to the opinion that your best base is to first setup a proper SVN server, then migrate from there. A proper SVN server is a HTTP(S) based one, so we will do that first. In the following I will use the brilliant VisualSVN Server, which is free for non-commercial use. You can also setup a SVN server using XAMPP, though that might be slightly more involved. For now, we use the simple option.
Step 1: Download VisualSVN: go right ahead and install it. Default options should be fine. Once you start the server, you'll see something like the following:
Step 2: Create a VisualSVN user: right-click on the 'users' folder in the VisualSVN GUI and choose 'Create new user':
Step 3: Let VisualSVN serve your existing project: copy the complete existing archive (not a checkout, the
\\SERVER\SVN\SUPERSOMETHING directory!) to the VisualSVN repository
directory you choose during the installation. For my VisualSVN install, this is
H:\Repositories, so I copied the complete folder.
Step 4: Refresh VisualSVN repositories using the F5 key (or right-click on Repositories and 'Refresh').
Your project should now show up in the list of available repositories. In this example, I copied the SVN repository that holds this website. If you select
a project, you will see the repository URL, typically something of the form
Here, it is
Step 5: Grant your user access to the repository: right-click the repository and choose 'Properties'
Then click 'add' to add your user
That's it! Wasn't too bad so far, was it?
Cloning a SVN repository into a local GIT repository
Step 1: From now on we have to say 'good bye' to the TortoiseGIT GUI for a moment and stick with GUI bash. Create a working directory, then right click it and choose 'Git bash':
A GIT bash will popup:
Step 2: Now, create a local clone from SVN
From the GIT bash, run this command:
git svn clone https://YOURMACHINE/svn/YOURPROJECT/ --no-metadata --prefix=origin/
Note a couple of fine-points:
- Don't forget the trailing slash at the end of YOURPROJECT.
- I don't understand all of the options, but they work for me: in particular
- Do not use
--stdlayoutunless you have tried it before and know it works for you.
- Do use the
--prefix=origin/, otherwise you'll get strict warnings and things may not work for you
- Do not use
Note: this will take a long time. Even if your project is small, it takes noticeably longer than most other operations in GIT; if your project is large, then prepared to spend a couple of hours waiting for the process to finish. If I were you, I'd not touch the SVN repository while you do the import, either. Well, if you take a close look you'll see what it is that GIT actually does: it goes through the SVN log and checks out each and every revision individually, in order to reconstruct the history. No wonder this takes so long!
Pushing the local repository into a bare repository
As discussed in Chapter 1, 'bare repositories' are what you need if you intend to have one central repository that everybody uses to sync. So, now that we have a local repository, we need to push it to a bare one.
Note: In the following, I assume you are in a directory
/T/TEST and have just checked out
YOURPROJECT, so a subdirectory
Step 1: Create a new bare repository and initialize it. From GIT bash, run this:
git init --bare YOURPROJECT.git/
Remember that there is a naming convention that bare GIT repositories end with
.git. This command will create a subdirectory
YOURPROJECT.git in the local
directory, initialize it and make it bare.
Step 2: Switch over to the local repository by running
Step 3: Tell the local repository that its bare 'master' (terminology badly off here, bare with me for a moment) is the new 'bare' repository:
git remote add bare ../YOURPROJECT.git/
Step 4: Tell the local repository that its bare 'master' (terminology badly off here, bare with me for a moment) is the new 'bare' repository:
git remote add bare ../YOURPROJECT.git/
Step 5: Push the local repository to the remote one using this:
git push --set-upstream bare master
Done. Phew. Take a deep breath.
Switch to the correct working directory
At this point, you have
- An old Subversion repository, which you should not use any longer
- An old local Git repository, which you should not use any longer
- A new bare Git repository, which sits there waiting
So logically, the next step is to check out a local copy of that, and start working from there. Try a few commits, do a push, just to verify things work as expected.
Using GIT from Visual Studio 2010
For Visual Studio 2010, there is the Git Source Control Provider, which allows you to control the most important aspects of GIT from within Visual Studio.
Step 1: download the Git Source Control Provider and double click it. It will install it.
Step 2: Restart Visual Studio 2010
Step 3: If you have an open solution that is currently managed by Subversion, you must close it first and then manually do the following:
- Close the solution
- Edit the solution file (
YOURPROJECT.sln) with Notepad or some other text editor.
- Once inside the file, search for
SCC. You will probably find a section like this:
- Delete the files
- In Visual Studio, go to Tools/Options and go to Source Control and be sure to select
- Now you can re-open the project and enjoy using GIT in Visual Studio
Unfortunately, I am still working on the next chapter, so you are finished ... for this time!
GK, Sept. 14, 2014