blob: 0acf81f2eaa4484f4b796c4281f53d83bc380d53 [file] [log] [blame]
------
Maven Git Convention
------
Olivier Lamy
------
2012-09-12
------
~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements. See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership. The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License. You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied. See the License for the
~~ specific language governing permissions and limitations
~~ under the License.
~~ NOTE: For help with the syntax of this file, see:
~~ https://maven.apache.org/doxia/references/apt-format.html
Maven Git Convention
This document describes how developers should use Git. The Maven project
is in the process of migrating some of its components from svn to git.
* Git migration
Information on the migration is here: {{https://cwiki.apache.org/confluence/display/MAVEN/Git+Migration}}
* Git Configuration
** For contributors who are not committers
Apache git repositories are at
< <<git://git.apache.org>>>. However, the ASF
uses clones on github.com to make it easier for people to contribute
changes via pull requests.
To contribute to a Maven component that is maintained in git, please
follow these steps:
[[1]] create a JIRA for bug or improvement that you wish to work
on. The Maven project uses JIRA to organize and track our work,
and in particular to keep track of which changes are included in
which releases.
[[2]] Make a fork of the official ASF clone from github.com. For
example, <<<https://github.com/apache/maven-scm>>>.
[[3]] Make a branch named after your JIRA. This is not <required>,
but it makes it easier for Maven committers to keep track of your
contribution.
[[4]] Make your changes. As always, unit or integration tests make
it much easier for us to accept your changes.
[[5]] Make a pull request to pull your changes to the official clone.
Add a link to your pull request to the JIRA. Committers will take it
from here.
** For committers
Committers may, of course, commit directly to the ASF repositories.
For complex changes, you may find it valuable to make a pull request
at github to make it easier to collaborate with others.
*** {Commit Message Template}
Commits should be focused on one issue at a time, because that makes it easier
for others to review the commit.
A commit message should use this template:
+-----+
[ISSUE-1] <<Summary field from JIRA>>
Submitted by: <<Name of non-committer>>
o Comments
+-----+
Where:
* <<ISSUE-1>> can be omitted if there was no relevant JIRA issue, though you are strongly encouraged to create one for
significant changes.
* <<Submitted by>> only needs to be specified when a patch is being applied for a non-committer.
* <<Comments>> some optional words about the solution.
[]
eg:
+-----+
[MNG-1456] Added the foo to the bar
Submitted by: Baz Bazman
o Applied without change
+-----+
* Apply User Patch
To keep the history of contributions clear,
The committer should usually apply the patch without any <<major>>
modifications, and then create his or her own commits for further
modifications. However, committers should never commit code to a live
branch which is not suitable to release. If a contribution requires
significant work to make it useful, commit it to a branch, fix it up,
and merge the branch.
If the user created a pull request, the committer is responsible for
closing that pull request. You do this by adding a note to a commit
message:
+----+
Closes #NNN.
+----+
where NNN is the number of the pull request.
* Edit Commit Message
to edit last commit comment:
---
$ git commit --amend -m "new comment"
---
* Workflow
Workflow for svn folks is something like :
---
$ git pull
$ hack hack hack
$ git push
// fails, because someone else has already pushed to master
$ git pull
// this creates some merges
$ git push
---
A more quiet workflow :
---
$ git pull
$ hack hack hack
$ git push
// fails, because someone else has already pushed to master
$ git fetch
// this moves 'origin/master'
$ git rebase origin/master
// this reapplies your local changes on top of origin/master
$ git push
---
* Other useful Git commands while developing
If you've done a chunk of work and you would like to ditch your changes and start from scratch use this command to
revert to the original checkout:
---
$ git checkout .
---
TODO .gitignore
** power-git checkout
This checkout is typical for highly experienced git users, and may serve as inspiration for others; as usual the
best way to learn is by doing. Sample shown for maven-surefire
Go to https://github.com/apache/maven-surefire and fork surefire to your own github account.
Starting with nothing (no existing clone)
---
git clone https://github.com/<youraccount>/maven-surefire.git
git remote add apache https://git-wip-us.apache.org/repos/asf/maven-surefire.git
git remote add asfgithub https://github.com/apache/maven-surefire.git
git config --add remote.asfgithub.fetch "+refs/pull/*/head:refs/remotes/asfgithub/pr/*"
git fetch --all
---
(You may consider adding --global to the git config statement above to always fetch
pull requests for any remote named "asfgithub")
In this setup, running "git push" will normally push to your personal github account.
Furthermore, all pull requests from github are also fetched to your local clone, use
---
gitk --all
---
to try to make some sense of it all. This is an important command to understand! (gitk may need to be installed additionally)
gitk also has a quite excellent context menu that is far more context sensitive than most people realize at first impression. Right-clicking on a commit in a github pull-request will allow you to cherry-pick straight in the gui.
If you're working on the master branch, you can do stuff like this:
---
git push # your github account
git push apache # the authoritative apache repo
---
Using your github account as a storage for half-finished work is excellent if you switch between multiple computers,
always push to github before leaving your current computer and start by pulling at the next computer.
To merge a pull request
---
git merge pr/10 # merge pull request number 10 from asf@github into master
git push apache # upload to apache
---
Or if you're comfortable with rebasing;
---
git checkout pr/10
git rebase apache/master
git push apache
---