I'm working on a project that uses subversion for their repository. Because I need to make some changes that can't be sent to the svn server yet, I started using git svn
so that I could do local checkins. My setup looks like this:
Branches: trunk (tracking svn trunk), master (pretty close to what's in svn), and topic.
*------------------ trunk
\
*-----------*--------- master
\
*-------- topic
Workflow:
[on branch master]
$ git svn fetch
$ git svn rebase
$ git checkout -b topic
$ git rebase master
[hack hack hack]
$ git commit -a
[once upstream is ready for my changes]
$ git svn fetch
$ git checkout master
$ git svn rebase
$ git checkout topic
$ git rebase master
$ git svn dcommit
$ git checkout master
$ git svn rebase
$ git branch -d topic
Presuming that no one commits to svn between git svn fetch
and git svn rebase
,
Is git svn rebase
run on master basically the same as git rebase trunk
run on master?
Is there a more sensible workflow to use? It seems like there's a lot of changing branches and rebasing going on. I understand that I want to be able to rebase my work on top of whatever's in svn, but it seems like I'm doing more rebases than are strictly necessary.
Getting the latest changes from SVN The equivalent to git pull is the command git svn rebase . This retrieves all the changes from the SVN repository and applies them on top of your local commits in your current branch.
No interaction between them. Just ignore the . git folder for SVN and the . svn folder for Git and you should be fine.
Rebasing can be dangerous! Rewriting history of shared branches is prone to team work breakage. This can be mitigated by doing the rebase/squash on a copy of the feature branch, but rebase carries the implication that competence and carefulness must be employed.
Git has the advantage that it's MUCH better suited if some developers are not always connected to the master repository. Also, it's much faster than SVN. And from what I hear, branching and merging support is a lot better (which is to be expected, as these are the core reasons it was written).
Note, from git svn, as detailed in "Why is the meaning of “ours” and “theirs” reversed with git-svn":
git svn rebase
This fetches revisions from the SVN parent of the current HEAD and rebases the current (uncommitted to SVN) work against it.
So you don't need the git svn fetch
before your git checkout master
and git svn rebase
, especially if you track only trunk
(parent of master
).
Second point, the git svn dcommit
would create revisions in SVN for each new commit on master
, but your workflow doesn't show any new commit on master
, only on topic
(which isn't ever merged on master
)
The OP Sean McMillan comments:
According to the docs,
git svn dcommit
without a branch specified pushes the commits on the current HEAD, not just onmaster
. So I commit to SVN from my branch, then rely on agit svn rebase
onmaster
to bring the commits back from SVN. I abandon thetopic
branch after I'vedcommited
. Is this not kosher?
He details that:
I can't sent them to SVN... yet. Upstream wants to "freeze" the trunk for a release, meanwhile, I'm working on functionality for the next release.
But the ultimate question is, "is git rebase trunk master the same as git svn rebase on the master branch?" If it is, then I don't need to be constantly changing my branches, just to rebase my master branch against SVN. But if it's not, and there's some kind of magic happening when I git svn rebase, I want to know.
To which I reply:
A git svn fetch
followed by a git rebase trunk master
would be the equivalent of a git svn rebase
.
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