|
|
(15 intermediate revisions by 8 users not shown) |
Line 1: |
Line 1: |
| __TOC__
| | {{ Historical }} |
| | |
| | ==Introduction== |
|
| |
|
| ITK version tracking and development is hosted by [http://git-scm.com Git]. | | ITK version tracking and development is hosted by [http://git-scm.com Git]. |
| | Please select a task for further instructions: |
|
| |
|
| =Official Repository=
| | {|border="0" |
| | | |- |
| One may browse the repository online using the [http://git.wiki.kernel.org/index.php/Gitweb Gitweb] interface at http://itk.org/gitweb.
| | |width=70%| |
| | | Main Tasks: |
| ==Cloning==
| |
| | |
| These instructions assume a command prompt is available with <code>git</code> in the path.
| |
| See our Git [[Git/Download|download instructions]] for help installing Git.
| |
| | |
| Clone ITK using the command
| |
| | |
| $ git clone git://itk.org/ITK.git
| |
| | |
| If your institution's firewall blocks the Git port for outgoing connections you may see an error similar to:
| |
| | |
| Initialized empty Git repository in C:/abc/ITK/.git/itk.org[0: 66.194.253.19]:
| |
| errno=No such file or directory
| |
| fatal: unable to connect a socket (No such file or directory)
| |
| | |
| In that case, see [[#Firewall_Blocks_Port_9418|below]].
| |
| | |
| If you want to run tests, add the <code>--recursive</code> option to download the <code>Testing/Data</code> submodule.
| |
| | |
| $ git clone --recursive git://itk.org/ITK.git
| |
| | |
| This requires Git 1.6.5 or higher. If you do not have it, see [[#Git Below 1.6.5|below]].
| |
| | |
| All further commands work inside the local copy of the repository created by the clone:
| |
| | |
| $ cd ITK
| |
| | |
| If you already cloned and want to add the <code>Testing/Data</code> submodule then run
| |
| | |
| $ git submodule update --init
| |
| | |
| For ITKApps, use the url
| |
| | |
| git://itk.org/ITKApps.git
| |
| | |
| instead.
| |
| | |
| ==Updating== | |
| | |
| If you have made no local commits and simply want to update your clone with the latest changes, run
| |
| | |
| $ git pull
| |
| $ git submodule update
| |
| | |
| If you know you do not have the <code>Testing/Data</code> submodule checked out then you can skip the submodule update command.
| |
| | |
| ==Branches==
| |
| | |
| At the time of this writing the repository has the following branches:
| |
| | |
| * '''master''': Development (default)
| |
| * '''release''': Release maintenance
| |
| * '''nightly-master''': Follows '''master''', updated at 01:00 UTC
| |
| * '''hooks''': Local commit hooks ([[Git/Hooks#Local|place]] in .git/hooks)
| |
| * '''dashboard''': Dashboard script (see [[#Dashboard|below]])
| |
| | |
| Release branches converted from CVS have been artificially merged into master.
| |
| Actual releases have tags named by the release version number.
| |
| | |
| After cloning your local repository will be configured to follow the upstream '''master''' branch by default.
| |
| One may create a local branch to track another upstream branch using [http://www.kernel.org/pub/software/scm/git/docs/git-checkout.html 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://itk.org/ITK.git ITKRel
| |
| | |
| =Development=
| |
| | |
| ITK development uses a [[Git/Workflow/Topic|branchy workflow]] based on topic branches.
| |
| Currently we use a single '''master''' integration branch for development and one '''release''' branch for release maintenance.
| |
| | |
| ==Workflow==
| |
| | |
| Our collaboration workflow consists of three main steps:
| |
| | |
| # Create Topics: [[#Local_Development|Develop Locally]]
| |
| # Share Topics: [[#Code_Review|Code Review with Gerrit]]
| |
| # Integrate Topics: [[#Topic_Stage|Merge using Topic Stage]]
| |
| | |
| [[image:ITK-Git-Gerrit-Stage-Workflow-A.png|529px]]
| |
| | |
| ==Local Development==
| |
| | |
| We provide here a brief introduction to local '''ITK''' development with Git.
| |
| See the [[Git/Resources|Resources]] page for further information such as Git tutorials.
| |
| | |
| ===Introduction===
| |
| | |
| These steps are a one-time setup per-user per-machine.
| |
| | |
| We require all commits in ITK to record valid author/committer name and email information.
| |
| Use [http://www.kernel.org/pub/software/scm/git/docs/git-config.html git config] to introduce yourself to Git:
| |
| | |
| $ git config --global user.name "Your Name"
| |
| $ git config --global user.email "you@yourdomain.com"
| |
| | |
| Note that "Your Name" is your ''real name'' (e.g. "John Doe", not "jdoe").
| |
| While you're at it, optionally enable color output from Git commands:
| |
| | |
| $ git config --global color.ui auto
| |
| | |
| If less displays strange characters and no color, your LESS environment variable may already be set. You can override the less options with:
| |
| | |
| $ git config --global core.pager "less -FXRS"
| |
| | |
| The <code>--global</code> option stores the configuration settings in <code>~/.gitconfig</code> in your home directory so that they apply to all repositories.
| |
| | |
| ===Local Clone===
| |
| | |
| Create a local clone of the repository to get a work tree for local development.
| |
| See instructions [[#Cloning|above]].
| |
| | |
| ===Hooks===
| |
| | |
| This step should be done once for each local clone of the ITK repository.
| |
| If you forget this step instructions will be printed on the first attempt to "<code>git commit</code>".
| |
| | |
| The '''hooks''' branch provides local commit hooks to be placed in <code>.git/hooks</code>.
| |
| It is shared by many <code>public.kitware.com</code> repositories. To setup or update the Git hooks, run the script
| |
| | |
| Utilities/hooks.sh
| |
| | |
| This script will setup the hooks and configure the ''KWStyle'' and ''uncrustify'' pre-commit hooks. The ''KWStyle'' hook is enabled by default while the ''uncrustify'' hook must be enabled manually.
| |
| See the general [[Git/Hooks|hooks]] information page for details.
| |
| | |
| ===Local Commits===
| |
| | |
| Develop locally on a [[Git/Workflow/Topic#Naming_Topics|well-named]] ''topic'' branch:
| |
| | |
| $ git checkout -b my-cool-feature origin/master
| |
| $ edit ''files''
| |
| $ git add ''files''
| |
| $ git commit
| |
| | |
| Use the editor to enter a descriptive message (leave the message blank to abort the commit).
| |
| Start with a one-line summary (suitable for use as an email subject line), then leave a blank line, then use free-form paragraph text to describe the change.
| |
| | |
| ==Code Review==
| |
| | |
| We use [http://code.google.com/p/gerrit/ Gerrit Code Review] to perform online code reviews.
| |
| See these pages for details:
| |
| | |
| * [[ITK/Gerrit]]
| |
| * [[ITK/Gerrit/Primer]]
| |
| | |
| Once a change is reviewed and approved in Gerrit, an '''''ITK developer with access to the upstream repository must integrate the change''''' using the ITK Topic Stage, covered in the following.
| |
| | |
| ==Topic Stage==
| |
| | |
| We provide a "[http://itk.org/stage/ITK.git ITK Topic Stage]" repository to which developers may publish arbitrary topic branches and request automatic merges.
| |
| | |
| The topic stage URLs are
| |
| | |
| * <code>git://itk.org/stage/ITK.git</code> (clone, fetch)
| |
| * <code>http://itk.org/stage/ITK.git</code> (clone, fetch, gitweb)
| |
| * <code>git@itk.org:stage/ITK.git</code> (push)
| |
| | |
| See our [http://public.kitware.com/Wiki/Git/Workflow/Stage Topic Stage Workflow] documentation for general instructions.
| |
| ''(Currently ITK does not have a '''next''' branch. Just skip that part of the instructions and merge directly to master.)''
| |
| When accessing the ITK stage, one may optionally substitute
| |
| "<code>ssh git@itk.org stage ITK ...</code>"
| |
| for
| |
| "<code>ssh git@public.kitware.com stage <repo> ...</code>"
| |
| in the ssh command-line interface.
| |
| | |
| {| border="0"
| |
| !colspan=2|Stage Usage Summary
| |
| |- | | |- |
| |align="center"|
| |
| '''Initial Setup:'''
| |
| | | | | |
| $ git remote add stage git://itk.org/stage/ITK.git
| | :*<span style="font-size: 1.5em">[[Git/Download|Install Git]]</span> - Git 1.6.6 or greater is preferred (required for development) |
| $ git config remote.stage.pushurl git@itk.org:stage/ITK.git
| |
| |- | | |- |
| |align="center"|
| |
| '''Fetch Staged Topics:'''
| |
| | | | | |
| $ git fetch stage --prune
| | :*<span style="font-size: 1.5em">[[ITK/Git/Download|Download ITK]] - Users start here</span> |
| |- | | |- |
| |align="center"|
| |
| '''Create Local Topic:'''
| |
| | | | | |
| $ git checkout -b ''topic-name'' origin/master
| | :*<span style="font-size: 1.5em">[[ITK/Git/Develop|Develop ITK]] - Contributors start here</span> |
| $ edit files
| |
| $ git commit
| |
| |- | | |- |
| |align="center"|
| |
| '''Stage Current Topic:'''
| |
| | | | | |
| $ git push stage HEAD
| | Other Tasks: |
| |- | | |- |
| |align="center"|
| |
| '''Print Staged Topics:'''
| |
| | | | | |
| $ ssh git@itk.org stage ITK print
| | :*<span style="font-size: 1.5em">[[ITK/Git/Dashboard|Test ITK]]</span> - CDash client setup |
| |- | | |- |
| |align="center"|
| |
| '''Merge Staged Topic:'''
| |
| | | | | |
| $ ssh git@itk.org stage ITK merge ''topic-name''
| | :*<span style="font-size: 1.5em">[[Git/Resources|Learn Git]]</span> - Third-party documentation |
| |} | | |} |
|
| |
|
| Note that the stage implementation is not ITK-specific and is used for other projects too.
| | ''The remainder of this page provides reference information and links. It is not intended to provide instructions.'' |
| If the merge attempt conflicts it may print instructions for performing the merge manually.
| |
| '''Ignore''' these instructions; you will not be able to push the merge commit directly. | |
| Instead, identify the commit that conflicts with yours, merge it into your topic locally, push the topic to the stage again, and then repeat the merge request.
| |
|
| |
|
| =Publishing= | | ==Repositories== |
|
| |
|
| ==Pushing==
| | One may browse the repositories online using the [https://git.wiki.kernel.org/index.php/Gitweb Gitweb] interface at http://itk.org/gitweb. |
|
| |
|
| Authorized developers may publish work directly to <code>itk.org/ITK.git</code> using Git's SSH protocol.
| | {|border="1" cellspacing="0" cellpadding="3" |
| To request access, fill out the [https://www.kitware.com/Admin/SendPassword.cgi Kitware Password] form.
| | !Repository |
| | !Purpose |
| | !Access |
| | !URL |
| | |- |
| | |rowspan=3|<code>ITK.git</code> |
| | |rowspan=3|Insight Toolkit |
| | |clone (git) |
| | |<code>git://itk.org/ITK.git</code> |
| | |- |
| | |clone (http) |
| | |<code>http://itk.org/ITK.git</code> |
| | |- |
| | |push (ssh) |
| | |<code>git@itk.org:ITK.git</code> |
| | |- |
| | |rowspan=3|<code>stage/ITK.git</code> |
| | |rowspan=3|ITK Topic Stage |
| | |clone (git) |
| | |<code>git://itk.org/stage/ITK.git</code> |
| | |- |
| | |clone (http) |
| | |<code>http://itk.org/stage/ITK.git</code> |
| | |- |
| | |push (ssh) |
| | |<code>git@itk.org:stage/ITK.git</code> |
| | |- |
| | |rowspan=3|<code>ITKApps.git</code> |
| | |rowspan=3|Insight Applications |
| | |clone (git) |
| | |<code>git://itk.org/ITKApps.git</code> |
| | |- |
| | |clone (http) |
| | |<code>http://itk.org/ITKApps.git</code> |
| | |- |
| | |push (ssh) |
| | |<code>git@itk.org:ITKApps.git</code> |
| | |- |
| | |rowspan=3|<code>ITKData.git</code> |
| | |rowspan=3|ITK <code>Testing/Data</code> Submodule |
| | |clone (git) |
| | |<code>git://itk.org/ITKData.git</code> |
| | |- |
| | |clone (http) |
| | |<code>http://itk.org/ITKData.git</code> |
| | |- |
| | |push (ssh) |
| | |<code>git@itk.org:ITKData.git</code> |
| | |} |
|
| |
|
| See the [[Git/Publish#Push_Access|push instructions]] for details.
| | ==Branches== |
|
| |
|
| For ITK, configure the push URL:
| | At the time of this writing the <code>ITK.git</code> repository has the following branches: |
|
| |
|
| git config remote.origin.pushurl git@itk.org:ITK.git
| | * '''master''': Development (default) |
| | * '''release''': Maintenance of latest release |
| | * '''release-3.20''': Maintenance of the ITKv3 series |
| | * '''nightly-master''': Follows '''master''', updated at 01:00 UTC |
| | * '''hooks''': Local commit hooks ([[Git/Hooks#Local|place]] in .git/hooks) |
| | * '''dashboard''': Dashboard script ([[ITK/Git/Dashboard|setup]] a CDash client) |
|
| |
|
| For ITKApps, configure the push URL:
| | Release branches converted from CVS have been artificially merged into master. |
| | | Actual releases have tags named by the release version number. |
| git config remote.origin.pushurl git@itk.org:ITKApps.git
| |
| | |
| ===Update Hook===
| |
| | |
| The itk.org repository has an <code>update</code> hook.
| |
| When someone tries to push changes to the repository it checks the commits as documented [[Git/Hooks#update|here]].
| |
| | |
| ==Patches==
| |
| | |
| Contributions of bug fixes and features are commonly produced by the community.
| |
| Patches are a convenient method for managing such contributions.
| |
| | |
| One may send patches to one of our mailing lists:
| |
| | |
| * [http://www.itk.org/mailman/listinfo/insight-users ITK Users Mailing List]
| |
| * [http://www.itk.org/mailman/listinfo/insight-developers ITK Developers Mailing List]
| |
| | |
| See our [[Git/Publish#Patches|patch instructions]] for details.
| |
| | |
| =Submodules=
| |
| | |
| In the ITK.git repository, <code>Testing/Data</code> is not really a directory.
| |
| It is a ''submodule'', meaning that its content does not actually appear in ITK.git, but in the ITKData.git repository.
| |
| In ITK.git Git stores in the <code>Testing</code> directory an entry called "<code>Data</code>" that refers to a ''commit'' from the ITKData repository.
| |
| Indeed, one can see this using a low-level "<code>git ls-tree</code>" command:
| |
| | |
| $ git ls-tree -r 9ec7c03d -- Testing/Data
| |
| 160000 commit bc9550f3215104818f0464fd6ede7c8ea3462aeb Testing/Data
| |
| ^^^^^^^^
| |
| We can view this commit from ITKData.git: http://itk.org/gitweb?p=ITKData.git;a=commitdiff;h=bc9550f3.
| |
| | |
| This approach allows us to keep the bulky data out of the main repository and version it separately.
| |
| Every version of ITK throughout history refers to the exact version of ITKData that it needs using this submodule link.
| |
| | |
| ==Updating Data==
| |
| | |
| One can think of the <code>Testing/Data</code> entry in ITK's tree kind of like a '''file''' that tells Git which version of ITKData.git we want.
| |
| If we want to change the version of ITKData.git to which we refer from ITK (perhaps because we've created a new commit in ITKData with some updated images), we commit a change to ITK that updates the Testing/Data "file" to refer to the new version.
| |
| | |
| First, make the changes to ITK needed to use the new data correctly:
| |
| | |
| $ git checkout -b my-new-test origin/master
| |
| $ git submodule update
| |
| $ edit ''files''
| |
| | |
| Then, make the change to Testing/Data and publish it:
| |
| | |
| $ cd Testing/Data
| |
| $ git checkout master
| |
| $ git pull --rebase origin master
| |
| $ edit ''data-files''
| |
| $ git add -- ''data-files''
| |
| $ git commit
| |
| $ git config remote.origin.pushurl git@itk.org:ITKData.git
| |
| $ git push origin master
| |
| $ cd ../..
| |
| | |
| Finally, update ITK to reference the new version of ITKData.
| |
| Our work tree already has the new version checked out in <code>Testing/Data</code> so we just need to tell Git to include this change in the next commit.
| |
| | |
| $ git add -- Testing/Data
| |
| | |
| The commit may also include the files edited above to use the new data:
| |
| | |
| $ git add -- ''files''
| |
| $ git commit
| |
| | |
| Now publish the ITK commits as you would any other topic.
| |
| | |
| =Testing=
| |
| | |
| ==Dashboard==
| |
| | |
| The [[#Branches| dashboard]] branch contains a dashboard client helper script.
| |
| Use these commands to track it:
| |
| | |
| $ mkdir -p ~/Dashboards/ITKScripts
| |
| $ cd ~/Dashboards/ITKScripts
| |
| $ git init
| |
| $ git remote add -t dashboard origin git://itk.org/ITK.git
| |
| $ git pull origin
| |
| | |
| The <code>itk_common.cmake</code> script contains setup instructions in its top comments.
| |
| Update the '''dashboard''' branch to get the latest version of this script by simply running
| |
| | |
| $ git pull origin
| |
| | |
| =Troubleshooting=
| |
| | |
| ==Firewall Blocks Port 9418==
| |
| | |
| Some institutions have firewalls that block Git's native protocol port 9418.
| |
| Use the "<code>url.<base>.insteadOf</code>" configuration option to map git URLs to http:
| |
| | |
| <pre>
| |
| $ git config --global url.http://itk.org/.insteadOf git://itk.org/
| |
| </pre>
| |
| | |
| This tells Git to translate URLs under the hood by replacing prefixes.
| |
| After running these commands ''once'' in your home directory then you can just use the "<code>git://</code>" mentioned elsewhere on this page and git will use the http protocol automagically.
| |
| | |
| ==Git Below 1.6.5==
| |
| | |
| To clone ITK using Git 1.6.4 or lower, use the commands
| |
| | |
| $ git clone git://itk.org/ITK.git
| |
| $ cd ITK
| |
| $ git submodule init
| |
| $ git submodule update
| |
| | |
| == The remote end hung up unexpectedly ==
| |
| | |
| If <code>git push</code> fails with
| |
| | |
| fatal: The remote end hung up unexpectedly
| |
| | |
| check that you set the pushurl with "<code>git config</code>".
| |
| See the [[#Pushing|push instructions]].
| |
| | |
| If you suspect your ssh key may not be configured correctly, see the [[Git/Publish#Authentication_Test|authentication test]] instructions.
| |
| | |
| =Tips=
| |
| | |
| ==Tip: Renaming==
| |
| | |
| Git does not explicitly track renames. The command
| |
| | |
| $ git mv old new
| |
| | |
| is equivalent to
| |
| | |
| $ mv old new
| |
| $ git add new
| |
| $ git rm old
| |
| | |
| Neither approach records the rename outright.
| |
| However, Git's philosophy is "''dumb add, smart view''".
| |
| It uses heuristics to ''detect'' renames when viewing history after-the-fact.
| |
| It even works when the content of a renamed file changes slightly.
| |
| | |
| In order to help Git efficiently detect the rename, it is important to remove the old file and add the new one in ''one commit'', perhaps by using <code>git mv</code> or the above 3-step procedure.
| |
| If the new file were added in one commit and the old file removed in the next, Git would report this as a copy followed by a removal.
| |
| It's copy-detection heuristics are more computationally intensive and must be explicitly enabled with the <code>-C</code> option to relevant operations (such as <code>git blame</code>).
| |
| | |
| =Resources=
| |
| | |
| Additional information about Git may be obtained at sites listed [[Git/Resources|here]].
| |