I'm experimenting with git-svn
, and am trying to come up with a relatively non error-prone workflow. I think the following should work, and is pretty simple, but I've seen people using far more complicated workflows, so I want to see why.
(master) $ git svn init <path>
(master) $ git svn fetch
(master) $ git svn rebase
(master) $ git checkout -b topic-branch
(topic-branch) $ # HACK HACK COMMIT HACK HACK HACK COMMIT HACK COMMIT
(topic-branch) $ git checkout master
(master) $ git merge topic-branch
-- this is a fast-forward merge, so no merge commit(master) $ git svn rebase
(master) $ # fix conflicts
(master) $ git svn dcommit
GOTO 4
git-svn is a specialized tool for Git users to interact with Git repositories. It works by providing a Git frontend to an SVN backend. With git-svn, you use Git commands on the local repository, so it's just like using normal Git. However, behind the scenes, the relevant SVN commands are sent to the server.
git svn is a git command that allows using git to interact with Subversion repositories. git svn is part of git, meaning that is NOT a plugin but actually bundled with your git installation. SourceTree also happens to support this command so you can use it with your usual workflow.
SVN is better than Git for architecture performance, binary files, and usability. And it may be better for access control and auditability, based on your needs.
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.
Yes, that's essentially what I do when working with Subversion repositories. The key to the simplicity of this is to keep the Git branches local and not try to map them to Subversion branches at all.
I just noticed that you linked directly to my answer in that other question. So perhaps I should explain more. :)
I sometimes do the conflict resolution in the topic branch if I expect some conflict work. Otherwise, if I don't expect many conflicts, I might merge to master first before doing the git svn rebase
. It doesn't matter much.
The key point is that Git is so flexible that the minimum workflow is very simple. You've added a topic branch to that; I've added rebasing on the topic branch.
From my brief experience I've made minor adjustments to your workflow and added comments:
(master) $ git svn init <path>
(or (master) git svn clone <url>
)(master) $ git svn fetch
(master) $ git svn rebase
(begin loop, resolve conflicts)(master) $ git checkout -B topic-branch
(careful before doing this)(topic-branch) ## HACK HACK COMMIT HACK COMMIT
(use 3rd party)(topic-branch) $ git checkout master
(master) $ git rebase topic-branch
(resolve conflicts)(master) $ git svn rebase
(resolve conflicts, if any)(master) $ git svn dcommit
(careful reading here)I'm using master branch just for integration with SVN and doing all work on topic-branch, just like I believe you were. I hope this makes more sense, since I couldn't use your workflow the way it was even if it was basically what I wanted - evidently! :-)
More details on the adjustments that were made:
-B
on step 4, it will reset the topic-branch so it's always new from current SVN. without it the loop would break giving an error "branch already exists".rebase
rather than merge
. yes, it will probably be a fast-forward merge, but it's better safe than sorry. picture if something is done between steps 6 and 7.svn rebase
never is an abuse and since it's always done on master there's always branches as backup.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