| '\" t |
| .\" Title: giteveryday |
| .\" Author: [FIXME: author] [see http://docbook.sf.net/el/author] |
| .\" Generator: DocBook XSL Stylesheets v1.79.1 <http://docbook.sf.net/> |
| .\" Date: 02/19/2019 |
| .\" Manual: Git Manual |
| .\" Source: Git 2.21.0.rc2 |
| .\" Language: English |
| .\" |
| .TH "GITEVERYDAY" "7" "02/19/2019" "Git 2\&.21\&.0\&.rc2" "Git Manual" |
| .\" ----------------------------------------------------------------- |
| .\" * Define some portability stuff |
| .\" ----------------------------------------------------------------- |
| .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| .\" http://bugs.debian.org/507673 |
| .\" http://lists.gnu.org/archive/html/groff/2009-02/msg00013.html |
| .\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| .ie \n(.g .ds Aq \(aq |
| .el .ds Aq ' |
| .\" ----------------------------------------------------------------- |
| .\" * set default formatting |
| .\" ----------------------------------------------------------------- |
| .\" disable hyphenation |
| .nh |
| .\" disable justification (adjust text to left margin only) |
| .ad l |
| .\" ----------------------------------------------------------------- |
| .\" * MAIN CONTENT STARTS HERE * |
| .\" ----------------------------------------------------------------- |
| .SH "NAME" |
| giteveryday \- A useful minimum set of commands for Everyday Git |
| .SH "SYNOPSIS" |
| .sp |
| Everyday Git With 20 Commands Or So |
| .SH "DESCRIPTION" |
| .sp |
| Git users can broadly be grouped into four categories for the purposes of describing here a small set of useful command for everyday Git\&. |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Individual Developer (Standalone) |
| commands are essential for anybody who makes a commit, even for somebody who works alone\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| If you work with other people, you will need commands listed in the |
| Individual Developer (Participant) |
| section as well\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| People who play the |
| Integrator |
| role need to learn some more commands in addition to the above\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| Repository Administration |
| commands are for system administrators who are responsible for the care and feeding of Git repositories\&. |
| .RE |
| .SH "INDIVIDUAL DEVELOPER (STANDALONE)" |
| .sp |
| A standalone individual developer does not exchange patches with other people, and works alone in a single repository, using the following commands\&. |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-init\fR(1) |
| to create a new repository\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-log\fR(1) |
| to see what happened\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-checkout\fR(1) |
| and |
| \fBgit-branch\fR(1) |
| to switch branches\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-add\fR(1) |
| to manage the index file\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-diff\fR(1) |
| and |
| \fBgit-status\fR(1) |
| to see what you are in the middle of doing\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-commit\fR(1) |
| to advance the current branch\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-reset\fR(1) |
| and |
| \fBgit-checkout\fR(1) |
| (with pathname parameters) to undo changes\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-merge\fR(1) |
| to merge between local branches\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-rebase\fR(1) |
| to maintain topic branches\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-tag\fR(1) |
| to mark a known point\&. |
| .RE |
| .SS "Examples" |
| .PP |
| Use a tarball as a starting point for a new repository\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ tar zxf frotz\&.tar\&.gz |
| $ cd frotz |
| $ git init |
| $ git add \&. \fB(1)\fR |
| $ git commit \-m "import of frotz source tree\&." |
| $ git tag v2\&.43 \fB(2)\fR |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRadd everything under the current directory\&. |
| .br |
| \fB2. \fRmake a lightweight, unannotated tag\&. |
| .br |
| .RE |
| .PP |
| Create a topic branch and develop\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ git checkout \-b alsa\-audio \fB(1)\fR |
| $ edit/compile/test |
| $ git checkout \-\- curses/ux_audio_oss\&.c \fB(2)\fR |
| $ git add curses/ux_audio_alsa\&.c \fB(3)\fR |
| $ edit/compile/test |
| $ git diff HEAD \fB(4)\fR |
| $ git commit \-a \-s \fB(5)\fR |
| $ edit/compile/test |
| $ git diff HEAD^ \fB(6)\fR |
| $ git commit \-a \-\-amend \fB(7)\fR |
| $ git checkout master \fB(8)\fR |
| $ git merge alsa\-audio \fB(9)\fR |
| $ git log \-\-since=\(aq3 days ago\(aq \fB(10)\fR |
| $ git log v2\&.43\&.\&. curses/ \fB(11)\fR |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRcreate a new topic branch\&. |
| .br |
| \fB2. \fRrevert your botched changes in |
| \fBcurses/ux_audio_oss\&.c\fR\&. |
| .br |
| \fB3. \fRyou need to tell Git if you added a new file; removal and modification will be caught if you do |
| \fBgit commit \-a\fR |
| later\&. |
| .br |
| \fB4. \fRto see what changes you are committing\&. |
| .br |
| \fB5. \fRcommit everything, as you have tested, with your sign\-off\&. |
| .br |
| \fB6. \fRlook at all your changes including the previous commit\&. |
| .br |
| \fB7. \fRamend the previous commit, adding all your new changes, using your original message\&. |
| .br |
| \fB8. \fRswitch to the master branch\&. |
| .br |
| \fB9. \fRmerge a topic branch into your master branch\&. |
| .br |
| \fB10. \fRreview commit logs; other forms to limit output can be combined and include |
| \fB\-10\fR |
| (to show up to 10 commits), |
| \fB\-\-until=2005\-12\-10\fR, etc\&. |
| .br |
| \fB11. \fRview only the changes that touch what\(cqs in |
| \fBcurses/\fR |
| directory, since |
| \fBv2\&.43\fR |
| tag\&. |
| .br |
| .RE |
| .SH "INDIVIDUAL DEVELOPER (PARTICIPANT)" |
| .sp |
| A developer working as a participant in a group project needs to learn how to communicate with others, and uses these commands in addition to the ones needed by a standalone developer\&. |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-clone\fR(1) |
| from the upstream to prime your local repository\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-pull\fR(1) |
| and |
| \fBgit-fetch\fR(1) |
| from "origin" to keep up\-to\-date with the upstream\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-push\fR(1) |
| to shared repository, if you adopt CVS style shared repository workflow\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-format-patch\fR(1) |
| to prepare e\-mail submission, if you adopt Linux kernel\-style public forum workflow\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-send-email\fR(1) |
| to send your e\-mail submission without corruption by your MUA\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-request-pull\fR(1) |
| to create a summary of changes for your upstream to pull\&. |
| .RE |
| .SS "Examples" |
| .PP |
| Clone the upstream and work on it\&. Feed changes to upstream\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ git clone git://git\&.kernel\&.org/pub/scm/\&.\&.\&./torvalds/linux\-2\&.6 my2\&.6 |
| $ cd my2\&.6 |
| $ git checkout \-b mine master \fB(1)\fR |
| $ edit/compile/test; git commit \-a \-s \fB(2)\fR |
| $ git format\-patch master \fB(3)\fR |
| $ git send\-email \-\-to="person <email@example\&.com>" 00*\&.patch \fB(4)\fR |
| $ git checkout master \fB(5)\fR |
| $ git pull \fB(6)\fR |
| $ git log \-p ORIG_HEAD\&.\&. arch/i386 include/asm\-i386 \fB(7)\fR |
| $ git ls\-remote \-\-heads http://git\&.kernel\&.org/\&.\&.\&./jgarzik/libata\-dev\&.git \fB(8)\fR |
| $ git pull git://git\&.kernel\&.org/pub/\&.\&.\&./jgarzik/libata\-dev\&.git ALL \fB(9)\fR |
| $ git reset \-\-hard ORIG_HEAD \fB(10)\fR |
| $ git gc \fB(11)\fR |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRcheckout a new branch |
| \fBmine\fR |
| from master\&. |
| .br |
| \fB2. \fRrepeat as needed\&. |
| .br |
| \fB3. \fRextract patches from your branch, relative to master, |
| .br |
| \fB4. \fRand email them\&. |
| .br |
| \fB5. \fRreturn to |
| \fBmaster\fR, ready to see what\(cqs new |
| .br |
| \fB6. \fR\fBgit pull\fR |
| fetches from |
| \fBorigin\fR |
| by default and merges into the current branch\&. |
| .br |
| \fB7. \fRimmediately after pulling, look at the changes done upstream since last time we checked, only in the area we are interested in\&. |
| .br |
| \fB8. \fRcheck the branch names in an external repository (if not known)\&. |
| .br |
| \fB9. \fRfetch from a specific branch |
| \fBALL\fR |
| from a specific repository and merge it\&. |
| .br |
| \fB10. \fRrevert the pull\&. |
| .br |
| \fB11. \fRgarbage collect leftover objects from reverted pull\&. |
| .br |
| .RE |
| .PP |
| Push into another repository\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| satellite$ git clone mothership:frotz frotz \fB(1)\fR |
| satellite$ cd frotz |
| satellite$ git config \-\-get\-regexp \(aq^(remote|branch)\e\&.\(aq \fB(2)\fR |
| remote\&.origin\&.url mothership:frotz |
| remote\&.origin\&.fetch refs/heads/*:refs/remotes/origin/* |
| branch\&.master\&.remote origin |
| branch\&.master\&.merge refs/heads/master |
| satellite$ git config remote\&.origin\&.push \e |
| +refs/heads/*:refs/remotes/satellite/* \fB(3)\fR |
| satellite$ edit/compile/test/commit |
| satellite$ git push origin \fB(4)\fR |
| |
| mothership$ cd frotz |
| mothership$ git checkout master |
| mothership$ git merge satellite/master \fB(5)\fR |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRmothership machine has a frotz repository under your home directory; clone from it to start a repository on the satellite machine\&. |
| .br |
| \fB2. \fRclone sets these configuration variables by default\&. It arranges |
| \fBgit pull\fR |
| to fetch and store the branches of mothership machine to local |
| \fBremotes/origin/*\fR |
| remote\-tracking branches\&. |
| .br |
| \fB3. \fRarrange |
| \fBgit push\fR |
| to push all local branches to their corresponding branch of the mothership machine\&. |
| .br |
| \fB4. \fRpush will stash all our work away on |
| \fBremotes/satellite/*\fR |
| remote\-tracking branches on the mothership machine\&. You could use this as a back\-up method\&. Likewise, you can pretend that mothership "fetched" from you (useful when access is one sided)\&. |
| .br |
| \fB5. \fRon mothership machine, merge the work done on the satellite machine into the master branch\&. |
| .br |
| .RE |
| .PP |
| Branch off of a specific tag\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ git checkout \-b private2\&.6\&.14 v2\&.6\&.14 \fB(1)\fR |
| $ edit/compile/test; git commit \-a |
| $ git checkout master |
| $ git cherry\-pick v2\&.6\&.14\&.\&.private2\&.6\&.14 \fB(2)\fR |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRcreate a private branch based on a well known (but somewhat behind) tag\&. |
| .br |
| \fB2. \fRforward port all changes in |
| \fBprivate2\&.6\&.14\fR |
| branch to |
| \fBmaster\fR |
| branch without a formal "merging"\&. Or longhand |
| |
| \fBgit format\-patch \-k \-m \-\-stdout v2\&.6\&.14\&.\&.private2\&.6\&.14 | git am \-3 \-k\fR |
| .br |
| .RE |
| .sp |
| An alternate participant submission mechanism is using the \fBgit request\-pull\fR or pull\-request mechanisms (e\&.g as used on GitHub (www\&.github\&.com) to notify your upstream of your contribution\&. |
| .SH "INTEGRATOR" |
| .sp |
| A fairly central person acting as the integrator in a group project receives changes made by others, reviews and integrates them and publishes the result for others to use, using these commands in addition to the ones needed by participants\&. |
| .sp |
| This section can also be used by those who respond to \fBgit request\-pull\fR or pull\-request on GitHub (www\&.github\&.com) to integrate the work of others into their history\&. A sub\-area lieutenant for a repository will act both as a participant and as an integrator\&. |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-am\fR(1) |
| to apply patches e\-mailed in from your contributors\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-pull\fR(1) |
| to merge from your trusted lieutenants\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-format-patch\fR(1) |
| to prepare and send suggested alternative to contributors\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-revert\fR(1) |
| to undo botched commits\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-push\fR(1) |
| to publish the bleeding edge\&. |
| .RE |
| .SS "Examples" |
| .PP |
| A typical integrator\(cqs Git day\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ git status \fB(1)\fR |
| $ git branch \-\-no\-merged master \fB(2)\fR |
| $ mailx \fB(3)\fR |
| & s 2 3 4 5 \&./+to\-apply |
| & s 7 8 \&./+hold\-linus |
| & q |
| $ git checkout \-b topic/one master |
| $ git am \-3 \-i \-s \&./+to\-apply \fB(4)\fR |
| $ compile/test |
| $ git checkout \-b hold/linus && git am \-3 \-i \-s \&./+hold\-linus \fB(5)\fR |
| $ git checkout topic/one && git rebase master \fB(6)\fR |
| $ git checkout pu && git reset \-\-hard next \fB(7)\fR |
| $ git merge topic/one topic/two && git merge hold/linus \fB(8)\fR |
| $ git checkout maint |
| $ git cherry\-pick master~4 \fB(9)\fR |
| $ compile/test |
| $ git tag \-s \-m "GIT 0\&.99\&.9x" v0\&.99\&.9x \fB(10)\fR |
| $ git fetch ko && for branch in master maint next pu \fB(11)\fR |
| do |
| git show\-branch ko/$branch $branch \fB(12)\fR |
| done |
| $ git push \-\-follow\-tags ko \fB(13)\fR |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRsee what you were in the middle of doing, if anything\&. |
| .br |
| \fB2. \fRsee which branches haven\(cqt been merged into |
| \fBmaster\fR |
| yet\&. Likewise for any other integration branches e\&.g\&. |
| \fBmaint\fR, |
| \fBnext\fR |
| and |
| \fBpu\fR |
| (potential updates)\&. |
| .br |
| \fB3. \fRread mails, save ones that are applicable, and save others that are not quite ready (other mail readers are available)\&. |
| .br |
| \fB4. \fRapply them, interactively, with your sign\-offs\&. |
| .br |
| \fB5. \fRcreate topic branch as needed and apply, again with sign\-offs\&. |
| .br |
| \fB6. \fRrebase internal topic branch that has not been merged to the master or exposed as a part of a stable branch\&. |
| .br |
| \fB7. \fRrestart |
| \fBpu\fR |
| every time from the next\&. |
| .br |
| \fB8. \fRand bundle topic branches still cooking\&. |
| .br |
| \fB9. \fRbackport a critical fix\&. |
| .br |
| \fB10. \fRcreate a signed tag\&. |
| .br |
| \fB11. \fRmake sure master was not accidentally rewound beyond that already pushed out\&. |
| .br |
| \fB12. \fRIn the output from |
| \fBgit show\-branch\fR, |
| \fBmaster\fR |
| should have everything |
| \fBko/master\fR |
| has, and |
| \fBnext\fR |
| should have everything |
| \fBko/next\fR |
| has, etc\&. |
| .br |
| \fB13. \fRpush out the bleeding edge, together with new tags that point into the pushed history\&. |
| .br |
| .RE |
| .sp |
| In this example, the \fBko\fR shorthand points at the Git maintainer\(cqs repository at kernel\&.org, and looks like this: |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| (in \&.git/config) |
| [remote "ko"] |
| url = kernel\&.org:/pub/scm/git/git\&.git |
| fetch = refs/heads/*:refs/remotes/ko/* |
| push = refs/heads/master |
| push = refs/heads/next |
| push = +refs/heads/pu |
| push = refs/heads/maint |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| .SH "REPOSITORY ADMINISTRATION" |
| .sp |
| A repository administrator uses the following tools to set up and maintain access to the repository by developers\&. |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-daemon\fR(1) |
| to allow anonymous download from repository\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-shell\fR(1) |
| can be used as a |
| \fIrestricted login shell\fR |
| for shared central repository users\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgit-http-backend\fR(1) |
| provides a server side implementation of Git\-over\-HTTP ("Smart http") allowing both fetch and push services\&. |
| .RE |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| \fBgitweb\fR(1) |
| provides a web front\-end to Git repositories, which can be set\-up using the |
| \fBgit-instaweb\fR(1) |
| script\&. |
| .RE |
| .sp |
| \m[blue]\fBupdate hook howto\fR\m[]\&\s-2\u[1]\d\s+2 has a good example of managing a shared central repository\&. |
| .sp |
| In addition there are a number of other widely deployed hosting, browsing and reviewing solutions such as: |
| .sp |
| .RS 4 |
| .ie n \{\ |
| \h'-04'\(bu\h'+03'\c |
| .\} |
| .el \{\ |
| .sp -1 |
| .IP \(bu 2.3 |
| .\} |
| gitolite, gerrit code review, cgit and others\&. |
| .RE |
| .SS "Examples" |
| .PP |
| We assume the following in /etc/services |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ grep 9418 /etc/services |
| git 9418/tcp # Git Version Control System |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| .RE |
| .PP |
| Run git\-daemon to serve /pub/scm from inetd\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ grep git /etc/inetd\&.conf |
| git stream tcp nowait nobody \e |
| /usr/bin/git\-daemon git\-daemon \-\-inetd \-\-export\-all /pub/scm |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| The actual configuration line should be on one line\&. |
| .RE |
| .PP |
| Run git\-daemon to serve /pub/scm from xinetd\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ cat /etc/xinetd\&.d/git\-daemon |
| # default: off |
| # description: The Git server offers access to Git repositories |
| service git |
| { |
| disable = no |
| type = UNLISTED |
| port = 9418 |
| socket_type = stream |
| wait = no |
| user = nobody |
| server = /usr/bin/git\-daemon |
| server_args = \-\-inetd \-\-export\-all \-\-base\-path=/pub/scm |
| log_on_failure += USERID |
| } |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| Check your xinetd(8) documentation and setup, this is from a Fedora system\&. Others might be different\&. |
| .RE |
| .PP |
| Give push/pull only access to developers using git\-over\-ssh\&. |
| .RS 4 |
| e\&.g\&. those using: |
| \fB$ git push/pull ssh://host\&.xz/pub/scm/project\fR |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ grep git /etc/passwd \fB(1)\fR |
| alice:x:1000:1000::/home/alice:/usr/bin/git\-shell |
| bob:x:1001:1001::/home/bob:/usr/bin/git\-shell |
| cindy:x:1002:1002::/home/cindy:/usr/bin/git\-shell |
| david:x:1003:1003::/home/david:/usr/bin/git\-shell |
| $ grep git /etc/shells \fB(2)\fR |
| /usr/bin/git\-shell |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRlog\-in shell is set to /usr/bin/git\-shell, which does not allow anything but |
| \fBgit push\fR |
| and |
| \fBgit pull\fR\&. The users require ssh access to the machine\&. |
| .br |
| \fB2. \fRin many distributions /etc/shells needs to list what is used as the login shell\&. |
| .br |
| .RE |
| .PP |
| CVS\-style shared repository\&. |
| .RS 4 |
| .sp |
| .if n \{\ |
| .RS 4 |
| .\} |
| .nf |
| $ grep git /etc/group \fB(1)\fR |
| git:x:9418:alice,bob,cindy,david |
| $ cd /home/devo\&.git |
| $ ls \-l \fB(2)\fR |
| lrwxrwxrwx 1 david git 17 Dec 4 22:40 HEAD \-> refs/heads/master |
| drwxrwsr\-x 2 david git 4096 Dec 4 22:40 branches |
| \-rw\-rw\-r\-\- 1 david git 84 Dec 4 22:40 config |
| \-rw\-rw\-r\-\- 1 david git 58 Dec 4 22:40 description |
| drwxrwsr\-x 2 david git 4096 Dec 4 22:40 hooks |
| \-rw\-rw\-r\-\- 1 david git 37504 Dec 4 22:40 index |
| drwxrwsr\-x 2 david git 4096 Dec 4 22:40 info |
| drwxrwsr\-x 4 david git 4096 Dec 4 22:40 objects |
| drwxrwsr\-x 4 david git 4096 Nov 7 14:58 refs |
| drwxrwsr\-x 2 david git 4096 Dec 4 22:40 remotes |
| $ ls \-l hooks/update \fB(3)\fR |
| \-r\-xr\-xr\-x 1 david git 3536 Dec 4 22:40 update |
| $ cat info/allowed\-users \fB(4)\fR |
| refs/heads/master alice\e|cindy |
| refs/heads/doc\-update bob |
| refs/tags/v[0\-9]* david |
| .fi |
| .if n \{\ |
| .RE |
| .\} |
| .sp |
| \fB1. \fRplace the developers into the same git group\&. |
| .br |
| \fB2. \fRand make the shared repository writable by the group\&. |
| .br |
| \fB3. \fRuse update\-hook example by Carl from Documentation/howto/ for branch policy control\&. |
| .br |
| \fB4. \fRalice and cindy can push into master, only bob can push into doc\-update\&. david is the release manager and is the only person who can create and push version tags\&. |
| .br |
| .RE |
| .SH "GIT" |
| .sp |
| Part of the \fBgit\fR(1) suite |
| .SH "NOTES" |
| .IP " 1." 4 |
| update hook howto |
| .RS 4 |
| \%git-htmldocs/howto/update-hook-example.html |
| .RE |