1. Clone git repository from http://repo.or.cz/w/synfig.git: $ git clone http://repo.or.cz/w/synfig.git You'll get the dir called 'synfig'. 2. Create 'genete_master' branch You need your own branch to make experiments in it. So, let's create 'genete_master' branch. Usually we just use 'git branch genete_master' command... But wait, we already have 'genete_master' branch in http://repo.or.cz/w/synfig.git! So we want not just create local branch, but also hook it to the remote branch on repo.or.cz. To do that, go to your repo dir and issue following command there: $ git branch --track genete_master origin/genete_master Now, switch to your branch: $ git checkout genete_master Run gitk to examine existing branches in repository: $ gitk --all 3. Add SVN remote "Remote" is the source you can pull from and you can push to. You already have one remote, called - http://repo.or.cz/w/synfig.git. That's default remote, called "origin". Let's add another one, hooked to svn. Go to .git dir inside your repo dir (synfig) and open file called "config" (this is plain text file, you can edit it in any text editor). Add following lines at the end of the file: [svn-remote "svn"] url = https://synfig.svn.sourceforge.net/svnroot/synfig fetch = :refs/remotes/git-svn Save and close file. Now you have special svn remote and could operate with "git svn" commands in your repo. Fetch svn updates: $ git svn fetch That will take a long time. after that examine changes in repository: $ gitk --all You will notice that 'master' branch was created and all svn stuff was imported there. But we will need 'master' branch for the git repo. Let's rename it to "svn". To do that, open .git/refs/heads dir inside of your repo and rename file called "master" to "svn". That's all. Open gitk again and check svn branch. Now if you want to integrate some commit into your current branch (which is 'genete_master'), just right-click on any commit in branch 'svn' and select "Cherry-pick this commit". 4. Integrating changes in SVN into your branch. OK, your current branch is "genete_master". Now we need integrate latest changes from SVN into it. First, fetch latest changes from SVN (if they exist): $ git svn fetch Next, open git-gui $ gitk --all Last commit in "genete_master" branch is "Fix 2502818: Noise when refresh an imported image layer." Let's search that commit in svn branch (see gitk-1.png). Now cherry-pick commits made after one you found. Obviously you don't need all commits. You can skip commits like "Let Subversion ignore the files..." by gerco and last commit from pabs. Please cherry-pick them in order. After you done that, push to server so I could see changes: $ git push Now we done. At this point you already can start playing with code. 5. Create local 'master' branch Likewise 'genete_master', 'master' branch is already exists now in remote git repo at git.or.cz. 'Master' branch is a branch where all changes incorporated together, release development branch. You'll need to make changes in that branch. But you can't directly change remote branch at repo.or.cz. To make changes in 'master' branch you need to make local branch called 'master' and hook it to remote master branch. Steps are the same as in "2. Create 'genete_master' branch": $ git branch --track master origin/master Now, switch to your branch: $ git checkout master Run gitk to examine existing branches in repository: $ gitk --all 6. Create more branches You probably need more separate branches for differrent features. I.e. "genete_svg". This branch is not exist in remote git.or.cz, so the steps are a little different: Go to place where you want to "fork" a new branch. Let's say it's 'master': $ git checkout master Create a new branch. $ git branch genete_svg Now switch to it: $ git checkout genete_svg Now you can make desired changes in it. Anyway, have you done changes or not, push this branch to repo.or.cz remote: $ git push Open http://repo.or.cz/w/synfig.git and see your new created branch there. NOTE: When you are issuing "git push" the changes are pushed only from current branch. NOTE 2: It is possible to push changes from all your local branches with 'git push --all' command, but I'mm highly not recommend to do that. Beacuse that will push your 'svn' branch to repo.or.cz too and that will be "junky" branch. NOTE 3: If you want to use 'git push --all', you could remove local branch 'svn' (you still be able to fetch SVN changes, though). To do that, just remove file called 'svn' from the .git/refs/heads dir inside of your repo. 7. Configure sf.net remote $ git remote add sf ssh://USERNAME@synfig.git.sourceforge.net/gitroot/synfig Replace USERNAME with your username at sf.net. Now you have new remote to push in. Later we will make that remote default one, but not now. 8. Push your local branches to sf.net To push contents of any your local branch to sf.net do the following: $ git push sf genete_master That means: push my local branch "genete_master" to remote server identified as "sf" Examine changes: http://synfig.git.sourceforge.net/git/gitweb.cgi?p=synfig 9. Push non local branches from repo.or.cz to sf.net You can't directly push non-local branches (uiomae_master, dooglus_master, genete_bones and the rest) to sf.net. To do that you should make them local (see section 2 or 5 of this guide). After that push them to sf.net like I described in previous section 8. Examine changes: http://synfig.git.sourceforge.net/git/gitweb.cgi?p=synfig When everything will be pushed, I'll show how to make "sf" remote default one. 10. Remove "svn" branch. Because of my last discovery, I've figured out what we don't need local "svn" branch to cherry-pick commits. So it's better to remove it. To do that remove .git/refs/heads/svn file in your repo directory. Consequence. You can use "git push sf --all" or "git push --all" command to push all your local branches to remote repo without a risk to push unneeded commits. (See NOTE2 and NOTE3 of section 6, this guide).