Introduction
We already have a git repo, but we want to interact with a system that currently works using svn. The svn repo is mainly for read-only but the setup should not block any potential direct writes to the svn.
git-svn is great, but the default setup is for when svn is the master and git is the personal client.
Also we do not want to clobber the history.
setup
In the following alis is the name for both the name that I choose to assign to the remote, and to the git-svn identifier for the remote.
I dont know why they are not always set to be the same.
git svn clone -ialis -Ralis svnUrl repoName
cd repoName
mv .git/refs/heads/master ./git/refs/heads/svn
git checkout svn
At this stage your .git/config
should look something like this:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[svn-remote "alis]
url = svnUrl
fetch = :refs/remotes/alis
Edit it to look something like this:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/*
url = originUrl
[svn-remote "alis"]
url = https://alis.cs.bath.ac.uk/svn/cs3mmh
fetch = :refs/remotes/alis
[branch "svn"]
remote = alis
merge = :
[branch "master"]
remote = origin
merge = refs/heads/master
Now do:
git fetch origin
git checkout master
At this stage everything from origin is in master, and the things in svn lives in the svn branch.
If we dont care about the history, we can simply merge master into svn and we will be done.
if we need to preserve history we have to do:
# work in temp branch so that we dont accidentilly screw things up.
git branch temp --track master
git checkout temp
git rebase --onto svn --root temp
# May have some conflicts resolve and continue.
# Inspect history and files when rebase is finnished.
# Assuming everything went well
git checkout svn
# bring in the changes from temp, but only fast forward
git merge --ff temp
# push everything onto svn server
git svn dcommit
git branch -d temp
continue working on master and when wanting to update the svn system do the last few steps. If the svn has been updated, just cherry-pick the change from the svn branch onto master.