We have moved most of our codebase from a monolithic svn repository into a set of git repositories. For various reasons, some work (on old versions of the project deployed in the field) has to continue in old svn branches, after they have been moved to git and deleted from the subversion trunk.
I have just done some work like this on an svn branch and re-applied the changes from the svn repository into the git repositories by doing the following:
cd <common_svn_commit_root>
svn diff -r 12344:12345 > ~/r12345.diff
gedit ~/r12345.diff
cd <common_git_commit_root>
git apply ~/r12345.diff
but it is rather cumbersome to do this for each and every svn commit, especially the gedit step, where I have to manually munge the svn paths into git paths (usually by prefixing the top level directory name).
One problem with trying some of the options presented so far is that the structure of the old svn repo and the new git repo are different. This is one of the reasons I have to edit the patch file.
The old directory structure was
svn
configurations
blah
mine
blam
plugins
foo
core
mine
bar
Whereas the new structure is
svn
plugins
bar
git
my_git
my_config
plugins
mine
core_git
plugins
core
foo_git
plugins
foo
I would really like to know if there is an easier way to do this, and understand what the best practice is for this situation.
The git svn clone command transforms the trunk, branches, and tags in your SVN repository into a new Git repository. Depending on the structure of your SVN repo, the command needs to be configured differently.
# Clone a repo with standard SVN directory layout (like git clone): git svn clone http://svn.example.com/project --stdlayout --prefix svn/ # Or, if the repo uses a non-standard directory layout: git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/ # View all branches and tags you have ...
The difference between Git and SVN version control systems is that Git is a distributed version control system, whereas SVN is a centralized version control system. Git uses multiple repositories including a centralized repository and server, as well as some local repositories.
you can use git svn to synchronize your git repo with the changes from svn.
git svn --authors-file=authors.txt clone https://repo/svn/reponame/trunk reponame-git-svn
# if something aborts:
cd reponame-git-svn
git svn fetch
# create a new branch
git checkout -b dvcs
git remote add dvcs-svn https://repo/git/reponame.git
this will leave you with the svn sources in a git branch. To sync from svn to git:
git checkout master
# get the changes from svn
git svn rebase
git checkout dvcs
# apply the changes from svn
git rebase master
# fetch the changes from git repo to the local repo
git fetch dvcs-svn
# apply the changes from git repo to the branch dvcs
git rebase dvcs-svn/master
# push all changes back to git repo
git push dvcs-svn dvcs:master
we have better experience with rebase than with merge. Hopefully this does the job for you as well.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With