giteveryday.7 (20552B)
- '\" t
- .\" Title: giteveryday
- .\" Author: [FIXME: author] [see http://www.docbook.org/tdg5/en/html/author]
- .\" Generator: DocBook XSL Stylesheets v1.79.2 <http://docbook.sf.net/>
- .\" Date: 2025-03-14
- .\" Manual: Git Manual
- .\" Source: Git 2.49.0
- .\" Language: English
- .\"
- .TH "GITEVERYDAY" "7" "2025-03-14" "Git 2\&.49\&.0" "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 commands 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-switch\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-restore\fR(1)
- 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
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- add everything under the current directory\&.
- T}
- \fB2.\fR\h'-2n':T{
- make a lightweight, unannotated tag\&.
- T}
- .TE
- .RE
- .PP
- Create a topic branch and develop\&.
- .RS 4
- .sp
- .if n \{\
- .RS 4
- .\}
- .nf
- $ git switch \-c alsa\-audio \fB(1)\fR
- $ edit/compile/test
- $ git restore 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 switch 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
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- create a new topic branch\&.
- T}
- \fB2.\fR\h'-2n':T{
- revert your botched changes in
- \fBcurses/ux_audio_oss\&.c\fR\&.
- T}
- \fB3.\fR\h'-2n':T{
- you need to tell Git if you added a new file; removal and modification will be caught if you do
- \fBgit\fR
- \fBcommit\fR
- \fB\-a\fR
- later\&.
- T}
- \fB4.\fR\h'-2n':T{
- to see what changes you are committing\&.
- T}
- \fB5.\fR\h'-2n':T{
- commit everything, as you have tested, with your sign\-off\&.
- T}
- \fB6.\fR\h'-2n':T{
- look at all your changes including the previous commit\&.
- T}
- \fB7.\fR\h'-2n':T{
- amend the previous commit, adding all your new changes, using your original message\&.
- T}
- \fB8.\fR\h'-2n':T{
- switch to the master branch\&.
- T}
- \fB9.\fR\h'-2n':T{
- merge a topic branch into your master branch\&.
- T}
- \fB10.\fR\h'-2n':T{
- review 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\&.
- T}
- \fB11.\fR\h'-2n':T{
- view only the changes that touch what\(cqs in
- \fBcurses/\fR
- directory, since
- \fBv2\&.43\fR
- tag\&.
- T}
- .TE
- .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 switch \-c 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 switch 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
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- checkout a new branch
- \fBmine\fR
- from master\&.
- T}
- \fB2.\fR\h'-2n':T{
- repeat as needed\&.
- T}
- \fB3.\fR\h'-2n':T{
- extract patches from your branch, relative to master,
- T}
- \fB4.\fR\h'-2n':T{
- and email them\&.
- T}
- \fB5.\fR\h'-2n':T{
- return to
- \fBmaster\fR, ready to see what\(cqs new
- T}
- \fB6.\fR\h'-2n':T{
- \fBgit\fR
- \fBpull\fR
- fetches from
- \fBorigin\fR
- by default and merges into the current branch\&.
- T}
- \fB7.\fR\h'-2n':T{
- immediately after pulling, look at the changes done upstream since last time we checked, only in the area we are interested in\&.
- T}
- \fB8.\fR\h'-2n':T{
- check the branch names in an external repository (if not known)\&.
- T}
- \fB9.\fR\h'-2n':T{
- fetch from a specific branch
- \fBALL\fR
- from a specific repository and merge it\&.
- T}
- \fB10.\fR\h'-2n':T{
- revert the pull\&.
- T}
- \fB11.\fR\h'-2n':T{
- garbage collect leftover objects from reverted pull\&.
- T}
- .TE
- .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 switch master
- mothership$ git merge satellite/master \fB(5)\fR
- .fi
- .if n \{\
- .RE
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- mothership machine has a frotz repository under your home directory; clone from it to start a repository on the satellite machine\&.
- T}
- \fB2.\fR\h'-2n':T{
- clone sets these configuration variables by default\&. It arranges
- \fBgit\fR
- \fBpull\fR
- to fetch and store the branches of mothership machine to local
- \fBremotes/origin/\fR* remote\-tracking branches\&.
- T}
- \fB3.\fR\h'-2n':T{
- arrange
- \fBgit\fR
- \fBpush\fR
- to push all local branches to their corresponding branch of the mothership machine\&.
- T}
- \fB4.\fR\h'-2n':T{
- push 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)\&.
- T}
- \fB5.\fR\h'-2n':T{
- on mothership machine, merge the work done on the satellite machine into the master branch\&.
- T}
- .TE
- .RE
- .PP
- Branch off of a specific tag\&.
- .RS 4
- .sp
- .if n \{\
- .RS 4
- .\}
- .nf
- $ git switch \-c 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
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- create a private branch based on a well known (but somewhat behind) tag\&.
- T}
- \fB2.\fR\h'-2n':T{
- forward port all changes in
- \fBprivate2\&.6\&.14\fR
- branch to
- \fBmaster\fR
- branch without a formal "merging"\&. Or longhand
- \fBgit\fR
- \fBformat\-patch\fR
- \fB\-k\fR
- \fB\-m\fR
- \fB\-\-stdout\fR
- \fBv2\&.6\&.14\fR\fB\&.\&.\fR\fBprivate2\&.6\&.14\fR
- |
- \fBgit\fR
- \fBam\fR
- \fB\-3\fR
- \fB\-k\fR
- T}
- .TE
- .RE
- .sp
- An alternate participant submission mechanism is using the \fBgit\fR \fBrequest\-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\fR \fBrequest\-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 switch \-c topic/one master
- $ git am \-3 \-i \-s \&./+to\-apply \fB(4)\fR
- $ compile/test
- $ git switch \-c hold/linus && git am \-3 \-i \-s \&./+hold\-linus \fB(5)\fR
- $ git switch topic/one && git rebase master \fB(6)\fR
- $ git switch \-C seen next \fB(7)\fR
- $ git merge topic/one topic/two && git merge hold/linus \fB(8)\fR
- $ git switch 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 seen \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
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- see what you were in the middle of doing, if anything\&.
- T}
- \fB2.\fR\h'-2n':T{
- see which branches haven\(cqt been merged into
- \fBmaster\fR
- yet\&. Likewise for any other integration branches e\&.g\&.
- \fBmaint\fR,
- \fBnext\fR
- and
- \fBseen\fR\&.
- T}
- \fB3.\fR\h'-2n':T{
- read mails, save ones that are applicable, and save others that are not quite ready (other mail readers are available)\&.
- T}
- \fB4.\fR\h'-2n':T{
- apply them, interactively, with your sign\-offs\&.
- T}
- \fB5.\fR\h'-2n':T{
- create topic branch as needed and apply, again with sign\-offs\&.
- T}
- \fB6.\fR\h'-2n':T{
- rebase internal topic branch that has not been merged to the master or exposed as a part of a stable branch\&.
- T}
- \fB7.\fR\h'-2n':T{
- restart
- \fBseen\fR
- every time from the next\&.
- T}
- \fB8.\fR\h'-2n':T{
- and bundle topic branches still cooking\&.
- T}
- \fB9.\fR\h'-2n':T{
- backport a critical fix\&.
- T}
- \fB10.\fR\h'-2n':T{
- create a signed tag\&.
- T}
- \fB11.\fR\h'-2n':T{
- make sure master was not accidentally rewound beyond that already pushed out\&.
- T}
- \fB12.\fR\h'-2n':T{
- In the output from
- \fBgit\fR
- \fBshow\-branch\fR,
- \fBmaster\fR
- should have everything
- \fBko/master\fR
- has, and
- \fBnext\fR
- should have everything
- \fBko/next\fR
- has, etc\&.
- T}
- \fB13.\fR\h'-2n':T{
- push out the bleeding edge, together with new tags that point into the pushed history\&.
- T}
- .TE
- .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/seen
- push = refs/heads/maint
- .fi
- .if n \{\
- .RE
- .\}
- .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
- .\}
- .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$\fR
- \fBgit\fR
- \fBpush/pull\fR
- \fBssh://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
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- log\-in shell is set to /usr/bin/git\-shell, which does not allow anything but
- \fBgit\fR
- \fBpush\fR
- and
- \fBgit\fR
- \fBpull\fR\&. The users require ssh access to the machine\&.
- T}
- \fB2.\fR\h'-2n':T{
- in many distributions /etc/shells needs to list what is used as the login shell\&.
- T}
- .TE
- .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
- .\}
- .TS
- tab(:);
- r lw(\n(.lu*75u/100u).
- \fB1.\fR\h'-2n':T{
- place the developers into the same git group\&.
- T}
- \fB2.\fR\h'-2n':T{
- and make the shared repository writable by the group\&.
- T}
- \fB3.\fR\h'-2n':T{
- use update\-hook example by Carl from Documentation/howto/ for branch policy control\&.
- T}
- \fB4.\fR\h'-2n':T{
- alice 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\&.
- T}
- .TE
- .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