No interaction between them. Just ignore the . git folder for SVN and the . svn folder for Git and you should be fine.
This retrieves all the changes from the SVN repository and applies them on top of your local commits in your current branch. You can also use git svn fetch to retrieve the changes from the SVN repository but without applying them to your local branch.
You can manually add the remote branch,
git config --add svn-remote.newbranch.url https://svn/path_to_newbranch/
git config --add svn-remote.newbranch.fetch :refs/remotes/newbranch
git svn fetch newbranch [-r<rev>]
git checkout -b local-newbranch -t newbranch
git svn rebase newbranch
If you want to track ALL the remote svn branches, then the solution is as simple as:
git svn fetch
This will fetch ALL the remote branches that have not been fetched yet.
Extra tip: if you checked out only the trunk at first, and later you want to track ALL branches, then edit .git/config to look like this and re-run git svn fetch:
[svn-remote "svn"]
url = https://svn/path_to_repo_root/
fetch = path_to_trunk:refs/remotes/git-svn
branches = path_to_branches/*:refs/remotes/*
The key points are url should point to the repository root, and the paths defined in fetch and branches should be relative to url.
If you want to fetch only specific branches instead of ALL, there is a nice example in git svn --help:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
branches = branches/{red,green}/src:refs/remotes/branches/*
tags = tags/{1.0,2.0}/src:refs/remotes/tags/*
With older versions of git-svn, once you specified branches like this, you might not be able to get new branches with git svn fetch. One workaround is adding more fetch lines, like this:
[svn-remote "huge-project"]
url = http://server.org/svn
fetch = trunk/src:refs/remotes/trunk
fetch = branches/blue:refs/remotes/branches/blue
fetch = branches/yellow:refs/remotes/branches/yellow
branches = branches/{red,green}/src:refs/remotes/branches/*
Another workaround by @AndyEstes: edit .git/svn/.metadata and change the value of branches-maxRev or tags-maxRev to a revision before any newly-specified branches or tags were created. Once you've done this, run git svn fetch to track the new svn remote branch.
It appears I just needed to git svn fetch; somehow I had convinced myself that would fetch the entire repo instead of just the changes.
Maybe I messed it up somehow but I followed the instructions in vjangus' answer and it almost worked. The only problem was that newbranch didn't appear to be branched from the trunk. In gitk, it was kind of "floating" all on its own; it had no common ancestor with the trunk.
The solution to this was:
git diff-tree <sha1 from step 1> <sha1 from step 2> -- there should be no output. If there is output, you may have selected the wrong commits.git checkout local-newbranch then git rebase <sha1 from step 1>. This will rebase local-newbranch onto the new tree but remotes/newbranch will still be disconnected. .git/refs/remotes/newbranch and edit it to contain the full SHA1 of the new commit (on the rebased newbranch) that corresponds to the old commit it's currently pointing at. (Or maybe use git-update-ref refs/remotes/newbranch <new-SHA>. Thank you inger.)git svn dcommit to newbranch, you'll get a bunch of messages about it updating some log. This is normal I think.I recommend keeping gitk --all open the whole time and refreshing it often to keep track of what you're doing. I'm still sort of new to git and git svn so please suggest improvements to this method.
A simplification of vjangus' answer:
If you're using the standard layout in SVN and have done the usual svn init, git-svn will do the config stuff for you. Just:
An example. SVN url is svn+ssh://[email protected]/repo. SVN branch I'm looking for is newbranch. Local git branch (tracking remote newbranch) will be git-newbranch.
Step 1: find the branch-copy revision
# svn log --stop-on-copy svn+ssh://[email protected]/repo/branches/newbranch | tail -4
r7802 | someone | 2014-03-21 18:54:58 +0000 (Fri, 21 Mar 2014) | 1 line
branching HEAD to newbranch
------------------------------------------------------------------------
So the branch point in SVN is revision 7802.
Step 2: Fetch the revision
# git svn fetch -r 7802
Found possible branch point: svn+ssh://[email protected]/repo/trunk => svn+ssh://[email protected]/repo/branches/newbranch, 7801
Found branch parent: (refs/remotes/trunk) 8dcf3c5793ff1a8a79dc94d268c91c2bf388894a
Following parent with do_switch
Successfully followed parent
r7802 = 9bbd4194041675ca5c9c6f3917e05ca5654a8a1e (refs/remotes/newbranch)
git-svn did all the work and now knows about the remote:
# git show-ref | grep newbranch
2df23af4733f36f5ad3c14cc1fa582ceeb3edb5c refs/remotes/newbranch
Step 3: Create your new local branch tracking the remote one:
# git checkout -b git-newbranch -t newbranch
Checking out files: 100% (413/413), done.
Branch git-newbranch set up to track local ref refs/remotes/newbranch.
Switched to a new branch 'git-newbranch'
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