CMake/Git: Difference between revisions

From KitwarePublic
Jump to navigationJump to search
Line 236: Line 236:
=Resources=
=Resources=


Additional information about Git may be obtained at these sites:
Additional information about Git may be obtained at sites listed [[Git/Resources|here]].
 
* [http://git-scm.com Git Homepage]
* [http://git.wiki.kernel.org/index.php/GitDocumentation Git Documentation Wiki]
* [http://book.git-scm.com/ Git Community Book]
* [http://www.kernel.org/pub/software/scm/git/docs/everyday.html Everyday Git]
* [http://github.com/guides/git-cheat-sheet Git Cheat-Sheet]
* [http://progit.org/book/ Pro Git]
* [http://marklodato.github.com/visual-git-guide/ A Visual Git Reference]

Revision as of 15:43, 24 July 2010

CMake version tracking and development is hosted by Git.

Official Repository

One may browse the repository online using the Gitweb interface at http://cmake.org/gitweb.

At the time of this writing the repository does not have branches and tags older than CMake 2.4. Conversion of older branches and tags from CVS will be completed later and added. The release branches in CVS are represented in git as tags. To see the available tags and branches use git show-ref. The current release being worked on will be the release branch.

Cloning

One may clone the repository using git clone through the native git protocol:

$ git clone git://cmake.org/cmake.git CMake

or through the (less efficient) http protocol:

$ git clone http://cmake.org/cmake.git CMake

All further commands work inside the local copy of the repository created by the clone:

$ cd CMake

The repository is also available by anonymous cvs pserver, served by git cvsserver. The server maps git branches to cvs modules, so one must ask cvs to get the module "master":

$ cvs -d :pserver:anonymous@cmake.org:/cmake.git co -d CMake master

Branches

We use a topic-based workflow as documented here and thus define integration branches:

  • maint: Release maintenance; bug fixes only
  • master: Release preparation; starting point for new features (default)
  • next: Development; new features published here first

We also provide additional branches:

  • nightly: Follows next, updated at 01:00 UTC
  • release: Follows master, updated at 01:00 UTC
  • dashboard: Dashboard script (see below)
  • hooks: Local commit hooks (place in .git/hooks)

After cloning, create a local branch to track the upstream branch using git checkout:

$ git checkout -b release origin/release

As a shortcut with Git >= 1.6.5 one may choose a branch during the initial clone:

$ git clone -b release git://cmake.org/cmake.git CMakeRel

Updating

Use git pull to update your repository and work tree with the latest upstream changes:

$ git checkout master
$ git pull
From git://cmake.org/cmake
   689aa0e..4803630  master     -> origin/master
Updating 689aa0e..4803630
Fast forward
...

Note the "Fast forward" in the output. This assumes that you have made no local commits on master.

Development

We provide here a brief introduction to development with Git. See the Resources below for further information.

First, use git config to introduce yourself to Git:

$ git config --global user.name "Your Name"
$ git config --global user.email "you@yourdomain.com"

Optionally enable color output from Git commands:

$ git config --global color.ui auto

The --global option stores the configuration settings in ~/.gitconfig in your home directory so that they apply to all repositories.

Committing

After cloning the repository using the above instructions one may commit new changes locally. Follow our workflow instructions to commit on a local branch. Here we document basic command-line usage. Refer to Git documentation and other online tutorials for details.

Git creates commits based on a stage (also called index or cache) that sits between the work tree and the repository. After editing a file, say Modules/readme.txt, use git status to see the state of the stage and work tree:

$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   Modules/readme.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

This tells you that no changes are staged for commit (i.e. the stage and HEAD commit have identical content), and that the Modules/readme.txt file in the work tree has been modified from what is in the stage. We stage the change using git add:

$ git add Modules/readme.txt

and check the status again:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   Modules/readme.txt
#

This tells you that changes have been staged for commit, and that the work tree is identical to the stage. Now use git commit to create a commit:

$ git commit

Git will bring up an editor interactively to ask for the commit message. The editor will already have the output of git status in it as a reminder, but the comment lines will be removed from the message automatically. A good convention is to use a short one-line summary (preferably 50 characters or less), then a blank line, then a detailed description:

Clarify documentation of module conventions

The previous description of output variable XXX_YYY_ZZZ was not precise.
We clarify the wording and give an example.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes to be committed:
#   (use "git reset HEAD^1 <file>..." to unstage)
#
#       modified:   Modules/readme.txt
#

Upon exit it will create the commit (unless you leave the message blank to abort the commit). After committing, check the status again:

$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

This tells you that the (new) HEAD commit, stage, and work tree are all identical. Furthermore it says you have one commit on your local master branch beyond what was last fetched from the upstream origin/master branch. Use git log to see your commit:

$ git log origin/master..master
commit 0298957e33baab30cda0da625091260a0267a5a4
Author: Your Name <you@yourdomain.com>
Date:   Thu Feb 4 14:37:53 2010 -0500

    Clarify documentation of module conventions
    
    The previous description of output variable XXX_YYY_ZZZ was not precise.
    We clarify the wording and give an example.

The origin/master..master option says "show me commits reachable from master but not from origin/master". In this case it is just the one commit.

One may also browse history interactively using gitk.

Integration

We use the branchy workflow documented here. Follow those instructions before publishing.

Publishing

Authorized developers may publish work as follows.

Git automatically configures a new clone to refer to its origin through a remote called origin. Initially one may fetch or pull changes from origin, but may not push changes to it.

In order to publish new commits in the cmake.org repository, developers must configure a push URL for the origin. Use git config to specify an ssh-protocol URL:

$ git config remote.origin.pushurl git@cmake.org:cmake.git

(Note that 'pushurl' requires Git >= 1.6.4. Use just 'url' for Git < 1.6.4.)

All publishers share the git@cmake.org account but each uses a unique ssh key for authentication. To request access, fill out the Kitware Password form. Include your ssh public key and a reference to someone our administrators may contact to verify your privileges.

Note that we may not grant all contributors push access to the cmake.org repository. The distributed nature of Git allows contributors to retain authorship credit even if they do not publish changes directly.

Once your push URL is configured and your key is installed for git@cmake.org then you can try pushing changes. Continuing from the above commit example, you have one commit on your local master beyond what was last fetched from origin. Use git push to send the changes back to origin:

$ git push

This shorthand push command works when your current local branch tracks a remote branch. Git automatically configured the local master branch to track the remote branch origin/master upon cloning. The configuration can be seen in .git/config:

[branch "master"]
        remote = origin
        merge = refs/heads/master

The configuration makes the above push command equivalent to the longhand form:

$ git push origin master:master

The origin option tells Git where to send history. The master:master option tells Git what history to send. The left part names a local branch to send, and the right part names the remote branch to update.

Dashboard

The dashboard branch contains a dashboard client helper script. Use these commands to track it:

$ mkdir -p ~/Dashboards/CMakeScripts
$ cd ~/Dashboards/CMakeScripts
$ git init
$ git remote add -t dashboard origin git://cmake.org/cmake.git
$ git pull origin

The cmake_common.cmake script contains setup instructions in its top comments.

Resources

Additional information about Git may be obtained at sites listed here.