Difference between revisions of "Git"

From GnuCash
Jump to: navigation, search
(added github clone address)
Line 4: Line 4:
  
 
Note: You should install git >= 1.5.0 because svn handling has improved considerably with these versions. Really. Don't bother with any 1.4 version; it plainly sucks in comparison to the latest versions.
 
Note: You should install git >= 1.5.0 because svn handling has improved considerably with these versions. Really. Don't bother with any 1.4 version; it plainly sucks in comparison to the latest versions.
 
There is a git clone at http://github.com/timabell/gnucash/ though it is likely to be out of date as github doesn't support tracking remote svn repositories. (cloned 31 jan 2009)
 
  
 
== Single Branch Setup ==
 
== Single Branch Setup ==
Line 22: Line 20:
 
Once you committed your changes to your local git repository, here's how you commit the local changes upstream into gnucash's SVN repository:
 
Once you committed your changes to your local git repository, here's how you commit the local changes upstream into gnucash's SVN repository:
 
  git svn dcommit
 
  git svn dcommit
 +
 +
== Advanced setup: graft points ==
 +
There is a git clone on GitHub at http://github.com/timabell/gnucash/ (cloned 31 jan 2009).  It is already out of date as GitHub doesn't support tracking remote svn repositories.  However, you can use it to efficiently "deepen" the history for a "shallow" checkout of trunk:
 +
 +
1) Checkout ''trunk'' as described above.  Use the subset r17856:HEAD; we'll get the rest from GitHub.
 +
git svn clone -r17856:HEAD svn+ssh://USERNAME@svn.gnucash.org/repo/gnucash/trunk
 +
 +
2) Fetch the rest of the history from GitHub.
 +
git-fetch git://github.com/timabell/gnucash.git
 +
 +
3) Find the latest commit in this history, here is what you should see:
 +
 +
$ git ls-remote git://github.com/timabell/gnucash.git HEAD
 +
5cabf7a61dee17c188a67d8cdbc4451d1b8ae7de        HEAD
 +
$ git branch history 5cabf7a61dee17c188a67d8cdbc4451d1b8ae7de
 +
$ git log history^..history
 +
commit 5cabf7a61dee17c188a67d8cdbc4451d1b8ae7de
 +
Author: cstim <cstim@57a11ea4-9604-0410-9ed3-97b8803252fd>
 +
Date:  Sat Jan 31 10:24:34 2009 +0000
 +
 +
    Add shell script to easily back-port commits in git-svn from trunk to other branches.
 +
 +
4) Find the corresponding commit from svn:
 +
 +
$ git svn log --show-commit -r17856
 +
------------------------------------------------------------------------
 +
r17856 | 048f138 | cstim | 2009-01-31 10:24:34 +0000 (Sat, 31 Jan 2009) | 2 lines
 +
 +
Add shell script to easily back-port commits in git-svn from trunk to other branches.
 +
 +
------------------------------------------------------------------------
 +
$ git-rev-parse 048f138
 +
048f1384a4bba73e438615630218568a4446c00f
 +
 +
5) Graft the two histories together:
 +
$ PARENT=$(git-rev-parse history^)
 +
$ echo 048f1384a4bba73e438615630218568a4446c00f $PARENT >> .git/info/grafts
  
 
== Multi-Branch Setup ==
 
== Multi-Branch Setup ==

Revision as of 11:16, 2 February 2009

Git is an extremely cool version control system, but a bit geeky to get used to it. For gnucash, it can be used to hold a local copy of the full svn repository, which means extremely fast version browsing. Also, it is possible to prepare your commits in your local repository first, and sending them to the gnucash svn server sometime later in a batch. Also extremely cool.

Webpage: http://git.or.cz

Note: You should install git >= 1.5.0 because svn handling has improved considerably with these versions. Really. Don't bother with any 1.4 version; it plainly sucks in comparison to the latest versions.

Single Branch Setup

If you want to checkout only one single branch, here's what you would do:

Here's how you as a developer get your local git repository if you only want trunk (git-1.5.2):

git svn clone -r16500:HEAD svn+ssh://USERNAME@svn.gnucash.org/repo/gnucash/trunk

That's it. The revision subset r16500:HEAD will download approx. 30-40 MB of data. If you download larger revision spans, the download amount might go up into the hundreds of MBs.

Here's how you run the equivalent of "svn update":

git svn rebase

That's it.

Once you committed your changes to your local git repository, here's how you commit the local changes upstream into gnucash's SVN repository:

git svn dcommit

Advanced setup: graft points

There is a git clone on GitHub at http://github.com/timabell/gnucash/ (cloned 31 jan 2009). It is already out of date as GitHub doesn't support tracking remote svn repositories. However, you can use it to efficiently "deepen" the history for a "shallow" checkout of trunk:

1) Checkout trunk as described above. Use the subset r17856:HEAD; we'll get the rest from GitHub.

git svn clone -r17856:HEAD svn+ssh://USERNAME@svn.gnucash.org/repo/gnucash/trunk

2) Fetch the rest of the history from GitHub.

git-fetch git://github.com/timabell/gnucash.git

3) Find the latest commit in this history, here is what you should see:

$ git ls-remote git://github.com/timabell/gnucash.git HEAD
5cabf7a61dee17c188a67d8cdbc4451d1b8ae7de        HEAD
$ git branch history 5cabf7a61dee17c188a67d8cdbc4451d1b8ae7de
$ git log history^..history
commit 5cabf7a61dee17c188a67d8cdbc4451d1b8ae7de
Author: cstim <cstim@57a11ea4-9604-0410-9ed3-97b8803252fd>
Date:   Sat Jan 31 10:24:34 2009 +0000
    Add shell script to easily back-port commits in git-svn from trunk to other branches.

4) Find the corresponding commit from svn:

$ git svn log --show-commit -r17856
------------------------------------------------------------------------
r17856 | 048f138 | cstim | 2009-01-31 10:24:34 +0000 (Sat, 31 Jan 2009) | 2 lines

Add shell script to easily back-port commits in git-svn from trunk to other branches.

------------------------------------------------------------------------
$ git-rev-parse 048f138
048f1384a4bba73e438615630218568a4446c00f

5) Graft the two histories together:

$ PARENT=$(git-rev-parse history^)
$ echo 048f1384a4bba73e438615630218568a4446c00f $PARENT >> .git/info/grafts

Multi-Branch Setup

If you want to checkout all of the currently active branches and have the ability to merge and cherry-pick back and forth between all branches locally, here's one way that works:

First of all, it is recommended to use multiple git repositories - one for each branch that you want to work with. This is because when changing between the branches, git would change your working directory, hence everything would need to be rebuilt.

(... FIXME: more text later ...)

git svn clone -s -r16500:HEAD svn+ssh://USERNAME@svn.gnucash.org/repo/gnucash all
cd all
git branch --track my-trunk remotes/trunk
git branch --track my-2.2 remotes/2.2
cd ..

This will need git svn --fetch-all rebase so that all SVN branches are updated in parallel.

Creating a working copy for trunk:

cd all
git checkout my-trunk
cd ..
git clone -s all trunk

And another working copy for branches/2.2:

cd all
git checkout my-2.2
cd ..
git clone -s all 2.2

Building one branch:

cd 2.2
./autogen.sh
mkdir build
cd build
../configure --some-options-foo-bar --prefix=/opt/experimental .....

(... FIXME: more text later ...)

Here's how you as a developer get your local git repository if you want trunk and all branches (git-1.5.2), pay attention to the -s switch:

git svn clone -s -r16500:HEAD svn+ssh://USERNAME@svn.gnucash.org/repo/gnucash
git reset --hard remotes/trunk

The latter command is necessary if your local master should represent the trunk of SVN, which is probably what you want. You need reset --hard here instead of rebase because the revision subset r16500:HEAD probably doesn't contain the original branch point between some of the other svn branches and trunk. If the branch point is included in your cloned revision subset, git rebase remotes/trunk would work as well and is safer (i.e. won't throw away any local changes without asking).

Starting at r16500 is a good opportunity because the 2.2 branch is branched at approx. r16560; if you need the gda-dev: that one was created at r15090.