diff options
Diffstat (limited to 'Documentation')
212 files changed, 7432 insertions, 2557 deletions
diff --git a/Documentation/.gitattributes b/Documentation/.gitattributes new file mode 100644 index 0000000000..ddb030137d --- /dev/null +++ b/Documentation/.gitattributes @@ -0,0 +1 @@ +*.txt whitespace diff --git a/Documentation/.gitignore b/Documentation/.gitignore index 2f938f471a..d8edd90406 100644 --- a/Documentation/.gitignore +++ b/Documentation/.gitignore @@ -2,7 +2,9 @@ *.html *.[1-8] *.made +*.texi git.info +gitman.info howto-index.txt doc.dep cmds-*.txt diff --git a/Documentation/CodingGuidelines b/Documentation/CodingGuidelines index 3b042db624..f628c1f3b7 100644 --- a/Documentation/CodingGuidelines +++ b/Documentation/CodingGuidelines @@ -53,6 +53,18 @@ For shell scripts specifically (not exhaustive): - We do not write the noiseword "function" in front of shell functions. + - As to use of grep, stick to a subset of BRE (namely, no \{m,n\}, + [::], [==], nor [..]) for portability. + + - We do not use \{m,n\}; + + - We do not use -E; + + - We do not use ? nor + (which are \{0,1\} and \{1,\} + respectively in BRE) but that goes without saying as these + are ERE elements not BRE (note that \? and \+ are not even part + of BRE -- making them accessible from BRE is a GNU extension). + For C programs: - We use tabs to indent, and interpret tabs as taking up to @@ -77,6 +89,8 @@ For C programs: of "else if" statements, it can make sense to add braces to single line blocks. + - We try to avoid assignments inside if(). + - Try to make your code understandable. You may put comments in, but comments invariably tend to stale out when the code they were describing changes. Often splitting a function @@ -91,7 +105,7 @@ For C programs: - Use the API. No, really. We have a strbuf (variable length string), several arrays with the ALLOC_GROW() macro, a - path_list for sorted string lists, a hash map (mapping struct + string_list for sorted string lists, a hash map (mapping struct objects) named "struct decorate", amongst other things. - When you come up with an API, document it. diff --git a/Documentation/Makefile b/Documentation/Makefile index 7a325462ee..62269e39c4 100644 --- a/Documentation/Makefile +++ b/Documentation/Makefile @@ -1,9 +1,12 @@ MAN1_TXT= \ $(filter-out $(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \ $(wildcard git-*.txt)) \ - gitk.txt -MAN5_TXT=gitattributes.txt gitignore.txt gitcli.txt gitmodules.txt -MAN7_TXT=git.txt + gitk.txt git.txt +MAN5_TXT=gitattributes.txt gitignore.txt gitmodules.txt githooks.txt \ + gitrepository-layout.txt +MAN7_TXT=gitcli.txt gittutorial.txt gittutorial-2.txt \ + gitcvs-migration.txt gitcore-tutorial.txt gitglossary.txt \ + gitdiffcore.txt MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT) MAN_XML=$(patsubst %.txt,%.xml,$(MAN_TXT)) @@ -11,17 +14,9 @@ MAN_HTML=$(patsubst %.txt,%.html,$(MAN_TXT)) DOC_HTML=$(MAN_HTML) -ARTICLES = tutorial -ARTICLES += tutorial-2 -ARTICLES += core-tutorial -ARTICLES += cvs-migration -ARTICLES += diffcore -ARTICLES += howto-index -ARTICLES += repository-layout -ARTICLES += hooks +ARTICLES = howto-index ARTICLES += everyday ARTICLES += git-tools -ARTICLES += glossary # with their own formatting rules. SP_ARTICLES = howto/revert-branch-rebase howto/using-merge-subtree user-manual API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt))) @@ -45,6 +40,7 @@ man7dir=$(mandir)/man7 ASCIIDOC=asciidoc ASCIIDOC_EXTRA = +MANPAGE_XSL = callouts.xsl INSTALL?=install RM ?= rm -f DOC_REF = origin/man @@ -65,6 +61,7 @@ ASCIIDOC_EXTRA += -a asciidoc7compatible endif ifdef DOCBOOK_XSL_172 ASCIIDOC_EXTRA += -a docbook-xsl-172 +MANPAGE_XSL = manpage-1.72.xsl endif # @@ -142,8 +139,6 @@ cmd-list.made: cmd-list.perl ../command-list.txt $(MAN1_TXT) $(PERL_PATH) ./cmd-list.perl ../command-list.txt date >$@ -git.7 git.html: git.txt - clean: $(RM) *.xml *.xml+ *.html *.html+ *.1 *.5 *.7 $(RM) *.texi *.texi+ git.info gitman.info @@ -159,7 +154,7 @@ $(MAN_HTML): %.html : %.txt %.1 %.5 %.7 : %.xml $(RM) $@ - xmlto -m callouts.xsl man $< + xmlto -m $(MANPAGE_XSL) man $< %.xml : %.txt $(RM) $@+ $@ diff --git a/Documentation/RelNotes-1.5.2.txt b/Documentation/RelNotes-1.5.2.txt index 6195715dc7..e8328d090a 100644 --- a/Documentation/RelNotes-1.5.2.txt +++ b/Documentation/RelNotes-1.5.2.txt @@ -36,7 +36,7 @@ Updates since v1.5.1 expansion). These conversions apply when checking files in or out, and exporting via git-archive. -* The packfile format now optionally suports 64-bit index. +* The packfile format now optionally supports 64-bit index. This release supports the "version 2" format of the .idx file. This is automatically enabled when a huge packfile diff --git a/Documentation/RelNotes-1.5.3.3.txt b/Documentation/RelNotes-1.5.3.3.txt index 2a7bfdd5cc..d213846951 100644 --- a/Documentation/RelNotes-1.5.3.3.txt +++ b/Documentation/RelNotes-1.5.3.3.txt @@ -12,7 +12,7 @@ Fixes since v1.5.3.2 * The default shell on some FreeBSD did not execute the argument parsing code correctly and made git unusable. - * git-svn incorrectly spawned pager even when the user user + * git-svn incorrectly spawned pager even when the user explicitly asked not to. * sample post-receive hook overquoted the envelope sender diff --git a/Documentation/RelNotes-1.5.3.txt b/Documentation/RelNotes-1.5.3.txt index d03894b926..0668d3c0ca 100644 --- a/Documentation/RelNotes-1.5.3.txt +++ b/Documentation/RelNotes-1.5.3.txt @@ -86,7 +86,7 @@ Updates since v1.5.2 - "git rev-list" learned --regexp-ignore-case and --extended-regexp options to tweak its matching logic used - for --grep fitering. + for --grep filtering. - "git describe --contains" is a handier way to call more obscure command "git name-rev --tags". @@ -243,7 +243,7 @@ Updates since v1.5.2 - We used to have core.legacyheaders configuration, when set to false, allowed git to write loose objects in a format - that mimicks the format used by objects stored in packs. It + that mimics the format used by objects stored in packs. It turns out that this was not so useful. Although we will continue to read objects written in that format, we do not honor that configuration anymore and create loose objects in @@ -302,7 +302,7 @@ Updates since v1.5.2 small enough delta results it creates while looking for the best delta candidates. - - "git pack-objects" learned a new heuristcs to prefer delta + - "git pack-objects" learned a new heuristic to prefer delta that is shallower in depth over the smallest delta possible. This improves both overall packfile access performance and packfile density. diff --git a/Documentation/RelNotes-1.5.4.1.txt b/Documentation/RelNotes-1.5.4.1.txt new file mode 100644 index 0000000000..d4e44b8b09 --- /dev/null +++ b/Documentation/RelNotes-1.5.4.1.txt @@ -0,0 +1,17 @@ +GIT v1.5.4.1 Release Notes +========================== + +Fixes since v1.5.4 +------------------ + + * "git-commit -C $tag" used to work but rewrite in C done in + 1.5.4 broke it. + + * An entry in the .gitattributes file that names a pattern in a + subdirectory of the directory it is in did not match + correctly (e.g. pattern "b/*.c" in "a/.gitattributes" should + match "a/b/foo.c" but it didn't). + + * Customized color specification was parsed incorrectly when + numeric color values are used. This was fixed in 1.5.4.1. + diff --git a/Documentation/RelNotes-1.5.4.2.txt b/Documentation/RelNotes-1.5.4.2.txt new file mode 100644 index 0000000000..21d0df59fb --- /dev/null +++ b/Documentation/RelNotes-1.5.4.2.txt @@ -0,0 +1,43 @@ +GIT v1.5.4.2 Release Notes +========================== + +Fixes since v1.5.4 +------------------ + + * The configuration parser was not prepared to see string + valued variables misspelled as boolean and segfaulted. + + * Temporary files left behind due to interrupted object + transfers were not cleaned up with "git prune". + + * "git config --unset" was confused when the unset variables + were spelled with continuation lines in the config file. + + * The merge message detection in "git cvsimport" did not catch + a message that began with "Merge...". + + * "git status" suggests "git rm --cached" for unstaging the + earlier "git add" before the initial commit. + + * "git status" output was incorrect during a partial commit. + + * "git bisect" refused to start when the HEAD was detached. + + * "git bisect" allowed a wildcard character in the commit + message expanded while writing its log file. + + * Manual pages were not formatted correctly with docbook xsl + 1.72; added a workaround. + + * "git-commit -C $tag" used to work but rewrite in C done in + 1.5.4 broke it. This was fixed in 1.5.4.1. + + * An entry in the .gitattributes file that names a pattern in a + subdirectory of the directory it is in did not match + correctly (e.g. pattern "b/*.c" in "a/.gitattributes" should + match "a/b/foo.c" but it didn't). This was fixed in 1.5.4.1. + + * Customized color specification was parsed incorrectly when + numeric color values are used. This was fixed in 1.5.4.1. + + * http transport misbehaved when linked with curl-gnutls. diff --git a/Documentation/RelNotes-1.5.4.3.txt b/Documentation/RelNotes-1.5.4.3.txt new file mode 100644 index 0000000000..b0fc67fb2a --- /dev/null +++ b/Documentation/RelNotes-1.5.4.3.txt @@ -0,0 +1,27 @@ +GIT v1.5.4.3 Release Notes +========================== + +Fixes since v1.5.4.2 +-------------------- + + * RPM spec used to pull in everything with 'git'. This has been + changed so that 'git' package contains just the core parts, + and we now supply 'git-all' metapackage to slurp in everything. + This should match end user's expectation better. + + * When some refs failed to update, git-push reported "failure" + which was unclear if some other refs were updated or all of + them failed atomically (the answer is the former). Reworded + the message to clarify this. + + * "git clone" from a repository whose HEAD was misconfigured + did not set up the remote properly. Now it tries to do + better. + + * Updated git-push documentation to clarify what "matching" + means, in order to reduce user confusion. + + * Updated git-add documentation to clarify "add -u" operates in + the current subdirectory you are in, just like other commands. + + * git-gui updates to work on OSX and Windows better. diff --git a/Documentation/RelNotes-1.5.4.4.txt b/Documentation/RelNotes-1.5.4.4.txt new file mode 100644 index 0000000000..323c1a88c7 --- /dev/null +++ b/Documentation/RelNotes-1.5.4.4.txt @@ -0,0 +1,66 @@ +GIT v1.5.4.4 Release Notes +========================== + +Fixes since v1.5.4.3 +-------------------- + + * Building and installing with an overtight umask such as 077 made + installed templates unreadable by others, while the rest of the install + are done in a way that is friendly to umask 022. + + * "git cvsexportcommit -w $cvsdir" misbehaved when GIT_DIR is set to a + relative directory. + + * "git http-push" had an invalid memory access that could lead it to + segfault. + + * When "git rebase -i" gave control back to the user for a commit that is + marked to be edited, it just said "modify it with commit --amend", + without saying what to do to continue after modifying it. Give an + explicit instruction to run "rebase --continue" to be more helpful. + + * "git send-email" in 1.5.4.3 issued a bogus empty In-Reply-To: header. + + * "git bisect" showed mysterious "won't bisect on seeked tree" error message. + This was leftover from Cogito days to prevent "bisect" starting from a + cg-seeked state. We still keep the Cogito safety, but running "git bisect + start" when another bisect was in effect will clean up and start over. + + * "git push" with an explicit PATH to receive-pack did not quite work if + receive-pack was not on usual PATH. We earlier fixed the same issue + with "git fetch" and upload-pack, but somehow forgot to do so in the + other direction. + + * git-gui's info dialog was not displayed correctly when the user tries + to commit nothing (i.e. without staging anything). + + * "git revert" did not properly fail when attempting to run with a + dirty index. + + * "git merge --no-commit --no-ff <other>" incorrectly made commits. + + * "git merge --squash --no-ff <other>", which is a nonsense combination + of options, was not rejected. + + * "git ls-remote" and "git remote show" against an empty repository + failed, instead of just giving an empty result (regression). + + * "git fast-import" did not handle a renamed path whose name needs to be + quoted, due to a bug in unquote_c_style() function. + + * "git cvsexportcommit" was confused when multiple files with the same + basename needed to be pushed out in the same commit. + + * "git daemon" did not send early errors to syslog. + + * "git log --merge" did not work well with --left-right option. + + * "git svn" prompted for client cert password every time it accessed the + server. + + * The reset command in "git fast-import" data stream was documented to + end with an optional LF, but it actually required one. + + * "git svn dcommit/rebase" did not honor --rewrite-root option. + +Also included are a handful documentation updates. diff --git a/Documentation/RelNotes-1.5.4.5.txt b/Documentation/RelNotes-1.5.4.5.txt new file mode 100644 index 0000000000..bbd130e36d --- /dev/null +++ b/Documentation/RelNotes-1.5.4.5.txt @@ -0,0 +1,56 @@ +GIT v1.5.4.5 Release Notes +========================== + +Fixes since v1.5.4.4 +-------------------- + + * "git fetch there" when the URL information came from the Cogito style + branches/there file did not update refs/heads/there (regression in + 1.5.4). + + * Bogus refspec configuration such as "remote.there.fetch = =" were not + detected as errors (regression in 1.5.4). + + * You couldn't specify a custom editor whose path contains a whitespace + via GIT_EDITOR (and core.editor). + + * The subdirectory filter to "git filter-branch" mishandled a history + where the subdirectory becomes empty and then later becomes non-empty. + + * "git shortlog" gave an empty line if the original commit message was + malformed (e.g. a botched import from foreign SCM). Now it finds the + first non-empty line and uses it for better information. + + * When the user fails to give a revision parameter to "git svn", an error + from the Perl interpreter was issued because the script lacked proper + error checking. + + * After "git rebase" stopped due to conflicts, if the user played with + "git reset" and friends, "git rebase --abort" failed to go back to the + correct commit. + + * Additional work trees prepared with git-new-workdir (in contrib/) did + not share git-svn metadata directory .git/svn with the original. + + * "git-merge-recursive" did not mark addition of the same path with + different filemodes correctly as a conflict. + + * "gitweb" gave malformed URL when pathinfo stype paths are in use. + + * "-n" stands for "--no-tags" again for "git fetch". + + * "git format-patch" did not detect the need to add 8-bit MIME header + when the user used format.header configuration. + + * "rev~" revision specifier used to mean "rev", which was inconsistent + with how "rev^" worked. Now "rev~" is the same as "rev~1" (hence it + also is the same as "rev^1"), and "rev~0" is the same as "rev^0" + (i.e. it has to be a commit). + + * "git quiltimport" did not grok empty lines, lines in "file -pNNN" + format to specify the prefix levels and lines with trailing comments. + + * "git rebase -m" triggered pre-commit verification, which made + "rebase --continue" impossible. + +As usual, it also comes with many documentation fixes and clarifications. diff --git a/Documentation/RelNotes-1.5.4.6.txt b/Documentation/RelNotes-1.5.4.6.txt new file mode 100644 index 0000000000..3e3c3e55a3 --- /dev/null +++ b/Documentation/RelNotes-1.5.4.6.txt @@ -0,0 +1,43 @@ +GIT v1.5.4.6 Release Notes +========================== + +I personally do not think there is any reason anybody should want to +run v1.5.4.X series these days, because 'master' version is always +more stable than any tagged released version of git. + +This is primarily to futureproof "git-shell" to accept requests +without a dash between "git" and subcommand name (e.g. "git +upload-pack") which the newer client will start to make sometime in +the future. + +Fixes since v1.5.4.5 +-------------------- + + * Command line option "-n" to "git-repack" was not correctly parsed. + + * Error messages from "git-apply" when the patchfile cannot be opened + have been improved. + + * Error messages from "git-bisect" when given nonsense revisions have + been improved. + + * reflog syntax that uses time e.g. "HEAD@{10 seconds ago}:path" did not + stop parsing at the closing "}". + + * "git rev-parse --symbolic-full-name ^master^2" printed solitary "^", + but it should print nothing. + + * "git apply" did not enforce "match at the beginning" correctly. + + * a path specification "a/b" in .gitattributes file should not match + "sub/a/b", but it did. + + * "git log --date-order --topo-order" did not override the earlier + date-order with topo-order as expected. + + * "git fast-export" did not export octopus merges correctly. + + * "git archive --prefix=$path/" mishandled gitattributes. + +As usual, it also comes with many documentation fixes and clarifications. + diff --git a/Documentation/RelNotes-1.5.4.txt b/Documentation/RelNotes-1.5.4.txt index 9c864c9def..f1323b6174 100644 --- a/Documentation/RelNotes-1.5.4.txt +++ b/Documentation/RelNotes-1.5.4.txt @@ -10,22 +10,32 @@ Removal * As git-commit and git-status have been rewritten, "git runstatus" helper script lost all its users and has been removed. - * Curl library older than 7.10 is not supported by "git http-push", - as it does not work without CURLM. + +Temporarily disabled +-------------------- + + * "git http-push" is known not to work well with cURL library older + than 7.16, and we had reports of repository corruption. It is + disabled on such platforms for now. Unfortunately, 1.5.3.8 shares + the same issue. In other words, this does not mean you will be + fine if you stick to an older git release. For now, please do not + use http-push from older git with cURL older than 7.16 if you + value your data. A proper fix will hopefully materialize in + later versions. Deprecation notices ------------------- - * The next feature release of git (this change is scheduled for v1.6.0) - will by default install dashed form of commands (e.g. "git-commit") - outside of users' normal $PATH, and will install only selected - commands ("git" itself, and "gitk") in $PATH. This implies: + * From v1.6.0, git will by default install dashed form of commands + (e.g. "git-commit") outside of users' normal $PATH, and will install + only selected commands ("git" itself, and "gitk") in $PATH. This + implies: - Using dashed forms of git commands (e.g. "git-commit") from the command line has been informally deprecated since early 2006, but now it officially is, and will be removed in the future. Use - dashless forms (e.g. "git commit") instead. + dash-less forms (e.g. "git commit") instead. - Using dashed forms from your scripts, without first prepending the return value from "git --exec-path" to the scripts' PATH, has been @@ -34,8 +44,8 @@ Deprecation notices - Use of dashed forms with "PATH=$(git --exec-path):$PATH; export PATH" early in your script is not deprecated with this change. - Users are strongly encouraged to adjust their habits and scripts now - to prepare for this. + Users are strongly encouraged to adjust their habits and scripts now + to prepare for this change. * The post-receive hook was introduced in March 2007 to supersede the post-update hook, primarily to overcome the command line length @@ -70,7 +80,7 @@ Updates since v1.5.3 * Comes with much improved gitk, with i18n. - * Comes with "git gui" 0.9.1 with i18n. + * Comes with git-gui 0.9.2 with i18n. * gitk is now merged as a subdirectory of git.git project, in preparation for its i18n. @@ -156,7 +166,7 @@ Updates since v1.5.3 command line in the generated log message, when told to cherry-pick a commit by naming a tag that points at it. It does not anymore. - * "git for-each-ref" learned %(xxxdate:<dateformat>) syntax to show the + * "git for-each-ref" learned %(xxxdate:<date-format>) syntax to show the various date fields in different formats. * "git gc --auto" is a low-impact way to automatically run a variant of @@ -211,7 +221,7 @@ Updates since v1.5.3 * "git pull --rebase" is a different way to integrate what you fetched into your current branch. - * "git fast-export" produces datastream that can be fed to fast-import + * "git fast-export" produces data-stream that can be fed to fast-import to reproduce the history recorded in a git repository. * "git add -i" takes pathspecs to limit the set of files to work on. @@ -232,8 +242,8 @@ Updates since v1.5.3 from its first parent. * "git commit" used to unconditionally strip comment lines that - began with '#' and removed excess blank lines. This - behaviour has been made configurable. + began with '#' and removed excess blank lines. This behavior has + been made configurable. * "git commit" has been rewritten in C. @@ -317,7 +327,7 @@ Updates since v1.5.3 * "git status" from a subdirectory now shows relative paths, which makes copy-and-pasting for git-checkout/git-add/git-rm easier. The - traditional behaviour to show the full path relative to the top of + traditional behavior to show the full path relative to the top of the work tree can be had by setting status.relativepaths configuration variable to false. @@ -332,7 +342,7 @@ Updates since v1.5.3 * "git help" learned "-w" option to show documentation in browsers. - * In addition there are quite a few internal clean-ups. Notably + * In addition there are quite a few internal clean-ups. Notably: - many fork/exec have been replaced with run-command API, brought from the msysgit effort. @@ -341,6 +351,7 @@ Updates since v1.5.3 - enhancement and more use of the strbuf API. + * Makefile tweaks to support HP-UX is in. Fixes since v1.5.3 ------------------ @@ -354,7 +365,7 @@ series. * The way "git diff --check" behaves is much more consistent with the way "git apply --whitespace=warn" works. - * "git svn" talking with the SVN over http will correctly quote branch + * "git svn" talking with the SVN over HTTP will correctly quote branch and project names. * "git config" did not work correctly on platforms that define @@ -364,9 +375,3 @@ series. documentation; a workaround has been implemented. * "git diff --color-words" colored context lines in a wrong color. - --- -exec >/var/tmp/1 -O=v1.5.4-rc4 -echo O=`git describe refs/heads/master` -git shortlog --no-merges $O..refs/heads/master ^refs/heads/maint diff --git a/Documentation/RelNotes-1.5.5.1.txt b/Documentation/RelNotes-1.5.5.1.txt new file mode 100644 index 0000000000..7de419708f --- /dev/null +++ b/Documentation/RelNotes-1.5.5.1.txt @@ -0,0 +1,44 @@ +GIT v1.5.5.1 Release Notes +========================== + +Fixes since v1.5.5 +------------------ + + * "git archive --prefix=$path/" mishandled gitattributes. + + * "git fetch -v" that fetches into FETCH_HEAD did not report the summary + the same way as done for updating the tracking refs. + + * "git svn" misbehaved when the configuration file customized the "git + log" output format using format.pretty. + + * "git submodule status" leaked an unnecessary error message. + + * "git log --date-order --topo-order" did not override the earlier + date-order with topo-order as expected. + + * "git bisect good $this" did not check the validity of the revision + given properly. + + * "url.<there>.insteadOf" did not work correctly. + + * "git clean" ran inside subdirectory behaved as if the directory was + explicitly specified for removal by the end user from the top level. + + * "git bisect" from a detached head leaked an unnecessary error message. + + * "git bisect good $a $b" when $a is Ok but $b is bogus should have + atomically failed before marking $a as good. + + * "git fmt-merge-msg" did not clean up leading empty lines from commit + log messages like "git log" family does. + + * "git am" recorded a commit with empty Subject: line without + complaining. + + * when given a commit log message whose first paragraph consists of + multiple lines, "git rebase" squashed it into a single line. + + * "git remote add $bogus_name $url" did not complain properly. + +Also comes with various documentation updates. diff --git a/Documentation/RelNotes-1.5.5.2.txt b/Documentation/RelNotes-1.5.5.2.txt new file mode 100644 index 0000000000..391a7b02ea --- /dev/null +++ b/Documentation/RelNotes-1.5.5.2.txt @@ -0,0 +1,27 @@ +GIT v1.5.5.2 Release Notes +========================== + +Fixes since v1.5.5.1 +-------------------- + + * "git repack -n" was mistakenly made no-op earlier. + + * "git imap-send" wanted to always have imap.host even when use of + imap.tunnel made it unnecessary. + + * reflog syntax that uses time e.g. "HEAD@{10 seconds ago}:path" did not + stop parsing at the closing "}". + + * "git rev-parse --symbolic-full-name ^master^2" printed solitary "^", + but it should print nothing. + + * "git commit" did not detect when it failed to write tree objects. + + * "git fetch" sometimes transferred too many objects unnecessarily. + + * a path specification "a/b" in .gitattributes file should not match + "sub/a/b". + + * various gitweb fixes. + +Also comes with various documentation updates. diff --git a/Documentation/RelNotes-1.5.5.3.txt b/Documentation/RelNotes-1.5.5.3.txt new file mode 100644 index 0000000000..f22f98b734 --- /dev/null +++ b/Documentation/RelNotes-1.5.5.3.txt @@ -0,0 +1,12 @@ +GIT v1.5.5.3 Release Notes +========================== + +Fixes since v1.5.5.2 +-------------------- + + * "git send-email --compose" did not notice that non-ascii contents + needed some MIME magic. + + * "git fast-export" did not export octopus merges correctly. + +Also comes with various documentation updates. diff --git a/Documentation/RelNotes-1.5.5.4.txt b/Documentation/RelNotes-1.5.5.4.txt new file mode 100644 index 0000000000..2d0279ecce --- /dev/null +++ b/Documentation/RelNotes-1.5.5.4.txt @@ -0,0 +1,7 @@ +GIT v1.5.5.4 Release Notes +========================== + +Fixes since v1.5.5.4 +-------------------- + + * "git name-rev --all" used to segfault. diff --git a/Documentation/RelNotes-1.5.5.5.txt b/Documentation/RelNotes-1.5.5.5.txt new file mode 100644 index 0000000000..30fa3615c7 --- /dev/null +++ b/Documentation/RelNotes-1.5.5.5.txt @@ -0,0 +1,11 @@ +GIT v1.5.5.5 Release Notes +========================== + +I personally do not think there is any reason anybody should want to +run v1.5.5.X series these days, because 'master' version is always +more stable than any tagged released version of git. + +This is primarily to futureproof "git-shell" to accept requests +without a dash between "git" and subcommand name (e.g. "git +upload-pack") which the newer client will start to make sometime in +the future. diff --git a/Documentation/RelNotes-1.5.5.txt b/Documentation/RelNotes-1.5.5.txt new file mode 100644 index 0000000000..2932212488 --- /dev/null +++ b/Documentation/RelNotes-1.5.5.txt @@ -0,0 +1,207 @@ +GIT v1.5.5 Release Notes +======================== + +Updates since v1.5.4 +-------------------- + +(subsystems) + + * Comes with git-gui 0.10.1 + +(portability) + + * We shouldn't ask for BSD group ownership semantics by setting g+s bit + on directories on older BSD systems that refuses chmod() by non root + users. BSD semantics is the default there anyway. + + * Bunch of portability improvement patches coming from an effort to port + to Solaris has been applied. + +(performance) + + * On platforms with suboptimal qsort(3) implementation, there + is an option to use more reasonable substitute we ship with + our software. + + * New configuration variable "pack.packsizelimit" can be used + in place of command line option --max-pack-size. + + * "git fetch" over the native git protocol used to make a + connection to find out the set of current remote refs and + another to actually download the pack data. We now use only + one connection for these tasks. + + * "git commit" does not run lstat(2) more than necessary + anymore. + +(usability, bells and whistles) + + * Bash completion script (in contrib) are aware of more commands and + options. + + * You can be warned when core.autocrlf conversion is applied in + such a way that results in an irreversible conversion. + + * A catch-all "color.ui" configuration variable can be used to + enable coloring of all color-capable commands, instead of + individual ones such as "color.status" and "color.branch". + + * The commands refused to take absolute pathnames where they + require pathnames relative to the work tree or the current + subdirectory. They now can take absolute pathnames in such a + case as long as the pathnames do not refer outside of the + work tree. E.g. "git add $(pwd)/foo" now works. + + * Error messages used to be sent to stderr, only to get hidden, + when $PAGER was in use. They now are sent to stdout along + with the command output to be shown in the $PAGER. + + * A pattern "foo/" in .gitignore file now matches a directory + "foo". Pattern "foo" also matches as before. + + * bash completion's prompt helper function can talk about + operation in-progress (e.g. merge, rebase, etc.). + + * Configuration variables "url.<usethis>.insteadof = <otherurl>" can be + used to tell "git-fetch" and "git-push" to use different URL than what + is given from the command line. + + * "git add -i" behaves better even before you make an initial commit. + + * "git am" refused to run from a subdirectory without a good reason. + + * After "git apply --whitespace=fix" fixes whitespace errors in a patch, + a line before the fix can appear as a context or preimage line in a + later patch, causing the patch not to apply. The command now knows to + see through whitespace fixes done to context lines to successfully + apply such a patch series. + + * "git branch" (and "git checkout -b") to branch from a local branch can + optionally set "branch.<name>.merge" to mark the new branch to build on + the other local branch, when "branch.autosetupmerge" is set to + "always", or when passing the command line option "--track" (this option + was ignored when branching from local branches). By default, this does + not happen when branching from a local branch. + + * "git checkout" to switch to a branch that has "branch.<name>.merge" set + (i.e. marked to build on another branch) reports how much the branch + and the other branch diverged. + + * When "git checkout" has to update a lot of paths, it used to be silent + for 4 seconds before it showed any progress report. It is now a bit + more impatient and starts showing progress report early. + + * "git commit" learned a new hook "prepare-commit-msg" that can + inspect what is going to be committed and prepare the commit + log message template to be edited. + + * "git cvsimport" can now take more than one -M options. + + * "git describe" learned to limit the tags to be used for + naming with --match option. + + * "git describe --contains" now barfs when the named commit + cannot be described. + + * "git describe --exact-match" describes only commits that are tagged. + + * "git describe --long" describes a tagged commit as $tag-0-$sha1, + instead of just showing the exact tagname. + + * "git describe" warns when using a tag whose name and path contradict + with each other. + + * "git diff" learned "--relative" option to limit and output paths + relative to the current directory when working in a subdirectory. + + * "git diff" learned "--dirstat" option to show birds-eye-summary of + changes more concisely than "--diffstat". + + * "git format-patch" learned --cover-letter option to generate a cover + letter template. + + * "git gc" learned --quiet option. + + * "git gc" now automatically prunes unreachable objects that are two + weeks old or older. + + * "git gc --auto" can be disabled more easily by just setting gc.auto + to zero. It also tolerates more packfiles by default. + + * "git grep" now knows "--name-only" is a synonym for the "-l" option. + + * "git help <alias>" now reports "'git <alias>' is alias to <what>", + instead of saying "No manual entry for git-<alias>". + + * "git help" can use different backends to show manual pages and this can + be configured using "man.viewer" configuration. + + * "gitk" does not restore window position from $HOME/.gitk anymore (it + still restores the size). + + * "git log --grep=<what>" learned "--fixed-strings" option to look for + <what> without treating it as a regular expression. + + * "git gui" learned an auto-spell checking. + + * "git push <somewhere> HEAD" and "git push <somewhere> +HEAD" works as + expected; they push the current branch (and only the current branch). + In addition, HEAD can be written as the value of "remote.<there>.push" + configuration variable. + + * When the configuration variable "pack.threads" is set to 0, "git + repack" auto detects the number of CPUs and uses that many threads. + + * "git send-email" learned to prompt for passwords + interactively. + + * "git send-email" learned an easier way to suppress CC + recipients. + + * "git stash" learned "pop" command, that applies the latest stash and + removes it from the stash, and "drop" command to discard the named + stash entry. + + * "git submodule" learned a new subcommand "summary" to show the + symmetric difference between the HEAD version and the work tree version + of the submodule commits. + + * Various "git cvsimport", "git cvsexportcommit", "git cvsserver", + "git svn" and "git p4" improvements. + +(internal) + + * Duplicated code between git-help and git-instaweb that + launches user's preferred browser has been refactored. + + * It is now easier to write test scripts that records known + breakages. + + * "git checkout" is rewritten in C. + + * "git remote" is rewritten in C. + + * Two conflict hunks that are separated by a very short span of common + lines are now coalesced into one larger hunk, to make the result easier + to read. + + * Run-command API's use of file descriptors is documented clearer and + is more consistent now. + + * diff output can be sent to FILE * that is different from stdout. This + will help reimplementing more things in C. + +Fixes since v1.5.4 +------------------ + +All of the fixes in v1.5.4 maintenance series are included in +this release, unless otherwise noted. + + * "git-http-push" did not allow deletion of remote ref with the usual + "push <remote> :<branch>" syntax. + + * "git-rebase --abort" did not go back to the right location if + "git-reset" was run during the "git-rebase" session. + + * "git imap-send" without setting imap.host did not error out but + segfaulted. diff --git a/Documentation/RelNotes-1.5.6.1.txt b/Documentation/RelNotes-1.5.6.1.txt new file mode 100644 index 0000000000..4864b16445 --- /dev/null +++ b/Documentation/RelNotes-1.5.6.1.txt @@ -0,0 +1,28 @@ +GIT v1.5.6.1 Release Notes +========================== + +Fixes since v1.5.6 +------------------ + +* Last minute change broke loose object creation on AIX. + +* (performance fix) We used to make $GIT_DIR absolute path early in the + programs but keeping it relative to the current directory internally + gives 1-3 per-cent performance boost. + +* bash completion knows the new --graph option to git-log family. + + +* git-diff -c/--cc showed unnecessary "deletion" lines at the context + boundary. + +* git-for-each-ref ignored %(object) and %(type) requests for tag + objects. + +* git-merge usage had a typo. + +* Rebuilding of git-svn metainfo database did not take rewriteRoot + option into account. + +* Running "git-rebase --continue/--skip/--abort" before starting a + rebase gave nonsense error messages. diff --git a/Documentation/RelNotes-1.5.6.2.txt b/Documentation/RelNotes-1.5.6.2.txt new file mode 100644 index 0000000000..5902a85a78 --- /dev/null +++ b/Documentation/RelNotes-1.5.6.2.txt @@ -0,0 +1,40 @@ +GIT v1.5.6.2 Release Notes +========================== + +Futureproof +----------- + + * "git-shell" accepts requests without a dash between "git" and + subcommand name (e.g. "git upload-pack") which the newer client will + start to make sometime in the future. + +Fixes since v1.5.6.1 +-------------------- + +* "git clone" from a remote that is named with url.insteadOf setting in + $HOME/.gitconfig did not work well. + +* "git describe --long --tags" segfaulted when the described revision was + tagged with a lightweight tag. + +* "git diff --check" did not report the result via its exit status + reliably. + +* When remote side used to have branch 'foo' and git-fetch finds that now + it has branch 'foo/bar', it refuses to lose the existing remote tracking + branch and its reflog. The error message has been improved to suggest + pruning the remote if the user wants to proceed and get the latest set + of branches from the remote, including such 'foo/bar'. + +* "git reset file" should mean the same thing as "git reset HEAD file", + but we required disambiguating -- even when "file" is not ambiguous. + +* "git show" segfaulted when an annotated tag that points at another + annotated tag was given to it. + +* Optimization for a large import via "git-svn" introduced in v1.5.6 had a + serious memory and temporary file leak, which made it unusable for + moderately large import. + +* "git-svn" mangled remote nickname used in the configuration file + unnecessarily. diff --git a/Documentation/RelNotes-1.5.6.3.txt b/Documentation/RelNotes-1.5.6.3.txt new file mode 100644 index 0000000000..942611299d --- /dev/null +++ b/Documentation/RelNotes-1.5.6.3.txt @@ -0,0 +1,52 @@ +GIT v1.5.6.3 Release Notes +========================== + +Fixes since v1.5.6.2 +-------------------- + +* Setting core.sharerepository to traditional "true" value was supposed to make + the repository group writable but should not affect permission for others. + However, since 1.5.6, it was broken to drop permission for others when umask is + 022, making the repository unreadable by others. + +* Setting GIT_TRACE will report spawning of external process via run_command(). + +* Using an object with very deep delta chain pinned memory needed for extracting + intermediate base objects unnecessarily long, leading to excess memory usage. + +* Bash completion script did not notice '--' marker on the command + line and tried the relatively slow "ref completion" even when + completing arguments after one. + +* Registering a non-empty blob racily and then truncating the working + tree file for it confused "racy-git avoidance" logic into thinking + that the path is now unchanged. + +* The section that describes attributes related to git-archive were placed + in a wrong place in the gitattributes(5) manual page. + +* "git am" was not helpful to the users when it detected that the committer + information is not set up properly yet. + +* "git clone" had a leftover debugging fprintf(). + +* "git clone -q" was not quiet enough as it used to and gave object count + and progress reports. + +* "git clone" marked downloaded packfile with .keep; this could be a + good thing if the remote side is well packed but otherwise not, + especially for a project that is not really big. + +* "git daemon" used to call syslog() from a signal handler, which + could raise signals of its own but generally is not reentrant. This + was fixed by restructuring the code to report syslog() after the handler + returns. + +* When "git push" tries to remove a remote ref, and corresponding + tracking ref is missing, we used to report error (i.e. failure to + remove something that does not exist). + +* "git mailinfo" (hence "git am") did not handle commit log messages in a + MIME multipart mail correctly. + +Contains other various documentation fixes. diff --git a/Documentation/RelNotes-1.5.6.4.txt b/Documentation/RelNotes-1.5.6.4.txt new file mode 100644 index 0000000000..d8968f1ecb --- /dev/null +++ b/Documentation/RelNotes-1.5.6.4.txt @@ -0,0 +1,47 @@ +GIT v1.5.6.4 Release Notes +========================== + +Fixes since v1.5.6.3 +-------------------- + +* Various commands could overflow its internal buffer on a platform + with small PATH_MAX value in a repository that has contents with + long pathnames. + +* There wasn't a way to make --pretty=format:%<> specifiers to honor + .mailmap name rewriting for authors and committers. Now you can with + %aN and %cN. + +* Bash completion wasted too many cycles; this has been optimized to be + usable again. + +* Bash completion lost ref part when completing something like "git show + pu:Makefile". + +* "git-cvsserver" did not clean up its temporary working area after annotate + request. + +* "git-daemon" called syslog() from its signal handler, which was a + no-no. + +* "git-fetch" into an empty repository used to remind that the fetch will + be huge by saying "no common commits", but this was an unnecessary + noise; it is already known by the user anyway. + +* "git-http-fetch" would have segfaulted when pack idx file retrieved + from the other side was corrupt. + +* "git-index-pack" used too much memory when dealing with a deep delta chain. + +* "git-mailinfo" (hence "git-am") did not correctly handle in-body [PATCH] + line to override the commit title taken from the mail Subject header. + +* "git-rebase -i -p" lost parents that are not involved in the history + being rewritten. + +* "git-rm" lost track of where the index file was when GIT_DIR was + specified as a relative path. + +* "git-rev-list --quiet" was not quiet as advertised. + +Contains other various documentation fixes. diff --git a/Documentation/RelNotes-1.5.6.5.txt b/Documentation/RelNotes-1.5.6.5.txt new file mode 100644 index 0000000000..47ca172462 --- /dev/null +++ b/Documentation/RelNotes-1.5.6.5.txt @@ -0,0 +1,29 @@ +GIT v1.5.6.5 Release Notes +========================== + +Fixes since v1.5.6.4 +-------------------- + +* "git cvsimport" used to spit out "UNKNOWN LINE..." diagnostics to stdout. + +* "git commit -F filename" and "git tag -F filename" run from subdirectories + did not read the right file. + +* "git init --template=" with blank "template" parameter linked files + under root directories to .git, which was a total nonsense. Instead, it + means "I do not want to use anything from the template directory". + +* "git diff-tree" and other diff plumbing ignored diff.renamelimit configuration + variable when the user explicitly asked for rename detection. + +* "git name-rev --name-only" did not work when "--stdin" option was in effect. + +* "git show-branch" mishandled its 8th branch. + +* Addition of "git update-index --ignore-submodules" that happened during + 1.5.6 cycle broke "git update-index --ignore-missing". + +* "git send-email" did not parse charset from an existing Content-type: + header properly. + +Contains other various documentation fixes. diff --git a/Documentation/RelNotes-1.5.6.txt b/Documentation/RelNotes-1.5.6.txt new file mode 100644 index 0000000000..e143d8d61b --- /dev/null +++ b/Documentation/RelNotes-1.5.6.txt @@ -0,0 +1,115 @@ +GIT v1.5.6 Release Notes +======================== + +Updates since v1.5.5 +-------------------- + +(subsystems) + +* Comes with updated gitk and git-gui. + +(portability) + +* git will build on AIX better than before now. + +* core.ignorecase configuration variable can be used to work better on + filesystems that are not case sensitive. + +* "git init" now autodetects the case sensitivity of the filesystem and + sets core.ignorecase accordingly. + +* cpio is no longer used; neither "curl" binary (libcurl is still used). + +(documentation) + +* Many freestanding documentation pages have been converted and made + available to "git help" (aka "man git<something>") as section 7 of + the manual pages. This means bookmarks to some HTML documentation + files may need to be updated (eg "tutorial.html" became + "gittutorial.html"). + +(performance) + +* "git clone" was rewritten in C. This will hopefully help cloning a + repository with insane number of refs. + +* "git rebase --onto $there $from $branch" used to switch to the tip of + $branch only to immediately reset back to $from, smudging work tree + files unnecessarily. This has been optimized. + +* Object creation codepath in "git-svn" has been optimized by enhancing + plumbing commands git-cat-file and git-hash-object. + +(usability, bells and whistles) + +* "git add -p" (and the "patch" subcommand of "git add -i") can choose to + apply (or not apply) mode changes independently from contents changes. + +* "git bisect help" gives longer and more helpful usage information. + +* "git bisect" does not use a special branch "bisect" anymore; instead, it + does its work on a detached HEAD. + +* "git branch" (and "git checkout -b") can be told to set up + branch.<name>.rebase automatically, so that later you can say "git pull" + and magically cause "git pull --rebase" to happen. + +* "git branch --merged" and "git branch --no-merged" can be used to list + branches that have already been merged (or not yet merged) to the + current branch. + +* "git cherry-pick" and "git revert" can add a sign-off. + +* "git commit" mentions the author identity when you are committing + somebody else's changes. + +* "git diff/log --dirstat" output is consistent between binary and textual + changes. + +* "git filter-branch" rewrites signed tags by demoting them to annotated. + +* "git format-patch --no-binary" can produce a patch that lack binary + changes (i.e. cannot be used to propagate the whole changes) meant only + for reviewing. + +* "git init --bare" is a synonym for "git --bare init" now. + +* "git gc --auto" honors a new pre-auto-gc hook to temporarily disable it. + +* "git log --pretty=tformat:<custom format>" gives a LF after each entry, + instead of giving a LF between each pair of entries which is how + "git log --pretty=format:<custom format>" works. + +* "git log" and friends learned the "--graph" option to show the ancestry + graph at the left margin of the output. + +* "git log" and friends can be told to use date format that is different + from the default via 'log.date' configuration variable. + +* "git send-email" now can send out messages outside a git repository. + +* "git send-email --compose" was made aware of rfc2047 quoting. + +* "git status" can optionally include output from "git submodule + summary". + +* "git svn" learned --add-author-from option to propagate the authorship + by munging the commit log message. + +* new object creation and looking up in "git svn" has been optimized. + +* "gitweb" can read from a system-wide configuration file. + +(internal) + +* "git unpack-objects" and "git receive-pack" is now more strict about + detecting breakage in the objects they receive over the wire. + + +Fixes since v1.5.5 +------------------ + +All of the fixes in v1.5.5 maintenance series are included in +this release, unless otherwise noted. + +And there are too numerous small fixes to otherwise note here ;-) diff --git a/Documentation/RelNotes-1.6.0.txt b/Documentation/RelNotes-1.6.0.txt new file mode 100644 index 0000000000..de7ef166b6 --- /dev/null +++ b/Documentation/RelNotes-1.6.0.txt @@ -0,0 +1,258 @@ +GIT v1.6.0 Release Notes +======================== + +User visible changes +-------------------- + +With the default Makefile settings, most of the programs are now +installed outside your $PATH, except for "git", "gitk" and +some server side programs that need to be accessible for technical +reasons. Invoking a git subcommand as "git-xyzzy" from the command +line has been deprecated since early 2006 (and officially announced in +1.5.4 release notes); use of them from your scripts after adding +output from "git --exec-path" to the $PATH is still supported in this +release, but users are again strongly encouraged to adjust their +scripts to use "git xyzzy" form, as we will stop installing +"git-xyzzy" hardlinks for built-in commands in later releases. + +An earlier change to page "git status" output was overwhelmingly unpopular +and has been reverted. + +Source changes needed for porting to MinGW environment are now all in the +main git.git codebase. + +By default, packfiles created with this version uses delta-base-offset +encoding introduced in v1.4.4. Pack idx files are using version 2 that +allows larger packs and added robustness thanks to its CRC checking, +introduced in v1.5.2 and v1.4.4.5. If you want to keep your repositories +backwards compatible past these versions, set repack.useDeltaBaseOffset +to false or pack.indexVersion to 1, respectively. + +We used to prevent sample hook scripts shipped in templates/ from +triggering by default by relying on the fact that we install them as +unexecutable, but on some filesystems, this approach does not work. +They are now shipped with ".sample" suffix. If you want to activate +any of these samples as-is, rename them to drop the ".sample" suffix, +instead of running "chmod +x" on them. For example, you can rename +hooks/post-update.sample to hooks/post-update to enable the sample +hook that runs update-server-info, in order to make repositories +friendly to dumb protocols (i.e. HTTP). + +GIT_CONFIG, which was only documented as affecting "git config", but +actually affected all git commands, now only affects "git config". +GIT_LOCAL_CONFIG, also only documented as affecting "git config" and +not different from GIT_CONFIG in a useful way, is removed. + +The ".dotest" temporary area "git am" and "git rebase" use is now moved +inside the $GIT_DIR, to avoid mistakes of adding it to the project by +accident. + +An ancient merge strategy "stupid" has been removed. + + +Updates since v1.5.6 +-------------------- + +(subsystems) + +* git-p4 in contrib learned "allowSubmit" configuration to control on + which branch to allow "submit" subcommand. + +* git-gui learned to stage changes per-line. + +(portability) + +* Changes for MinGW port have been merged, thanks to Johannes Sixt and + gangs. + +* Sample hook scripts shipped in templates/ are now suffixed with + *.sample. + +* perl's in-place edit (-i) does not work well without backup files on Windows; + some tests are rewritten to cope with this. + +(documentation) + +* Updated howto/update-hook-example + +* Got rid of usage of "git-foo" from the tutorial and made typography + more consistent. + +* Disambiguating "--" between revs and paths is finally documented. + +(performance, robustness, sanity etc.) + +* index-pack used too much memory when dealing with a deep delta chain. + This has been optimized. + +* reduced excessive inlining to shrink size of the "git" binary. + +* verify-pack checks the object CRC when using version 2 idx files. + +* When an object is corrupt in a pack, the object became unusable even + when the same object is available in a loose form, We now try harder to + fall back to these redundant objects when able. In particular, "git + repack -a -f" can be used to fix such a corruption as long as necessary + objects are available. + +* Performance of "git-blame -C -C" operation is vastly improved. + +* git-clone does not create refs in loose form anymore (it behaves as + if you immediately ran git-pack-refs after cloning). This will help + repositories with insanely large number of refs. + +* core.fsyncobjectfiles configuration can be used to ensure that the loose + objects created will be fsync'ed (this is only useful on filesystems + that does not order data writes properly). + +* "git commit-tree" plumbing can make Octopus with more than 16 parents. + "git commit" has been capable of this for quite some time. + +(usability, bells and whistles) + +* even more documentation pages are now accessible via "man" and "git help". + +* A new environment variable GIT_CEILING_DIRECTORIES can be used to stop + the discovery process of the toplevel of working tree; this may be useful + when you are working in a slow network disk and are outside any working tree, + as bash-completion and "git help" may still need to run in these places. + +* By default, stash entries never expire. Set reflogexpire in [gc + "refs/stash"] to a reasonable value to get traditional auto-expiration + behaviour back + +* Longstanding latency issue with bash completion script has been + addressed. This will need to be backmerged to 'maint' later. + +* pager.<cmd> configuration variable can be used to enable/disable the + default paging behaviour per command. + +* "git-add -i" has a new action 'e/dit' to allow you edit the patch hunk + manually. + +* git-am records the original tip of the branch in ORIG_HEAD before it + starts applying patches. + +* git-apply can handle a patch that touches the same path more than once + much better than before. + +* git-apply can be told not to trust the line counts recorded in the input + patch but recount, with the new --recount option. + +* git-apply can be told to apply a patch to a path deeper than what the + patch records with --directory option. + +* git-archive can be told to omit certain paths from its output using + export-ignore attributes. + +* git-archive uses the zlib default compression level when creating + zip archive. + +* git-archive's command line options --exec and --remote can take their + parameters as separate command line arguments, similar to other commands. + IOW, both "--exec=path" and "--exec path" are now supported. + +* With -v option, git-branch describes the remote tracking statistics + similar to the way git-checkout reports by how many commits your branch + is ahead/behind. + +* git-branch's --contains option used to always require a commit parameter + to limit the branches with; it now defaults to list branches that + contains HEAD if this parameter is omitted. + +* git-branch's --merged and --no-merged option used to always limit the + branches relative to the HEAD, but they can now take an optional commit + argument that is used in place of HEAD. + +* git-bundle can read the revision arguments from the standard input. + +* git-cherry-pick can replay a root commit now. + +* git-clone can clone from a remote whose URL would be rewritten by + configuration stored in $HOME/.gitconfig now. + +* "git-clone --mirror" is a handy way to set up a bare mirror repository. + +* git-cvsserver learned to respond to "cvs co -c". + +* git-diff --check now checks leftover merge conflict markers. + +* "git-diff -p" learned to grab a better hunk header lines in + BibTex, Pascal/Delphi, and Ruby files and also pays attention to + chapter and part boundary in TeX documents. + +* When remote side used to have branch 'foo' and git-fetch finds that now + it has branch 'foo/bar', it refuses to lose the existing remote tracking + branch and its reflog. The error message has been improved to suggest + pruning the remote if the user wants to proceed and get the latest set + of branches from the remote, including such 'foo/bar'. + +* fast-export learned to export and import marks file; this can be used to + interface with fast-import incrementally. + +* fast-import and fast-export learned to export and import gitlinks. + +* "gitk" left background process behind after being asked to dig very deep + history and the user killed the UI; the process is killed when the UI goes + away now. + +* git-rebase records the original tip of branch in ORIG_HEAD before it is + rewound. + +* "git rerere" can be told to update the index with auto-reused resolution + with rerere.autoupdate configuration variable. + +* git-rev-parse learned $commit^! and $commit^@ notations used in "log" + family. These notations are available in gitk as well, because the gitk + command internally uses rev-parse to interpret its arguments. + +* git-rev-list learned --children option to show child commits it + encountered during the traversal, instead of showing parent commits. + +* git-send-mail can talk not just over SSL but over TLS now. + +* git-shortlog honors custom output format specified with "--pretty=format:". + +* "git-stash save" learned --keep-index option. This lets you stash away the + local changes and bring the changes staged in the index to your working + tree for examination and testing. + +* git-stash also learned branch subcommand to create a new branch out of + stashed changes. + +* git-status gives the remote tracking statistics similar to the way + git-checkout reports by how many commits your branch is ahead/behind. + +* "git-svn dcommit" is now aware of auto-props setting the subversion user + has. + +* You can tell "git status -u" to even more aggressively omit checking + untracked files with --untracked-files=no. + +* Original SHA-1 value for "update-ref -d" is optional now. + +* Error codes from gitweb are made more descriptive where possible, rather + than "403 forbidden" as we used to issue everywhere. + +(internal) + +* git-merge has been reimplemented in C. + + +Fixes since v1.5.6 +------------------ + +All of the fixes in v1.5.6 maintenance series are included in +this release, unless otherwise noted. + + * git-clone ignored its -u option; the fix needs to be backported to + 'maint'; + + * git-mv used to lose the distinction between changes that are staged + and that are only in the working tree, by staging both in the index + after moving such a path. + + * "git-rebase -i -p" rewrote the parents to wrong ones when amending + (either edit or squash) was involved, and did not work correctly + when fast forwarding. + diff --git a/Documentation/SubmittingPatches b/Documentation/SubmittingPatches index de08d094e3..841bead9db 100644 --- a/Documentation/SubmittingPatches +++ b/Documentation/SubmittingPatches @@ -34,9 +34,9 @@ Checklist (and a short version for the impatient): - if your name is not writable in ASCII, make sure that you send off a message in the correct encoding. - send the patch to the list (git@vger.kernel.org) and the - maintainer (gitster@pobox.com). If you use - git-send-email(1), please test it first by sending - email to yourself. + maintainer (gitster@pobox.com) if (and only if) the patch + is ready for inclusion. If you use git-send-email(1), + please test it first by sending email to yourself. Long version: @@ -112,7 +112,12 @@ lose tabs that way if you are not careful. It is a common convention to prefix your subject line with [PATCH]. This lets people easily distinguish patches from other -e-mail discussions. +e-mail discussions. Use of additional markers after PATCH and +the closing bracket to mark the nature of the patch is also +encouraged. E.g. [PATCH/RFC] is often used when the patch is +not ready to be applied but it is for discussion, [PATCH v2], +[PATCH v3] etc. are often seen when you are sending an update to +what you have previously sent. "git format-patch" command follows the best current practice to format the body of an e-mail message. At the beginning of the @@ -157,7 +162,8 @@ Note that your maintainer does not necessarily read everything on the git mailing list. If your patch is for discussion first, send it "To:" the mailing list, and optionally "cc:" him. If it is trivially correct or after the list reached a consensus, send -it "To:" the maintainer and optionally "cc:" the list. +it "To:" the maintainer and optionally "cc:" the list for +inclusion. Also note that your maintainer does not actively involve himself in maintaining what are in contrib/ hierarchy. When you send fixes and @@ -210,10 +216,53 @@ then you just add a line saying This line can be automatically added by git if you run the git-commit command with the -s option. -Some people also put extra tags at the end. They'll just be ignored for -now, but you can do this to mark internal company procedures or just -point out some special detail about the sign-off. +Notice that you can place your own Signed-off-by: line when +forwarding somebody else's patch with the above rules for +D-C-O. Indeed you are encouraged to do so. Do not forget to +place an in-body "From: " line at the beginning to properly attribute +the change to its true author (see (2) above). +Some people also put extra tags at the end. + +"Acked-by:" says that the patch was reviewed by the person who +is more familiar with the issues and the area the patch attempts +to modify. "Tested-by:" says the patch was tested by the person +and found to have the desired effect. + +------------------------------------------------ +An ideal patch flow + +Here is an ideal patch flow for this project the current maintainer +suggests to the contributors: + + (0) You come up with an itch. You code it up. + + (1) Send it to the list and cc people who may need to know about + the change. + + The people who may need to know are the ones whose code you + are butchering. These people happen to be the ones who are + most likely to be knowledgeable enough to help you, but + they have no obligation to help you (i.e. you ask for help, + don't demand). "git log -p -- $area_you_are_modifying" would + help you find out who they are. + + (2) You get comments and suggestions for improvements. You may + even get them in a "on top of your change" patch form. + + (3) Polish, refine, and re-send to the list and the people who + spend their time to improve your patch. Go back to step (2). + + (4) The list forms consensus that the last round of your patch is + good. Send it to the list and cc the maintainer. + + (5) A topic branch is created with the patch and is merged to 'next', + and cooked further and eventually graduates to 'master'. + +In any time between the (2)-(3) cycle, the maintainer may pick it up +from the list and queue it to 'pu', in order to make it easier for +people play with it without having to pick up and apply the patch to +their trees themselves. ------------------------------------------------ MUA specific hints @@ -252,7 +301,7 @@ If it does not apply correctly, there can be various reasons. patch appropriately. * Your MUA corrupted your patch; "am" would complain that - the patch does not apply. Look at .dotest/ subdirectory and + the patch does not apply. Look at .git/rebase-apply/ subdirectory and see what 'patch' file contains and check for the common corruption patterns mentioned above. @@ -370,6 +419,11 @@ settings but I haven't tried, yet. mail.identity.default.compose_html => false mail.identity.id?.compose_html => false +(Lukas Sandström) + +There is a script in contrib/thunderbird-patch-inline which can help +you include patches with Thunderbird in an easy way. To use it, do the +steps above and then use the script as the external editor. Gnus ---- diff --git a/Documentation/asciidoc.conf b/Documentation/asciidoc.conf index 10c1a151a4..40d43b78ee 100644 --- a/Documentation/asciidoc.conf +++ b/Documentation/asciidoc.conf @@ -8,6 +8,7 @@ # the command. [attributes] +asterisk=* plus=+ caret=^ startsb=[ diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt index ea1007bfb0..5428111d73 100644 --- a/Documentation/blame-options.txt +++ b/Documentation/blame-options.txt @@ -41,7 +41,8 @@ of lines before or after the line given by <start>. -S <revs-file>:: Use revs from revs-file instead of calling linkgit:git-rev-list[1]. --p, --porcelain:: +-p:: +--porcelain:: Show in a format designed for machine consumption. --incremental:: @@ -52,7 +53,7 @@ of lines before or after the line given by <start>. When <rev> is not specified, the command annotates the changes starting backwards from the working tree copy. This flag makes the command pretend as if the working - tree copy has the contents of he named file (specify + tree copy has the contents of the named file (specify `-` to make the command read from the standard input). -M|<num>|:: @@ -83,5 +84,6 @@ alphanumeric characters that git must detect as moving between files for it to associate those lines with the parent commit. --h, --help:: +-h:: +--help:: Show help message. diff --git a/Documentation/cat-texi.perl b/Documentation/cat-texi.perl index e3d8e9faa8..dbc133cd3c 100755 --- a/Documentation/cat-texi.perl +++ b/Documentation/cat-texi.perl @@ -11,7 +11,7 @@ while (<STDIN>) { if (s/^\@top (.*)/\@node $1,,,Top/) { push @menu, $1; } - s/\(\@pxref{\[URLS\]}\)//; + s/\(\@pxref{\[(URLS|REMOTES)\]}\)//; print TMP; } close TMP; diff --git a/Documentation/config.txt b/Documentation/config.txt index 877eda960d..676c39bb84 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -63,7 +63,7 @@ The values following the equals sign in variable assign are all either a string, an integer, or a boolean. Boolean values may be given as yes/no, 0/1 or true/false. Case is not significant in boolean values, when converting value to the canonical form using '--bool' type specifier; -`git-config` will ensure that the output is "true" or "false". +'git-config' will ensure that the output is "true" or "false". String values may be entirely or partially enclosed in double quotes. You need to enclose variable value in double quotes if you want to @@ -92,7 +92,7 @@ Example # Our diff algorithm [diff] - external = "/usr/local/bin/gnu-diff -u" + external = /usr/local/bin/diff-wrapper renames = true [branch "devel"] @@ -117,9 +117,16 @@ core.fileMode:: the working copy are ignored; useful on broken filesystems like FAT. See linkgit:git-update-index[1]. True by default. +core.trustctime:: + If false, the ctime differences between the index and the + working copy are ignored; useful when the inode change time + is regularly modified by something outside Git (file system + crawlers and some backup systems). + See linkgit:git-update-index[1]. True by default. + core.quotepath:: - The commands that output paths (e.g. `ls-files`, - `diff`), when not given the `-z` option, will quote + The commands that output paths (e.g. 'ls-files', + 'diff'), when not given the `-z` option, will quote "unusual" characters in the pathname by enclosing the pathname in a double-quote pair and with backslashes the same way strings in C source code are quoted. If this @@ -139,6 +146,51 @@ core.autocrlf:: "text" (i.e. be subjected to the autocrlf mechanism) is decided purely based on the contents. +core.safecrlf:: + If true, makes git check if converting `CRLF` as controlled by + `core.autocrlf` is reversible. Git will verify if a command + modifies a file in the work tree either directly or indirectly. + For example, committing a file followed by checking out the + same file should yield the original file in the work tree. If + this is not the case for the current setting of + `core.autocrlf`, git will reject the file. The variable can + be set to "warn", in which case git will only warn about an + irreversible conversion but continue the operation. ++ +CRLF conversion bears a slight chance of corrupting data. +autocrlf=true will convert CRLF to LF during commit and LF to +CRLF during checkout. A file that contains a mixture of LF and +CRLF before the commit cannot be recreated by git. For text +files this is the right thing to do: it corrects line endings +such that we have only LF line endings in the repository. +But for binary files that are accidentally classified as text the +conversion can corrupt data. ++ +If you recognize such corruption early you can easily fix it by +setting the conversion type explicitly in .gitattributes. Right +after committing you still have the original file in your work +tree and this file is not yet corrupted. You can explicitly tell +git that this file is binary and git will handle the file +appropriately. ++ +Unfortunately, the desired effect of cleaning up text files with +mixed line endings and the undesired effect of corrupting binary +files cannot be distinguished. In both cases CRLFs are removed +in an irreversible way. For text files this is the right thing +to do because CRLFs are line endings, while for binary files +converting CRLFs corrupts data. ++ +Note, this safety check does not mean that a checkout will generate a +file identical to the original file for a different setting of +`core.autocrlf`, but only for the current one. For example, a text +file with `LF` would be accepted with `core.autocrlf=input` and could +later be checked out with `core.autocrlf=true`, in which case the +resulting file would contain `CRLF`, although the original file +contained `LF`. However, in both work trees the line endings would be +consistent, that is either all `LF` or all `CRLF`, but never mixed. A +file with mixed line endings would be reported by the `core.safecrlf` +mechanism. + core.symlinks:: If false, symbolic links are checked out as small plain files that contain the link text. linkgit:git-update-index[1] and @@ -160,10 +212,13 @@ Can be overridden by the 'GIT_PROXY_COMMAND' environment variable handling). core.ignoreStat:: - The working copy files are assumed to stay unchanged until you - mark them otherwise manually - Git will not detect the file changes - by lstat() calls. This is useful on systems where those are very - slow, such as Microsoft Windows. See linkgit:git-update-index[1]. + If true, commands which modify both the working tree and the index + will mark the updated paths with the "assume unchanged" bit in the + index. These marked files are then assumed to stay unchanged in the + working copy, until you mark them otherwise manually - Git will not + detect the file changes by lstat() calls. This is useful on systems + where those are very slow, such as Microsoft Windows. + See linkgit:git-update-index[1]. False by default. core.preferSymlinkRefs:: @@ -189,7 +244,13 @@ core.worktree:: used in combination with repositories found automatically in a .git directory (i.e. $GIT_DIR is not set). This can be overridden by the GIT_WORK_TREE environment - variable and the '--work-tree' command line option. + variable and the '--work-tree' command line option. It can be + a absolute path or relative path to the directory specified by + --git-dir or GIT_DIR. + Note: If --git-dir or GIT_DIR are specified but none of + --work-tree, GIT_WORK_TREE and core.worktree is specified, + the current working directory is regarded as the top directory + of your working tree. core.logAllRefUpdates:: Enable the reflog. Updates to a ref <ref> is logged to the file @@ -216,7 +277,12 @@ core.sharedRepository:: group-writable). When 'all' (or 'world' or 'everybody'), the repository will be readable by all users, additionally to being group-shareable. When 'umask' (or 'false'), git will use permissions - reported by umask(2). See linkgit:git-init[1]. False by default. + reported by umask(2). When '0xxx', where '0xxx' is an octal number, + files in the repository will have this mode value. '0xxx' will override + user's umask value, and thus, users with a safe umask (0077) can use + this option. Examples: '0660' is equivalent to 'group'. '0640' is a + repository that is group-readable but not group-writable. + See linkgit:git-init[1]. False by default. core.warnAmbiguousRefs:: If true, git will warn you if the ref name you passed it is ambiguous @@ -297,9 +363,10 @@ core.pager:: core.whitespace:: A comma separated list of common whitespace problems to - notice. `git diff` will use `color.diff.whitespace` to - highlight them, and `git apply --whitespace=error` will - consider them as errors: + notice. 'git-diff' will use `color.diff.whitespace` to + highlight them, and 'git-apply --whitespace=error' will + consider them as errors. You can prefix `-` to disable + any of them (e.g. `-trailing-space`): + * `trailing-space` treats trailing whitespaces at the end of the line as an error (enabled by default). @@ -308,6 +375,18 @@ core.whitespace:: error (enabled by default). * `indent-with-non-tab` treats a line that is indented with 8 or more space characters as an error (not enabled by default). +* `cr-at-eol` treats a carriage-return at the end of line as + part of the line terminator, i.e. with it, `trailing-space` + does not trigger if the character before such a carriage-return + is not a whitespace (not enabled by default). + +core.fsyncobjectfiles:: + This boolean will enable 'fsync()' when writing object files. ++ +This is a total waste of time and effort on a filesystem that orders +data writes properly, but can be useful for filesystems that do not use +journalling (traditional UNIX filesystems) or that only journal metadata +and not file contents (OS X's HFS+, or Linux ext3 with "data=writeback"). alias.*:: Command aliases for the linkgit:git[1] command wrapper - e.g. @@ -325,31 +404,50 @@ it will be treated as a shell command. For example, defining "gitk --all --not ORIG_HEAD". apply.whitespace:: - Tells `git-apply` how to handle whitespaces, in the same way + Tells 'git-apply' how to handle whitespaces, in the same way as the '--whitespace' option. See linkgit:git-apply[1]. branch.autosetupmerge:: - Tells `git-branch` and `git-checkout` to setup new branches - so that linkgit:git-pull[1] will appropriately merge from that - remote branch. Note that even if this option is not set, + Tells 'git-branch' and 'git-checkout' to setup new branches + so that linkgit:git-pull[1] will appropriately merge from the + starting point branch. Note that even if this option is not set, this behavior can be chosen per-branch using the `--track` - and `--no-track` options. This option defaults to false. + and `--no-track` options. The valid settings are: `false` -- no + automatic setup is done; `true` -- automatic setup is done when the + starting point is a remote branch; `always` -- automatic setup is + done when the starting point is either a local branch or remote + branch. This option defaults to true. + +branch.autosetuprebase:: + When a new branch is created with 'git-branch' or 'git-checkout' + that tracks another branch, this variable tells git to set + up pull to rebase instead of merge (see "branch.<name>.rebase"). + When `never`, rebase is never automatically set to true. + When `local`, rebase is set to true for tracked branches of + other local branches. + When `remote`, rebase is set to true for tracked branches of + remote branches. + When `always`, rebase will be set to true for all tracking + branches. + See "branch.autosetupmerge" for details on how to set up a + branch to track another branch. + This option defaults to never. branch.<name>.remote:: - When in branch <name>, it tells `git fetch` which remote to fetch. - If this option is not given, `git fetch` defaults to remote "origin". + When in branch <name>, it tells 'git-fetch' which remote to fetch. + If this option is not given, 'git-fetch' defaults to remote "origin". branch.<name>.merge:: - When in branch <name>, it tells `git fetch` the default + When in branch <name>, it tells 'git-fetch' the default refspec to be marked for merging in FETCH_HEAD. The value is handled like the remote part of a refspec, and must match a ref which is fetched from the remote given by "branch.<name>.remote". - The merge information is used by `git pull` (which at first calls - `git fetch`) to lookup the default branch for merging. Without - this option, `git pull` defaults to merge the first refspec fetched. + The merge information is used by 'git-pull' (which at first calls + 'git-fetch') to lookup the default branch for merging. Without + this option, 'git-pull' defaults to merge the first refspec fetched. Specify multiple values to get an octopus merge. - If you wish to setup `git pull` so that it merges into <name> from + If you wish to setup 'git-pull' so that it merges into <name> from another branch in the local repository, you can point branch.<name>.merge to the desired branch, and use the special setting `.` (a period) for branch.<name>.remote. @@ -362,11 +460,22 @@ branch.<name>.mergeoptions:: branch.<name>.rebase:: When true, rebase the branch <name> on top of the fetched branch, - instead of merging the default branch from the default remote. + instead of merging the default branch from the default remote when + "git pull" is run. *NOTE*: this is a possibly dangerous operation; do *not* use it unless you understand the implications (see linkgit:git-rebase[1] for details). +browser.<tool>.cmd:: + Specify the command to invoke the specified browser. The + specified command is evaluated in shell with the URLs passed + as arguments. (See linkgit:git-web--browse[1].) + +browser.<tool>.path:: + Override the path for the given tool that may be used to + browse HTML help (see '-w' option in linkgit:git-help[1]) or a + working repository in gitweb (see linkgit:git-instaweb[1]). + clean.requireForce:: A boolean to make git-clean do nothing unless given -f or -n. Defaults to true. @@ -407,12 +516,12 @@ color.diff.<slot>:: color.interactive:: When set to `always`, always use colors for interactive prompts - and displays (such as those used by "git add --interactive"). + and displays (such as those used by "git-add --interactive"). When false (or `never`), never. When set to `true` or `auto`, use colors only when the output is to the terminal. Defaults to false. color.interactive.<slot>:: - Use customized color for `git add --interactive` + Use customized color for 'git-add --interactive' output. `<slot>` may be `prompt`, `header`, or `help`, for three distinct types of normal output from interactive programs. The values of these variables may be specified as @@ -433,32 +542,43 @@ color.status.<slot>:: one of `header` (the header text of the status message), `added` or `updated` (files which are added but not committed), `changed` (files which are changed but not added in the index), - or `untracked` (files which are not tracked by git). The values of - these variables may be specified as in color.branch.<slot>. + `untracked` (files which are not tracked by git), or + `nobranch` (the color the 'no branch' warning is shown in, defaulting + to red). The values of these variables may be specified as in + color.branch.<slot>. commit.template:: Specify a file to use as the template for new commit messages. +color.ui:: + When set to `always`, always use colors in all git commands which + are capable of colored output. When false (or `never`), never. When + set to `true` or `auto`, use colors only when the output is to the + terminal. When more specific variables of color.* are set, they always + take precedence over this setting. Defaults to false. + diff.autorefreshindex:: - When using `git diff` to compare with work tree + When using 'git-diff' to compare with work tree files, do not consider stat-only change as changed. Instead, silently run `git update-index --refresh` to update the cached stat information for paths whose contents in the work tree match the contents in the index. This option defaults to true. Note that this - affects only `git diff` Porcelain, and not lower level - `diff` commands, such as `git diff-files`. + affects only 'git-diff' Porcelain, and not lower level + 'diff' commands, such as 'git-diff-files'. diff.external:: If this config variable is set, diff generation is not performed using the internal diff machinery, but using the - given command. Note: if you want to use an external diff - program only on a subset of your files, you might want to - use linkgit:gitattributes[5] instead. + given command. Can be overridden with the `GIT_EXTERNAL_DIFF' + environment variable. The command is called with parameters + as described under "git Diffs" in linkgit:git[1]. Note: if + you want to use an external diff program only on a subset of + your files, you might want to use linkgit:gitattributes[5] instead. diff.renameLimit:: The number of files to consider when performing the copy/rename - detection; equivalent to the git diff option '-l'. + detection; equivalent to the 'git-diff' option '-l'. diff.renames:: Tells git to detect renames. If set to any boolean value, it @@ -491,9 +611,14 @@ format.suffix:: `.patch`. Use this variable to change that suffix (make sure to include the dot if you want it). +format.pretty:: + The default pretty format for log/show/whatchanged command, + See linkgit:git-log[1], linkgit:git-show[1], + linkgit:git-whatchanged[1]. + gc.aggressiveWindow:: The window size parameter used in the delta compression - algorithm used by 'git gc --aggressive'. This defaults + algorithm used by 'git-gc --aggressive'. This defaults to 10. gc.auto:: @@ -507,38 +632,47 @@ gc.autopacklimit:: When there are more than this many packs that are not marked with `*.keep` file in the repository, `git gc --auto` consolidates them into one larger pack. The - default value is 20. Setting this to 0 disables it. + default value is 50. Setting this to 0 disables it. gc.packrefs:: - `git gc` does not run `git pack-refs` in a bare repository by + 'git-gc' does not run `git pack-refs` in a bare repository by default so that older dumb-transport clients can still fetch - from the repository. Setting this to `true` lets `git - gc` to run `git pack-refs`. Setting this to `false` tells - `git gc` never to run `git pack-refs`. The default setting is + from the repository. Setting this to `true` lets 'git-gc' + to run `git pack-refs`. Setting this to `false` tells + 'git-gc' never to run `git pack-refs`. The default setting is `notbare`. Enable it only when you know you do not have to support such clients. The default setting will change to `true` at some stage, and setting this to `false` will continue to - prevent `git pack-refs` from being run from `git gc`. + prevent `git pack-refs` from being run from 'git-gc'. + +gc.pruneexpire:: + When 'git-gc' is run, it will call 'prune --expire 2.weeks.ago'. + Override the grace period with this config variable. gc.reflogexpire:: - `git reflog expire` removes reflog entries older than + 'git-reflog expire' removes reflog entries older than this time; defaults to 90 days. gc.reflogexpireunreachable:: - `git reflog expire` removes reflog entries older than + 'git-reflog expire' removes reflog entries older than this time and are not reachable from the current tip; defaults to 30 days. gc.rerereresolved:: Records of conflicted merge you resolved earlier are - kept for this many days when `git rerere gc` is run. + kept for this many days when 'git-rerere gc' is run. The default is 60 days. See linkgit:git-rerere[1]. gc.rerereunresolved:: Records of conflicted merge you have not resolved are - kept for this many days when `git rerere gc` is run. + kept for this many days when 'git-rerere gc' is run. The default is 15 days. See linkgit:git-rerere[1]. +rerere.autoupdate:: + When set to true, `git-rerere` updates the index with the + resulting contents after it cleanly resolves conflicts using + previously recorded resolution. Defaults to false. + rerere.enabled:: Activate recording of resolved conflicts, so that identical conflict hunks can be resolved automatically, should they @@ -554,11 +688,24 @@ gitcvs.logfile:: Path to a log file where the CVS server interface well... logs various stuff. See linkgit:git-cvsserver[1]. +gitcvs.usecrlfattr + If true, the server will look up the `crlf` attribute for + files to determine the '-k' modes to use. If `crlf` is set, + the '-k' mode will be left blank, so cvs clients will + treat it as text. If `crlf` is explicitly unset, the file + will be set with '-kb' mode, which suppresses any newline munging + the client might otherwise do. If `crlf` is not specified, + then 'gitcvs.allbinary' is used. See linkgit:gitattributes[5]. + gitcvs.allbinary:: - If true, all files are sent to the client in mode '-kb'. This - causes the client to treat all files as binary files which suppresses - any newline munging it otherwise might do. A work-around for the - fact that there is no way yet to set single files to mode '-kb'. + This is used if 'gitcvs.usecrlfattr' does not resolve + the correct '-kb' mode to use. If true, all + unresolved files are sent to the client in + mode '-kb'. This causes the client to treat them + as binary files, which suppresses any newline munging it + otherwise might do. Alternatively, if it is set to "guess", + then the contents of the file are examined to decide if + it is binary, similar to 'core.autocrlf'. gitcvs.dbname:: Database used by git-cvsserver to cache revision information @@ -582,11 +729,49 @@ gitcvs.dbuser, gitcvs.dbpass:: 'gitcvs.dbuser' supports variable substitution (see linkgit:git-cvsserver[1] for details). -All gitcvs variables except for 'gitcvs.allbinary' can also be -specified as 'gitcvs.<access_method>.<varname>' (where 'access_method' +gitcvs.dbTableNamePrefix:: + Database table name prefix. Prepended to the names of any + database tables used, allowing a single database to be used + for several repositories. Supports variable substitution (see + linkgit:git-cvsserver[1] for details). Any non-alphabetic + characters will be replaced with underscores. + +All gitcvs variables except for 'gitcvs.usecrlfattr' and +'gitcvs.allbinary' can also be specified as +'gitcvs.<access_method>.<varname>' (where 'access_method' is one of "ext" and "pserver") to make them apply only for the given access method. +gui.commitmsgwidth:: + Defines how wide the commit message window is in the + linkgit:git-gui[1]. "75" is the default. + +gui.diffcontext:: + Specifies how many context lines should be used in calls to diff + made by the linkgit:git-gui[1]. The default is "5". + +gui.matchtrackingbranch:: + Determines if new branches created with linkgit:git-gui[1] should + default to tracking remote branches with matching names or + not. Default: "false". + +gui.newbranchtemplate:: + Is used as suggested name when creating new branches using the + linkgit:git-gui[1]. + +gui.pruneduringfetch:: + "true" if linkgit:git-gui[1] should prune tracking branches when + performing a fetch. The default value is "false". + +gui.trustmtime:: + Determines if linkgit:git-gui[1] should trust the file modification + timestamp or not. By default the timestamps are not trusted. + +gui.spellingdictionary:: + Specifies the dictionary used for spell checking commit messages in + the linkgit:git-gui[1]. When set to "none" spell checking is turned + off. + help.browser:: Specify the browser that will be used to display help in the 'web' format. See linkgit:git-help[1]. @@ -651,7 +836,7 @@ i18n.commitEncoding:: i18n.logOutputEncoding:: Character encoding the commit messages are converted to when - running `git-log` and friends. + running 'git-log' and friends. instaweb.browser:: Specify the program that will be used to browse your working @@ -672,46 +857,62 @@ instaweb.port:: The port number to bind the gitweb httpd to. See linkgit:git-instaweb[1]. +log.date:: + Set default date-time mode for the log command. Setting log.date + value is similar to using 'git-log'\'s --date option. The value is one of the + following alternatives: {relative,local,default,iso,rfc,short}. + See linkgit:git-log[1]. + log.showroot:: If true, the initial commit will be shown as a big creation event. This is equivalent to a diff against an empty tree. Tools like linkgit:git-log[1] or linkgit:git-whatchanged[1], which normally hide the root commit will now show it. True by default. -merge.summary:: - Whether to include summaries of merged commits in newly created - merge commit messages. False by default. - -merge.tool:: - Controls which merge resolution program is used by - linkgit:git-mergetool[1]. Valid values are: "kdiff3", "tkdiff", - "meld", "xxdiff", "emerge", "vimdiff", "gvimdiff", and "opendiff". +man.viewer:: + Specify the programs that may be used to display help in the + 'man' format. See linkgit:git-help[1]. -merge.verbosity:: - Controls the amount of output shown by the recursive merge - strategy. Level 0 outputs nothing except a final error - message if conflicts were detected. Level 1 outputs only - conflicts, 2 outputs conflicts and file changes. Level 5 and - above outputs debugging information. The default is level 2. - Can be overridden by 'GIT_MERGE_VERBOSITY' environment variable. +include::merge-config.txt[] -merge.<driver>.name:: - Defines a human readable name for a custom low-level - merge driver. See linkgit:gitattributes[5] for details. +man.<tool>.cmd:: + Specify the command to invoke the specified man viewer. The + specified command is evaluated in shell with the man page + passed as argument. (See linkgit:git-help[1].) -merge.<driver>.driver:: - Defines the command that implements a custom low-level - merge driver. See linkgit:gitattributes[5] for details. - -merge.<driver>.recursive:: - Names a low-level merge driver to be used when - performing an internal merge between common ancestors. - See linkgit:gitattributes[5] for details. +man.<tool>.path:: + Override the path for the given tool that may be used to + display help in the 'man' format. See linkgit:git-help[1]. mergetool.<tool>.path:: Override the path for the given tool. This is useful in case your tool is not in the PATH. +mergetool.<tool>.cmd:: + Specify the command to invoke the specified merge tool. The + specified command is evaluated in shell with the following + variables available: 'BASE' is the name of a temporary file + containing the common base of the files to be merged, if available; + 'LOCAL' is the name of a temporary file containing the contents of + the file on the current branch; 'REMOTE' is the name of a temporary + file containing the contents of the file from the branch being + merged; 'MERGED' contains the name of the file to which the merge + tool should write the results of a successful merge. + +mergetool.<tool>.trustExitCode:: + For a custom merge command, specify whether the exit code of + the merge command can be used to determine whether the merge was + successful. If this is not set to true then the merge target file + timestamp is checked and the merge assumed to have been successful + if the file has been updated, otherwise the user is prompted to + indicate the success of the merge. + +mergetool.keepBackup:: + After performing a merge, the original file with conflict markers + can be saved as a file with a `.orig` extension. If this variable + is set to `false` then this file is not preserved. Defaults to + `true` (i.e. keep the backup files). + pack.window:: The size of the window used by linkgit:git-pack-objects[1] when no window size is given on the command line. Defaults to 10. @@ -751,15 +952,36 @@ pack.threads:: warning. This is meant to reduce packing time on multiprocessor machines. The required amount of memory for the delta search window is however multiplied by the number of threads. + Specifying 0 will cause git to auto-detect the number of CPU's + and set the number of threads accordingly. pack.indexVersion:: Specify the default pack index version. Valid values are 1 for legacy pack index used by Git versions prior to 1.5.2, and 2 for the new pack index with capabilities for packs larger than 4 GB as well as proper protection against the repacking of corrupted - packs. Version 2 is selected and this config option ignored - whenever the corresponding pack is larger than 2 GB. Otherwise - the default is 1. + packs. Version 2 is the default. Note that version 2 is enforced + and this config option ignored whenever the corresponding pack is + larger than 2 GB. ++ +If you have an old git that does not understand the version 2 `{asterisk}.idx` file, +cloning or fetching over a non native protocol (e.g. "http" and "rsync") +that will copy both `{asterisk}.pack` file and corresponding `{asterisk}.idx` file from the +other side may give you a repository that cannot be accessed with your +older version of git. If the `{asterisk}.pack` file is smaller than 2 GB, however, +you can use linkgit:git-index-pack[1] on the *.pack file to regenerate +the `{asterisk}.idx` file. + +pack.packSizeLimit:: + The default maximum size of a pack. This setting only affects + packing to a file, i.e. the git:// protocol is unaffected. It + can be overridden by the `\--max-pack-size` option of + linkgit:git-repack[1]. + +pager.<cmd>:: + Allows to set your own pager preferences for each command, overriding + the default. If `\--pager` or `\--no-pager` is specified on the command + line, it takes precedence over this option. pull.octopus:: The default merge strategy to use when pulling multiple branches @@ -785,33 +1007,37 @@ remote.<name>.push:: The default set of "refspec" for linkgit:git-push[1]. See linkgit:git-push[1]. +remote.<name>.mirror:: + If true, pushing to this remote will automatically behave + as if the `\--mirror` option was given on the command line. + remote.<name>.skipDefaultUpdate:: If true, this remote will be skipped by default when updating using the update subcommand of linkgit:git-remote[1]. remote.<name>.receivepack:: The default program to execute on the remote side when pushing. See - option \--exec of linkgit:git-push[1]. + option \--receive-pack of linkgit:git-push[1]. remote.<name>.uploadpack:: The default program to execute on the remote side when fetching. See - option \--exec of linkgit:git-fetch-pack[1]. + option \--upload-pack of linkgit:git-fetch-pack[1]. remote.<name>.tagopt:: - Setting this value to --no-tags disables automatic tag following when fetching - from remote <name> + Setting this value to \--no-tags disables automatic tag following when + fetching from remote <name> remotes.<group>:: The list of remotes which are fetched by "git remote update <group>". See linkgit:git-remote[1]. repack.usedeltabaseoffset:: - Allow linkgit:git-repack[1] to create packs that uses - delta-base offset. Defaults to false. - -show.difftree:: - The default linkgit:git-diff-tree[1] arguments to be used - for linkgit:git-show[1]. + By default, linkgit:git-repack[1] creates packs that use + delta-base offset. If you need to share your repository with + git older than version 1.4.4, either directly or via a dumb + protocol such as http, then you need to set this option to + "false" and repack. Access from old git versions over the + native protocol are unaffected by this option. showbranch.default:: The default set of branches for linkgit:git-show-branch[1]. @@ -823,6 +1049,25 @@ status.relativePaths:: relative to the repository root (this was the default for git prior to v1.5.4). +status.showUntrackedFiles:: + By default, linkgit:git-status[1] and linkgit:git-commit[1] show + files which are not currently tracked by Git. Directories which + contain only untracked files, are shown with the directory name + only. Showing untracked files means that Git needs to lstat() all + all the files in the whole repository, which might be slow on some + systems. So, this variable controls how the commands displays + the untracked files. Possible values are: ++ +-- + - 'no' - Show no untracked files + - 'normal' - Shows untracked files and directories + - 'all' - Shows also individual files in untracked directories. +-- ++ +If this variable is not specified, it defaults to 'normal'. +This variable can be overridden with the -u|--untracked-files option +of linkgit:git-status[1] and linkgit:git-commit[1]. + tar.umask:: This variable can be used to restrict the permission bits of tar archive entries. The default is 0002, which turns off the @@ -830,6 +1075,17 @@ tar.umask:: archiving user's umask will be used instead. See umask(2) and linkgit:git-archive[1]. +url.<base>.insteadOf:: + Any URL that starts with this value will be rewritten to + start, instead, with <base>. In cases where some site serves a + large number of repositories, and serves them with multiple + access methods, and some users need to use different access + methods, this feature allows people to specify any of the + equivalent URLs and have git automatically rewrite the URL to + the best alternative for the particular user, even for a + never-before-seen repository on the site. When more than one + insteadOf strings match a given URL, the longest match is used. + user.email:: Your email address to be recorded in any newly created commits. Can be overridden by the 'GIT_AUTHOR_EMAIL', 'GIT_COMMITTER_EMAIL', and @@ -847,14 +1103,16 @@ user.signingkey:: unchanged to gpg's --local-user parameter, so you may specify a key using any method that gpg supports. -whatchanged.difftree:: - The default linkgit:git-diff-tree[1] arguments to be used - for linkgit:git-whatchanged[1]. - imap:: The configuration variables in the 'imap' section are described in linkgit:git-imap-send[1]. +receive.fsckObjects:: + If it is set to true, git-receive-pack will check all received + objects. It will abort in the case of a malformed object or a + broken link. The result of an abort are only dangling objects. + Defaults to false. + receive.unpackLimit:: If the number of objects received in a push is below this limit then the objects will be unpacked into loose object diff --git a/Documentation/diff-generate-patch.txt b/Documentation/diff-generate-patch.txt index 029c5f2b82..517e1eba3c 100644 --- a/Documentation/diff-generate-patch.txt +++ b/Documentation/diff-generate-patch.txt @@ -96,7 +96,7 @@ index fabadb8,cc95eb0..4866510 + or like this (when '--cc' option is used): - diff --c file + diff --cc file 2. It is followed by one or more extended header lines (this example shows a merge with two parents): diff --git a/Documentation/diff-options.txt b/Documentation/diff-options.txt index 8d35cbd60d..cba90fd27c 100644 --- a/Documentation/diff-options.txt +++ b/Documentation/diff-options.txt @@ -58,6 +58,14 @@ endif::git-format-patch[] number of modified files, as well as number of added and deleted lines. +--dirstat[=limit]:: + Output only the sub-directories that are impacted by a diff, + and to what degree they are impacted. You can override the + default cut-off in percent (3) by "--dirstat=limit". If you + want to enable "cumulative" directory statistics, you can use + the "--cumulative" flag, which adds up percentages recursively + even when they have been already reported for a sub-directory. + --summary:: Output a condensed summary of extended header information such as creations, renames and mode changes. @@ -75,7 +83,8 @@ endif::git-format-patch[] Show only names of changed files. --name-status:: - Show only names and status of changed files. + Show only names and status of changed files. See the description + of the `--diff-filter` option on what the status letters mean. --color:: Show colored diff. @@ -170,6 +179,14 @@ endif::git-format-patch[] Swap two inputs; that is, show differences from index or on-disk file to tree contents. +--relative[=<path>]:: + When run from a subdirectory of the project, it can be + told to exclude changes outside the directory and show + pathnames relative to it with this option. When you are + not in a subdirectory (e.g. in a bare repository), you + can name which subdirectory to make the output relative + to by giving a <path> as an argument. + --text:: Treat all files as text. @@ -211,6 +228,9 @@ endif::git-format-patch[] --no-ext-diff:: Disallow external diff drivers. +--ignore-submodules:: + Ignore changes to submodules in the diff generation. + --src-prefix=<prefix>:: Show the given source prefix instead of "a/". @@ -221,4 +241,4 @@ endif::git-format-patch[] Do not show any source or destination prefix. For more detailed explanation on these common options, see also -link:diffcore.html[diffcore documentation]. +linkgit:gitdiffcore[7]. diff --git a/Documentation/everyday.txt b/Documentation/everyday.txt index fdbd15a181..e598cdda45 100644 --- a/Documentation/everyday.txt +++ b/Documentation/everyday.txt @@ -48,14 +48,12 @@ $ git gc <3> repository health reasonably well. <2> check how many loose objects there are and how much disk space is wasted by not repacking. -<3> repacks the local repository and performs other housekeeping tasks. Running -without `--prune` is a safe operation even while other ones are in progress. +<3> repacks the local repository and performs other housekeeping tasks. Repack a small project into single pack.:: + ------------ $ git gc <1> -$ git gc --prune ------------ + <1> pack all the objects reachable from the refs into one pack, @@ -182,7 +180,7 @@ $ git pull <3> $ git log -p ORIG_HEAD.. arch/i386 include/asm-i386 <4> $ git pull git://git.kernel.org/pub/.../jgarzik/libata-dev.git ALL <5> $ git reset --hard ORIG_HEAD <6> -$ git gc --prune <7> +$ git gc <7> $ git fetch --tags <8> ------------ + diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt index 61e48ccf02..d313795fdb 100644 --- a/Documentation/fetch-options.txt +++ b/Documentation/fetch-options.txt @@ -1,35 +1,45 @@ --q, \--quiet:: +-q:: +--quiet:: Pass --quiet to git-fetch-pack and silence any other internally used programs. --v, \--verbose:: +-v:: +--verbose:: Be verbose. --a, \--append:: +-a:: +--append:: Append ref names and object names of fetched refs to the existing contents of `.git/FETCH_HEAD`. Without this option old data in `.git/FETCH_HEAD` will be overwritten. -\--upload-pack <upload-pack>:: +--upload-pack <upload-pack>:: When given, and the repository to fetch from is handled by 'git-fetch-pack', '--exec=<upload-pack>' is passed to the command to specify non-default path for the command run on the other end. --f, \--force:: - When `git-fetch` is used with `<rbranch>:<lbranch>` +-f:: +--force:: + When 'git-fetch' is used with `<rbranch>:<lbranch>` refspec, it refuses to update the local branch `<lbranch>` unless the remote branch `<rbranch>` it fetches is a descendant of `<lbranch>`. This option overrides that check. --n, \--no-tags:: - By default, `git-fetch` fetches tags that point at - objects that are downloaded from the remote repository - and stores them locally. This option disables this - automatic tag following. +ifdef::git-pull[] +--no-tags:: +endif::git-pull[] +ifndef::git-pull[] +-n:: +--no-tags:: +endif::git-pull[] + By default, tags that point at objects that are downloaded + from the remote repository are fetched and stored locally. + This option disables this automatic tag following. --t, \--tags:: +-t:: +--tags:: Most of the tags are fetched automatically as branch heads are downloaded, but tags that do not point at objects reachable from the branch heads that are being @@ -37,18 +47,20 @@ flag lets all tags and their associated objects be downloaded. --k, \--keep:: +-k:: +--keep:: Keep downloaded pack. --u, \--update-head-ok:: - By default `git-fetch` refuses to update the head which +-u:: +--update-head-ok:: + By default 'git-fetch' refuses to update the head which corresponds to the current branch. This flag disables the - check. This is purely for the internal use for `git-pull` - to communicate with `git-fetch`, and unless you are + check. This is purely for the internal use for 'git-pull' + to communicate with 'git-fetch', and unless you are implementing your own Porcelain you are not supposed to use it. -\--depth=<depth>:: +--depth=<depth>:: Deepen the history of a 'shallow' repository created by `git clone` with `--depth=<depth>` option (see linkgit:git-clone[1]) by the specified number of commits. diff --git a/Documentation/git-add.txt b/Documentation/git-add.txt index 9d2ac865d2..2b6d6c8654 100644 --- a/Documentation/git-add.txt +++ b/Documentation/git-add.txt @@ -8,8 +8,9 @@ git-add - Add file contents to the index SYNOPSIS -------- [verse] -'git-add' [-n] [-v] [-f] [--interactive | -i] [--patch | -p] [-u] [--refresh] - [--] <filepattern>... +'git add' [-n] [-v] [--force | -f] [--interactive | -i] [--patch | -p] + [--all | [--update | -u]] [--refresh] [--ignore-errors] [--] + <filepattern>... DESCRIPTION ----------- @@ -50,37 +51,56 @@ OPTIONS and `dir/file2`) can be given to add all files in the directory, recursively. --n, \--dry-run:: +-n:: +--dry-run:: Don't actually add the file(s), just show if they exist. --v, \--verbose:: +-v:: +--verbose:: Be verbose. -f:: +--force:: Allow adding otherwise ignored files. --i, \--interactive:: +-i:: +--interactive:: Add modified contents in the working tree interactively to the index. Optional path arguments may be supplied to limit operation to a subset of the working tree. See ``Interactive mode'' for details. --p, \--patch:: +-p:: +--patch:: Similar to Interactive mode but the initial command loop is bypassed and the 'patch' subcommand is invoked using each of the specified filepatterns before exiting. -u:: - Update only files that git already knows about. This is similar +--update:: + Update only files that git already knows about, staging modified + content for commit and marking deleted files for removal. This + is similar to what "git commit -a" does in preparation for making a commit, except that the update is limited to paths specified on the - command line. If no paths are specified, all tracked files are - updated. + command line. If no paths are specified, all tracked files in the + current directory and its subdirectories are updated. -\--refresh:: +-A:: +--all:: + Update files that git already knows about (same as '\--update') + and add all untracked files that are not ignored by '.gitignore' + mechanism. + +--refresh:: Don't add the file(s), but only refresh their stat() information in the index. +--ignore-errors:: + If some files could not be added because of errors indexing + them, do not abort the operation, but continue adding the + others. The command shall still exit with non-zero status. + \--:: This option can be used to separate command-line options from the list of files, (useful when filenames might be mistaken @@ -93,26 +113,32 @@ Configuration The optional configuration variable 'core.excludesfile' indicates a path to a file containing patterns of file names to exclude from git-add, similar to $GIT_DIR/info/exclude. Patterns in the exclude file are used in addition to -those in info/exclude. See link:repository-layout.html[repository layout]. +those in info/exclude. See linkgit:gitrepository-layout[5]. EXAMPLES -------- -git-add Documentation/\\*.txt:: - Adds content from all `\*.txt` files under `Documentation` - directory and its subdirectories. +* Adds content from all `\*.txt` files under `Documentation` directory +and its subdirectories: ++ +------------ +$ git add Documentation/\\*.txt +------------ + Note that the asterisk `\*` is quoted from the shell in this example; this lets the command to include the files from subdirectories of `Documentation/` directory. -git-add git-*.sh:: - - Considers adding content from all git-*.sh scripts. - Because this example lets shell expand the asterisk - (i.e. you are listing the files explicitly), it does not - consider `subdir/git-foo.sh`. +* Considers adding content from all git-*.sh scripts: ++ +------------ +$ git add git-*.sh +------------ ++ +Because this example lets shell expand the asterisk (i.e. you are +listing the files explicitly), it does not consider +`subdir/git-foo.sh`. Interactive mode ---------------- @@ -167,8 +193,9 @@ update:: "Update>>". When the prompt ends with double '>>', you can make more than one selection, concatenated with whitespace or comma. Also you can say ranges. E.g. "2-5 7,9" to choose - 2,3,4,5,7,9 from the list. You can say '*' to choose - everything. + 2,3,4,5,7,9 from the list. If the second number in a range is + omitted, all remaining patches are taken. E.g. "7-" to choose + 7,8,9 from the list. You can say '*' to choose everything. + What you chose are then highlighted with '*', like this: @@ -207,17 +234,16 @@ patch:: and the working tree file and asks you if you want to stage the change of each hunk. You can say: - y - add the change from that hunk to index - n - do not add the change from that hunk to index - a - add the change from that hunk and all the rest to index - d - do not the change from that hunk nor any of the rest to index - j - do not decide on this hunk now, and view the next - undecided hunk - J - do not decide on this hunk now, and view the next hunk - k - do not decide on this hunk now, and view the previous - undecided hunk - K - do not decide on this hunk now, and view the previous hunk + y - stage this hunk + n - do not stage this hunk + a - stage this and all the remaining hunks in the file + d - do not stage this hunk nor any of the remaining hunks in the file + j - leave this hunk undecided, see next undecided hunk + J - leave this hunk undecided, see next hunk + k - leave this hunk undecided, see previous undecided hunk + K - leave this hunk undecided, see previous hunk s - split the current hunk into smaller hunks + e - manually edit the current hunk ? - print help + After deciding the fate for all hunks, if there is any hunk @@ -228,8 +254,14 @@ diff:: This lets you review what will be committed (i.e. between HEAD and index). +Bugs +---- +The interactive mode does not work with files whose names contain +characters that need C-quoting. `core.quotepath` configuration can be +used to work this limitation around to some degree, but backslash, +double-quote and control characters will still have problems. -See Also +SEE ALSO -------- linkgit:git-status[1] linkgit:git-rm[1] @@ -248,4 +280,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-am.txt b/Documentation/git-am.txt index 2ffba2102b..b9c6fac748 100644 --- a/Documentation/git-am.txt +++ b/Documentation/git-am.txt @@ -9,11 +9,11 @@ git-am - Apply a series of patches from a mailbox SYNOPSIS -------- [verse] -'git-am' [--signoff] [--dotest=<dir>] [--keep] [--utf8 | --no-utf8] - [--3way] [--interactive] [--binary] +'git am' [--signoff] [--keep] [--utf8 | --no-utf8] + [--3way] [--interactive] [--whitespace=<option>] [-C<n>] [-p<n>] - <mbox>|<Maildir>... -'git-am' [--skip | --resolved] + [<mbox> | <Maildir>...] +'git am' (--skip | --resolved | --abort) DESCRIPTION ----------- @@ -28,19 +28,18 @@ OPTIONS supply this argument, reads from the standard input. If you supply directories, they'll be treated as Maildirs. --s, --signoff:: +-s:: +--signoff:: Add `Signed-off-by:` line to the commit message, using the committer identity of yourself. --d=<dir>, --dotest=<dir>:: - Instead of `.dotest` directory, use <dir> as a working - area to store extracted patches. +-k:: +--keep:: + Pass `-k` flag to 'git-mailinfo' (see linkgit:git-mailinfo[1]). --k, --keep:: - Pass `-k` flag to `git-mailinfo` (see linkgit:git-mailinfo[1]). - --u, --utf8:: - Pass `-u` flag to `git-mailinfo` (see linkgit:git-mailinfo[1]). +-u:: +--utf8:: + Pass `-u` flag to 'git-mailinfo' (see linkgit:git-mailinfo[1]). The proposed commit log message taken from the e-mail is re-coded into UTF-8 encoding (configuration variable `i18n.commitencoding` can be used to specify project's @@ -50,37 +49,37 @@ This was optional in prior versions of git, but now it is the default. You could use `--no-utf8` to override this. --no-utf8:: - Pass `-n` flag to `git-mailinfo` (see + Pass `-n` flag to 'git-mailinfo' (see linkgit:git-mailinfo[1]). --3, --3way:: +-3:: +--3way:: When the patch does not apply cleanly, fall back on 3-way merge, if the patch records the identity of blobs it is supposed to apply to, and we have those blobs available locally. --b, --binary:: - Pass `--allow-binary-replacement` flag to `git-apply` - (see linkgit:git-apply[1]). - --whitespace=<option>:: - This flag is passed to the `git-apply` (see linkgit:git-apply[1]) + This flag is passed to the 'git-apply' (see linkgit:git-apply[1]) program that applies the patch. --C<n>, -p<n>:: - These flags are passed to the `git-apply` (see linkgit:git-apply[1]) +-C<n>:: +-p<n>:: + These flags are passed to the 'git-apply' (see linkgit:git-apply[1]) program that applies the patch. --i, --interactive:: +-i:: +--interactive:: Run interactively. --skip:: Skip the current patch. This is only meaningful when restarting an aborted patch. --r, --resolved:: +-r:: +--resolved:: After a patch failure (e.g. attempting to apply conflicting patch), the user has applied it by hand and the index file stores the result of the application. @@ -93,7 +92,10 @@ default. You could use `--no-utf8` to override this. to the screen before exiting. This overrides the standard message informing you to use `--resolved` or `--skip` to handle the failure. This is solely - for internal use between `git-rebase` and `git-am`. + for internal use between 'git-rebase' and 'git-am'. + +--abort:: + Restore the original branch and abort the patching operation. DISCUSSION ---------- @@ -136,11 +138,17 @@ aborts in the middle,. You can recover from this in one of two ways: the index file to bring it in a state that the patch should have produced. Then run the command with '--resolved' option. -The command refuses to process new mailboxes while `.dotest` +The command refuses to process new mailboxes while `.git/rebase-apply` directory exists, so if you decide to start over from scratch, -run `rm -f .dotest` before running the command with mailbox +run `rm -f -r .git/rebase-apply` before running the command with mailbox names. +Before any patches are applied, ORIG_HEAD is set to the tip of the +current branch. This is useful if you have problems with multiple +commits, like running 'git am' on the wrong branch or an error in the +commits that is more easily fixed by changing the mailbox (e.g. +errors in the "From:" lines). + SEE ALSO -------- @@ -149,7 +157,7 @@ linkgit:git-apply[1]. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -157,4 +165,4 @@ Documentation by Petr Baudis, Junio C Hamano and the git-list <git@vger.kernel.o GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-annotate.txt b/Documentation/git-annotate.txt index 45a6a7251e..8b6b56a544 100644 --- a/Documentation/git-annotate.txt +++ b/Documentation/git-annotate.txt @@ -7,7 +7,7 @@ git-annotate - Annotate file lines with commit info SYNOPSIS -------- -git-annotate [options] file [revision] +'git annotate' [options] file [revision] DESCRIPTION ----------- @@ -28,4 +28,4 @@ Written by Ryan Anderson <ryan@michonline.com>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-apply.txt b/Documentation/git-apply.txt index 2dec2ec1cf..feb51f124a 100644 --- a/Documentation/git-apply.txt +++ b/Documentation/git-apply.txt @@ -9,16 +9,16 @@ git-apply - Apply a patch on a git index file and a working tree SYNOPSIS -------- [verse] -'git-apply' [--stat] [--numstat] [--summary] [--check] [--index] +'git apply' [--stat] [--numstat] [--summary] [--check] [--index] [--apply] [--no-add] [--build-fake-ancestor <file>] [-R | --reverse] [--allow-binary-replacement | --binary] [--reject] [-z] - [-pNUM] [-CNUM] [--inaccurate-eof] [--cached] + [-pNUM] [-CNUM] [--inaccurate-eof] [--recount] [--cached] [--whitespace=<nowarn|warn|fix|error|error-all>] - [--exclude=PATH] [--verbose] [<patch>...] + [--exclude=PATH] [--directory=<root>] [--verbose] [<patch>...] DESCRIPTION ----------- -Reads supplied diff output and applies it on a git index file +Reads supplied 'diff' output and applies it on a git index file and a work tree. OPTIONS @@ -64,7 +64,7 @@ OPTIONS without using the working tree. This implies '--index'. --build-fake-ancestor <file>:: - Newer git-diff output has embedded 'index information' + Newer 'git-diff' output has embedded 'index information' for each blob to help identify the original version that the patch applies to. When this flag is given, and if the original versions of the blobs is available locally, @@ -73,11 +73,12 @@ OPTIONS When a pure mode change is encountered (which has no index information), the information is read from the current index instead. --R, --reverse:: +-R:: +--reverse:: Apply the patch in reverse. --reject:: - For atomicity, linkgit:git-apply[1] by default fails the whole patch and + For atomicity, 'git-apply' by default fails the whole patch and does not touch the working tree when some of the hunks do not apply. This option makes it apply the parts of the patch that are applicable, and leave the @@ -101,7 +102,7 @@ the information is read from the current index instead. ever ignored. --unidiff-zero:: - By default, linkgit:git-apply[1] expects that the patch being + By default, 'git-apply' expects that the patch being applied is a unified diff with at least one line of context. This provides good safety measures, but breaks down when applying a diff generated with --unified=0. To bypass these @@ -112,7 +113,7 @@ discouraged. --apply:: If you use any of the options marked "Turns off - 'apply'" above, linkgit:git-apply[1] reads and outputs the + 'apply'" above, 'git-apply' reads and outputs the information you asked without actually applying the patch. Give this flag after those flags to also apply the patch. @@ -120,11 +121,12 @@ discouraged. --no-add:: When applying a patch, ignore additions made by the patch. This can be used to extract the common part between - two files by first running `diff` on them and applying + two files by first running 'diff' on them and applying the result with this option, which would apply the deletion part but not addition part. ---allow-binary-replacement, --binary:: +--allow-binary-replacement:: +--binary:: Historically we did not allow binary patch applied without an explicit permission from the user, and this flag was the way to do so. Currently we always allow binary @@ -145,7 +147,7 @@ discouraged. considered whitespace errors. + By default, the command outputs warning messages but applies the patch. -When linkgit:git-apply[1] is used for statistics and not applying a +When `git-apply is used for statistics and not applying a patch, it defaults to `nowarn`. + You can use different `<action>` to control this @@ -163,17 +165,31 @@ behavior: * `error-all` is similar to `error` but shows all errors. --inaccurate-eof:: - Under certain circumstances, some versions of diff do not correctly + Under certain circumstances, some versions of 'diff' do not correctly detect a missing new-line at the end of the file. As a result, patches - created by such diff programs do not record incomplete lines + created by such 'diff' programs do not record incomplete lines correctly. This option adds support for applying such patches by working around this bug. --v, --verbose:: +-v:: +--verbose:: Report progress to stderr. By default, only a message about the current patch being applied will be printed. This option will cause additional information to be reported. +--recount:: + Do not trust the line counts in the hunk headers, but infer them + by inspecting the patch (e.g. after editing the patch without + adjusting the hunk headers appropriately). + +--directory=<root>:: + Prepend <root> to all filenames. If a "-p" argument was passed, too, + it is applied before prepending the new root. ++ +For example, a patch that talks about updating `a/git-gui.sh` to `b/git-gui.sh` +can be applied to the file in the working tree `modules/git-gui/git-gui.sh` by +running `git apply --directory=modules/git-gui`. + Configuration ------------- @@ -183,7 +199,7 @@ apply.whitespace:: Submodules ---------- -If the patch contains any changes to submodules then linkgit:git-apply[1] +If the patch contains any changes to submodules then 'git-apply' treats these changes as follows. If --index is specified (explicitly or implicitly), then the submodule @@ -206,4 +222,4 @@ Documentation by Junio C Hamano GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-archimport.txt b/Documentation/git-archimport.txt index bd20fd8206..c7a6e3ec05 100644 --- a/Documentation/git-archimport.txt +++ b/Documentation/git-archimport.txt @@ -9,7 +9,7 @@ git-archimport - Import an Arch repository into git SYNOPSIS -------- [verse] -'git-archimport' [-h] [-v] [-o] [-a] [-f] [-T] [-D depth] [-t tempdir] +'git archimport' [-h] [-v] [-o] [-a] [-f] [-T] [-D depth] [-t tempdir] <archive/branch>[:<git-branch>] ... DESCRIPTION @@ -29,17 +29,17 @@ branches that have different roots, it will refuse to run. In that case, edit your <archive/branch> parameters to define clearly the scope of the import. -`git-archimport` uses `tla` extensively in the background to access the +'git-archimport' uses `tla` extensively in the background to access the Arch repository. Make sure you have a recent version of `tla` available in the path. `tla` must -know about the repositories you pass to `git-archimport`. +know about the repositories you pass to 'git-archimport'. -For the initial import `git-archimport` expects to find itself in an empty +For the initial import, 'git-archimport' expects to find itself in an empty directory. To follow the development of a project that uses Arch, rerun -`git-archimport` with the same parameters as the initial import to perform +'git-archimport' with the same parameters as the initial import to perform incremental imports. -While git-archimport will try to create sensible branch names for the +While 'git-archimport' will try to create sensible branch names for the archives that it imports, it is also possible to specify git branch names manually. To do so, write a git branch name after each <archive/branch> parameter, separated by a colon. This way, you can shorten the Arch @@ -84,7 +84,7 @@ OPTIONS -o:: Use this for compatibility with old-style branch names used by - earlier versions of git-archimport. Old-style branch names + earlier versions of 'git-archimport'. Old-style branch names were category--branch, whereas new-style branch names are archive,category--branch--version. In both cases, names given on the command-line will override the automatically-generated @@ -117,4 +117,4 @@ Documentation by Junio C Hamano, Martin Langhoff and the git-list <git@vger.kern GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-archive.txt b/Documentation/git-archive.txt index d3eaa16af1..41cbf9c081 100644 --- a/Documentation/git-archive.txt +++ b/Documentation/git-archive.txt @@ -9,7 +9,7 @@ git-archive - Create an archive of files from a named tree SYNOPSIS -------- [verse] -'git-archive' --format=<fmt> [--list] [--prefix=<prefix>/] [<extra>] +'git archive' --format=<fmt> [--list] [--prefix=<prefix>/] [<extra>] [--remote=<repo> [--exec=<git-upload-archive>]] <tree-ish> [path...] @@ -36,10 +36,12 @@ OPTIONS Format of the resulting archive: 'tar' or 'zip'. The default is 'tar'. ---list, -l:: +-l:: +--list:: Show all available formats. ---verbose, -v:: +-v:: +--verbose:: Report progress to stderr. --prefix=<prefix>/:: @@ -55,7 +57,7 @@ OPTIONS --exec=<git-upload-archive>:: Used with --remote to specify the path to the - git-upload-archive executable on the remote side. + 'git-upload-archive' on the remote side. <tree-ish>:: The tree or commit to produce an archive for. @@ -118,4 +120,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-bisect.txt b/Documentation/git-bisect.txt index 96585ae8d9..c7981efcd9 100644 --- a/Documentation/git-bisect.txt +++ b/Documentation/git-bisect.txt @@ -15,6 +15,7 @@ DESCRIPTION The command takes various subcommands, and different options depending on the subcommand: + git bisect help git bisect start [<bad> [<good>...]] [--] [<paths>...] git bisect bad [<rev>] git bisect good [<rev>...] @@ -25,10 +26,16 @@ on the subcommand: git bisect log git bisect run <cmd>... -This command uses 'git-rev-list --bisect' option to help drive the +This command uses 'git-rev-list --bisect' to help drive the binary search process to find which change introduced a bug, given an old "good" commit object name and a later "bad" commit object name. +Getting help +~~~~~~~~~~~~ + +Use "git bisect" to get a short usage description, and "git bisect +help" or "git bisect -h" to get a long usage description. + Basic bisect commands: start, bad, good ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -78,10 +85,9 @@ Oh, and then after you want to reset to the original head, do a $ git bisect reset ------------------------------------------------ -to get back to the master branch, instead of being in one of the -bisection branches ("git bisect start" will do that for you too, -actually: it will reset the bisection state, and before it does that -it checks that you're not using some old bisection branch). +to get back to the original branch, instead of being on the bisection +commit ("git bisect start" will do that for you too, actually: it will +reset the bisection state). Bisect visualize ~~~~~~~~~~~~~~~~ @@ -92,10 +98,10 @@ During the bisection process, you can say $ git bisect visualize ------------ -to see the currently remaining suspects in `gitk`. `visualize` is a bit +to see the currently remaining suspects in 'gitk'. `visualize` is a bit too long to type and `view` is provided as a synonym. -If `DISPLAY` environment variable is not set, `git log` is used +If 'DISPLAY' environment variable is not set, 'git-log' is used instead. You can even give command line options such as `-p` and `--stat`. @@ -209,13 +215,62 @@ tweaks (e.g., s/#define DEBUG 0/#define DEBUG 1/ in a header file, or work around other problem this bisection is not interested in") applied to the revision being tested. -To cope with such a situation, after the inner git-bisect finds the +To cope with such a situation, after the inner 'git-bisect' finds the next revision to test, with the "run" script, you can apply that tweak before compiling, run the real test, and after the test decides if the revision (possibly with the needed tweaks) passed the test, rewind the tree to the pristine state. Finally the "run" script can exit with -the status of the real test to let "git bisect run" command loop to -know the outcome. +the status of the real test to let the "git bisect run" command loop to +determine the outcome. + +EXAMPLES +-------- + +* Automatically bisect a broken build between v1.2 and HEAD: ++ +------------ +$ git bisect start HEAD v1.2 -- # HEAD is bad, v1.2 is good +$ git bisect run make # "make" builds the app +------------ + +* Automatically bisect a broken test suite: ++ +------------ +$ cat ~/test.sh +#!/bin/sh +make || exit 125 # this "skip"s broken builds +make test # "make test" runs the test suite +$ git bisect start v1.3 v1.1 -- # v1.3 is bad, v1.1 is good +$ git bisect run ~/test.sh +------------ ++ +Here we use a "test.sh" custom script. In this script, if "make" +fails, we "skip" the current commit. ++ +It's safer to use a custom script outside the repo to prevent +interactions between the bisect, make and test processes and the +script. ++ +And "make test" should "exit 0", if the test suite passes, and +"exit 1" (for example) otherwise. + +* Automatically bisect a broken test case: ++ +------------ +$ cat ~/test.sh +#!/bin/sh +make || exit 125 # this "skip"s broken builds +~/check_test_case.sh # does the test case passes ? +$ git bisect start HEAD HEAD~10 -- # culprit is among the last 10 +$ git bisect run ~/test.sh +------------ ++ +Here "check_test_case.sh" should "exit 0", if the test case passes, +and "exit 1" (for example) otherwise. ++ +It's safer if both "test.sh" and "check_test_case.sh" scripts are +outside the repo to prevent interactions between the bisect, make and +test processes and the scripts. Author ------ @@ -227,4 +282,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-blame.txt b/Documentation/git-blame.txt index 14163b65f9..fba374d652 100644 --- a/Documentation/git-blame.txt +++ b/Documentation/git-blame.txt @@ -8,7 +8,7 @@ git-blame - Show what revision and author last modified each line of a file SYNOPSIS -------- [verse] -'git-blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-p] [-w] [--incremental] [-L n,m] +'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-p] [-w] [--incremental] [-L n,m] [-S <revs-file>] [-M] [-C] [-C] [--since=<date>] [<rev> | --contents <file>] [--] <file> @@ -21,7 +21,7 @@ last modified the line. Optionally, start annotating from the given revision. Also it can limit the range of lines annotated. This report doesn't tell you anything about lines which have been deleted or -replaced; you need to use a tool such as linkgit:git-diff[1] or the "pickaxe" +replaced; you need to use a tool such as 'git-diff' or the "pickaxe" interface briefly mentioned in the following paragraph. Apart from supporting file annotation, git also supports searching the @@ -49,15 +49,17 @@ include::blame-options.txt[] file (see `-M`). The first number listed is the score. This is the number of alphanumeric characters detected to be moved between or within files. This must be above - a certain threshold for git-blame to consider those lines + a certain threshold for 'git-blame' to consider those lines of code to have been moved. --f, --show-name:: +-f:: +--show-name:: Show filename in the original commit. By default filename is shown if there is any line that came from a file with different name, due to rename detection. --n, --show-number:: +-n:: +--show-number:: Show line number in the original commit (Default: off). -s:: @@ -98,7 +100,7 @@ header elements later. SPECIFYING RANGES ----------------- -Unlike `git-blame` and `git-annotate` in older git, the extent +Unlike 'git-blame' and 'git-annotate' in older git, the extent of annotation can be limited to both line ranges and revision ranges. When you are interested in finding the origin for ll. 40-60 for file `foo`, you can use `-L` option like these @@ -116,7 +118,7 @@ would limit the annotation to the body of `hello` subroutine. When you are not interested in changes older than the version v2.6.18, or changes older than 3 weeks, you can use revision -range specifiers similar to `git-rev-list`: +range specifiers similar to 'git-rev-list': git blame v2.6.18.. -- foo git blame --since=3.weeks -- foo @@ -188,8 +190,8 @@ linkgit:git-annotate[1] AUTHOR ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-branch.txt b/Documentation/git-branch.txt index f920c04cc0..6103d62fe3 100644 --- a/Documentation/git-branch.txt +++ b/Documentation/git-branch.txt @@ -8,22 +8,27 @@ git-branch - List, create, or delete branches SYNOPSIS -------- [verse] -'git-branch' [--color | --no-color] [-r | -a] - [-v [--abbrev=<length> | --no-abbrev]] - [--contains <commit>] -'git-branch' [--track | --no-track] [-l] [-f] <branchname> [<start-point>] -'git-branch' (-m | -M) [<oldbranch>] <newbranch> -'git-branch' (-d | -D) [-r] <branchname>... +'git branch' [--color | --no-color] [-r | -a] + [-v [--abbrev=<length> | --no-abbrev]] + [(--merged | --no-merged | --contains) [<commit>]] +'git branch' [--track | --no-track] [-l] [-f] <branchname> [<start-point>] +'git branch' (-m | -M) [<oldbranch>] <newbranch> +'git branch' (-d | -D) [-r] <branchname>... DESCRIPTION ----------- -With no arguments given a list of existing branches -will be shown, the current branch will be highlighted with an asterisk. -Option `-r` causes the remote-tracking branches to be listed, -and option `-a` shows both. -With `--contains <commit>`, shows only the branches that -contains the named commit (in other words, the branches whose -tip commits are descendant of the named commit). + +With no arguments, existing branches are listed, the current branch will +be highlighted with an asterisk. Option `-r` causes the remote-tracking +branches to be listed, and option `-a` shows both. + +With `--contains`, shows only the branches that contains the named commit +(in other words, the branches whose tip commits are descendant of the +named commit). With `--merged`, only branches merged into the named +commit (i.e. the branches whose tip commits are reachable from the named +commit) will be listed. With `--no-merged` only branches not merged into +the named commit will be listed. Missing <commit> argument defaults to +'HEAD' (i.e. the tip of the current branch). In its second form, a new branch named <branchname> will be created. It will start out with a head equal to the one given as <start-point>. @@ -34,12 +39,11 @@ Note that this will create the new branch, but it will not switch the working tree to it; use "git checkout <newbranch>" to switch to the new branch. -When a local branch is started off a remote branch, git can setup the -branch so that linkgit:git-pull[1] will appropriately merge from that -remote branch. If this behavior is desired, it is possible to make it -the default using the global `branch.autosetupmerge` configuration -flag. Otherwise, it can be chosen per-branch using the `--track` -and `--no-track` options. +When a local branch is started off a remote branch, git sets up the +branch so that 'git-pull' will appropriately merge from +the remote branch. This behavior may be changed via the global +`branch.autosetupmerge` configuration flag. That setting can be +overridden by using the `--track` and `--no-track` options. With a '-m' or '-M' option, <oldbranch> will be renamed to <newbranch>. If <oldbranch> had a corresponding reflog, it is renamed to match @@ -53,7 +57,7 @@ has a reflog then the reflog will also be deleted. Use -r together with -d to delete remote-tracking branches. Note, that it only makes sense to delete remote-tracking branches if they no longer exist -in remote repository or if linkgit:git-fetch[1] was configured not to fetch +in remote repository or if 'git-fetch' was configured not to fetch them again. See also 'prune' subcommand of linkgit:git-remote[1] for way to clean up all obsolete remote-tracking branches. @@ -94,7 +98,8 @@ OPTIONS -a:: List both remote-tracking branches and local branches. --v, --verbose:: +-v:: +--verbose:: Show sha1 and commit subject line for each head. --abbrev=<length>:: @@ -105,19 +110,28 @@ OPTIONS Display the full sha1s in output listing rather than abbreviating them. --track:: - Set up configuration so that git-pull will automatically - retrieve data from the remote branch. Use this if you always - pull from the same remote branch into the new branch, or if you - don't want to use "git pull <repository> <refspec>" explicitly. Set the - branch.autosetupmerge configuration variable to true if you - want git-checkout and git-branch to always behave as if - '--track' were given. + When creating a new branch, set up configuration so that 'git-pull' + will automatically retrieve data from the start point, which must be + a branch. Use this if you always pull from the same upstream branch + into the new branch, and if you don't want to use "git pull + <repository> <refspec>" explicitly. This behavior is the default + when the start point is a remote branch. Set the + branch.autosetupmerge configuration variable to `false` if you want + 'git-checkout' and 'git-branch' to always behave as if '--no-track' were + given. Set it to `always` if you want this behavior when the + start-point is either a local or remote branch. --no-track:: - When a branch is created off a remote branch, - set up configuration so that git-pull will not retrieve data - from the remote branch, ignoring the branch.autosetupmerge - configuration variable. + Ignore the branch.autosetupmerge configuration variable. + +--contains <commit>:: + Only list branches which contain the specified commit. + +--merged:: + Only list branches which are fully contained by HEAD. + +--no-merged:: + Do not list branches which are fully contained by HEAD. <branchname>:: The name of the branch to create or delete. @@ -176,10 +190,22 @@ If you are creating a branch that you want to immediately checkout, it's easier to use the git checkout command with its `-b` option to create a branch and check it out with a single command. +The options `--contains`, `--merged` and `--no-merged` serves three related +but different purposes: + +- `--contains <commit>` is used to find all branches which will need + special attention if <commit> were to be rebased or amended, since those + branches contain the specified <commit>. + +- `--merged` is used to find all branches which can be safely deleted, + since those branches are fully contained by HEAD. + +- `--no-merged` is used to find branches which are candidates for merging + into HEAD, since those branches are not fully contained by HEAD. Author ------ -Written by Linus Torvalds <torvalds@osdl.org> and Junio C Hamano <junkio@cox.net> +Written by Linus Torvalds <torvalds@osdl.org> and Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -187,4 +213,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-bundle.txt b/Documentation/git-bundle.txt index 72f080a972..1b66ab743c 100644 --- a/Documentation/git-bundle.txt +++ b/Documentation/git-bundle.txt @@ -9,10 +9,10 @@ git-bundle - Move objects and refs by archive SYNOPSIS -------- [verse] -'git-bundle' create <file> [git-rev-list args] -'git-bundle' verify <file> -'git-bundle' list-heads <file> [refname...] -'git-bundle' unbundle <file> [refname...] +'git bundle' create <file> <git-rev-list args> +'git bundle' verify <file> +'git bundle' list-heads <file> [refname...] +'git bundle' unbundle <file> [refname...] DESCRIPTION ----------- @@ -21,9 +21,9 @@ Some workflows require that one or more branches of development on one machine be replicated on another machine, but the two machines cannot be directly connected so the interactive git protocols (git, ssh, rsync, http) cannot be used. This command provides support for -git-fetch and git-pull to operate by packaging objects and references +'git-fetch' and 'git-pull' to operate by packaging objects and references in an archive at the originating machine, then importing those into -another repository using linkgit:git-fetch[1] and linkgit:git-pull[1] +another repository using 'git-fetch' and 'git-pull' after moving the archive by some means (i.e., by sneakernet). As no direct connection between repositories exists, the user must specify a basis for the bundle that is held by the destination repository: the @@ -35,14 +35,14 @@ OPTIONS create <file>:: Used to create a bundle named 'file'. This requires the - git-rev-list arguments to define the bundle contents. + 'git-rev-list' arguments to define the bundle contents. verify <file>:: Used to check that a bundle file is valid and will apply cleanly to the current repository. This includes checks on the bundle format itself as well as checking that the prerequisite commits exist and are fully linked in the current repository. - git-bundle prints a list of missing commits, if any, and exits + 'git-bundle' prints a list of missing commits, if any, and exits with non-zero status. list-heads <file>:: @@ -51,16 +51,15 @@ list-heads <file>:: printed out. unbundle <file>:: - Passes the objects in the bundle to linkgit:git-index-pack[1] + Passes the objects in the bundle to 'git-index-pack' for storage in the repository, then prints the names of all defined references. If a reflist is given, only references matching those in the given list are printed. This command is - really plumbing, intended to be called only by - linkgit:git-fetch[1]. + really plumbing, intended to be called only by 'git-fetch'. [git-rev-list-args...]:: - A list of arguments, acceptable to git-rev-parse and - git-rev-list, that specify the specific objects and references + A list of arguments, acceptable to 'git-rev-parse' and + 'git-rev-list', that specify the specific objects and references to transport. For example, "master~10..master" causes the current master reference to be packaged along with all objects added since its 10th ancestor commit. There is no explicit @@ -70,16 +69,16 @@ unbundle <file>:: [refname...]:: A list of references used to limit the references reported as - available. This is principally of use to git-fetch, which + available. This is principally of use to 'git-fetch', which expects to receive only those references asked for and not - necessarily everything in the pack (in this case, git-bundle is - acting like linkgit:git-fetch-pack[1]). + necessarily everything in the pack (in this case, 'git-bundle' is + acting like 'git-fetch-pack'). SPECIFYING REFERENCES --------------------- -git-bundle will only package references that are shown by -git-show-ref: this includes heads, tags, and remote heads. References +'git-bundle' will only package references that are shown by +'git-show-ref': this includes heads, tags, and remote heads. References such as master~1 cannot be packaged, but are perfectly suitable for defining the basis. More than one reference may be packaged, and more than one basis can be specified. The objects packaged are those not @@ -99,36 +98,62 @@ Assume two repositories exist as R1 on machine A, and R2 on machine B. For whatever reason, direct connection between A and B is not allowed, but we can move data from A to B via some mechanism (CD, email, etc). We want to update R2 with developments made on branch master in R1. + +To create the bundle you have to specify the basis. You have some options: + +- Without basis. ++ +This is useful when sending the whole history. + +------------ +$ git bundle create mybundle master +------------ + +- Using temporally tags. ++ We set a tag in R1 (lastR2bundle) after the previous such transport, and move it afterwards to help build the bundle. -in R1 on A: - ------------ -$ git-bundle create mybundle master ^lastR2bundle +$ git bundle create mybundle master ^lastR2bundle $ git tag -f lastR2bundle master ------------ -(move mybundle from A to B by some mechanism) +- Using a tag present in both repositories + +------------ +$ git bundle create mybundle master ^v1.0.0 +------------ + +- A basis based on time. + +------------ +$ git bundle create mybundle master --since=10.days.ago +------------ -in R2 on B: +- With a limit on the number of commits ------------ -$ git-bundle verify mybundle -$ git-fetch mybundle refspec +$ git bundle create mybundle master -n 10 ------------ -where refspec is refInBundle:localRef +Then you move mybundle from A to B, and in R2 on B: +------------ +$ git bundle verify mybundle +$ git fetch mybundle master:localRef +------------ -Also, with something like this in your config: +With something like this in the config in R2: +------------------------ [remote "bundle"] url = /home/me/tmp/file.bdl fetch = refs/heads/*:refs/remotes/origin/* +------------------------ You can first sneakernet the bundle file to ~/tmp/file.bdl and -then these commands: +then these commands on machine B: ------------ $ git ls-remote bundle @@ -145,4 +170,4 @@ Written by Mark Levedahl <mdl123@verizon.net> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-cat-file.txt b/Documentation/git-cat-file.txt index df42cb10f2..668f697c2a 100644 --- a/Documentation/git-cat-file.txt +++ b/Documentation/git-cat-file.txt @@ -8,13 +8,18 @@ git-cat-file - Provide content or type/size information for repository objects SYNOPSIS -------- -'git-cat-file' [-t | -s | -e | -p | <type>] <object> +[verse] +'git cat-file' [-t | -s | -e | -p | <type>] <object> +'git cat-file' [--batch | --batch-check] < <list-of-objects> DESCRIPTION ----------- -Provides content or type of objects in the repository. The type -is required unless '-t' or '-p' is used to find the object type, -or '-s' is used to find the object size. +In the first form, provides content or type of objects in the repository. The +type is required unless '-t' or '-p' is used to find the object type, or '-s' +is used to find the object size. + +In the second form, a list of object (separated by LFs) is provided on stdin, +and the SHA1, type, and size of each object is printed on stdout. OPTIONS ------- @@ -46,6 +51,14 @@ OPTIONS or to ask for a "blob" with <object> being a tag object that points at it. +--batch:: + Print the SHA1, type, size, and contents of each object provided on + stdin. May not be combined with any other options or arguments. + +--batch-check:: + Print the SHA1, type, and size of each object provided on stdin. May not be + combined with any other options or arguments. + OUTPUT ------ If '-t' is specified, one of the <type>. @@ -56,9 +69,30 @@ If '-e' is specified, no output. If '-p' is specified, the contents of <object> are pretty-printed. -Otherwise the raw (though uncompressed) contents of the <object> will -be returned. +If <type> is specified, the raw (though uncompressed) contents of the <object> +will be returned. + +If '--batch' is specified, output of the following form is printed for each +object specified on stdin: + +------------ +<sha1> SP <type> SP <size> LF +<contents> LF +------------ + +If '--batch-check' is specified, output of the following form is printed for +each object specified on stdin: + +------------ +<sha1> SP <type> SP <size> LF +------------ + +For both '--batch' and '--batch-check', output of the following form is printed +for each object specified on stdin that does not exist in the repository: +------------ +<object> SP missing LF +------------ Author ------ @@ -70,4 +104,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-check-attr.txt b/Documentation/git-check-attr.txt index 290f10f169..2b821f2a1d 100644 --- a/Documentation/git-check-attr.txt +++ b/Documentation/git-check-attr.txt @@ -8,7 +8,7 @@ git-check-attr - Display gitattributes information. SYNOPSIS -------- -'git-check-attr' attr... [--] pathname... +'git check-attr' attr... [--] pathname... DESCRIPTION ----------- @@ -30,7 +30,7 @@ linkgit:gitattributes[5]. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -38,4 +38,4 @@ Documentation by James Bowes. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-check-ref-format.txt b/Documentation/git-check-ref-format.txt index a676880429..034223cc5a 100644 --- a/Documentation/git-check-ref-format.txt +++ b/Documentation/git-check-ref-format.txt @@ -7,7 +7,7 @@ git-check-ref-format - Make sure ref name is well formed SYNOPSIS -------- -'git-check-ref-format' <refname> +'git check-ref-format' <refname> DESCRIPTION ----------- @@ -47,9 +47,9 @@ refname expressions (see linkgit:git-rev-parse[1]). Namely: . colon `:` is used as in `srcref:dstref` to mean "use srcref\'s value and store it in dstref" in fetch and push operations. It may also be used to select a specific object such as with - linkgit:git-cat-file[1] "git-cat-file blob v1.3.3:refs.c". + 'git-cat-file': "git cat-file blob v1.3.3:refs.c". GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-checkout-index.txt b/Documentation/git-checkout-index.txt index cbbb0b5099..62d84836b8 100644 --- a/Documentation/git-checkout-index.txt +++ b/Documentation/git-checkout-index.txt @@ -9,7 +9,7 @@ git-checkout-index - Copy files from the index to the working tree SYNOPSIS -------- [verse] -'git-checkout-index' [-u] [-q] [-a] [-f] [-n] [--prefix=<string>] +'git checkout-index' [-u] [-q] [-a] [-f] [-n] [--prefix=<string>] [--stage=<number>|all] [--temp] [-z] [--stdin] @@ -22,21 +22,26 @@ Will copy all files listed from the index to the working directory OPTIONS ------- --u|--index:: +-u:: +--index:: update stat information for the checked out entries in the index file. --q|--quiet:: +-q:: +--quiet:: be quiet if files exist or are not in the index --f|--force:: +-f:: +--force:: forces overwrite of existing files --a|--all:: +-a:: +--all:: checks out all files in the index. Cannot be used together with explicit filenames. --n|--no-create:: +-n:: +--no-create:: Don't checkout new files, only refresh files already checked out. @@ -68,25 +73,25 @@ OPTIONS The order of the flags used to matter, but not anymore. -Just doing `git-checkout-index` does nothing. You probably meant -`git-checkout-index -a`. And if you want to force it, you want -`git-checkout-index -f -a`. +Just doing `git checkout-index` does nothing. You probably meant +`git checkout-index -a`. And if you want to force it, you want +`git checkout-index -f -a`. Intuitiveness is not the goal here. Repeatability is. The reason for the "no arguments means no work" behavior is that from scripts you are supposed to be able to do: ---------------- -$ find . -name '*.h' -print0 | xargs -0 git-checkout-index -f -- +$ find . -name '*.h' -print0 | xargs -0 git checkout-index -f -- ---------------- which will force all existing `*.h` files to be replaced with their cached copies. If an empty command line implied "all", then this would force-refresh everything in the index, which was not the point. But -since git-checkout-index accepts --stdin it would be faster to use: +since 'git-checkout-index' accepts --stdin it would be faster to use: ---------------- -$ find . -name '*.h' -print0 | git-checkout-index -f -z --stdin +$ find . -name '*.h' -print0 | git checkout-index -f -z --stdin ---------------- The `--` is just a good idea when you know the rest will be filenames; @@ -97,7 +102,7 @@ Using `--` is probably a good policy in scripts. Using --temp or --stage=all --------------------------- When `--temp` is used (or implied by `--stage=all`) -`git-checkout-index` will create a temporary file for each index +'git-checkout-index' will create a temporary file for each index entry being checked out. The index will not be updated with stat information. These options can be useful if the caller needs all stages of all unmerged entries so that the unmerged files can be @@ -139,19 +144,19 @@ EXAMPLES To update and refresh only the files already checked out:: + ---------------- -$ git-checkout-index -n -f -a && git-update-index --ignore-missing --refresh +$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh ---------------- -Using `git-checkout-index` to "export an entire tree":: +Using 'git-checkout-index' to "export an entire tree":: The prefix ability basically makes it trivial to use - `git-checkout-index` as an "export as tree" function. + 'git-checkout-index' as an "export as tree" function. Just read the desired tree into the index, and do: + ---------------- -$ git-checkout-index --prefix=git-export-dir/ -a +$ git checkout-index --prefix=git-export-dir/ -a ---------------- + -`git-checkout-index` will "export" the index into the specified +`git checkout-index` will "export" the index into the specified directory. + The final "/" is important. The exported name is literally just @@ -161,7 +166,7 @@ following example. Export files with a prefix:: + ---------------- -$ git-checkout-index --prefix=.merged- Makefile +$ git checkout-index --prefix=.merged- Makefile ---------------- + This will check out the currently cached copy of `Makefile` @@ -181,4 +186,4 @@ Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-checkout.txt b/Documentation/git-checkout.txt index 584359ff3f..5aa69c0e12 100644 --- a/Documentation/git-checkout.txt +++ b/Documentation/git-checkout.txt @@ -3,13 +3,13 @@ git-checkout(1) NAME ---- -git-checkout - Checkout and switch to a branch +git-checkout - Checkout a branch or paths to the working tree SYNOPSIS -------- [verse] -'git-checkout' [-q] [-f] [[--track | --no-track] -b <new_branch> [-l]] [-m] [<branch>] -'git-checkout' [<tree-ish>] <paths>... +'git checkout' [-q] [-f] [[--track | --no-track] -b <new_branch> [-l]] [-m] [<branch>] +'git checkout' [<tree-ish>] [--] <paths>... DESCRIPTION ----------- @@ -23,7 +23,7 @@ options, which will be passed to `git branch`. When <paths> are given, this command does *not* switch branches. It updates the named paths in the working tree from -the index file (i.e. it runs `git-checkout-index -f -u`), or +the index file (i.e. it runs `git checkout-index -f -u`), or from a named commit. In this case, the `-f` and `-b` options are meaningless and giving either of them results in an error. <tree-ish> argument can be @@ -47,21 +47,21 @@ OPTIONS by linkgit:git-check-ref-format[1]. Some of these checks may restrict the characters allowed in a branch name. +-t:: --track:: - When -b is given and a branch is created off a remote branch, - set up configuration so that git-pull will automatically - retrieve data from the remote branch. Use this if you always - pull from the same remote branch into the new branch, or if you - don't want to use "git pull <repository> <refspec>" explicitly. Set the - branch.autosetupmerge configuration variable to true if you - want git-checkout and git-branch to always behave as if - '--track' were given. + When creating a new branch, set up configuration so that 'git-pull' + will automatically retrieve data from the start point, which must be + a branch. Use this if you always pull from the same upstream branch + into the new branch, and if you don't want to use "git pull + <repository> <refspec>" explicitly. This behavior is the default + when the start point is a remote branch. Set the + branch.autosetupmerge configuration variable to `false` if you want + 'git-checkout' and 'git-branch' to always behave as if '--no-track' were + given. Set it to `always` if you want this behavior when the + start-point is either a local or remote branch. --no-track:: - When -b is given and a branch is created off a remote branch, - set up configuration so that git-pull will not retrieve data - from the remote branch, ignoring the branch.autosetupmerge - configuration variable. + Ignore the branch.autosetupmerge configuration variable. -l:: Create the new branch's reflog. This activates recording of @@ -112,7 +112,7 @@ current branch and directly point at the commit named by the tag (`v2.6.18` in the above example). You can use usual git commands while in this state. You can use -`git-reset --hard $othercommit` to further move around, for +`git reset --hard $othercommit` to further move around, for example. You can make changes and create a new commit on top of a detached HEAD. You can even create a merge by using `git merge $othercommit`. @@ -216,4 +216,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-cherry-pick.txt b/Documentation/git-cherry-pick.txt index 877ab66ef5..837fb08b79 100644 --- a/Documentation/git-cherry-pick.txt +++ b/Documentation/git-cherry-pick.txt @@ -7,7 +7,7 @@ git-cherry-pick - Apply the change introduced by an existing commit SYNOPSIS -------- -'git-cherry-pick' [--edit] [-n] [-m parent-number] [-x] <commit> +'git cherry-pick' [--edit] [-n] [-m parent-number] [-s] [-x] <commit> DESCRIPTION ----------- @@ -19,11 +19,12 @@ OPTIONS ------- <commit>:: Commit to cherry-pick. - For a more complete list of ways to spell commits, see + For a more complete list of ways to spell commits, see the "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1]. --e|--edit:: - With this option, `git-cherry-pick` will let you edit the commit +-e:: +--edit:: + With this option, 'git-cherry-pick' will let you edit the commit message prior to committing. -x:: @@ -44,30 +45,36 @@ OPTIONS described above, and `-r` was to disable it. Now the default is not to do `-x` so this option is a no-op. --m parent-number|--mainline parent-number:: - Usually you cannot revert a merge because you do not know which +-m parent-number:: +--mainline parent-number:: + Usually you cannot cherry-pick a merge because you do not know which side of the merge should be considered the mainline. This option specifies the parent number (starting from 1) of the mainline and allows cherry-pick to replay the change relative to the specified parent. --n|--no-commit:: +-n:: +--no-commit:: Usually the command automatically creates a commit with a commit log message stating which commit was cherry-picked. This flag applies the change necessary - to cherry-pick the named commit to your working tree, - but does not make the commit. In addition, when this - option is used, your working tree does not have to match + to cherry-pick the named commit to your working tree + and the index, but does not make the commit. In addition, + when this option is used, your index does not have to match the HEAD commit. The cherry-pick is done against the - beginning state of your working tree. + beginning state of your index. + This is useful when cherry-picking more than one commits' -effect to your working tree in a row. +effect to your index in a row. + +-s:: +--signoff:: + Add Signed-off-by line at the end of the commit message. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -75,4 +82,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-cherry.txt b/Documentation/git-cherry.txt index b0468aa746..74d14c4e7f 100644 --- a/Documentation/git-cherry.txt +++ b/Documentation/git-cherry.txt @@ -7,12 +7,14 @@ git-cherry - Find commits not merged upstream SYNOPSIS -------- -'git-cherry' [-v] <upstream> [<head>] [<limit>] +'git cherry' [-v] <upstream> [<head>] [<limit>] DESCRIPTION ----------- The changeset (or "diff") of each commit between the fork-point and <head> is compared against each commit between the fork-point and <upstream>. +The commits are compared with their 'patch id', obtained from +the 'git-patch-id' program. Every commit that doesn't exist in the <upstream> branch has its id (sha1) reported, prefixed by a symbol. The ones that have @@ -35,8 +37,8 @@ to and including <limit> are not reported: \__*__*__<limit>__-__+__> <head> -Because git-cherry compares the changeset rather than the commit id -(sha1), you can use git-cherry to find out if a commit you made locally +Because 'git-cherry' compares the changeset rather than the commit id +(sha1), you can use 'git-cherry' to find out if a commit you made locally has been applied <upstream> under a different commit id. For example, this will happen if you're feeding patches <upstream> via email rather than pushing or pulling commits directly. @@ -56,9 +58,13 @@ OPTIONS <limit>:: Do not report commits up to (and including) limit. +SEE ALSO +-------- +linkgit:git-patch-id[1] + Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -66,4 +72,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-citool.txt b/Documentation/git-citool.txt index aca1d75e50..670cb02b6c 100644 --- a/Documentation/git-citool.txt +++ b/Documentation/git-citool.txt @@ -14,9 +14,9 @@ DESCRIPTION A Tcl/Tk based graphical interface to review modified files, stage them into the index, enter a commit message and record the new commit onto the current branch. This interface is an alternative -to the less interactive linkgit:git-commit[1] program. +to the less interactive 'git-commit' program. -git-citool is actually a standard alias for 'git gui citool'. +'git-citool' is actually a standard alias for `git gui citool`. See linkgit:git-gui[1] for more details. Author @@ -29,4 +29,4 @@ Documentation by Shawn O. Pearce <spearce@spearce.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-clean.txt b/Documentation/git-clean.txt index 5e9da036ba..8a114509f4 100644 --- a/Documentation/git-clean.txt +++ b/Documentation/git-clean.txt @@ -8,7 +8,7 @@ git-clean - Remove untracked files from the working tree SYNOPSIS -------- [verse] -'git-clean' [-d] [-f] [-n] [-q] [-x | -X] [--] <paths>... +'git clean' [-d] [-f] [-n] [-q] [-x | -X] [--] <path>... DESCRIPTION ----------- @@ -16,8 +16,8 @@ Removes files unknown to git. This allows to clean the working tree from files that are not under version control. If the '-x' option is specified, ignored files are also removed, allowing to remove all build products. -When optional `<paths>...` arguments are given, the paths -affected are further limited to those that match them. +If any optional `<path>...` arguments are given, only those paths +are affected. OPTIONS @@ -27,19 +27,21 @@ OPTIONS -f:: If the git configuration specifies clean.requireForce as true, - git-clean will refuse to run unless given -f or -n. + 'git-clean' will refuse to run unless given -f or -n. -n:: +--dry-run:: Don't actually remove anything, just show what would be done. -q:: +--quiet:: Be quiet, only report errors, but not the files that are successfully removed. -x:: Don't use the ignore rules. This allows removing all untracked files, including build products. This can be used (possibly in - conjunction with linkgit:git-reset[1]) to create a pristine + conjunction with 'git-reset') to create a pristine working directory to test a clean build. -X:: @@ -54,4 +56,4 @@ Written by Pavel Roskin <proski@gnu.org> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index fdccbd4cbe..0e14e732fd 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -9,8 +9,8 @@ git-clone - Clone a repository into a new directory SYNOPSIS -------- [verse] -'git-clone' [--template=<template_directory>] - [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] +'git clone' [--template=<template_directory>] + [-l] [-s] [--no-hardlinks] [-q] [-n] [--bare] [--mirror] [-o <name>] [-u <upload-pack>] [--reference <repository>] [--depth <depth>] [--] <repository> [<directory>] @@ -62,6 +62,18 @@ OPTIONS .git/objects/info/alternates to share the objects with the source repository. The resulting repository starts out without any object of its own. ++ +*NOTE*: this is a possibly dangerous operation; do *not* use +it unless you understand what it does. If you clone your +repository using this option and then delete branches (or use any +other git command that makes any existing commit unreferenced) in the +source repository, some objects may become unreferenced (or dangling). +These objects may be removed by normal git operations (such as 'git-commit') +which automatically call `git gc --auto`. (See linkgit:git-gc[1].) +If these objects are removed and were referenced by the cloned repository, +then the cloned repository will become corrupt. + + --reference <repository>:: If the reference repository is on the local machine @@ -70,11 +82,13 @@ OPTIONS an already existing repository as an alternate will require fewer objects to be copied from the repository being cloned, reducing network and local storage costs. ++ +*NOTE*: see NOTE to --shared option. --quiet:: -q:: - Operate quietly. This flag is passed to "rsync" and - "git-fetch-pack" commands when given. + Operate quietly. This flag is also passed to the `rsync' + command when given. --no-checkout:: -n:: @@ -92,6 +106,9 @@ OPTIONS used, neither remote-tracking branches nor the related configuration variables are created. +--mirror:: + Set up a mirror of the remote repository. This implies --bare. + --origin <name>:: -o <name>:: Instead of using the remote name 'origin' to keep track @@ -99,9 +116,8 @@ OPTIONS --upload-pack <upload-pack>:: -u <upload-pack>:: - When given, and the repository to clone from is handled - by 'git-fetch-pack', '--exec=<upload-pack>' is passed to - the command to specify non-default path for the command + When given, and the repository to clone from is accessed + via ssh, this specifies a non-default path for the command run on the other end. --template=<template_directory>:: @@ -191,4 +207,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-commit-tree.txt b/Documentation/git-commit-tree.txt index 170803a6d0..92ab3ab4a8 100644 --- a/Documentation/git-commit-tree.txt +++ b/Documentation/git-commit-tree.txt @@ -8,7 +8,7 @@ git-commit-tree - Create a new commit object SYNOPSIS -------- -'git-commit-tree' <tree> [-p <parent commit>]\* < changelog +'git commit-tree' <tree> [-p <parent commit>]\* < changelog DESCRIPTION ----------- @@ -16,12 +16,12 @@ This is usually not what an end user wants to run directly. See linkgit:git-commit[1] instead. Creates a new commit object based on the provided tree object and -emits the new commit object id on stdout. If no parent is given then -it is considered to be an initial tree. +emits the new commit object id on stdout. -A commit object usually has 1 parent (a commit after a change) or up -to 16 parents. More than one parent represents a merge of branches -that led to them. +A commit object may have any number of parents. With exactly one +parent, it is an ordinary commit. Having more than one parent makes +the commit a merge between several lines of history. Initial (root) +commits have no parents. While a tree represents a particular directory state of a working directory, a commit represents that state in "time", and explains how @@ -70,7 +70,7 @@ is taken from the configuration items user.name and user.email, or, if not present, system user name and fully qualified hostname. A commit comment is read from stdin. If a changelog -entry is not provided via "<" redirection, "git-commit-tree" will just wait +entry is not provided via "<" redirection, 'git-commit-tree' will just wait for one to be entered and terminated with ^D. @@ -88,7 +88,7 @@ Discussion include::i18n.txt[] -See Also +SEE ALSO -------- linkgit:git-write-tree[1] @@ -103,4 +103,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt index c3725b2ed9..0e25bb8627 100644 --- a/Documentation/git-commit.txt +++ b/Documentation/git-commit.txt @@ -8,23 +8,23 @@ git-commit - Record changes to the repository SYNOPSIS -------- [verse] -'git-commit' [-a | --interactive] [-s] [-v] [-u] - [(-c | -C) <commit> | -F <file> | -m <msg> | --amend] - [--allow-empty] [--no-verify] [-e] [--author <author>] +'git commit' [-a | --interactive] [-s] [-v] [-u<mode>] [--amend] + [(-c | -C) <commit>] [-F <file> | -m <msg>] + [--allow-empty] [--no-verify] [-e] [--author=<author>] [--cleanup=<mode>] [--] [[-i | -o ]<file>...] DESCRIPTION ----------- -Use 'git commit' to store the current contents of the index in a new -commit along with a log message describing the changes you have made. +Stores the current contents of the index in a new commit along +with a log message from the user describing the changes. The content to be added can be specified in several ways: -1. by using linkgit:git-add[1] to incrementally "add" changes to the +1. by using 'git-add' to incrementally "add" changes to the index before using the 'commit' command (Note: even modified files must be "added"); -2. by using linkgit:git-rm[1] to remove files from the working tree +2. by using 'git-rm' to remove files from the working tree and the index, again before using the 'commit' command; 3. by listing files as arguments to the 'commit' command, in which @@ -39,55 +39,65 @@ The content to be added can be specified in several ways: 5. by using the --interactive switch with the 'commit' command to decide one by one which files should be part of the commit, before finalizing the - operation. Currently, this is done by invoking `git-add --interactive`. + operation. Currently, this is done by invoking 'git-add --interactive'. -The linkgit:git-status[1] command can be used to obtain a +The 'git-status' command can be used to obtain a summary of what is included by any of the above for the next commit by giving the same set of parameters you would give to this command. -If you make a commit and then found a mistake immediately after -that, you can recover from it with linkgit:git-reset[1]. +If you make a commit and then find a mistake immediately after +that, you can recover from it with 'git-reset'. OPTIONS ------- --a|--all:: +-a:: +--all:: Tell the command to automatically stage files that have been modified and deleted, but new files you have not told git about are not affected. --c or -C <commit>:: - Take existing commit object, and reuse the log message +-C <commit>:: +--reuse-message=<commit>:: + Take an existing commit object, and reuse the log message and the authorship information (including the timestamp) - when creating the commit. With '-C', the editor is not - invoked; with '-c' the user can further edit the commit - message. + when creating the commit. + +-c <commit>:: +--reedit-message=<commit>:: + Like '-C', but with '-c' the editor is invoked, so that + the user can further edit the commit message. -F <file>:: +--file=<file>:: Take the commit message from the given file. Use '-' to read the message from the standard input. ---author <author>:: +--author=<author>:: Override the author name used in the commit. Use `A U Thor <author@example.com>` format. --m <msg>|--message=<msg>:: +-m <msg>:: +--message=<msg>:: Use the given <msg> as the commit message. --t <file>|--template=<file>:: +-t <file>:: +--template=<file>:: Use the contents of the given file as the initial version of the commit message. The editor is invoked and you can make subsequent changes. If a message is specified using the `-m` or `-F` options, this option has no effect. This overrides the `commit.template` configuration variable. --s|--signoff:: +-s:: +--signoff:: Add Signed-off-by line at the end of the commit message. +-n:: --no-verify:: This option bypasses the pre-commit and commit-msg hooks. - See also link:hooks.html[hooks]. + See also linkgit:githooks[5]. --allow-empty:: Usually recording a commit that has the exact same tree as its @@ -105,14 +115,14 @@ OPTIONS 'whitespace' removes just leading/trailing whitespace lines and 'strip' removes both whitespace and commentary. --e|--edit:: +-e:: +--edit:: The message taken from file with `-F`, command line with `-m`, and from file with `-C` are usually used as the commit log message unmodified. This option lets you further edit the message taken from these sources. --amend:: - Used to amend the tip of the current branch. Prepare the tree object you would want to replace the latest commit as usual (this includes the usual -i/-o and explicit paths), and the @@ -133,26 +143,51 @@ It is a rough equivalent for: but can be used to amend a merge commit. -- --i|--include:: +-i:: +--include:: Before making a commit out of staged contents so far, stage the contents of paths given on the command line as well. This is usually not what you want unless you are concluding a conflicted merge. --u|--untracked-files:: - Show all untracked files, also those in uninteresting - directories, in the "Untracked files:" section of commit - message template. Without this option only its name and - a trailing slash are displayed for each untracked - directory. +-o:: +--only:: + Make a commit only from the paths specified on the + command line, disregarding any contents that have been + staged so far. This is the default mode of operation of + 'git-commit' if any paths are given on the command line, + in which case this option can be omitted. + If this option is specified together with '--amend', then + no paths need be specified, which can be used to amend + the last commit without committing changes that have + already been staged. + +-u[<mode>]:: +--untracked-files[=<mode>]:: + Show untracked files (Default: 'all'). ++ +The mode parameter is optional, and is used to specify +the handling of untracked files. The possible options are: ++ +-- + - 'no' - Show no untracked files + - 'normal' - Shows untracked files and directories + - 'all' - Also shows individual files in untracked directories. +-- ++ +See linkgit:git-config[1] for configuration variable +used to change the default for when the option is not +specified. --v|--verbose:: +-v:: +--verbose:: Show unified diff between the HEAD commit and what would be committed at the bottom of the commit message template. Note that this diff output doesn't have its lines prefixed with '#'. --q|--quiet:: +-q:: +--quiet:: Suppress commit summary message. \--:: @@ -170,10 +205,10 @@ EXAMPLES -------- When recording your own work, the contents of modified files in your working tree are temporarily stored to a staging area -called the "index" with linkgit:git-add[1]. A file can be +called the "index" with 'git-add'. A file can be reverted back, only in the index but not in the working tree, -to that of the last commit with `git-reset HEAD -- <file>`, -which effectively reverts `git-add` and prevents the changes to +to that of the last commit with `git reset HEAD -- <file>`, +which effectively reverts 'git-add' and prevents the changes to this file from participating in the next commit. After building the state to be committed incrementally with these commands, `git commit` (without any pathname parameter) is used to record what @@ -229,13 +264,13 @@ $ git commit this second commit would record the changes to `hello.c` and `hello.h` as expected. -After a merge (initiated by either linkgit:git-merge[1] or -linkgit:git-pull[1]) stops because of conflicts, cleanly merged +After a merge (initiated by 'git-merge' or 'git-pull') stops +because of conflicts, cleanly merged paths are already staged to be committed for you, and paths that conflicted are left in unmerged state. You would have to first -check which paths are conflicting with linkgit:git-status[1] +check which paths are conflicting with 'git-status' and after fixing them manually in your working tree, you would -stage the result as usual with linkgit:git-add[1]: +stage the result as usual with 'git-add': ------------ $ git status | grep unmerged @@ -280,8 +315,8 @@ order). HOOKS ----- -This command can run `commit-msg`, `pre-commit`, and -`post-commit` hooks. See link:hooks.html[hooks] for more +This command can run `commit-msg`, `prepare-commit-msg`, `pre-commit`, +and `post-commit` hooks. See linkgit:githooks[5] for more information. @@ -296,9 +331,9 @@ linkgit:git-commit-tree[1] Author ------ Written by Linus Torvalds <torvalds@osdl.org> and -Junio C Hamano <junkio@cox.net> +Junio C Hamano <gitster@pobox.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt index e4d0e47529..28e1861094 100644 --- a/Documentation/git-config.txt +++ b/Documentation/git-config.txt @@ -9,19 +9,19 @@ git-config - Get and set repository or global options SYNOPSIS -------- [verse] -'git-config' [<file-option>] [type] [-z|--null] name [value [value_regex]] -'git-config' [<file-option>] [type] --add name value -'git-config' [<file-option>] [type] --replace-all name [value [value_regex]] -'git-config' [<file-option>] [type] [-z|--null] --get name [value_regex] -'git-config' [<file-option>] [type] [-z|--null] --get-all name [value_regex] -'git-config' [<file-option>] [type] [-z|--null] --get-regexp name_regex [value_regex] -'git-config' [<file-option>] --unset name [value_regex] -'git-config' [<file-option>] --unset-all name [value_regex] -'git-config' [<file-option>] --rename-section old_name new_name -'git-config' [<file-option>] --remove-section name -'git-config' [<file-option>] [-z|--null] -l | --list -'git-config' [<file-option>] --get-color name [default] -'git-config' [<file-option>] --get-colorbool name [stdout-is-tty] +'git config' [<file-option>] [type] [-z|--null] name [value [value_regex]] +'git config' [<file-option>] [type] --add name value +'git config' [<file-option>] [type] --replace-all name [value [value_regex]] +'git config' [<file-option>] [type] [-z|--null] --get name [value_regex] +'git config' [<file-option>] [type] [-z|--null] --get-all name [value_regex] +'git config' [<file-option>] [type] [-z|--null] --get-regexp name_regex [value_regex] +'git config' [<file-option>] --unset name [value_regex] +'git config' [<file-option>] --unset-all name [value_regex] +'git config' [<file-option>] --rename-section old_name new_name +'git config' [<file-option>] --remove-section name +'git config' [<file-option>] [-z|--null] -l | --list +'git config' [<file-option>] --get-color name [default] +'git config' [<file-option>] --get-colorbool name [stdout-is-tty] DESCRIPTION ----------- @@ -101,7 +101,8 @@ rather than from all available files. + See also <<FILES>>. --f config-file, --file config-file:: +-f config-file:: +--file config-file:: Use the given config file instead of the one specified by GIT_CONFIG. --remove-section:: @@ -116,21 +117,23 @@ See also <<FILES>>. --unset-all:: Remove all lines matching the key from config file. --l, --list:: +-l:: +--list:: List all variables set in config file. --bool:: - git-config will ensure that the output is "true" or "false" + 'git-config' will ensure that the output is "true" or "false" --int:: - git-config will ensure that the output is a simple + 'git-config' will ensure that the output is a simple decimal number. An optional value suffix of 'k', 'm', or 'g' in the config file will cause the value to be multiplied by 1024, 1048576, or 1073741824 prior to output. --z, --null:: +-z:: +--null:: For all options that output values and/or keys, always - end values with with the null character (instead of a + end values with the null character (instead of a newline). Use newline instead as a delimiter between key and value. This allows for secure parsing of the output without getting confused e.g. by values that @@ -144,6 +147,8 @@ See also <<FILES>>. "auto". If `stdout-is-tty` is missing, then checks the standard output of the command itself, and exits with status 0 if color is to be used, or exits with status 1 otherwise. + When the color setting for `name` is undefined, the command uses + `color.ui` as fallback. --get-color name default:: @@ -157,7 +162,7 @@ FILES ----- If not set explicitly with '--file', there are three files where -git-config will search for configuration options: +'git-config' will search for configuration options: $GIT_DIR/config:: Repository specific configuration file. (The filename is @@ -174,23 +179,18 @@ $(prefix)/etc/gitconfig:: If no further options are given, all reading options will read all of these files that are available. If the global or the system-wide configuration file are not available they will be ignored. If the repository configuration -file is not available or readable, git-config will exit with a non-zero +file is not available or readable, 'git-config' will exit with a non-zero error code. However, in neither case will an error message be issued. All writing options will per default write to the repository specific configuration file. Note that this also affects options like '--replace-all' -and '--unset'. *git-config will only ever change one file at a time*. +and '--unset'. *'git-config' will only ever change one file at a time*. You can override these rules either by command line options or by environment variables. The '--global' and the '--system' options will limit the file used to the global or system-wide file respectively. The GIT_CONFIG environment variable has a similar effect, but you can specify any filename you want. -The GIT_CONFIG_LOCAL environment variable on the other hand only changes -the name used instead of the repository configuration file. The global and -the system-wide configuration files will still be read. (For writing options -this will obviously result in the same behavior as using GIT_CONFIG.) - ENVIRONMENT ----------- @@ -200,10 +200,6 @@ GIT_CONFIG:: Using the "--global" option forces this to ~/.gitconfig. Using the "--system" option forces this to $(prefix)/etc/gitconfig. -GIT_CONFIG_LOCAL:: - Take the configuration from the given file instead if .git/config. - Still read the global and the system-wide configuration files, though. - See also <<FILES>>. @@ -226,7 +222,7 @@ Given a .git/config like this: ; Our diff algorithm [diff] - external = "/usr/local/bin/gnu-diff -u" + external = /usr/local/bin/diff-wrapper renames = true ; Proxy settings @@ -332,4 +328,4 @@ Documentation by Johannes Schindelin, Petr Baudis and the git-list <git@vger.ker GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-count-objects.txt b/Documentation/git-count-objects.txt index 7fb08e9348..75a8da1ca9 100644 --- a/Documentation/git-count-objects.txt +++ b/Documentation/git-count-objects.txt @@ -7,7 +7,7 @@ git-count-objects - Count unpacked number of objects and their disk consumption SYNOPSIS -------- -'git-count-objects' [-v] +'git count-objects' [-v] DESCRIPTION ----------- @@ -18,15 +18,16 @@ them, to help you decide when it is a good time to repack. OPTIONS ------- -v:: +--verbose:: In addition to the number of loose objects and disk space consumed, it reports the number of in-pack objects, number of packs, and number of objects that can be - removed by running `git-prune-packed`. + removed by running `git prune-packed`. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -34,4 +35,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-cvsexportcommit.txt b/Documentation/git-cvsexportcommit.txt index 9a47b4c397..2da8588f4f 100644 --- a/Documentation/git-cvsexportcommit.txt +++ b/Documentation/git-cvsexportcommit.txt @@ -8,7 +8,8 @@ git-cvsexportcommit - Export a single commit to a CVS checkout SYNOPSIS -------- -'git-cvsexportcommit' [-h] [-u] [-v] [-c] [-P] [-p] [-a] [-d cvsroot] [-w cvsworkdir] [-f] [-m msgprefix] [PARENTCOMMIT] COMMITID +'git cvsexportcommit' [-h] [-u] [-v] [-c] [-P] [-p] [-a] [-d cvsroot] + [-w cvsworkdir] [-W] [-f] [-m msgprefix] [PARENTCOMMIT] COMMITID DESCRIPTION @@ -26,8 +27,8 @@ by default. Supports file additions, removals, and commits that affect binary files. -If the commit is a merge commit, you must tell git-cvsexportcommit what parent -should the changeset be done against. +If the commit is a merge commit, you must tell 'git-cvsexportcommit' what +parent the changeset should be done against. OPTIONS ------- @@ -65,11 +66,22 @@ OPTIONS -w:: Specify the location of the CVS checkout to use for the export. This option does not require GIT_DIR to be set before execution if the - current directory is within a git repository. + current directory is within a git repository. The default is the + value of 'cvsexportcommit.cvsdir'. + +-W:: + Tell cvsexportcommit that the current working directory is not only + a Git checkout, but also the CVS checkout. Therefore, Git will + reset the working directory to the parent commit before proceeding. -v:: Verbose. +CONFIGURATION +------------- +cvsexportcommit.cvsdir:: + The default location of the CVS checkout to use for the export. + EXAMPLES -------- @@ -78,14 +90,14 @@ Merge one patch into CVS:: ------------ $ export GIT_DIR=~/project/.git $ cd ~/project_cvs_checkout -$ git-cvsexportcommit -v <commit-sha1> +$ git cvsexportcommit -v <commit-sha1> $ cvs commit -F .msg <files> ------------ Merge one patch into CVS (-c and -w options). The working directory is within the Git Repo:: + ------------ - $ git-cvsexportcommit -v -c -w ~/project_cvs_checkout <commit-sha1> + $ git cvsexportcommit -v -c -w ~/project_cvs_checkout <commit-sha1> ------------ Merge pending patches into CVS automatically -- only if you really know what you are doing:: @@ -93,7 +105,7 @@ Merge pending patches into CVS automatically -- only if you really know what you ------------ $ export GIT_DIR=~/project/.git $ cd ~/project_cvs_checkout -$ git-cherry cvshead myhead | sed -n 's/^+ //p' | xargs -l1 git-cvsexportcommit -c -p -v +$ git cherry cvshead myhead | sed -n 's/^+ //p' | xargs -l1 git cvsexportcommit -c -p -v ------------ Author @@ -106,4 +118,4 @@ Documentation by Martin Langhoff <martin@catalyst.net.nz> and others. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt index dbce503694..b7a8c10b87 100644 --- a/Documentation/git-cvsimport.txt +++ b/Documentation/git-cvsimport.txt @@ -9,7 +9,7 @@ git-cvsimport - Salvage your data out of another SCM people love to hate SYNOPSIS -------- [verse] -'git-cvsimport' [-o <branch-for-HEAD>] [-h] [-v] [-d <CVSROOT>] +'git cvsimport' [-o <branch-for-HEAD>] [-h] [-v] [-d <CVSROOT>] [-A <author-conv-file>] [-p <options-for-cvsps>] [-P <file>] [-C <git_repository>] [-z <fuzz>] [-i] [-k] [-u] [-s <subst>] [-a] [-m] [-M <regex>] [-S <regex>] [-L <commitlimit>] @@ -25,12 +25,18 @@ Splitting the CVS log into patch sets is done by 'cvsps'. At least version 2.1 is required. You should *never* do any work of your own on the branches that are -created by git-cvsimport. By default initial import will create and populate a +created by 'git-cvsimport'. By default initial import will create and populate a "master" branch from the CVS repository's main branch which you're free -to work with; after that, you need to 'git merge' incremental imports, or +to work with; after that, you need to 'git-merge' incremental imports, or any CVS branches, yourself. It is advisable to specify a named remote via -r to separate and protect the incoming branches. +If you intend to set up a shared public repository that all developers can +read/write, or if you want to use linkgit:git-cvsserver[1], then you +probably want to make a bare clone of the imported repository, +and use the clone as the shared repository. +See linkgit:gitcvs-migration[7]. + OPTIONS ------- @@ -40,13 +46,13 @@ OPTIONS -d <CVSROOT>:: The root of the CVS archive. May be local (a simple path) or remote; currently, only the :local:, :ext: and :pserver: access methods - are supported. If not given, git-cvsimport will try to read it + are supported. If not given, 'git-cvsimport' will try to read it from `CVS/Root`. If no such file exists, it checks for the `CVSROOT` environment variable. <CVS_module>:: The CVS module you want to import. Relative to <CVSROOT>. - If not given, git-cvsimport tries to read it from + If not given, 'git-cvsimport' tries to read it from `CVS/Repository`. -C <target-dir>:: @@ -56,14 +62,14 @@ OPTIONS -r <remote>:: The git remote to import this CVS repository into. Moves all CVS branches into remotes/<remote>/<branch> - akin to the git-clone --use-separate-remote option. + akin to the 'git-clone' "--use-separate-remote" option. -o <branch-for-HEAD>:: When no remote is specified (via -r) the 'HEAD' branch from CVS is imported to the 'origin' branch within the git repository, as 'HEAD' already has a special meaning for git. When a remote is specified the 'HEAD' branch is named - remotes/<remote>/master mirroring git-clone behaviour. + remotes/<remote>/master mirroring 'git-clone' behaviour. Use this option if you want to import into a different branch. + @@ -102,13 +108,17 @@ If you need to pass multiple options, separate them with a comma. -m:: Attempt to detect merges based on the commit message. This option - will enable default regexes that try to capture the name source + will enable default regexes that try to capture the source branch name from the commit message. -M <regex>:: Attempt to detect merges based on the commit message with a custom - regex. It can be used with '-m' to also see the default regexes. - You must escape forward slashes. + regex. It can be used with '-m' to enable the default regexes + as well. You must escape forward slashes. ++ +The regex must capture the source branch name in $1. ++ +This option can be used several times to provide several detection regexes. -S <regex>:: Skip paths matching the regex. @@ -132,17 +142,17 @@ If you need to pass multiple options, separate them with a comma. --------- + -git-cvsimport will make it appear as those authors had +'git-cvsimport' will make it appear as those authors had their GIT_AUTHOR_NAME and GIT_AUTHOR_EMAIL set properly all along. + For convenience, this data is saved to `$GIT_DIR/cvs-authors` each time the '-A' option is provided and read from that same -file each time git-cvsimport is run. +file each time 'git-cvsimport' is run. + It is not recommended to use this feature if you intend to export changes back to CVS again later with -linkgit:git-cvsexportcommit[1]. +'git-cvsexportcommit'. -h:: Print a short usage message and exit. @@ -166,4 +176,4 @@ Documentation by Matthias Urlichs <smurf@smurf.noris.de>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-cvsserver.txt b/Documentation/git-cvsserver.txt index d75e401343..c2d3c90d27 100644 --- a/Documentation/git-cvsserver.txt +++ b/Documentation/git-cvsserver.txt @@ -22,7 +22,7 @@ cvspserver stream tcp nowait nobody /usr/bin/git-cvsserver git-cvsserver pserver Usage: [verse] -'git-cvsserver' [options] [pserver|server] [<directory> ...] +'git cvsserver' [options] [pserver|server] [<directory> ...] OPTIONS ------- @@ -41,10 +41,13 @@ Don't allow recursing into subdirectories Don't check for `gitcvs.enabled` in config. You also have to specify a list of allowed directories (see below) if you want to use this option. ---version, -V:: +-V:: +--version:: Print version information and exit ---help, -h, -H:: +-h:: +-H:: +--help:: Print usage information and exit <directory>:: @@ -74,7 +77,7 @@ over pserver for anonymous CVS access. CVS clients cannot tag, branch or perform GIT merges. -git-cvsserver maps GIT branches to CVS modules. This is very different +'git-cvsserver' maps GIT branches to CVS modules. This is very different from what most CVS users would expect since in CVS modules usually represent one or more directories. @@ -100,7 +103,7 @@ looks like ------ No special setup is needed for SSH access, other than having GIT tools in the PATH. If you have clients that do not accept the CVS_SERVER -environment variable, you can rename git-cvsserver to cvs. +environment variable, you can rename 'git-cvsserver' to `cvs`. Note: Newer CVS versions (>= 1.12.11) also support specifying CVS_SERVER directly in CVSROOT like @@ -110,7 +113,9 @@ cvs -d ":ext;CVS_SERVER=git-cvsserver:user@server/path/repo.git" co <HEAD_name> ------ This has the advantage that it will be saved in your 'CVS/Root' files and you don't need to worry about always setting the correct environment -variable. +variable. SSH users restricted to 'git-shell' don't need to override the default +with CVS_SERVER (and shouldn't) as 'git-shell' understands `cvs` to mean +'git-cvsserver' and pretends that the other end runs the real 'cvs' better. -- 2. For each repo that you want accessible from CVS you need to edit config in the repo and add the following section. @@ -123,11 +128,14 @@ variable. logfile=/path/to/logfile ------ -Note: you need to ensure each user that is going to invoke git-cvsserver has +Note: you need to ensure each user that is going to invoke 'git-cvsserver' has write access to the log file and to the database (see <<dbbackend,Database Backend>>. If you want to offer write access over SSH, the users of course also need write access to the git repository itself. +You also need to ensure that each repository is "bare" (without a git index +file) for `cvs commit` to work. See linkgit:gitcvs-migration[7]. + [[configaccessmethod]] All configuration variables can also be overridden for a specific method of access. Valid method names are "ext" (for SSH access) and "pserver". The @@ -141,25 +149,29 @@ allowing access over SSH. enabled=1 ------ -- -3. On the client machine you need to set the following variables. - CVSROOT should be set as per normal, but the directory should point at the - appropriate git repo. For example: +3. If you didn't specify the CVSROOT/CVS_SERVER directly in the checkout command, + automatically saving it in your 'CVS/Root' files, then you need to set them + explicitly in your environment. CVSROOT should be set as per normal, but the + directory should point at the appropriate git repo. As above, for SSH clients + _not_ restricted to 'git-shell', CVS_SERVER should be set to 'git-cvsserver'. + -- -For SSH access, CVS_SERVER should be set to git-cvsserver - -Example: - ------ export CVSROOT=:ext:user@server:/var/git/project.git export CVS_SERVER=git-cvsserver ------ -- -4. For SSH clients that will make commits, make sure their .bashrc file - sets the GIT_AUTHOR and GIT_COMMITTER variables. +4. For SSH clients that will make commits, make sure their server-side + .ssh/environment files (or .bashrc, etc., according to their specific shell) + export appropriate values for GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, + GIT_COMMITTER_NAME, and GIT_COMMITTER_EMAIL. For SSH clients whose login + shell is bash, .bashrc may be a reasonable alternative. 5. Clients should now be able to check out the project. Use the CVS 'module' - name to indicate what GIT 'head' you want to check out. Example: + name to indicate what GIT 'head' you want to check out. This also sets the + name of your newly checked-out directory, unless you tell it otherwise with + `-d <dir_name>`. For example, this checks out 'master' branch to the + `project-master` directory: + ------ cvs co -d project-master master @@ -169,27 +181,27 @@ Example: Database Backend ---------------- -git-cvsserver uses one database per git head (i.e. CVS module) to +'git-cvsserver' uses one database per git head (i.e. CVS module) to store information about the repository for faster access. The database doesn't contain any persistent data and can be completely regenerated from the git repository at any time. The database needs to be updated (i.e. written to) after every commit. -If the commit is done directly by using git (as opposed to -using git-cvsserver) the update will need to happen on the -next repository access by git-cvsserver, independent of +If the commit is done directly by using `git` (as opposed to +using 'git-cvsserver') the update will need to happen on the +next repository access by 'git-cvsserver', independent of access method and requested operation. That means that even if you offer only read access (e.g. by using -the pserver method), git-cvsserver should have write access to +the pserver method), 'git-cvsserver' should have write access to the database to work reliably (otherwise you need to make sure -that the database if up-to-date all the time git-cvsserver is run). +that the database is up-to-date any time 'git-cvsserver' is executed). By default it uses SQLite databases in the git directory, named `gitcvs.<module_name>.sqlite`. Note that the SQLite backend creates temporary files in the same directory as the database file on write so it might not be enough to grant the users using -git-cvsserver write access to the database file without granting +'git-cvsserver' write access to the database file without granting them write access to the directory, too. You can configure the database backend with the following @@ -198,13 +210,13 @@ configuration variables: Configuring database backend ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -git-cvsserver uses the Perl DBI module. Please also read +'git-cvsserver' uses the Perl DBI module. Please also read its documentation if changing these variables, especially about `DBI->connect()`. gitcvs.dbname:: Database name. The exact meaning depends on the - used database driver, for SQLite this is a filename. + selected database driver, for SQLite this is a filename. Supports variable substitution (see below). May not contain semicolons (`;`). Default: '%Ggitcvs.%m.sqlite' @@ -215,7 +227,7 @@ gitcvs.dbdriver:: with 'DBD::SQLite', reported to work with 'DBD::Pg', and reported *not* to work with 'DBD::mysql'. Please regard this as an experimental feature. May not - contain double colons (`:`). + contain colons (`:`). Default: 'SQLite' gitcvs.dbuser:: @@ -227,6 +239,11 @@ gitcvs.dbpass:: Database password. Only useful if setting `dbdriver`, since SQLite has no concept of database passwords. +gitcvs.dbTableNamePrefix:: + Database table name prefix. Supports variable substitution + (see below). Any non-alphabetic characters will be replaced + with underscores. + All variables can also be set per access method, see <<configaccessmethod,above>>. Variable substitution @@ -245,7 +262,7 @@ In `dbdriver` and `dbuser` you can use the following variables: %a:: access method (one of "ext" or "pserver") %u:: - Name of the user running git-cvsserver. + Name of the user running 'git-cvsserver'. If no name can be determined, the numeric uid is used. @@ -271,8 +288,8 @@ you will definitely want to have SSH keys setup. Alternatively, you can just use the non-standard extssh protocol that Eclipse offer. In that case CVS_SERVER is ignored, and you will have to replace -the cvs utility on the server with git-cvsserver or manipulate your `.bashrc` -so that calling 'cvs' effectively calls git-cvsserver. +the cvs utility on the server with 'git-cvsserver' or manipulate your `.bashrc` +so that calling 'cvs' effectively calls 'git-cvsserver'. Clients known to work --------------------- @@ -290,16 +307,37 @@ checkout, diff, status, update, log, add, remove, commit. Legacy monitoring operations are not supported (edit, watch and related). Exports and tagging (tags and branches) are not supported at this stage. -The server should set the '-k' mode to binary when relevant, however, -this is not really implemented yet. For now, you can force the server -to set '-kb' for all files by setting the `gitcvs.allbinary` config -variable. In proper GIT tradition, the contents of the files are -always respected. No keyword expansion or newline munging is supported. +CRLF Line Ending Conversions +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +By default the server leaves the '-k' mode blank for all files, +which causes the cvs client to treat them as a text files, subject +to crlf conversion on some platforms. + +You can make the server use `crlf` attributes to set the '-k' modes +for files by setting the `gitcvs.usecrlfattr` config variable. +In this case, if `crlf` is explicitly unset ('-crlf'), then the +server will set '-kb' mode for binary files. If `crlf` is set, +then the '-k' mode will explicitly be left blank. See +also linkgit:gitattributes[5] for more information about the `crlf` +attribute. + +Alternatively, if `gitcvs.usecrlfattr` config is not enabled +or if the `crlf` attribute is unspecified for a filename, then +the server uses the `gitcvs.allbinary` config for the default setting. +If `gitcvs.allbinary` is set, then file not otherwise +specified will default to '-kb' mode. Otherwise the '-k' mode +is left blank. But if `gitcvs.allbinary` is set to "guess", then +the correct '-k' mode will be guessed based on the contents of +the file. + +For best consistency with 'cvs', it is probably best to override the +defaults by setting `gitcvs.usecrlfattr` to true, +and `gitcvs.allbinary` to "guess". Dependencies ------------ - -git-cvsserver depends on DBD::SQLite. +'git-cvsserver' depends on DBD::SQLite. Copyright and Authors --------------------- @@ -319,4 +357,4 @@ Documentation by Martyn Smith <martyn@catalyst.net.nz>, Martin Langhoff <martin@ GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-daemon.txt b/Documentation/git-daemon.txt index fd83bc7833..4ba4b75c11 100644 --- a/Documentation/git-daemon.txt +++ b/Documentation/git-daemon.txt @@ -8,12 +8,12 @@ git-daemon - A really simple server for git repositories SYNOPSIS -------- [verse] -'git-daemon' [--verbose] [--syslog] [--export-all] - [--timeout=n] [--init-timeout=n] [--strict-paths] - [--base-path=path] [--user-path | --user-path=path] - [--interpolated-path=pathtemplate] - [--reuseaddr] [--detach] [--pid-file=file] - [--enable=service] [--disable=service] +'git daemon' [--verbose] [--syslog] [--export-all] + [--timeout=n] [--init-timeout=n] [--strict-paths] + [--base-path=path] [--user-path | --user-path=path] + [--interpolated-path=pathtemplate] + [--reuseaddr] [--detach] [--pid-file=file] + [--enable=service] [--disable=service] [--allow-override=service] [--forbid-override=service] [--inetd | [--listen=host_or_ipaddr] [--port=n] [--user=user [--group=group]] [directory...] @@ -31,32 +31,32 @@ pass some directory paths as 'git-daemon' arguments, you can further restrict the offers to a whitelist comprising of those. By default, only `upload-pack` service is enabled, which serves -`git-fetch-pack` and `git-ls-remote` clients, which are invoked -from `git-fetch`, `git-pull`, and `git-clone`. +'git-fetch-pack' and 'git-ls-remote' clients, which are invoked +from 'git-fetch', 'git-pull', and 'git-clone'. This is ideally suited for read-only updates, i.e., pulling from git repositories. -An `upload-archive` also exists to serve `git-archive`. +An `upload-archive` also exists to serve 'git-archive'. OPTIONS ------- --strict-paths:: Match paths exactly (i.e. don't allow "/foo/repo" when the real path is "/foo/repo.git" or "/foo/repo/.git") and don't do user-relative paths. - git-daemon will refuse to start when this option is enabled and no + 'git-daemon' will refuse to start when this option is enabled and no whitelist is specified. --base-path:: Remap all the path requests as relative to the given path. - This is sort of "GIT root" - if you run git-daemon with + This is sort of "GIT root" - if you run 'git-daemon' with '--base-path=/srv/git' on example.com, then if you later try to pull - 'git://example.com/hello.git', `git-daemon` will interpret the path + 'git://example.com/hello.git', 'git-daemon' will interpret the path as '/srv/git/hello.git'. --base-path-relaxed:: If --base-path is enabled and repo lookup fails, with this option - `git-daemon` will attempt to lookup without prefixing the base path. + 'git-daemon' will attempt to lookup without prefixing the base path. This is useful for switching to --base-path usage, while still allowing the old paths. @@ -103,7 +103,8 @@ OPTIONS Log to syslog instead of stderr. Note that this option does not imply --verbose, thus by default only error conditions will be logged. ---user-path, --user-path=path:: +--user-path:: +--user-path=path:: Allow ~user notation to be used in requests. When specified with no parameter, requests to git://host/~alice/foo is taken as a request to access @@ -127,7 +128,8 @@ OPTIONS Save the process id in 'file'. Ignored when the daemon is run under `--inetd`. ---user=user, --group=group:: +--user=user:: +--group=group:: Change daemon's uid and gid before entering the service loop. When only `--user` is given without `--group`, the primary group ID for the user is used. The values of @@ -136,16 +138,18 @@ OPTIONS + Giving these options is an error when used with `--inetd`; use the facility of inet daemon to achieve the same before spawning -`git-daemon` if needed. +'git-daemon' if needed. ---enable=service, --disable=service:: +--enable=service:: +--disable=service:: Enable/disable the service site-wide per default. Note that a service disabled site-wide can still be enabled per repository if it is marked overridable and the repository enables the service with an configuration item. ---allow-override=service, --forbid-override=service:: +--allow-override=service:: +--forbid-override=service:: Allow/forbid overriding the site-wide default with per repository configuration. By default, all the services are overridable. @@ -160,24 +164,24 @@ SERVICES These services can be globally enabled/disabled using the command line options of this command. If a finer-grained -control is desired (e.g. to allow `git-archive` to be run +control is desired (e.g. to allow 'git-archive' to be run against only in a few selected repositories the daemon serves), the per-repository configuration file can be used to enable or disable them. upload-pack:: - This serves `git-fetch-pack` and `git-ls-remote` + This serves 'git-fetch-pack' and 'git-ls-remote' clients. It is enabled by default, but a repository can disable it by setting `daemon.uploadpack` configuration item to `false`. upload-archive:: - This serves `git-archive --remote`. It is disabled by + This serves 'git-archive --remote'. It is disabled by default, but a repository can enable it by setting - `daemon.uploadarchive` configuration item to `true`. + `daemon.uploadarch` configuration item to `true`. receive-pack:: - This serves `git-send-pack` clients, allowing anonymous + This serves 'git-send-pack' clients, allowing anonymous push. It is disabled by default, as there is _no_ authentication in the protocol (in other words, anybody can push anything into the repository, including removal @@ -195,28 +199,28 @@ $ grep 9418 /etc/services git 9418/tcp # Git Version Control System ------------ -git-daemon as inetd server:: - To set up `git-daemon` as an inetd service that handles any +'git-daemon' as inetd server:: + To set up 'git-daemon' as an inetd service that handles any repository under the whitelisted set of directories, /pub/foo and /pub/bar, place an entry like the following into /etc/inetd all on one line: + ------------------------------------------------ - git stream tcp nowait nobody /usr/bin/git-daemon - git-daemon --inetd --verbose --export-all + git stream tcp nowait nobody /usr/bin/git + git daemon --inetd --verbose --export-all /pub/foo /pub/bar ------------------------------------------------ -git-daemon as inetd server for virtual hosts:: - To set up `git-daemon` as an inetd service that handles +'git-daemon' as inetd server for virtual hosts:: + To set up 'git-daemon' as an inetd service that handles repositories for different virtual hosts, `www.example.com` and `www.example.org`, place an entry like the following into `/etc/inetd` all on one line: + ------------------------------------------------ - git stream tcp nowait nobody /usr/bin/git-daemon - git-daemon --inetd --verbose --export-all + git stream tcp nowait nobody /usr/bin/git + git daemon --inetd --verbose --export-all --interpolated-path=/pub/%H%D /pub/www.example.org/software /pub/www.example.com/software @@ -231,13 +235,13 @@ clients, a symlink from `/software` into the appropriate default repository could be made as well. -git-daemon as regular daemon for virtual hosts:: - To set up `git-daemon` as a regular, non-inetd service that +'git-daemon' as regular daemon for virtual hosts:: + To set up 'git-daemon' as a regular, non-inetd service that handles repositories for multiple virtual hosts based on their IP addresses, start the daemon like this: + ------------------------------------------------ - git-daemon --verbose --export-all + git daemon --verbose --export-all --interpolated-path=/pub/%IP/%D /pub/192.168.1.200/software /pub/10.10.220.23/software @@ -249,7 +253,7 @@ Repositories can still be accessed by hostname though, assuming they correspond to these IP addresses. selectively enable/disable services per repository:: - To enable `git-archive --remote` and disable `git-fetch` against + To enable 'git-archive --remote' and disable 'git-fetch' against a repository, have the following in the configuration file in the repository (that is the file 'config' next to 'HEAD', 'refs' and 'objects'). @@ -257,7 +261,7 @@ selectively enable/disable services per repository:: ---------------------------------------------------------------- [daemon] uploadpack = false - uploadarchive = true + uploadarch = true ---------------------------------------------------------------- @@ -272,4 +276,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt index 0742152b81..c4dbc2ae34 100644 --- a/Documentation/git-describe.txt +++ b/Documentation/git-describe.txt @@ -8,20 +8,21 @@ git-describe - Show the most recent tag that is reachable from a commit SYNOPSIS -------- -'git-describe' [--all] [--tags] [--contains] [--abbrev=<n>] <committish>... +'git describe' [--all] [--tags] [--contains] [--abbrev=<n>] <committish>... DESCRIPTION ----------- The command finds the most recent tag that is reachable from a -commit, and if the commit itself is pointed at by the tag, shows -the tag. Otherwise, it suffixes the tag name with the number of -additional commits and the abbreviated object name of the commit. +commit. If the tag points to the commit, then only the tag is +shown. Otherwise, it suffixes the tag name with the number of +additional commits on top of the tagged object and the +abbreviated object name of the most recent commit. OPTIONS ------- -<committish>:: - The object name of the committish. +<committish>...:: + Committish object names to describe. --all:: Instead of using only the annotated tags, use any ref @@ -45,18 +46,39 @@ OPTIONS candidates to describe the input committish consider up to <n> candidates. Increasing <n> above 10 will take slightly longer but may produce a more accurate result. + An <n> of 0 will cause only exact matches to be output. + +--exact-match:: + Only output exact matches (a tag directly references the + supplied commit). This is a synonym for --candidates=0. --debug:: Verbosely display information about the searching strategy being employed to standard error. The tag name will still be printed to standard out. +--long:: + Always output the long format (the tag, the number of commits + and the abbreviated commit name) even when it matches a tag. + This is useful when you want to see parts of the commit object name + in "describe" output, even when the commit in question happens to be + a tagged version. Instead of just emitting the tag name, it will + describe such a commit as v1.2-0-deadbeef (0th commit since tag v1.2 + that points at object deadbeef....). + +--match <pattern>:: + Only consider tags matching the given pattern (can be used to avoid + leaking private tags made from the repository). + +--always:: + Show uniquely abbreviated commit object as fallback. + EXAMPLES -------- With something like git.git current tree, I get: - [torvalds@g5 git]$ git-describe parent + [torvalds@g5 git]$ git describe parent v1.0.4-14-g2414721 i.e. the current head of my "parent" branch is based on v1.0.4, @@ -70,9 +92,9 @@ of commits which would be displayed by "git log v1.0.4..parent". The hash suffix is "-g" + 7-char abbreviation for the tip commit of parent (which was `2414721b194453f058079d897d13c4e377f92dc6`). -Doing a "git-describe" on a tag-name will just show the tag name: +Doing a 'git-describe' on a tag-name will just show the tag name: - [torvalds@g5 git]$ git-describe v1.0.4 + [torvalds@g5 git]$ git describe v1.0.4 v1.0.4 With --all, the command can use branch heads as references, so @@ -93,13 +115,13 @@ closest tagname without any suffix: SEARCH STRATEGY --------------- -For each committish supplied "git describe" will first look for +For each committish supplied, 'git-describe' will first look for a tag which tags exactly that commit. Annotated tags will always be preferred over lightweight tags, and tags with newer dates will always be preferred over tags with older dates. If an exact match is found, its name will be output and searching will stop. -If an exact match was not found "git describe" will walk back +If an exact match was not found, 'git-describe' will walk back through the commit history to locate an ancestor commit which has been tagged. The ancestor's tag will be output along with an abbreviation of the input committish's SHA1. @@ -107,14 +129,14 @@ abbreviation of the input committish's SHA1. If multiple tags were found during the walk then the tag which has the fewest commits different from the input committish will be selected and output. Here fewest commits different is defined as -the number of commits which would be shown by "git log tag..input" +the number of commits which would be shown by `git log tag..input` will be the smallest number of commits possible. Author ------ Written by Linus Torvalds <torvalds@osdl.org>, but somewhat -butchered by Junio C Hamano <junkio@cox.net>. Later significantly +butchered by Junio C Hamano <gitster@pobox.com>. Later significantly updated by Shawn Pearce <spearce@spearce.org>. Documentation @@ -123,4 +145,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-diff-files.txt b/Documentation/git-diff-files.txt index 6d2ea16a25..5c8c1d95a8 100644 --- a/Documentation/git-diff-files.txt +++ b/Documentation/git-diff-files.txt @@ -8,14 +8,14 @@ git-diff-files - Compares files in the working tree and the index SYNOPSIS -------- -'git-diff-files' [-q] [-0|-1|-2|-3|-c|--cc|--no-index] [<common diff options>] [<path>...] +'git diff-files' [-q] [-0|-1|-2|-3|-c|--cc] [<common diff options>] [<path>...] DESCRIPTION ----------- Compares the files in the working tree and the index. When paths are specified, compares only those named paths. Otherwise all entries in the index are compared. The output format is the -same as "git-diff-index" and "git-diff-tree". +same as for 'git-diff-index' and 'git-diff-tree'. OPTIONS ------- @@ -30,15 +30,13 @@ The default is to diff against our branch (-2) and the cleanly resolved paths. The option -0 can be given to omit diff output for unmerged entries and just show "Unmerged". --c,--cc:: +-c:: +--cc:: This compares stage 2 (our branch), stage 3 (their branch) and the working tree file and outputs a combined diff, similar to the way 'diff-tree' shows a merge commit with these flags. ---no-index:: - Compare the two given files / directories. - -q:: Remain silent even on nonexistent files @@ -57,4 +55,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-diff-index.txt b/Documentation/git-diff-index.txt index e867778590..26920d4f63 100644 --- a/Documentation/git-diff-index.txt +++ b/Documentation/git-diff-index.txt @@ -8,7 +8,7 @@ git-diff-index - Compares content and mode of blobs between the index and reposi SYNOPSIS -------- -'git-diff-index' [-m] [--cached] [<common diff options>] <tree-ish> [<path>...] +'git diff-index' [-m] [--cached] [<common diff options>] <tree-ish> [<path>...] DESCRIPTION ----------- @@ -31,7 +31,7 @@ include::diff-options.txt[] -m:: By default, files recorded in the index but not checked out are reported as deleted. This flag makes - "git-diff-index" say that all non-checked-out files are up + 'git-diff-index' say that all non-checked-out files are up to date. Output format @@ -50,31 +50,31 @@ Cached Mode If '--cached' is specified, it allows you to ask: show me the differences between HEAD and the current index - contents (the ones I'd write with a "git-write-tree") + contents (the ones I'd write using 'git-write-tree') For example, let's say that you have worked on your working directory, updated some files in the index and are ready to commit. You want to see exactly *what* you are going to commit, without having to write a new tree object and compare it that way, and to do that, you just do - git-diff-index --cached HEAD + git diff-index --cached HEAD Example: let's say I had renamed `commit.c` to `git-commit.c`, and I had -done an "git-update-index" to make that effective in the index file. -"git-diff-files" wouldn't show anything at all, since the index file -matches my working directory. But doing a "git-diff-index" does: +done an `update-index` to make that effective in the index file. +`git diff-files` wouldn't show anything at all, since the index file +matches my working directory. But doing a 'git-diff-index' does: - torvalds@ppc970:~/git> git-diff-index --cached HEAD + torvalds@ppc970:~/git> git diff-index --cached HEAD -100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 commit.c +100644 blob 4161aecc6700a2eb579e842af0b7f22b98443f74 git-commit.c You can see easily that the above is a rename. -In fact, "git-diff-index --cached" *should* always be entirely equivalent to -actually doing a "git-write-tree" and comparing that. Except this one is much +In fact, `git diff-index --cached` *should* always be entirely equivalent to +actually doing a 'git-write-tree' and comparing that. Except this one is much nicer for the case where you just want to check where you are. -So doing a "git-diff-index --cached" is basically very useful when you are +So doing a 'git-diff-index --cached' is basically very useful when you are asking yourself "what have I already marked for being committed, and what's the difference to a previous tree". @@ -82,23 +82,23 @@ Non-cached Mode --------------- The "non-cached" mode takes a different approach, and is potentially the more useful of the two in that what it does can't be emulated with -a "git-write-tree" + "git-diff-tree". Thus that's the default mode. +a 'git-write-tree' + 'git-diff-tree'. Thus that's the default mode. The non-cached version asks the question: show me the differences between HEAD and the currently checked out tree - index contents _and_ files that aren't up-to-date which is obviously a very useful question too, since that tells you what -you *could* commit. Again, the output matches the "git-diff-tree -r" +you *could* commit. Again, the output matches the 'git-diff-tree -r' output to a tee, but with a twist. The twist is that if some file doesn't match the index, we don't have a backing store thing for it, and we use the magic "all-zero" sha1 to show that. So let's say that you have edited `kernel/sched.c`, but -have not actually done a "git-update-index" on it yet - there is no +have not actually done a 'git-update-index' on it yet - there is no "object" associated with the new state, and you get: - torvalds@ppc970:~/v2.6/linux> git-diff-index HEAD + torvalds@ppc970:~/v2.6/linux> git diff-index HEAD *100644->100664 blob 7476bb......->000000...... kernel/sched.c i.e., it shows that the tree has changed, and that `kernel/sched.c` has is @@ -106,11 +106,11 @@ not up-to-date and may contain new stuff. The all-zero sha1 means that to get the real diff, you need to look at the object in the working directory directly rather than do an object-to-object diff. -NOTE: As with other commands of this type, "git-diff-index" does not +NOTE: As with other commands of this type, 'git-diff-index' does not actually look at the contents of the file at all. So maybe `kernel/sched.c` hasn't actually changed, and it's just that you touched it. In either case, it's a note that you need to -"git-update-index" it to make the index be in sync. +'git-update-index' it to make the index be in sync. NOTE: You can have a mixture of files show up as "has been updated" and "is still dirty in the working directory" together. You can always @@ -129,4 +129,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-diff-tree.txt b/Documentation/git-diff-tree.txt index 58d02c6a20..1fdf20dcc9 100644 --- a/Documentation/git-diff-tree.txt +++ b/Documentation/git-diff-tree.txt @@ -9,7 +9,7 @@ git-diff-tree - Compares the content and mode of blobs found via two tree object SYNOPSIS -------- [verse] -'git-diff-tree' [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty] +'git diff-tree' [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty] [-t] [-r] [-c | --cc] [--root] [<common diff options>] <tree-ish> [<tree-ish>] [<path>...] @@ -20,7 +20,7 @@ Compares the content and mode of the blobs found via two tree objects. If there is only one <tree-ish> given, the commit is compared with its parents (see --stdin below). -Note that "git-diff-tree" can use the tree encapsulated in a commit object. +Note that 'git-diff-tree' can use the tree encapsulated in a commit object. OPTIONS ------- @@ -49,34 +49,34 @@ include::diff-options.txt[] --stdin:: When '--stdin' is specified, the command does not take <tree-ish> arguments from the command line. Instead, it - reads either one <commit> or a pair of <tree-ish> + reads either one <commit> or a list of <commit> separated with a single space from its standard input. + When a single commit is given on one line of such input, it compares the commit with its parents. The following flags further affects its -behavior. This does not apply to the case where two <tree-ish> -separated with a single space are given. +behavior. The remaining commits, when given, are used as if they are +parents of the first commit. -m:: - By default, "git-diff-tree --stdin" does not show + By default, 'git-diff-tree --stdin' does not show differences for merge commits. With this flag, it shows differences to that commit from all of its parents. See also '-c'. -s:: - By default, "git-diff-tree --stdin" shows differences, + By default, 'git-diff-tree --stdin' shows differences, either in machine-readable form (without '-p') or in patch form (with '-p'). This output can be suppressed. It is only useful with '-v' flag. -v:: - This flag causes "git-diff-tree --stdin" to also show + This flag causes 'git-diff-tree --stdin' to also show the commit message before the differences. include::pretty-options.txt[] --no-commit-id:: - git-diff-tree outputs a line with the commit ID when + 'git-diff-tree' outputs a line with the commit ID when applicable. This flag suppressed the commit ID output. -c:: @@ -93,11 +93,11 @@ include::pretty-options.txt[] This flag changes the way a merge commit patch is displayed, in a similar way to the '-c' option. It implies the '-c' and '-p' options and further compresses the patch output - by omitting hunks that show differences from only one - parent, or show the same change from all but one parent - for an Octopus merge. When this optimization makes all - hunks disappear, the commit itself and the commit log - message is not shown, just like in any other "empty diff" case. + by omitting uninteresting hunks whose the contents in the parents + have only two variants and the merge result picks one of them + without modification. When all hunks are uninteresting, the commit + itself and the commit log message is not shown, just like in any other + "empty diff" case. --always:: Show the commit itself and the commit log message even @@ -112,13 +112,13 @@ Limiting Output If you're only interested in differences in a subset of files, for example some architecture-specific files, you might do: - git-diff-tree -r <tree-ish> <tree-ish> arch/ia64 include/asm-ia64 + git diff-tree -r <tree-ish> <tree-ish> arch/ia64 include/asm-ia64 and it will only show you what changed in those two directories. Or if you are searching for what changed in just `kernel/sched.c`, just do - git-diff-tree -r <tree-ish> <tree-ish> kernel/sched.c + git diff-tree -r <tree-ish> <tree-ish> kernel/sched.c and it will ignore all differences to other files. @@ -129,7 +129,7 @@ so it can be used to name subdirectories. An example of normal usage is: - torvalds@ppc970:~/git> git-diff-tree 5319e4...... + torvalds@ppc970:~/git> git diff-tree 5319e4...... *100664->100664 blob ac348b.......->a01513....... git-fsck-objects.c which tells you that the last commit changed just one file (it's from @@ -165,4 +165,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-diff.txt b/Documentation/git-diff.txt index 57c28628bb..c53eba557d 100644 --- a/Documentation/git-diff.txt +++ b/Documentation/git-diff.txt @@ -8,14 +8,14 @@ git-diff - Show changes between commits, commit and working tree, etc SYNOPSIS -------- -'git-diff' [<common diff options>] <commit>{0,2} [--] [<path>...] +'git diff' [<common diff options>] <commit>{0,2} [--] [<path>...] DESCRIPTION ----------- Show changes between two trees, a tree and the working tree, a tree and the index file, or the index file and the working tree. -'git-diff' [--options] [--] [<path>...]:: +'git diff' [--options] [--] [<path>...]:: This form is to view the changes you made relative to the index (staging area for the next commit). In other @@ -27,14 +27,14 @@ If exactly two paths are given, and at least one is untracked, compare the two files / directories. This behavior can be forced by --no-index. -'git-diff' [--options] --cached [<commit>] [--] [<path>...]:: +'git diff' [--options] --cached [<commit>] [--] [<path>...]:: This form is to view the changes you staged for the next commit relative to the named <commit>. Typically you would want comparison with the latest commit, so if you do not give <commit>, it defaults to HEAD. -'git-diff' [--options] <commit> [--] [<path>...]:: +'git diff' [--options] <commit> [--] [<path>...]:: This form is to view the changes you have in your working tree relative to the named <commit>. You can @@ -42,23 +42,23 @@ forced by --no-index. branch name to compare with the tip of a different branch. -'git-diff' [--options] <commit> <commit> [--] [<path>...]:: +'git diff' [--options] <commit> <commit> [--] [<path>...]:: This is to view the changes between two arbitrary <commit>. -'git-diff' [--options] <commit>..<commit> [--] [<path>...]:: +'git diff' [--options] <commit>..<commit> [--] [<path>...]:: This is synonymous to the previous form. If <commit> on one side is omitted, it will have the same effect as using HEAD instead. -'git-diff' [--options] <commit>\...<commit> [--] [<path>...]:: +'git diff' [--options] <commit>\...<commit> [--] [<path>...]:: This form is to view the changes on the branch containing and up to the second <commit>, starting at a common ancestor - of both <commit>. "git-diff A\...B" is equivalent to - "git-diff $(git-merge-base A B) B". You can omit any one + of both <commit>. "git diff A\...B" is equivalent to + "git diff $(git-merge-base A B) B". You can omit any one of <commit>, which has the same effect as using HEAD instead. Just in case if you are doing something exotic, it should be @@ -168,4 +168,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-fast-export.txt b/Documentation/git-fast-export.txt index 6dac475a0b..b974e2115b 100644 --- a/Documentation/git-fast-export.txt +++ b/Documentation/git-fast-export.txt @@ -8,23 +8,23 @@ git-fast-export - Git data exporter SYNOPSIS -------- -'git-fast-export [options]' | 'git-fast-import' +'git fast-export [options]' | 'git fast-import' DESCRIPTION ----------- This program dumps the given revisions in a form suitable to be piped -into linkgit:git-fast-import[1]. +into 'git-fast-import'. You can use it as a human readable bundle replacement (see linkgit:git-bundle[1]), or as a kind of an interactive -linkgit:git-filter-branch[1]. +'git-filter-branch'. OPTIONS ------- --progress=<n>:: Insert 'progress' statements every <n> objects, to be shown by - linkgit:git-fast-import[1] during import. + 'git-fast-import' during import. --signed-tags=(verbatim|warn|strip|abort):: Specify how to handle signed tags. Since any transformation @@ -36,6 +36,35 @@ when encountering a signed tag. With 'strip', the tags will be made unsigned, with 'verbatim', they will be silently exported and with 'warn', they will be exported, but you will see a warning. +-M:: +-C:: + Perform move and/or copy detection, as described in the + linkgit:git-diff[1] manual page, and use it to generate + rename and copy commands in the output dump. ++ +Note that earlier versions of this command did not complain and +produced incorrect results if you gave these options. + +--export-marks=<file>:: + Dumps the internal marks table to <file> when complete. + Marks are written one per line as `:markid SHA-1`. Only marks + for revisions are dumped; marks for blobs are ignored. + Backends can use this file to validate imports after they + have been completed, or to save the marks table across + incremental runs. As <file> is only opened and truncated + at completion, the same path can also be safely given to + \--import-marks. + +--import-marks=<file>:: + Before processing any input, load the marks specified in + <file>. The input file must exist, must be readable, and + must use the same format as produced by \--export-marks. ++ +Any commits that have already been marked will not be exported again. +If the backend uses a similar \--import-marks file, this allows for +incremental bidirectional exporting of the repository by keeping the +marks the same across runs. + EXAMPLES -------- @@ -65,7 +94,7 @@ referenced by that revision range contains the string Limitations ----------- -Since linkgit:git-fast-import[1] cannot tag trees, you will not be +Since 'git-fast-import' cannot tag trees, you will not be able to export the linux-2.6.git repository completely, as it contains a tag referencing a tree instead of a commit. @@ -80,4 +109,4 @@ Documentation by Johannes E. Schindelin <johannes.schindelin@gmx.de>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-fast-import.txt b/Documentation/git-fast-import.txt index bd625ababf..c2f483a8d2 100644 --- a/Documentation/git-fast-import.txt +++ b/Documentation/git-fast-import.txt @@ -8,14 +8,14 @@ git-fast-import - Backend for fast Git data importers SYNOPSIS -------- -frontend | 'git-fast-import' [options] +frontend | 'git fast-import' [options] DESCRIPTION ----------- This program is usually not what the end user wants to run directly. Most end users want to use one of the existing frontend programs, which parses a specific type of foreign source and feeds the contents -stored there to git-fast-import. +stored there to 'git-fast-import'. fast-import reads a mixed command/data stream from standard input and writes one or more packfiles directly into the current repository. @@ -24,7 +24,7 @@ updated branch and tag refs, fully updating the current repository with the newly imported data. The fast-import backend itself can import into an empty repository (one that -has already been initialized by linkgit:git-init[1]) or incrementally +has already been initialized by 'git-init') or incrementally update an existing populated repository. Whether or not incremental imports are supported from a particular foreign source depends on the frontend program in use. @@ -82,11 +82,11 @@ OPTIONS This information may be useful after importing projects whose total object set exceeds the 4 GiB packfile limit, as these commits can be used as edge points during calls - to linkgit:git-pack-objects[1]. + to 'git-pack-objects'. --quiet:: Disable all non-fatal output, making fast-import silent when it - is successful. This option disables the output shown by + is successful. This option disables the output shown by \--stats. --stats:: @@ -124,9 +124,9 @@ an ideal situation, given that most conversion tools are throw-away Parallel Operation ------------------ -Like `git-push` or `git-fetch`, imports handled by fast-import are safe to +Like 'git-push' or 'git-fetch', imports handled by fast-import are safe to run alongside parallel `git repack -a -d` or `git gc` invocations, -or any other Git operation (including `git prune`, as loose objects +or any other Git operation (including 'git-prune', as loose objects are never used by fast-import). fast-import does not lock the branch or tag refs it is actively importing. @@ -220,7 +220,7 @@ variation in formatting will cause fast-import to reject the value. + An example value is ``Tue Feb 6 11:22:18 2007 -0500''. The Git parser is accurate, but a little on the lenient side. It is the -same parser used by linkgit:git-am[1] when applying patches +same parser used by 'git-am' when applying patches received from email. + Some malformed strings may be accepted as valid dates. In some of @@ -256,7 +256,7 @@ timezone. This particular format is supplied as its short to implement and may be useful to a process that wants to create a new commit right now, without needing to use a working directory or -linkgit:git-update-index[1]. +'git-update-index'. + If separate `author` and `committer` commands are used in a `commit` the timestamps may not match, as the system clock will be polled @@ -385,6 +385,9 @@ new commit. Omitting the `from` command in the first commit of a new branch will cause fast-import to create that commit with no ancestor. This tends to be desired only for the initial commit of a project. +If the frontend creates all files from scratch when making a new +branch, a `merge` command may be used instead of `from` to start +the commit with an empty tree. Omitting the `from` command on existing branches is usually desired, as the current commit on that branch is automatically assumed to be the first ancestor of the new commit. @@ -427,13 +430,15 @@ existing value of the branch. `merge` ^^^^^^^ -Includes one additional ancestor commit, and makes the current -commit a merge commit. An unlimited number of `merge` commands per +Includes one additional ancestor commit. If the `from` command is +omitted when creating a new branch, the first `merge` commit will be +the first ancestor of the current commit, and the branch will start +out with no files. An unlimited number of `merge` commands per commit are permitted by fast-import, thereby establishing an n-way merge. However Git's other tools never create commits with more than 15 additional ancestors (forming a 16-way merge). For this reason it is suggested that frontends do not use more than 15 `merge` -commands per commit. +commands per commit; 16, if starting a new, empty branch. Here `<committish>` is any of the commit specification expressions also accepted by `from` (see above). @@ -476,6 +481,9 @@ in octal. Git only supports the following modes: what you want. * `100755` or `755`: A normal, but executable, file. * `120000`: A symlink, the content of the file will be the link target. +* `160000`: A gitlink, SHA-1 of the object refers to a commit in + another repository. Git links can only be specified by SHA or through + a commit mark. They are used to implement submodules. In both formats `<path>` is the complete path of the file to be added (if not already existing) or modified (if already existing). @@ -649,7 +657,7 @@ recommended, as the frontend does not (easily) have access to the complete set of bytes which normally goes into such a signature. If signing is required, create lightweight tags from within fast-import with `reset`, then create the annotated versions of those tags offline -with the standard linkgit:git-tag[1] process. +with the standard 'git-tag' process. `reset` ~~~~~~~ @@ -798,13 +806,100 @@ Callers may wish to process the output through a tool such as sed to remove the leading part of the line, for example: ==== - frontend | git-fast-import | sed 's/^progress //' + frontend | git fast-import | sed 's/^progress //' ==== Placing a `progress` command immediately after a `checkpoint` will inform the reader when the `checkpoint` has been completed and it can safely access the refs that fast-import updated. +Crash Reports +------------- +If fast-import is supplied invalid input it will terminate with a +non-zero exit status and create a crash report in the top level of +the Git repository it was importing into. Crash reports contain +a snapshot of the internal fast-import state as well as the most +recent commands that lead up to the crash. + +All recent commands (including stream comments, file changes and +progress commands) are shown in the command history within the crash +report, but raw file data and commit messages are excluded from the +crash report. This exclusion saves space within the report file +and reduces the amount of buffering that fast-import must perform +during execution. + +After writing a crash report fast-import will close the current +packfile and export the marks table. This allows the frontend +developer to inspect the repository state and resume the import from +the point where it crashed. The modified branches and tags are not +updated during a crash, as the import did not complete successfully. +Branch and tag information can be found in the crash report and +must be applied manually if the update is needed. + +An example crash: + +==== + $ cat >in <<END_OF_INPUT + # my very first test commit + commit refs/heads/master + committer Shawn O. Pearce <spearce> 19283 -0400 + # who is that guy anyway? + data <<EOF + this is my commit + EOF + M 644 inline .gitignore + data <<EOF + .gitignore + EOF + M 777 inline bob + END_OF_INPUT + + $ git fast-import <in + fatal: Corrupt mode: M 777 inline bob + fast-import: dumping crash report to .git/fast_import_crash_8434 + + $ cat .git/fast_import_crash_8434 + fast-import crash report: + fast-import process: 8434 + parent process : 1391 + at Sat Sep 1 00:58:12 2007 + + fatal: Corrupt mode: M 777 inline bob + + Most Recent Commands Before Crash + --------------------------------- + # my very first test commit + commit refs/heads/master + committer Shawn O. Pearce <spearce> 19283 -0400 + # who is that guy anyway? + data <<EOF + M 644 inline .gitignore + data <<EOF + * M 777 inline bob + + Active Branch LRU + ----------------- + active_branches = 1 cur, 5 max + + pos clock name + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + 1) 0 refs/heads/master + + Inactive Branches + ----------------- + refs/heads/master: + status : active loaded dirty + tip commit : 0000000000000000000000000000000000000000 + old tree : 0000000000000000000000000000000000000000 + cur tree : 0000000000000000000000000000000000000000 + commit clock: 0 + last pack : + + + ------------------- + END OF CRASH REPORT +==== + Tips and Tricks --------------- The following tips and tricks have been collected from various @@ -863,7 +958,7 @@ is not `refs/heads/TAG_FIXUP`). When committing fixups, consider using `merge` to connect the commit(s) which are supplying file revisions to the fixup branch. -Doing so will allow tools such as linkgit:git-blame[1] to track +Doing so will allow tools such as 'git-blame' to track through the real commit history and properly annotate the source files. @@ -892,7 +987,7 @@ Repacking Historical Data ~~~~~~~~~~~~~~~~~~~~~~~~~ If you are repacking very old imported data (e.g. older than the last year), consider expending some extra CPU time and supplying -\--window=50 (or higher) when you run linkgit:git-repack[1]. +\--window=50 (or higher) when you run 'git-repack'. This will take longer, but will also produce a smaller packfile. You only need to expend the effort once, and everyone using your project will benefit from the smaller repository. @@ -1027,4 +1122,4 @@ Documentation by Shawn O. Pearce <spearce@spearce.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-fetch-pack.txt b/Documentation/git-fetch-pack.txt index 2b8ffe5324..47448da22e 100644 --- a/Documentation/git-fetch-pack.txt +++ b/Documentation/git-fetch-pack.txt @@ -8,14 +8,14 @@ git-fetch-pack - Receive missing objects from another repository SYNOPSIS -------- -'git-fetch-pack' [--all] [--quiet|-q] [--keep|-k] [--thin] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...] +'git fetch-pack' [--all] [--quiet|-q] [--keep|-k] [--thin] [--include-tag] [--upload-pack=<git-upload-pack>] [--depth=<n>] [--no-progress] [-v] [<host>:]<directory> [<refs>...] DESCRIPTION ----------- -Usually you would want to use linkgit:git-fetch[1] which is a -higher level wrapper of this command instead. +Usually you would want to use 'git-fetch', which is a +higher level wrapper of this command, instead. -Invokes 'git-upload-pack' on a potentially remote repository, +Invokes 'git-upload-pack' on a possibly remote repository and asks it to send objects missing from this repository, to update the named heads. The list of commits available locally is found out by scanning local $GIT_DIR/refs/ and sent to @@ -28,24 +28,32 @@ have a common ancestor commit. OPTIONS ------- -\--all:: +--all:: Fetch all remote refs. -\--quiet, \-q:: +-q:: +--quiet:: Pass '-q' flag to 'git-unpack-objects'; this makes the cloning process less verbose. -\--keep, \-k:: +-k:: +--keep:: Do not invoke 'git-unpack-objects' on received data, but create a single packfile out of it instead, and store it in the object database. If provided twice then the pack is locked against repacking. -\--thin:: +--thin:: Spend extra cycles to minimize the number of objects to be sent. Use it on slower connection. -\--upload-pack=<git-upload-pack>:: +--include-tag:: + If the remote side supports it, annotated tags objects will + be downloaded on the same connection as the other objects if + the object the tag references is downloaded. The caller must + otherwise determine the tags this option made available. + +--upload-pack=<git-upload-pack>:: Use this to specify the path to 'git-upload-pack' on the remote side, if is not found on your $PATH. Installations of sshd ignores the user's environment @@ -57,16 +65,16 @@ OPTIONS shells by having a lean .bashrc file (they set most of the things up in .bash_profile). -\--exec=<git-upload-pack>:: +--exec=<git-upload-pack>:: Same as \--upload-pack=<git-upload-pack>. -\--depth=<n>:: +--depth=<n>:: Limit fetching to ancestor-chains not longer than n. -\--no-progress:: +--no-progress:: Do not show the progress. -\-v:: +-v:: Run verbosely. <host>:: @@ -93,4 +101,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-fetch.txt b/Documentation/git-fetch.txt index d982f961fc..d3164c5c88 100644 --- a/Documentation/git-fetch.txt +++ b/Documentation/git-fetch.txt @@ -8,7 +8,7 @@ git-fetch - Download objects and refs from another repository SYNOPSIS -------- -'git-fetch' <options> <repository> <refspec>... +'git fetch' <options> <repository> <refspec>... DESCRIPTION @@ -18,7 +18,7 @@ the objects necessary to complete them. The ref names and their object names of fetched refs are stored in `.git/FETCH_HEAD`. This information is left for a later merge -operation done by "git merge". +operation done by 'git-merge'. When <refspec> stores the fetched result in tracking branches, the tags that point at these branches are automatically @@ -45,7 +45,7 @@ linkgit:git-pull[1] Author ------ Written by Linus Torvalds <torvalds@osdl.org> and -Junio C Hamano <junkio@cox.net> +Junio C Hamano <gitster@pobox.com> Documentation ------------- @@ -53,4 +53,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt index e22dfa5803..b0e710d5f9 100644 --- a/Documentation/git-filter-branch.txt +++ b/Documentation/git-filter-branch.txt @@ -8,12 +8,12 @@ git-filter-branch - Rewrite branches SYNOPSIS -------- [verse] -'git-filter-branch' [--env-filter <command>] [--tree-filter <command>] +'git filter-branch' [--env-filter <command>] [--tree-filter <command>] [--index-filter <command>] [--parent-filter <command>] [--msg-filter <command>] [--commit-filter <command>] [--tag-name-filter <command>] [--subdirectory-filter <directory>] [--original <namespace>] [-d <directory>] [-f | --force] - [<rev-list options>...] + [--] [<rev-list options>...] DESCRIPTION ----------- @@ -25,7 +25,7 @@ Otherwise, all information (including original commit times or merge information) will be preserved. The command will only rewrite the _positive_ refs mentioned in the -command line (i.e. if you pass 'a..b', only 'b' will be rewritten). +command line (e.g. if you pass 'a..b', only 'b' will be rewritten). If you specify no filters, the commits will be recommitted without any changes, which would normally have no effect. Nevertheless, this may be useful in the future for compensating for some git bugs or such, @@ -42,7 +42,7 @@ Always verify that the rewritten version is correct: The original refs, if different from the rewritten ones, will be stored in the namespace 'refs/original/'. -Note that since this operation is extensively I/O expensive, it might +Note that since this operation is very I/O expensive, it might be a good idea to redirect the temporary directory off-disk with the '-d' option, e.g. on tmpfs. Reportedly the speedup is very noticeable. @@ -51,12 +51,15 @@ Filters ~~~~~~~ The filters are applied in the order as listed below. The <command> -argument is always evaluated in shell using the 'eval' command (with the -notable exception of the commit filter, for technical reasons). +argument is always evaluated in the shell context using the 'eval' command +(with the notable exception of the commit filter, for technical reasons). Prior to that, the $GIT_COMMIT environment variable will be set to contain the id of the commit being rewritten. Also, GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL, -and GIT_COMMITTER_DATE are set according to the current commit. +and GIT_COMMITTER_DATE are set according to the current commit. The values +of these variables after the filters have run, are used for the new commit. +If any evaluation of <command> returns a non-zero exit status, the whole +operation will be aborted. A 'map' function is available that takes an "original sha1 id" argument and outputs a "rewritten sha1 id" if the commit has been already @@ -69,9 +72,9 @@ OPTIONS ------- --env-filter <command>:: - This is the filter for modifying the environment in which - the commit will be performed. Specifically, you might want - to rewrite the author/committer name/email/time environment + This filter may be used if you only need to modify the environment + in which the commit will be performed. Specifically, you might + want to rewrite the author/committer name/email/time environment variables (see linkgit:git-commit[1] for details). Do not forget to re-export the variables. @@ -92,7 +95,7 @@ OPTIONS This is the filter for rewriting the commit's parent list. It will receive the parent string on stdin and shall output the new parent string on stdout. The parent string is in - a format accepted by linkgit:git-commit-tree[1]: empty for + the format described in linkgit:git-commit-tree[1]: empty for the initial commit, "-p parent" for a normal commit and "-p parent1 -p parent2 -p parent3 ..." for a merge commit. @@ -105,18 +108,18 @@ OPTIONS --commit-filter <command>:: This is the filter for performing the commit. If this filter is specified, it will be called instead of the - linkgit:git-commit-tree[1] command, with arguments of the form + 'git-commit-tree' command, with arguments of the form "<TREE_ID> [-p <PARENT_COMMIT_ID>]..." and the log message on stdin. The commit id is expected on stdout. + As a special extension, the commit filter may emit multiple -commit ids; in that case, ancestors of the original commit will +commit ids; in that case, the rewritten children of the original commit will have all of them as parents. + You can use the 'map' convenience function in this filter, and other convenience functions, too. For example, calling 'skip_commit "$@"' will leave out the current commit (but not its changes! If you want -that, use linkgit:git-rebase[1] instead). +that, use 'git-rebase' instead). --tag-name-filter <command>:: This is the filter for rewriting tag names. When passed, @@ -130,10 +133,16 @@ use "--tag-name-filter cat" to simply update the tags. In this case, be very careful and make sure you have the old tags backed up in case the conversion has run afoul. + -Note that there is currently no support for proper rewriting of -tag objects; in layman terms, if the tag has a message or signature -attached, the rewritten tag won't have it. Sorry. (It is by -definition impossible to preserve signatures at any rate.) +Nearly proper rewriting of tag objects is supported. If the tag has +a message attached, a new tag object will be created with the same message, +author, and timestamp. If the tag has a signature attached, the +signature will be stripped. It is by definition impossible to preserve +signatures. The reason this is "nearly" proper, is because ideally if +the tag did not change (points to the same object, has the same name, etc.) +it should retain any signature. That is not the case, signatures will always +be removed, buyer beware. There is also no support for changing the +author or timestamp (or the tag message for that matter). Tags which point +to other tags will be rewritten to point to the underlying commit. --subdirectory-filter <directory>:: Only look at the history which touches the given subdirectory. @@ -147,21 +156,22 @@ definition impossible to preserve signatures at any rate.) -d <directory>:: Use this option to set the path to the temporary directory used for rewriting. When applying a tree filter, the command needs to - temporary checkout the tree to some directory, which may consume + temporarily check out the tree to some directory, which may consume considerable space in case of large projects. By default it does this in the '.git-rewrite/' directory but you can override that choice by this parameter. --f|--force:: - `git filter-branch` refuses to start with an existing temporary +-f:: +--force:: + 'git-filter-branch' refuses to start with an existing temporary directory or when there are already refs starting with 'refs/original/', unless forced. -<rev-list-options>:: - When options are given after the new branch name, they will - be passed to linkgit:git-rev-list[1]. Only commits in the resulting - output will be filtered, although the filtered commits can still - reference parents which are outside of that set. +<rev-list options>...:: + Arguments for 'git-rev-list'. All positive refs included by + these options are rewritten. You may also specify options + such as '--all', but you must use '--' to separate them from + the 'git-filter-branch' options. Examples @@ -174,14 +184,29 @@ or copyright violation) from all commits: git filter-branch --tree-filter 'rm filename' HEAD ------------------------------------------------------- +However, if the file is absent from the tree of some commit, +a simple `rm filename` will fail for that tree and commit. +Thus you may instead want to use `rm -f filename` as the script. + A significantly faster version: -------------------------------------------------------------------------- -git filter-branch --index-filter 'git update-index --remove filename' HEAD +git filter-branch --index-filter 'git rm --cached filename' HEAD -------------------------------------------------------------------------- Now, you will get the rewritten history saved in HEAD. +To rewrite the repository to look as if `foodir/` had been its project +root, and discard all other history: + +------------------------------------------------------- +git filter-branch --subdirectory-filter foodir -- --all +------------------------------------------------------- + +Thus you can, e.g., turn a library subdirectory into a repository of +its own. Note the `\--` that separates 'filter-branch' options from +revision options, and the `\--all` to rewrite all branches and tags. + To set a commit (which typically is at the tip of another history) to be the parent of the current initial commit, in order to paste the other history behind the current history: @@ -197,7 +222,7 @@ happened). If this is not the case, use: -------------------------------------------------------------------------- git filter-branch --parent-filter \ - 'cat; test $GIT_COMMIT = <commit-id> && echo "-p <graft-id>"' HEAD + 'test $GIT_COMMIT = <commit-id> && echo "-p <graft-id>" || cat' HEAD -------------------------------------------------------------------------- or even simpler: @@ -240,16 +265,25 @@ committed a merge between P1 and P2, it will be propagated properly and all children of the merge will become merge commits with P1,P2 as their parents instead of the merge commit. +You can rewrite the commit log messages using `--msg-filter`. For +example, 'git-svn-id' strings in a repository created by 'git-svn' can +be removed this way: + +------------------------------------------------------- +git filter-branch --msg-filter ' + sed -e "/^git-svn-id:/d" +' +------------------------------------------------------- To restrict rewriting to only part of the history, specify a revision range in addition to the new branch name. The new branch name will -point to the top-most revision that a 'git rev-list' of this range +point to the top-most revision that a 'git-rev-list' of this range will print. *NOTE* the changes introduced by the commits, and which are not reverted by subsequent commits, will still be in the rewritten branch. If you want to throw out _changes_ together with the commits, you should use the -interactive mode of linkgit:git-rebase[1]. +interactive mode of 'git-rebase'. Consider this history: @@ -295,4 +329,4 @@ Documentation by Petr Baudis and the git list. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-fmt-merge-msg.txt b/Documentation/git-fmt-merge-msg.txt index 8615ae353e..1c24796d66 100644 --- a/Documentation/git-fmt-merge-msg.txt +++ b/Documentation/git-fmt-merge-msg.txt @@ -9,41 +9,51 @@ git-fmt-merge-msg - Produce a merge commit message SYNOPSIS -------- [verse] -git-fmt-merge-msg [--summary | --no-summary] <$GIT_DIR/FETCH_HEAD -git-fmt-merge-msg [--summary | --no-summary] -F <file> +'git fmt-merge-msg' [--log | --no-log] <$GIT_DIR/FETCH_HEAD +'git fmt-merge-msg' [--log | --no-log] -F <file> DESCRIPTION ----------- Takes the list of merged objects on stdin and produces a suitable commit message to be used for the merge commit, usually to be -passed as the '<merge-message>' argument of `git-merge`. +passed as the '<merge-message>' argument of 'git-merge'. This script is intended mostly for internal use by scripts -automatically invoking `git-merge`. +automatically invoking 'git-merge'. OPTIONS ------- ---summary:: +--log:: In addition to branch names, populate the log message with one-line descriptions from the actual commits that are being merged. ---no-summary:: +--no-log:: Do not list one-line descriptions from the actual commits being merged. ---file <file>, -F <file>:: +--summary:: +--no-summary:: + Synonyms to --log and --no-log; these are deprecated and will be + removed in the future. + +-F <file>:: +--file <file>:: Take the list of merged objects from <file> instead of stdin. CONFIGURATION ------------- -merge.summary:: +merge.log:: Whether to include summaries of merged commits in newly merge commit messages. False by default. +merge.summary:: + Synonym to `merge.log`; this is deprecated and will be removed in + the future. + SEE ALSO -------- linkgit:git-merge[1] @@ -51,7 +61,7 @@ linkgit:git-merge[1] Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -59,4 +69,4 @@ Documentation by Petr Baudis, Junio C Hamano and the git-list <git@vger.kernel.o GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-for-each-ref.txt b/Documentation/git-for-each-ref.txt index f1f90cca62..eae6c0e7bc 100644 --- a/Documentation/git-for-each-ref.txt +++ b/Documentation/git-for-each-ref.txt @@ -8,9 +8,8 @@ git-for-each-ref - Output information on each ref SYNOPSIS -------- [verse] -'git-for-each-ref' [--count=<count>]\* - [--shell|--perl|--python|--tcl] - [--sort=<key>]\* [--format=<format>] [<pattern>] +'git for-each-ref' [--count=<count>] [--shell|--perl|--python|--tcl] + [--sort=<key>]\* [--format=<format>] [<pattern>...] DESCRIPTION ----------- @@ -32,8 +31,9 @@ OPTIONS <key>:: A field name to sort on. Prefix `-` to sort in descending order of the value. When unspecified, - `refname` is used. More than one sort keys can be - given. + `refname` is used. You may use the --sort=<key> option + multiple times, in which case the last key becomes the primary + key. <format>:: A string that interpolates `%(fieldname)` from the @@ -47,12 +47,16 @@ OPTIONS `xx`; for example `%00` interpolates to `\0` (NUL), `%09` to `\t` (TAB) and `%0a` to `\n` (LF). -<pattern>:: - If given, the name of the ref is matched against this - using fnmatch(3). Refs that do not match the pattern - are not shown. +<pattern>...:: + If one or more patterns are given, only refs are shown that + match against at least one pattern, either using fnmatch(3) or + literally, in the latter case matching completely or from the + beginning up to a slash. ---shell, --perl, --python, --tcl:: +--shell:: +--perl:: +--python:: +--tcl:: If given, strings that substitute `%(fieldname)` placeholders are quoted as string literals suitable for the specified host language. This is meant to produce @@ -75,7 +79,7 @@ objecttype:: The type of the object (`blob`, `tree`, `commit`, `tag`). objectsize:: - The size of the object (the same as `git-cat-file -s` reports). + The size of the object (the same as 'git-cat-file -s' reports). objectname:: The object name (aka SHA-1). @@ -115,7 +119,7 @@ An example directly producing formatted text. Show the most recent ------------ #!/bin/sh -git-for-each-ref --count=3 --sort='-*authordate' \ +git for-each-ref --count=3 --sort='-*authordate' \ --format='From: %(*authorname) %(*authoremail) Subject: %(*subject) Date: %(*authordate) @@ -131,7 +135,7 @@ demonstrating the use of --shell. List the prefixes of all heads:: ------------ #!/bin/sh -git-for-each-ref --shell --format="ref=%(refname)" refs/heads | \ +git for-each-ref --shell --format="ref=%(refname)" refs/heads | \ while read entry do eval "$entry" @@ -185,7 +189,7 @@ Its message reads as: fi ' -eval=`git-for-each-ref --shell --format="$fmt" \ +eval=`git for-each-ref --shell --format="$fmt" \ --sort='*objecttype' \ --sort=-taggerdate \ refs/tags` diff --git a/Documentation/git-format-patch.txt b/Documentation/git-format-patch.txt index 651efe6ca1..adb4ea7b1b 100644 --- a/Documentation/git-format-patch.txt +++ b/Documentation/git-format-patch.txt @@ -9,14 +9,16 @@ git-format-patch - Prepare patches for e-mail submission SYNOPSIS -------- [verse] -'git-format-patch' [-k] [-o <dir> | --stdout] [--thread] - [--attach[=<boundary>] | --inline[=<boundary>]] - [-s | --signoff] [<common diff options>] - [-n | --numbered | -N | --no-numbered] - [--start-number <n>] [--numbered-files] - [--in-reply-to=Message-Id] [--suffix=.<sfx>] - [--ignore-if-in-upstream] - [--subject-prefix=Subject-Prefix] +'git format-patch' [-k] [-o <dir> | --stdout] [--thread] + [--attach[=<boundary>] | --inline[=<boundary>]] + [-s | --signoff] [<common diff options>] + [-n | --numbered | -N | --no-numbered] + [--start-number <n>] [--numbered-files] + [--in-reply-to=Message-Id] [--suffix=.<sfx>] + [--ignore-if-in-upstream] + [--subject-prefix=Subject-Prefix] + [--cc=<email>] + [--cover-letter] [ <since> | <revision range> ] DESCRIPTION @@ -25,7 +27,7 @@ DESCRIPTION Prepare each commit with its patch in one file per commit, formatted to resemble UNIX mailbox format. The output of this command is convenient for e-mail submission or -for use with linkgit:git-am[1]. +for use with 'git-am'. There are two ways to specify which commits to operate on. @@ -59,7 +61,7 @@ they are created in the current working directory. If -n is specified, instead of "[PATCH] Subject", the first line is formatted as "[PATCH n/m] Subject". -If given --thread, git-format-patch will generate In-Reply-To and +If given --thread, 'git-format-patch' will generate In-Reply-To and References headers to make the second and subsequent patch mails appear as replies to the first mail; this also generates a Message-Id header to reference. @@ -72,14 +74,17 @@ include::diff-options.txt[] -<n>:: Limits the number of patches to prepare. --o|--output-directory <dir>:: +-o <dir>:: +--output-directory <dir>:: Use <dir> to store the resulting files, instead of the current working directory. --n|--numbered:: +-n:: +--numbered:: Name output in '[PATCH n/m]' format. --N|--no-numbered:: +-N:: +--no-numbered:: Name output in '[PATCH]' format. --start-number <n>:: @@ -90,11 +95,13 @@ include::diff-options.txt[] without the default first line of the commit appended. Mutually exclusive with the --stdout option. --k|--keep-subject:: +-k:: +--keep-subject:: Do not strip/add '[PATCH]' from the first line of the commit log message. --s|--signoff:: +-s:: +--signoff:: Add `Signed-off-by:` line to the commit message, using the committer identity of yourself. @@ -135,6 +142,15 @@ include::diff-options.txt[] allows for useful naming of a patch series, and can be combined with the --numbered option. +--cc=<email>:: + Add a "Cc:" header to the email headers. This is in addition + to any configured headers, and may be used multiple times. + +--cover-letter:: + In addition to the patches, generate a cover letter file + containing the shortlog and the overall diffstat. You can + fill in a description in the file before sending it out. + --suffix=.<sfx>:: Instead of using `.patch` as the suffix for generated filenames, use specified suffix. A common alternative is @@ -145,6 +161,12 @@ want a filename like `0001-description-of-my-change.patch`, and the first letter does not have to be a dot. Leaving it empty would not add any suffix. +--no-binary:: + Don't output contents of changes in binary files, just take note + that they differ. Note that this disable the patch to be properly + applied. By default the contents of changes in those files are + encoded in the patch. + CONFIGURATION ------------- You can specify extra mail header lines to be added to each message @@ -153,51 +175,67 @@ and file suffix, and number patches when outputting more than one. ------------ [format] - headers = "Organization: git-foo\n" - subjectprefix = CHANGE - suffix = .txt - numbered = auto + headers = "Organization: git-foo\n" + subjectprefix = CHANGE + suffix = .txt + numbered = auto + cc = <email> ------------ EXAMPLES -------- -git-format-patch -k --stdout R1..R2 | git-am -3 -k:: - Extract commits between revisions R1 and R2, and apply - them on top of the current branch using `git-am` to - cherry-pick them. - -git-format-patch origin:: - Extract all commits which are in the current branch but - not in the origin branch. For each commit a separate file - is created in the current directory. - -git-format-patch \--root origin:: - Extract all commits that lead to 'origin' since the - inception of the project. - -git-format-patch -M -B origin:: - The same as the previous one. Additionally, it detects - and handles renames and complete rewrites intelligently to - produce a renaming patch. A renaming patch reduces the - amount of text output, and generally makes it easier to - review it. Note that the "patch" program does not - understand renaming patches, so use it only when you know - the recipient uses git to apply your patch. - -git-format-patch -3:: - Extract three topmost commits from the current branch - and format them as e-mailable patches. - -See Also +* Extract commits between revisions R1 and R2, and apply them on top of +the current branch using 'git-am' to cherry-pick them: ++ +------------ +$ git format-patch -k --stdout R1..R2 | git am -3 -k +------------ + +* Extract all commits which are in the current branch but not in the +origin branch: ++ +------------ +$ git format-patch origin +------------ ++ +For each commit a separate file is created in the current directory. + +* Extract all commits that lead to 'origin' since the inception of the +project: ++ +------------ +$ git format-patch --root origin +------------ + +* The same as the previous one: ++ +------------ +$ git format-patch -M -B origin +------------ ++ +Additionally, it detects and handles renames and complete rewrites +intelligently to produce a renaming patch. A renaming patch reduces +the amount of text output, and generally makes it easier to review it. +Note that the "patch" program does not understand renaming patches, so +use it only when you know the recipient uses git to apply your patch. + +* Extract three topmost commits from the current branch and format them +as e-mailable patches: ++ +------------ +$ git format-patch -3 +------------ + +SEE ALSO -------- linkgit:git-am[1], linkgit:git-send-email[1] Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -205,4 +243,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-fsck-objects.txt b/Documentation/git-fsck-objects.txt index 6e9f717642..965a8279c1 100644 --- a/Documentation/git-fsck-objects.txt +++ b/Documentation/git-fsck-objects.txt @@ -8,7 +8,7 @@ git-fsck-objects - Verifies the connectivity and validity of the objects in the SYNOPSIS -------- -'git-fsck-objects' ... +'git fsck-objects' ... DESCRIPTION ----------- diff --git a/Documentation/git-fsck.txt b/Documentation/git-fsck.txt index f16cb98612..d5a7647219 100644 --- a/Documentation/git-fsck.txt +++ b/Documentation/git-fsck.txt @@ -9,7 +9,7 @@ git-fsck - Verifies the connectivity and validity of the objects in the database SYNOPSIS -------- [verse] -'git-fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs] +'git fsck' [--tags] [--root] [--unreachable] [--cache] [--no-reflogs] [--full] [--strict] [--verbose] [--lost-found] [<object>*] DESCRIPTION @@ -21,8 +21,9 @@ OPTIONS <object>:: An object to treat as the head of an unreachability trace. + -If no objects are given, git-fsck defaults to using the -index file and all SHA1 references in .git/refs/* as heads. +If no objects are given, 'git-fsck' defaults to using the +index file, all SHA1 references in .git/refs/*, and all reflogs (unless +--no-reflogs is given) as heads. --unreachable:: Print out objects that exist but that aren't readable from any @@ -78,15 +79,15 @@ that aren't readable from any of the specified head nodes. So for example - git-fsck --unreachable HEAD $(cat .git/refs/heads/*) + git fsck --unreachable HEAD $(cat .git/refs/heads/*) will do quite a _lot_ of verification on the tree. There are a few extra validity tests to be added (make sure that tree objects are -sorted properly etc), but on the whole if "git-fsck" is happy, you +sorted properly etc), but on the whole if 'git-fsck' is happy, you do have a valid tree. Any corrupt objects you will have to find in backups or other archives -(i.e., you can just remove them and do an "rsync" with some other site in +(i.e., you can just remove them and do an 'rsync' with some other site in the hopes that somebody else has the object you have corrupted). Of course, "valid tree" doesn't mean that it wasn't generated by some @@ -150,4 +151,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-gc.txt b/Documentation/git-gc.txt index 4b2dfefa6a..7086eea74a 100644 --- a/Documentation/git-gc.txt +++ b/Documentation/git-gc.txt @@ -8,44 +8,40 @@ git-gc - Cleanup unnecessary files and optimize the local repository SYNOPSIS -------- -'git-gc' [--prune] [--aggressive] [--auto] +'git gc' [--aggressive] [--auto] [--quiet] DESCRIPTION ----------- Runs a number of housekeeping tasks within the current repository, such as compressing file revisions (to reduce disk space and increase performance) and removing unreachable objects which may have been -created from prior invocations of linkgit:git-add[1]. +created from prior invocations of 'git-add'. Users are encouraged to run this task on a regular basis within each repository to maintain good disk space utilization and good -operating performance. Some git commands may automatically run -`git-gc`; see the `--auto` flag below for details. +operating performance. + +Some git commands may automatically run 'git-gc'; see the `--auto` flag +below for details. If you know what you're doing and all you want is to +disable this behavior permanently without further considerations, just do: + +---------------------- +$ git config --global gc.auto 0 +---------------------- OPTIONS ------- ---prune:: - Usually `git-gc` packs refs, expires old reflog entries, - packs loose objects, - and removes old 'rerere' records. Removal - of unreferenced loose objects is an unsafe operation - while other git operations are in progress, so it is not - done by default. Pass this option if you want it, and only - when you know nobody else is creating new objects in the - repository at the same time (e.g. never use this option - in a cron script). - --aggressive:: Usually 'git-gc' runs very quickly while providing good disk space utilization and performance. This option will cause - git-gc to more aggressively optimize the repository at the expense + 'git-gc' to more aggressively optimize the repository at the expense of taking much more time. The effects of this optimization are persistent, so this option only needs to be used occasionally; every few hundred changesets or so. --auto:: - With this option, `git gc` checks whether any housekeeping is + With this option, 'git-gc' checks whether any housekeeping is required; if not, it exits without performing any work. Some git commands run `git gc --auto` after performing operations that could create many loose objects. @@ -54,15 +50,18 @@ Housekeeping is required if there are too many loose objects or too many packs in the repository. If the number of loose objects exceeds the value of the `gc.auto` configuration variable, then all loose objects are combined into a single pack using -`git-repack -d -l`. Setting the value of `gc.auto` to 0 +'git-repack -d -l'. Setting the value of `gc.auto` to 0 disables automatic packing of loose objects. + If the number of packs exceeds the value of `gc.autopacklimit`, then existing packs (except those marked with a `.keep` file) are consolidated into a single pack by using the `-A` option of -`git-repack`. Setting `gc.autopacklimit` to 0 disables +'git-repack'. Setting `gc.autopacklimit` to 0 disables automatic consolidation of packs. +--quiet:: + Suppress all progress reports. + Configuration ------------- @@ -90,7 +89,7 @@ how long records of conflicted merge you have not resolved are kept. This defaults to 15 days. The optional configuration variable 'gc.packrefs' determines if -`git gc` runs `git-pack-refs`. This can be set to "nobare" to enable +'git-gc' runs 'git-pack-refs'. This can be set to "nobare" to enable it within all non-bare repos or it can be set to a boolean value. This defaults to true. @@ -101,7 +100,26 @@ the value, the more time is spent optimizing the delta compression. See the documentation for the --window' option in linkgit:git-repack[1] for more details. This defaults to 10. -See Also +The optional configuration variable 'gc.pruneExpire' controls how old +the unreferenced loose objects have to be before they are pruned. The +default is "2 weeks ago". + + +Notes +----- + +'git-gc' tries very hard to be safe about the garbage it collects. In +particular, it will keep not only objects referenced by your current set +of branches and tags, but also objects referenced by the index, remote +tracking branches, refs saved by 'git-filter-branch' in +refs/original/, or reflogs (which may references commits in branches +that were later amended or rewound). + +If you are expecting some objects to be collected and they aren't, check +all of those locations and decide whether it makes sense in your case to +remove those references. + +SEE ALSO -------- linkgit:git-prune[1] linkgit:git-reflog[1] @@ -114,4 +132,4 @@ Written by Shawn O. Pearce <spearce@spearce.org> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-get-tar-commit-id.txt b/Documentation/git-get-tar-commit-id.txt index dea41490c4..84f23ee525 100644 --- a/Documentation/git-get-tar-commit-id.txt +++ b/Documentation/git-get-tar-commit-id.txt @@ -8,18 +8,18 @@ git-get-tar-commit-id - Extract commit ID from an archive created using git-arch SYNOPSIS -------- -'git-get-tar-commit-id' < <tarfile> +'git get-tar-commit-id' < <tarfile> DESCRIPTION ----------- Acts as a filter, extracting the commit ID stored in archives created by -linkgit:git-archive[1]. It reads only the first 1024 bytes of input, thus its +'git-archive'. It reads only the first 1024 bytes of input, thus its runtime is not influenced by the size of <tarfile> very much. -If no commit ID is found, git-get-tar-commit-id quietly exists with a +If no commit ID is found, 'git-get-tar-commit-id' quietly exists with a return code of 1. This can happen if <tarfile> had not been created -using git-archive or if the first parameter of git-archive had been +using 'git-archive' or if the first parameter of 'git-archive' had been a tree ID instead of a commit ID or tag. @@ -33,4 +33,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-grep.txt b/Documentation/git-grep.txt index f3cb24f252..fa4d133c1b 100644 --- a/Documentation/git-grep.txt +++ b/Documentation/git-grep.txt @@ -9,7 +9,7 @@ git-grep - Print lines matching a pattern SYNOPSIS -------- [verse] -'git-grep' [--cached] +'git grep' [--cached] [-a | --text] [-I] [-i | --ignore-case] [-w | --word-regexp] [-v | --invert-match] [-h|-H] [--full-name] [-E | --extended-regexp] [-G | --basic-regexp] @@ -33,25 +33,30 @@ OPTIONS Instead of searching in the working tree files, check the blobs registered in the index file. --a | --text:: +-a:: +--text:: Process binary files as if they were text. --i | --ignore-case:: +-i:: +--ignore-case:: Ignore case differences between the patterns and the files. -I:: Don't match the pattern in binary files. --w | --word-regexp:: +-w:: +--word-regexp:: Match the pattern only at word boundary (either begin at the beginning of a line, or preceded by a non-word character; end at the end of a line or followed by a non-word character). --v | --invert-match:: +-v:: +--invert-match:: Select non-matching lines. --h | -H:: +-h:: +-H:: By default, the command shows the filename for each match. `-h` option is used to suppress this output. `-H` is there for completeness and does not do anything @@ -64,22 +69,33 @@ OPTIONS option forces paths to be output relative to the project top directory. --E | --extended-regexp | -G | --basic-regexp:: +-E:: +--extended-regexp:: +-G:: +--basic-regexp:: Use POSIX extended/basic regexp for patterns. Default is to use basic regexp. --F | --fixed-strings:: +-F:: +--fixed-strings:: Use fixed strings for patterns (don't interpret pattern as a regex). -n:: Prefix the line number to matching lines. --l | --files-with-matches | -L | --files-without-match:: +-l:: +--files-with-matches:: +--name-only:: +-L:: +--files-without-match:: Instead of showing every matched line, show only the names of files that contain (or do not contain) matches. + For better compatibility with 'git-diff', --name-only is a + synonym for --files-with-matches. --c | --count:: +-c:: +--count:: Instead of showing every matched line, show the number of lines that match. @@ -101,7 +117,10 @@ OPTIONS scripts passing user input to grep. Multiple patterns are combined by 'or'. ---and | --or | --not | ( | ):: +--and:: +--or:: +--not:: +( ... ):: Specify how multiple patterns are combined using Boolean expressions. `--or` is the default operator. `--and` has higher precedence than `--or`. `-e` has to be used for all @@ -143,4 +162,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-gui.txt b/Documentation/git-gui.txt index 6d6cd5d87c..0e650f497b 100644 --- a/Documentation/git-gui.txt +++ b/Documentation/git-gui.txt @@ -11,19 +11,19 @@ SYNOPSIS DESCRIPTION ----------- -A Tcl/Tk based graphical user interface to Git. git-gui focuses +A Tcl/Tk based graphical user interface to Git. 'git-gui' focuses on allowing users to make changes to their repository by making new commits, amending existing ones, creating branches, performing local merges, and fetching/pushing to remote repositories. -Unlike linkgit:gitk[1], git-gui focuses on commit generation -and single file annotation, and does not show project history. -It does however supply menu actions to start a gitk session from -within git-gui. +Unlike 'gitk', 'git-gui' focuses on commit generation +and single file annotation and does not show project history. +It does however supply menu actions to start a 'gitk' session from +within 'git-gui'. -git-gui is known to work on all popular UNIX systems, Mac OS X, +'git-gui' is known to work on all popular UNIX systems, Mac OS X, and Windows (under both Cygwin and MSYS). To the extent possible -OS specific user interface guidelines are followed, making git-gui +OS specific user interface guidelines are followed, making 'git-gui' a fairly native interface for users. COMMANDS @@ -34,17 +34,17 @@ blame:: browser:: Start a tree browser showing all files in the specified - commit (or 'HEAD' by default). Files selected through the + commit (or 'HEAD' by default). Files selected through the browser are opened in the blame viewer. citool:: - Start git-gui and arrange to make exactly one commit before + Start 'git-gui' and arrange to make exactly one commit before exiting and returning to the shell. The interface is limited to only commit actions, slightly reducing the application's startup time and simplifying the menubar. version:: - Display the currently running version of git-gui. + Display the currently running version of 'git-gui'. Examples @@ -61,7 +61,7 @@ git gui blame Makefile:: git gui blame v0.99.8 Makefile:: Show the contents of 'Makefile' in revision 'v0.99.8' - and provide annotations for each line. Unlike the above + and provide annotations for each line. Unlike the above example the file is read from the object database and not the working directory. @@ -71,7 +71,7 @@ git gui citool:: git citool:: - Same as 'git gui citool' (above). + Same as `git gui citool` (above). git gui browser maint:: @@ -79,20 +79,20 @@ git gui browser maint:: selected in the browser can be viewed with the internal blame viewer. -See Also +SEE ALSO -------- -'gitk(1)':: +linkgit:gitk[1]:: The git repository browser. Shows branches, commit history and file differences. gitk is the utility started by - git-gui's Repository Visualize actions. + 'git-gui''s Repository Visualize actions. Other ----- -git-gui is actually maintained as an independent project, but stable +'git-gui' is actually maintained as an independent project, but stable versions are distributed as part of the Git suite for the convenience of end users. -A git-gui development repository can be obtained from: +A 'git-gui' development repository can be obtained from: git clone git://repo.or.cz/git-gui.git @@ -112,4 +112,4 @@ Documentation by Shawn O. Pearce <spearce@spearce.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-hash-object.txt b/Documentation/git-hash-object.txt index 33030c022f..ac928e198e 100644 --- a/Documentation/git-hash-object.txt +++ b/Documentation/git-hash-object.txt @@ -8,7 +8,7 @@ git-hash-object - Compute object ID and optionally creates a blob from a file SYNOPSIS -------- -'git-hash-object' [-t <type>] [-w] [--stdin] [--] <file>... +'git hash-object' [-t <type>] [-w] [--stdin | --stdin-paths] [--] <file>... DESCRIPTION ----------- @@ -16,7 +16,7 @@ Computes the object ID value for an object with specified type with the contents of the named file (which can be outside of the work tree), and optionally writes the resulting object into the object database. Reports its object ID to its standard output. -This is used by "git-cvsimport" to update the index +This is used by 'git-cvsimport' to update the index without modifying files in the work tree. When <type> is not specified, it defaults to "blob". @@ -32,9 +32,12 @@ OPTIONS --stdin:: Read the object from standard input instead of from a file. +--stdin-paths:: + Read file names from stdin instead of from the command-line. + Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -42,4 +45,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-help.txt b/Documentation/git-help.txt index 09904c75c4..f414583fc4 100644 --- a/Documentation/git-help.txt +++ b/Documentation/git-help.txt @@ -23,45 +23,48 @@ If a git command is named, a manual page for that command is brought up. The 'man' program is used by default for this purpose, but this can be overridden by other options or configuration variables. -Note that 'git --help ...' is identical as 'git help ...' because the +Note that `git --help ...` is identical to `git help ...` because the former is internally converted into the latter. OPTIONS ------- --a|--all:: +-a:: +--all:: Prints all the available commands on the standard output. This option supersedes any other option. --i|--info:: - Use the 'info' program to display the manual page, instead of - the 'man' program that is used by default. +-i:: +--info:: + Display manual page for the command in the 'info' format. The + 'info' program will be used for that purpose. --m|--man:: - Use the 'man' program to display the manual page. This may be - used to override a value set in the 'help.format' - configuration variable. - --w|--web:: - Use a web browser to display the HTML manual page, instead of - the 'man' program that is used by default. +-m:: +--man:: + Display manual page for the command in the 'man' format. This + option may be used to override a value set in the + 'help.format' configuration variable. ++ +By default the 'man' program will be used to display the manual page, +but the 'man.viewer' configuration variable may be used to choose +other display programs (see below). + +-w:: +--web:: + Display manual page for the command in the 'web' (HTML) + format. A web browser will be used for that purpose. + The web browser can be specified using the configuration variable 'help.browser', or 'web.browser' if the former is not set. If none of -these config variables is set, the 'git-help--browse' helper script -(called by 'git-help') will pick a suitable default. -+ -You can explicitly provide a full path to your preferred browser by -setting the configuration variable 'browser.<tool>.path'. For example, -you can configure the absolute path to firefox by setting -'browser.firefox.path'. Otherwise, 'git-help--browse' assumes the tool -is available in PATH. -+ -Note that the script tries, as much as possible, to display the HTML -page in a new tab on an already opened browser. +these config variables is set, the 'git-web--browse' helper script +(called by 'git-help') will pick a suitable default. See +linkgit:git-web--browse[1] for more information about this. CONFIGURATION VARIABLES ----------------------- +help.format +~~~~~~~~~~~ + If no command line option is passed, the 'help.format' configuration variable will be checked. The following values are supported for this variable; they make 'git-help' behave as their corresponding command @@ -69,15 +72,94 @@ line option: * "man" corresponds to '-m|--man', * "info" corresponds to '-i|--info', -* "web" or "html" correspond to '-w|--web', +* "web" or "html" correspond to '-w|--web'. + +help.browser, web.browser and browser.<tool>.path +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The 'help.browser', 'web.browser' and 'browser.<tool>.path' will also be checked if the 'web' format is chosen (either by command line option or configuration variable). See '-w|--web' in the OPTIONS -section above. +section above and linkgit:git-web--browse[1]. + +man.viewer +~~~~~~~~~~ + +The 'man.viewer' config variable will be checked if the 'man' format +is chosen. The following values are currently supported: + +* "man": use the 'man' program as usual, +* "woman": use 'emacsclient' to launch the "woman" mode in emacs +(this only works starting with emacsclient versions 22), +* "konqueror": use 'kfmclient' to open the man page in a new konqueror +tab (see 'Note about konqueror' below). + +Values for other tools can be used if there is a corresponding +'man.<tool>.cmd' configuration entry (see below). + +Multiple values may be given to the 'man.viewer' configuration +variable. Their corresponding programs will be tried in the order +listed in the configuration file. + +For example, this configuration: + +------------------------------------------------ + [man] + viewer = konqueror + viewer = woman +------------------------------------------------ + +will try to use konqueror first. But this may fail (for example if +DISPLAY is not set) and in that case emacs' woman mode will be tried. + +If everything fails the 'man' program will be tried anyway. + +man.<tool>.path +~~~~~~~~~~~~~~~ + +You can explicitly provide a full path to your preferred man viewer by +setting the configuration variable 'man.<tool>.path'. For example, you +can configure the absolute path to konqueror by setting +'man.konqueror.path'. Otherwise, 'git-help' assumes the tool is +available in PATH. + +man.<tool>.cmd +~~~~~~~~~~~~~~ + +When the man viewer, specified by the 'man.viewer' configuration +variables, is not among the supported ones, then the corresponding +'man.<tool>.cmd' configuration variable will be looked up. If this +variable exists then the specified tool will be treated as a custom +command and a shell eval will be used to run the command with the man +page passed as arguments. + +Note about konqueror +~~~~~~~~~~~~~~~~~~~~ + +When 'konqueror' is specified in the 'man.viewer' configuration +variable, we launch 'kfmclient' to try to open the man page on an +already opened konqueror in a new tab if possible. + +For consistency, we also try such a trick if 'man.konqueror.path' is +set to something like 'A_PATH_TO/konqueror'. That means we will try to +launch 'A_PATH_TO/kfmclient' instead. + +If you really want to use 'konqueror', then you can use something like +the following: + +------------------------------------------------ + [man] + viewer = konq + + [man "konq"] + cmd = A_PATH_TO/konqueror +------------------------------------------------ + +Note about git config --global +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Note that these configuration variables should probably be set using -the '--global' flag, for example like this: +Note that all these configuration variables should probably be set +using the '--global' flag, for example like this: ------------------------------------------------ $ git config --global help.format web @@ -94,10 +176,10 @@ Written by Junio C Hamano <gitster@pobox.com> and the git-list Documentation ------------- -Initial documentation was part of the linkgit:git[7] man page. +Initial documentation was part of the linkgit:git[1] man page. Christian Couder <chriscool@tuxfamily.org> extracted and rewrote it a little. Maintenance is done by the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-http-fetch.txt b/Documentation/git-http-fetch.txt index b784a9d07e..e7c796155f 100644 --- a/Documentation/git-http-fetch.txt +++ b/Documentation/git-http-fetch.txt @@ -8,7 +8,7 @@ git-http-fetch - Download from a remote git repository via HTTP SYNOPSIS -------- -'git-http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] [--stdin] <commit> <url> +'git http-fetch' [-c] [-t] [-a] [-d] [-v] [-w filename] [--recover] [--stdin] <commit> <url> DESCRIPTION ----------- @@ -53,4 +53,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-http-push.txt b/Documentation/git-http-push.txt index cca77f10d2..aef383e0b1 100644 --- a/Documentation/git-http-push.txt +++ b/Documentation/git-http-push.txt @@ -8,13 +8,16 @@ git-http-push - Push objects over HTTP/DAV to another repository SYNOPSIS -------- -'git-http-push' [--all] [--dry-run] [--force] [--verbose] <url> <ref> [<ref>...] +'git http-push' [--all] [--dry-run] [--force] [--verbose] <url> <ref> [<ref>...] DESCRIPTION ----------- Sends missing objects to remote repository, and updates the remote branch. +*NOTE*: This command is temporarily disabled if your libcurl +is older than 7.16, as the combination has been reported +not to work and sometimes corrupts repository. OPTIONS ------- @@ -37,7 +40,8 @@ OPTIONS Report the list of objects being walked locally and the list of objects successfully sent to the remote repository. --d, -D:: +-d:: +-D:: Remove <ref> from remote repository. The specified branch cannot be the remote HEAD. If -d is specified the following other conditions must also be met: @@ -98,4 +102,4 @@ Documentation by Nick Hengeveld GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-imap-send.txt b/Documentation/git-imap-send.txt index 522b73c12f..b3d8da33ee 100644 --- a/Documentation/git-imap-send.txt +++ b/Documentation/git-imap-send.txt @@ -8,7 +8,7 @@ git-imap-send - Dump a mailbox from stdin into an imap folder SYNOPSIS -------- -'git-imap-send' +'git imap-send' DESCRIPTION @@ -20,13 +20,13 @@ files directly. Typical usage is something like: -git-format-patch --signoff --stdout --attach origin | git-imap-send +git format-patch --signoff --stdout --attach origin | git imap-send CONFIGURATION ------------- -git-imap-send requires the following values in the repository +'git-imap-send' requires the following values in the repository configuration file (shown with examples): .......................... @@ -59,4 +59,4 @@ Documentation by Mike McCormack GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-index-pack.txt b/Documentation/git-index-pack.txt index 72b5d00116..4b5c743c1e 100644 --- a/Documentation/git-index-pack.txt +++ b/Documentation/git-index-pack.txt @@ -9,8 +9,8 @@ git-index-pack - Build pack index file for an existing packed archive SYNOPSIS -------- [verse] -'git-index-pack' [-v] [-o <index-file>] <pack-file> -'git-index-pack' --stdin [--fix-thin] [--keep] [-v] [-o <index-file>] +'git index-pack' [-v] [-o <index-file>] <pack-file> +'git index-pack' --stdin [--fix-thin] [--keep] [-v] [-o <index-file>] [<pack-file>] @@ -43,10 +43,10 @@ OPTIONS a default name determined from the pack content. If <pack-file> is not specified consider using --keep to prevent a race condition between this process and - linkgit:git-repack[1]. + 'git-repack'. --fix-thin:: - It is possible for linkgit:git-pack-objects[1] to build + It is possible for 'git-pack-objects' to build "thin" pack, which records objects in deltified form based on objects not included in the pack to reduce network traffic. Those objects are expected to be present on the receiving end @@ -59,7 +59,7 @@ OPTIONS Before moving the index into its final destination create an empty .keep file for the associated pack file. This option is usually necessary with --stdin to prevent a - simultaneous linkgit:git-repack[1] process from deleting + simultaneous 'git-repack' process from deleting the newly constructed pack and index before refs can be updated to use objects contained in the pack. @@ -75,6 +75,9 @@ OPTIONS to force the version for the generated pack index, and to force 64-bit index entries on objects located above the given offset. +--strict:: + Die, if the pack contains broken objects or links. + Note ---- @@ -83,7 +86,7 @@ Once the index has been created, the list of object names is sorted and the SHA1 hash of that list is printed to stdout. If --stdin was also used then this is prefixed by either "pack\t", or "keep\t" if a new .keep file was successfully created. This is useful to remove a -.keep file used as a lock to prevent the race with linkgit:git-repack[1] +.keep file used as a lock to prevent the race with 'git-repack' mentioned above. @@ -97,4 +100,4 @@ Documentation by Sergey Vlasov GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-init-db.txt b/Documentation/git-init-db.txt index 439cabb737..1fd0ff2610 100644 --- a/Documentation/git-init-db.txt +++ b/Documentation/git-init-db.txt @@ -8,7 +8,7 @@ git-init-db - Creates an empty git repository SYNOPSIS -------- -'git-init-db' [-q | --quiet] [--template=<template_directory>] [--shared[=<permissions>]] +'git init-db' [-q | --quiet] [--template=<template_directory>] [--shared[=<permissions>]] DESCRIPTION diff --git a/Documentation/git-init.txt b/Documentation/git-init.txt index 62914da97b..71749c09d3 100644 --- a/Documentation/git-init.txt +++ b/Documentation/git-init.txt @@ -8,7 +8,7 @@ git-init - Create an empty git repository or reinitialize an existing one SYNOPSIS -------- -'git-init' [-q | --quiet] [--template=<template_directory>] [--shared[=<permissions>]] +'git init' [-q | --quiet] [--bare] [--template=<template_directory>] [--shared[=<permissions>]] OPTIONS @@ -16,10 +16,16 @@ OPTIONS -- --q, \--quiet:: +-q:: +--quiet:: Only print error and warning messages, all other output will be suppressed. +--bare:: + +Create a bare repository. If GIT_DIR environment is not set, it is set to the +current working directory. + --template=<template_directory>:: Provide the directory from which templates will be used. The default template @@ -31,7 +37,7 @@ structure, some suggested "exclude patterns", and copies of non-executing "hook" files. The suggested patterns and hook files are all modifiable and extensible. ---shared[={false|true|umask|group|all|world|everybody}]:: +--shared[={false|true|umask|group|all|world|everybody|0xxx}]:: Specify that the git repository is to be shared amongst several users. This allows users belonging to the same group to push into that @@ -52,6 +58,12 @@ is given: - 'all' (or 'world' or 'everybody'): Same as 'group', but make the repository readable by all users. + - '0xxx': '0xxx' is an octal number and each file will have mode '0xxx' + Any option except 'umask' can be set using this option. '0xxx' will + override users umask(2) value, and thus, users with a safe umask (0077) + can use this option. '0640' will create a repository which is group-readable + but not writable. '0660' is equivalent to 'group'. + By default, the configuration flag receive.denyNonFastForwards is enabled in shared repositories, so that you cannot force a non fast-forwarding push into it. @@ -74,11 +86,11 @@ If the object storage directory is specified via the `$GIT_OBJECT_DIRECTORY` environment variable then the sha1 directories are created underneath - otherwise the default `$GIT_DIR/objects` directory is used. -Running `git-init` in an existing repository is safe. It will not overwrite -things that are already there. The primary reason for rerunning `git-init` +Running 'git-init' in an existing repository is safe. It will not overwrite +things that are already there. The primary reason for rerunning 'git-init' is to pick up newly added templates. -Note that `git-init` is the same as `git-init-db`. The command +Note that 'git-init' is the same as 'git-init-db'. The command was primarily meant to initialize the object database, but over time it has become responsible for setting up the other aspects of the repository, such as installing the default hooks and @@ -93,8 +105,8 @@ Start a new git repository for an existing code base:: + ---------------- $ cd /path/to/my/codebase -$ git-init <1> -$ git-add . <2> +$ git init <1> +$ git add . <2> ---------------- + <1> prepare /path/to/my/codebase/.git directory @@ -111,4 +123,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-instaweb.txt b/Documentation/git-instaweb.txt index 841e8fac7f..22da21a54f 100644 --- a/Documentation/git-instaweb.txt +++ b/Documentation/git-instaweb.txt @@ -8,40 +8,46 @@ git-instaweb - Instantly browse your working repository in gitweb SYNOPSIS -------- [verse] -'git-instaweb' [--local] [--httpd=<httpd>] [--port=<port>] +'git instaweb' [--local] [--httpd=<httpd>] [--port=<port>] [--browser=<browser>] -'git-instaweb' [--start] [--stop] [--restart] +'git instaweb' [--start] [--stop] [--restart] DESCRIPTION ----------- -A simple script to setup gitweb and a web server for browsing the local +A simple script to set up `gitweb` and a web server for browsing the local repository. OPTIONS ------- --l|--local:: +-l:: +--local:: Only bind the web server to the local IP (127.0.0.1). --d|--httpd:: +-d:: +--httpd:: The HTTP daemon command-line that will be executed. Command-line options may be specified here, and the configuration file will be added at the end of the command-line. Currently lighttpd, apache2 and webrick are supported. (Default: lighttpd) --m|--module-path:: +-m:: +--module-path:: The module path (only needed if httpd is Apache). (Default: /usr/lib/apache2/modules) --p|--port:: +-p:: +--port:: The port number to bind the httpd to. (Default: 1234) --b|--browser:: - - The web browser command-line to execute to view the gitweb page. - If blank, the URL of the gitweb instance will be printed to - stdout. (Default: 'firefox') +-b:: +--browser:: + The web browser that should be used to view the gitweb + page. This will be passed to the 'git-web--browse' helper + script along with the URL of the gitweb instance. See + linkgit:git-web--browse[1] for more information about this. If + the script fails, the URL will be printed to stdout. --start:: Start the httpd instance and exit. This does not generate @@ -72,7 +78,8 @@ You may specify configuration in your .git/config ----------------------------------------------------------------------- If the configuration variable 'instaweb.browser' is not set, -'web.browser' will be used instead if it is defined. +'web.browser' will be used instead if it is defined. See +linkgit:git-web--browse[1] for more information about this. Author ------ @@ -84,4 +91,4 @@ Documentation by Eric Wong <normalperson@yhbt.net>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-log.txt b/Documentation/git-log.txt index ebaee4b334..0446bad7e5 100644 --- a/Documentation/git-log.txt +++ b/Documentation/git-log.txt @@ -8,15 +8,15 @@ git-log - Show commit logs SYNOPSIS -------- -'git-log' <option>... +'git log' <option>... DESCRIPTION ----------- Shows the commit logs. -The command takes options applicable to the linkgit:git-rev-list[1] +The command takes options applicable to the 'git-rev-list' command to control what is shown and how, and options applicable to -the linkgit:git-diff-tree[1] commands to control how the changes +the 'git-diff-*' commands to control how the changes each commit introduces are shown. @@ -41,10 +41,10 @@ include::diff-options.txt[] Print out the ref names of any commits that are shown. --full-diff:: - Without this flag, "git log -p <paths>..." shows commits that + Without this flag, "git log -p <path>..." shows commits that touch the specified paths, and diffs about the same specified paths. With this, the full diff is shown for commits that touch - the specified paths; this means that "<paths>..." limits only + the specified paths; this means that "<path>..." limits only commits, and doesn't limit diff for those commits. --follow:: @@ -57,8 +57,8 @@ include::diff-options.txt[] Note that only message is considered, if also a diff is shown its size is not included. -<paths>...:: - Show only commits that affect the specified paths. +<path>...:: + Show only commits that affect any of the specified paths. include::rev-list-options.txt[] @@ -112,4 +112,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-lost-found.txt b/Documentation/git-lost-found.txt index b1c797f109..602b8d5d4d 100644 --- a/Documentation/git-lost-found.txt +++ b/Documentation/git-lost-found.txt @@ -7,7 +7,7 @@ git-lost-found - Recover lost refs that luckily have not yet been pruned SYNOPSIS -------- -'git-lost-found' +'git lost-found' DESCRIPTION ----------- @@ -78,4 +78,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-ls-files.txt b/Documentation/git-ls-files.txt index da9ebf405c..9f85d60b5f 100644 --- a/Documentation/git-ls-files.txt +++ b/Documentation/git-ls-files.txt @@ -9,7 +9,7 @@ git-ls-files - Show information about files in the index and the working tree SYNOPSIS -------- [verse] -'git-ls-files' [-z] [-t] [-v] +'git ls-files' [-z] [-t] [-v] (--[cached|deleted|others|ignored|stage|unmerged|killed|modified])\* (-[c|d|o|i|s|u|k|m])\* [-x <pattern>|--exclude=<pattern>] @@ -30,24 +30,30 @@ shown: OPTIONS ------- --c|--cached:: +-c:: +--cached:: Show cached files in the output (default) --d|--deleted:: +-d:: +--deleted:: Show deleted files in the output --m|--modified:: +-m:: +--modified:: Show modified files in the output --o|--others:: +-o:: +--others:: Show other files in the output --i|--ignored:: +-i:: +--ignored:: Show ignored files in the output. Note that this also reverses any exclude list present. --s|--stage:: - Show stage files in the output +-s:: +--stage:: + Show staged contents' object name, mode bits and stage number in the output. --directory:: If a whole directory is classified as "other", show just its @@ -56,10 +62,12 @@ OPTIONS --no-empty-directory:: Do not list empty directories. Has no effect without --directory. --u|--unmerged:: +-u:: +--unmerged:: Show unmerged files in the output (forces --stage) --k|--killed:: +-k:: +--killed:: Show files on the filesystem that need to be removed due to file/directory conflicts for checkout-index to succeed. @@ -67,11 +75,13 @@ OPTIONS -z:: \0 line termination on output. --x|--exclude=<pattern>:: +-x <pattern>:: +--exclude=<pattern>:: Skips files matching pattern. Note that pattern is a shell wildcard pattern. --X|--exclude-from=<file>:: +-X <file>:: +--exclude-from=<file>:: exclude patterns are read from <file>; 1 per line. --exclude-per-directory=<file>:: @@ -133,14 +143,14 @@ which case it outputs: [<tag> ]<mode> <object> <stage> <file> -"git-ls-files --unmerged" and "git-ls-files --stage" can be used to examine +'git-ls-files --unmerged' and 'git-ls-files --stage' can be used to examine detailed information on unmerged paths. For an unmerged path, instead of recording a single mode/SHA1 pair, the index records up to three such pairs; one from tree O in stage 1, A in stage 2, and B in stage 3. This information can be used by the user (or the porcelain) to see what should eventually be recorded at the -path. (see git-read-tree for more information on state) +path. (see linkgit:git-read-tree[1] for more information on state) When `-z` option is not used, TAB, LF, and backslash characters in pathnames are represented as `\t`, `\n`, and `\\`, @@ -177,7 +187,7 @@ top of the directory tree. A pattern read from a file specified by --exclude-per-directory is relative to the directory that the pattern file appears in. -See Also +SEE ALSO -------- linkgit:git-read-tree[1], linkgit:gitignore[5] @@ -192,4 +202,4 @@ Documentation by David Greaves, Junio C Hamano, Josh Triplett, and the git-list GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-ls-remote.txt b/Documentation/git-ls-remote.txt index c5ba0aad13..abe7bf9ff9 100644 --- a/Documentation/git-ls-remote.txt +++ b/Documentation/git-ls-remote.txt @@ -9,7 +9,7 @@ git-ls-remote - List references in a remote repository SYNOPSIS -------- [verse] -'git-ls-remote' [--heads] [--tags] [-u <exec> | --upload-pack <exec>] +'git ls-remote' [--heads] [--tags] [-u <exec> | --upload-pack <exec>] <repository> <refs>... DESCRIPTION @@ -20,14 +20,18 @@ commit IDs. OPTIONS ------- --h|--heads, -t|--tags:: +-h:: +--heads:: +-t:: +--tags:: Limit to only refs/heads and refs/tags, respectively. These options are _not_ mutually exclusive; when given both, references stored in refs/heads and refs/tags are displayed. --u <exec>, --upload-pack=<exec>:: - Specify the full path of linkgit:git-upload-pack[1] on the remote +-u <exec>:: +--upload-pack=<exec>:: + Specify the full path of 'git-upload-pack' on the remote host. This allows listing references from repositories accessed via SSH and where the SSH daemon does not use the PATH configured by the user. @@ -65,8 +69,8 @@ EXAMPLES Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-ls-tree.txt b/Documentation/git-ls-tree.txt index 360c0a1b98..4c7262f1cd 100644 --- a/Documentation/git-ls-tree.txt +++ b/Documentation/git-ls-tree.txt @@ -9,17 +9,27 @@ git-ls-tree - List the contents of a tree object SYNOPSIS -------- [verse] -'git-ls-tree' [-d] [-r] [-t] [-l] [-z] +'git ls-tree' [-d] [-r] [-t] [-l] [-z] [--name-only] [--name-status] [--full-name] [--abbrev=[<n>]] <tree-ish> [paths...] DESCRIPTION ----------- Lists the contents of a given tree object, like what "/bin/ls -a" does -in the current working directory. Note that the usage is subtly different, -though - 'paths' denote just a list of patterns to match, e.g. so specifying -directory name (without '-r') will behave differently, and order of the -arguments does not matter. +in the current working directory. Note that: + + - the behaviour is slightly different from that of "/bin/ls" in that the + 'paths' denote just a list of patterns to match, e.g. so specifying + directory name (without '-r') will behave differently, and order of the + arguments does not matter. + + - the behaviour is similar to that of "/bin/ls" in that the 'paths' is + taken as relative to the current working directory. E.g. when you are + in a directory 'sub' that has a directory 'dir', you can run 'git + ls-tree -r HEAD dir' to list the contents of the tree (that is + 'sub/dir' in 'HEAD'). You don't want to give a tree that is not at the + root level (e.g. 'git ls-tree -r HEAD:sub dir') in this case, as that + would result in asking for 'sub/sub/dir' in the 'HEAD' commit. OPTIONS ------- @@ -81,7 +91,7 @@ with minimum width of 7 characters. Object size is given only for blobs Author ------ Written by Petr Baudis <pasky@suse.cz> -Completely rewritten from scratch by Junio C Hamano <junkio@cox.net>, +Completely rewritten from scratch by Junio C Hamano <gitster@pobox.com>, another major rewrite by Linus Torvalds <torvalds@osdl.org> Documentation @@ -91,4 +101,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-mailinfo.txt b/Documentation/git-mailinfo.txt index 3846f0e6eb..31eccea5bc 100644 --- a/Documentation/git-mailinfo.txt +++ b/Documentation/git-mailinfo.txt @@ -8,7 +8,7 @@ git-mailinfo - Extracts patch and authorship from a single e-mail message SYNOPSIS -------- -'git-mailinfo' [-k] [-u | --encoding=<encoding>] <msg> <patch> +'git mailinfo' [-k] [-u | --encoding=<encoding> | -n] <msg> <patch> DESCRIPTION @@ -16,7 +16,7 @@ DESCRIPTION Reading a single e-mail message from the standard input, and writes the commit log message in <msg> file, and the patches in <patch> file. The author name, e-mail and e-mail subject are -written out to the standard output to be used by git-am +written out to the standard output to be used by 'git-am' to create a commit. It is usually not necessary to use this command directly. See linkgit:git-am[1] instead. @@ -29,8 +29,8 @@ OPTIONS among which (1) remove 'Re:' or 're:', (2) leading whitespaces, (3) '[' up to ']', typically '[PATCH]', and then prepends "[PATCH] ". This flag forbids this - munging, and is most useful when used to read back 'git - format-patch -k' output. + munging, and is most useful when used to read back + 'git-format-patch -k' output. -u:: The commit log message, author name and author email are @@ -46,6 +46,9 @@ conversion, even with this flag. from what is specified by i18n.commitencoding, this flag can be used to override it. +-n:: + Disable all charset re-coding of the metadata. + <msg>:: The commit log message extracted from e-mail, usually except the title line which comes from e-mail Subject. @@ -57,7 +60,7 @@ conversion, even with this flag. Author ------ Written by Linus Torvalds <torvalds@osdl.org> and -Junio C Hamano <junkio@cox.net> +Junio C Hamano <gitster@pobox.com> Documentation @@ -66,4 +69,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-mailsplit.txt b/Documentation/git-mailsplit.txt index 8243f69113..5cc94ec53d 100644 --- a/Documentation/git-mailsplit.txt +++ b/Documentation/git-mailsplit.txt @@ -7,7 +7,7 @@ git-mailsplit - Simple UNIX mbox splitter program SYNOPSIS -------- -'git-mailsplit' [-b] [-f<nn>] [-d<prec>] -o<directory> [--] [<mbox>|<Maildir>...] +'git mailsplit' [-b] [-f<nn>] [-d<prec>] -o<directory> [--] [<mbox>|<Maildir>...] DESCRIPTION ----------- @@ -27,7 +27,7 @@ OPTIONS Root of the Maildir to split. This directory should contain the cur, tmp and new subdirectories. -<directory>:: +-o<directory>:: Directory in which to place the individual messages. -b:: @@ -46,7 +46,7 @@ OPTIONS Author ------ Written by Linus Torvalds <torvalds@osdl.org> -and Junio C Hamano <junkio@cox.net> +and Junio C Hamano <gitster@pobox.com> Documentation @@ -55,4 +55,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-merge-base.txt b/Documentation/git-merge-base.txt index 07f78b4ae0..1a7ecbf8f3 100644 --- a/Documentation/git-merge-base.txt +++ b/Documentation/git-merge-base.txt @@ -8,20 +8,20 @@ git-merge-base - Find as good common ancestors as possible for a merge SYNOPSIS -------- -'git-merge-base' [--all] <commit> <commit> +'git merge-base' [--all] <commit> <commit> DESCRIPTION ----------- -"git-merge-base" finds as good a common ancestor as possible between -the two commits. That is, given two commits A and B 'git-merge-base A -B' will output a commit which is reachable from both A and B through +'git-merge-base' finds as good a common ancestor as possible between +the two commits. That is, given two commits A and B, `git merge-base A +B` will output a commit which is reachable from both A and B through the parent relationship. Given a selection of equally good common ancestors it should not be relied on to decide in any particular way. -The "git-merge-base" algorithm is still in flux - use the source... +The 'git-merge-base' algorithm is still in flux - use the source... OPTIONS ------- @@ -39,4 +39,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-merge-file.txt b/Documentation/git-merge-file.txt index c513184ba0..024ec015a3 100644 --- a/Documentation/git-merge-file.txt +++ b/Documentation/git-merge-file.txt @@ -9,21 +9,21 @@ git-merge-file - Run a three-way file merge SYNOPSIS -------- [verse] -'git-merge-file' [-L <current-name> [-L <base-name> [-L <other-name>]]] +'git merge-file' [-L <current-name> [-L <base-name> [-L <other-name>]]] [-p|--stdout] [-q|--quiet] <current-file> <base-file> <other-file> DESCRIPTION ----------- -git-file-merge incorporates all changes that lead from the `<base-file>` +'git-file-merge' incorporates all changes that lead from the `<base-file>` to `<other-file>` into `<current-file>`. The result ordinarily goes into -`<current-file>`. git-merge-file is useful for combining separate changes +`<current-file>`. 'git-merge-file' is useful for combining separate changes to an original. Suppose `<base-file>` is the original, and both `<current-file>` and `<other-file>` are modifications of `<base-file>`. -Then git-merge-file combines both changes. +Then 'git-merge-file' combines both changes. A conflict occurs if both `<current-file>` and `<other-file>` have changes -in a common segment of lines. If a conflict is found, git-merge-file +in a common segment of lines. If a conflict is found, 'git-merge-file' normally outputs a warning and brackets the conflict with <<<<<<< and >>>>>>> lines. A typical conflict will look like this: @@ -39,8 +39,8 @@ the alternatives. The exit value of this program is negative on error, and the number of conflicts otherwise. If the merge was clean, the exit value is 0. -git-merge-file is designed to be a minimal clone of RCS merge, that is, it -implements all of RCS merge's functionality which is needed by +'git-merge-file' is designed to be a minimal clone of RCS 'merge'; that is, it +implements all of RCS 'merge''s functionality which is needed by linkgit:git[1]. @@ -51,7 +51,7 @@ OPTIONS This option may be given up to three times, and specifies labels to be used in place of the corresponding file names in conflict reports. That is, - `git-merge-file -L x -L y -L z a b c` generates output that + `git merge-file -L x -L y -L z a b c` generates output that looks like it came from files x, y and z instead of from files a, b and c. @@ -85,8 +85,8 @@ Written by Johannes Schindelin <johannes.schindelin@gmx.de> Documentation -------------- Documentation by Johannes Schindelin and the git-list <git@vger.kernel.org>, -with parts copied from the original documentation of RCS merge. +with parts copied from the original documentation of RCS 'merge'. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-merge-index.txt b/Documentation/git-merge-index.txt index 5d816d0d8b..ff088c5c29 100644 --- a/Documentation/git-merge-index.txt +++ b/Documentation/git-merge-index.txt @@ -8,7 +8,7 @@ git-merge-index - Run a merge for files needing merging SYNOPSIS -------- -'git-merge-index' [-o] [-q] <merge-program> (-a | \-- | <file>\*) +'git merge-index' [-o] [-q] <merge-program> (-a | [--] <file>\*) DESCRIPTION ----------- @@ -36,24 +36,24 @@ OPTIONS failure usually indicates conflicts during merge). This is for porcelains which might want to emit custom messages. -If "git-merge-index" is called with multiple <file>s (or -a) then it +If 'git-merge-index' is called with multiple <file>s (or -a) then it processes them in turn only stopping if merge returns a non-zero exit code. Typically this is run with a script calling git's imitation of -the merge command from the RCS package. +the 'merge' command from the RCS package. -A sample script called "git-merge-one-file" is included in the +A sample script called 'git-merge-one-file' is included in the distribution. ALERT ALERT ALERT! The git "merge object order" is different from the -RCS "merge" program merge object order. In the above ordering, the +RCS 'merge' program merge object order. In the above ordering, the original is first. But the argument order to the 3-way merge program -"merge" is to have the original in the middle. Don't ask me why. +'merge' is to have the original in the middle. Don't ask me why. Examples: - torvalds@ppc970:~/merge-test> git-merge-index cat MM + torvalds@ppc970:~/merge-test> git merge-index cat MM This is MM from the original tree. # original This is modified MM in the branch A. # merge1 This is modified MM in the branch B. # merge2 @@ -61,17 +61,17 @@ Examples: or - torvalds@ppc970:~/merge-test> git-merge-index cat AA MM + torvalds@ppc970:~/merge-test> git merge-index cat AA MM cat: : No such file or directory This is added AA in the branch A. This is added AA in the branch B. This is added AA in the branch B. fatal: merge program failed -where the latter example shows how "git-merge-index" will stop trying to -merge once anything has returned an error (i.e., "cat" returned an error +where the latter example shows how 'git-merge-index' will stop trying to +merge once anything has returned an error (i.e., `cat` returned an error for the AA file, because it didn't exist in the original, and thus -"git-merge-index" didn't even try to merge the MM thing). +'git-merge-index' didn't even try to merge the MM thing). Author ------ @@ -84,4 +84,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-merge-one-file.txt b/Documentation/git-merge-one-file.txt index ee95df3bc0..dc8a96adb0 100644 --- a/Documentation/git-merge-one-file.txt +++ b/Documentation/git-merge-one-file.txt @@ -12,13 +12,13 @@ SYNOPSIS DESCRIPTION ----------- -This is the standard helper program to use with "git-merge-index" -to resolve a merge after the trivial merge done with "git-read-tree -m". +This is the standard helper program to use with 'git-merge-index' +to resolve a merge after the trivial merge done with 'git-read-tree -m'. Author ------ Written by Linus Torvalds <torvalds@osdl.org>, -Junio C Hamano <junkio@cox.net> and Petr Baudis <pasky@suse.cz>. +Junio C Hamano <gitster@pobox.com> and Petr Baudis <pasky@suse.cz>. Documentation -------------- @@ -26,4 +26,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-merge-tree.txt b/Documentation/git-merge-tree.txt index 4cc0964e78..dbb0c18668 100644 --- a/Documentation/git-merge-tree.txt +++ b/Documentation/git-merge-tree.txt @@ -8,7 +8,7 @@ git-merge-tree - Show three-way merge without touching index SYNOPSIS -------- -'git-merge-tree' <base-tree> <branch1> <branch2> +'git merge-tree' <base-tree> <branch1> <branch2> DESCRIPTION ----------- @@ -33,4 +33,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-merge.txt b/Documentation/git-merge.txt index 0c9ad7f2bb..17a15acb07 100644 --- a/Documentation/git-merge.txt +++ b/Documentation/git-merge.txt @@ -9,9 +9,9 @@ git-merge - Join two or more development histories together SYNOPSIS -------- [verse] -'git-merge' [-n] [--summary] [--no-commit] [--squash] [-s <strategy>]... +'git merge' [-n] [--stat] [--no-commit] [--squash] [-s <strategy>]... [-m <msg>] <remote> <remote>... -'git-merge' <msg> HEAD <remote>... +'git merge' <msg> HEAD <remote>... DESCRIPTION ----------- @@ -29,11 +29,11 @@ include::merge-options.txt[] -m <msg>:: The commit message to be used for the merge commit (in case - it is created). The `git-fmt-merge-msg` script can be used - to give a good default for automated `git-merge` invocations. + it is created). The 'git-fmt-merge-msg' script can be used + to give a good default for automated 'git-merge' invocations. -<remote>:: - Other branch head merged into our branch. You need at +<remote>...:: + Other branch heads to merge into our branch. You need at least one <remote>. Specifying more than one <remote> obviously means you are trying an Octopus. @@ -41,75 +41,47 @@ include::merge-strategies.txt[] If you tried a merge which resulted in a complex conflicts and -would want to start over, you can recover with -linkgit:git-reset[1]. +would want to start over, you can recover with 'git-reset'. CONFIGURATION ------------- - -merge.summary:: - Whether to include summaries of merged commits in newly - created merge commit. False by default. - -merge.verbosity:: - Controls the amount of output shown by the recursive merge - strategy. Level 0 outputs nothing except a final error - message if conflicts were detected. Level 1 outputs only - conflicts, 2 outputs conflicts and file changes. Level 5 and - above outputs debugging information. The default is level 2. - Can be overridden by 'GIT_MERGE_VERBOSITY' environment variable. +include::merge-config.txt[] branch.<name>.mergeoptions:: Sets default options for merging into branch <name>. The syntax and - supported options are equal to that of git-merge, but option values + supported options are equal to that of 'git-merge', but option values containing whitespace characters are currently not supported. HOW MERGE WORKS --------------- A merge is always between the current `HEAD` and one or more -remote branch heads, and the index file must exactly match the -tree of `HEAD` commit (i.e. the contents of the last commit) when -it happens. In other words, `git-diff --cached HEAD` must -report no changes. - -[NOTE] -This is a bit of a lie. In certain special cases, your index is -allowed to be different from the tree of the `HEAD` commit. The most -notable case is when your `HEAD` commit is already ahead of what -is being merged, in which case your index can have arbitrary -differences from your `HEAD` commit. Also, your index entries -may have differences from your `HEAD` commit that match -the result of a trivial merge (e.g. you received the same patch -from an external source to produce the same result as what you are -merging). For example, if a path did not exist in the common -ancestor and your head commit but exists in the tree you are -merging into your repository, and if you already happen to have -that path exactly in your index, the merge does not have to -fail. - -Otherwise, merge will refuse to do any harm to your repository -(that is, it may fetch the objects from remote, and it may even -update the local branch used to keep track of the remote branch -with `git pull remote rbranch:lbranch`, but your working tree, -`.git/HEAD` pointer and index file are left intact). - -You may have local modifications in the working tree files. In -other words, `git-diff` is allowed to report changes. -However, the merge uses your working tree as the working area, -and in order to prevent the merge operation from losing such -changes, it makes sure that they do not interfere with the -merge. Those complex tables in read-tree documentation define -what it means for a path to "interfere with the merge". And if -your local modifications interfere with the merge, again, it -stops before touching anything. - -So in the above two "failed merge" case, you do not have to -worry about loss of data --- you simply were not ready to do -a merge, so no merge happened at all. You may want to finish -whatever you were in the middle of doing, and retry the same -pull after you are done and ready. - +commits (usually, branch head or tag), and the index file must +match the tree of `HEAD` commit (i.e. the contents of the last commit) +when it starts out. In other words, `git diff --cached HEAD` must +report no changes. (One exception is when the changed index +entries are already in the same state that would result from +the merge anyway.) + +Three kinds of merge can happen: + +* The merged commit is already contained in `HEAD`. This is the + simplest case, called "Already up-to-date." + +* `HEAD` is already contained in the merged commit. This is the + most common case especially when involved through 'git pull': + you are tracking an upstream repository, committed no local + changes and now you want to update to a newer upstream revision. + Your `HEAD` (and the index) is updated to at point the merged + commit, without creating an extra merge commit. This is + called "Fast-forward". + +* Both the merged commit and `HEAD` are independent and must be + tied together by a merge commit that has them both as its parents. + The rest of this section describes this "True merge" case. + +The chosen merge strategy merges the two commits into a single +new source tree. When things cleanly merge, these things happen: 1. The results are updated both in the index file and in your @@ -138,7 +110,7 @@ When there are conflicts, these things happen: 3. For conflicting paths, the index file records up to three versions; stage1 stores the version from the common ancestor, stage2 from `HEAD`, and stage3 from the remote branch (you - can inspect the stages with `git-ls-files -u`). The working + can inspect the stages with `git ls-files -u`). The working tree files have the result of "merge" program; i.e. 3-way merge result with familiar conflict markers `<<< === >>>`. @@ -151,25 +123,29 @@ After seeing a conflict, you can do two things: * Decide not to merge. The only clean-up you need are to reset the index file to the `HEAD` commit to reverse 2. and to clean - up working tree changes made by 2. and 3.; `git-reset` can + up working tree changes made by 2. and 3.; 'git-reset --hard' can be used for this. - * Resolve the conflicts. `git-diff` would report only the - conflicting paths because of the above 2. and 3.. Edit the - working tree files into a desirable shape, `git-add` or `git-rm` + * Resolve the conflicts. `git diff` would report only the + conflicting paths because of the above 2. and 3. + Edit the working tree files into a desirable shape + ('git mergetool' can ease this task), 'git-add' or 'git-rm' them, to make the index file contain what the merge result - should be, and run `git-commit` to commit the result. + should be, and run 'git-commit' to commit the result. SEE ALSO -------- linkgit:git-fmt-merge-msg[1], linkgit:git-pull[1], -linkgit:gitattributes[5] - +linkgit:gitattributes[5], +linkgit:git-reset[1], +linkgit:git-diff[1], linkgit:git-ls-files[1], +linkgit:git-add[1], linkgit:git-rm[1], +linkgit:git-mergetool[1] Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation @@ -178,4 +154,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-mergetool.txt b/Documentation/git-mergetool.txt index 50f106ec5b..e0b2703b38 100644 --- a/Documentation/git-mergetool.txt +++ b/Documentation/git-mergetool.txt @@ -7,17 +7,17 @@ git-mergetool - Run merge conflict resolution tools to resolve merge conflicts SYNOPSIS -------- -'git-mergetool' [--tool=<tool>] [<file>]... +'git mergetool' [--tool=<tool>] [<file>]... DESCRIPTION ----------- -Use 'git mergetool' to run one of several merge utilities to resolve -merge conflicts. It is typically run after linkgit:git-merge[1]. +Use `git mergetool` to run one of several merge utilities to resolve +merge conflicts. It is typically run after 'git-merge'. If one or more <file> parameters are given, the merge tool program will be run to resolve differences on each file. If no <file> names are -specified, 'git mergetool' will run the merge tool program on every file +specified, 'git-mergetool' will run the merge tool program on every file with merge conflicts. OPTIONS @@ -27,16 +27,38 @@ OPTIONS Valid merge tools are: kdiff3, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, and opendiff + -If a merge resolution program is not specified, 'git mergetool' -will use the configuration variable merge.tool. If the -configuration variable merge.tool is not set, 'git mergetool' +If a merge resolution program is not specified, 'git-mergetool' +will use the configuration variable `merge.tool`. If the +configuration variable `merge.tool` is not set, 'git-mergetool' will pick a suitable default. + You can explicitly provide a full path to the tool by setting the -configuration variable mergetool.<tool>.path. For example, you +configuration variable `mergetool.<tool>.path`. For example, you can configure the absolute path to kdiff3 by setting -mergetool.kdiff3.path. Otherwise, 'git mergetool' assumes the tool -is available in PATH. +`mergetool.kdiff3.path`. Otherwise, 'git-mergetool' assumes the +tool is available in PATH. ++ +Instead of running one of the known merge tool programs +'git-mergetool' can be customized to run an alternative program +by specifying the command line to invoke in a configuration +variable `mergetool.<tool>.cmd`. ++ +When 'git-mergetool' is invoked with this tool (either through the +`-t` or `--tool` option or the `merge.tool` configuration +variable) the configured command line will be invoked with `$BASE` +set to the name of a temporary file containing the common base for +the merge, if available; `$LOCAL` set to the name of a temporary +file containing the contents of the file on the current branch; +`$REMOTE` set to the name of a temporary file containing the +contents of the file to be merged, and `$MERGED` set to the name +of the file to which the merge tool should write the result of the +merge resolution. ++ +If the custom merge tool correctly indicates the success of a +merge resolution with its exit code then the configuration +variable `mergetool.<tool>.trustExitCode` can be set to `true`. +Otherwise, 'git-mergetool' will prompt the user to indicate the +success of the resolution after the custom tool has exited. Author ------ @@ -48,4 +70,4 @@ Documentation by Theodore Y Ts'o. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-mktag.txt b/Documentation/git-mktag.txt index 82db9f5d8f..8bcc11443d 100644 --- a/Documentation/git-mktag.txt +++ b/Documentation/git-mktag.txt @@ -8,7 +8,7 @@ git-mktag - Creates a tag object SYNOPSIS -------- -'git-mktag' < signature_file +'git mktag' < signature_file DESCRIPTION ----------- @@ -43,4 +43,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-mktree.txt b/Documentation/git-mktree.txt index f312036ab5..af19f06ed7 100644 --- a/Documentation/git-mktree.txt +++ b/Documentation/git-mktree.txt @@ -8,7 +8,7 @@ git-mktree - Build a tree-object from ls-tree formatted text SYNOPSIS -------- -'git-mktree' [-z] +'git mktree' [-z] DESCRIPTION ----------- @@ -23,7 +23,7 @@ OPTIONS Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -31,4 +31,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-mv.txt b/Documentation/git-mv.txt index bff3fbe745..9c5660275b 100644 --- a/Documentation/git-mv.txt +++ b/Documentation/git-mv.txt @@ -8,14 +8,14 @@ git-mv - Move or rename a file, a directory, or a symlink SYNOPSIS -------- -'git-mv' <options>... <args>... +'git mv' <options>... <args>... DESCRIPTION ----------- This script is used to move or rename a file, directory or symlink. - git-mv [-f] [-n] <source> <destination> - git-mv [-f] [-n] [-k] <source> ... <destination directory> + git mv [-f] [-n] <source> <destination> + git mv [-f] [-n] [-k] <source> ... <destination directory> In the first form, it renames <source>, which must exist and be either a file, symlink or directory, to <destination>. @@ -34,7 +34,8 @@ OPTIONS condition. An error happens when a source is neither existing nor controlled by GIT, or when it would overwrite an existing file unless '-f' is given. --n, \--dry-run:: +-n:: +--dry-run:: Do nothing; only show what would happen @@ -50,4 +51,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-name-rev.txt b/Documentation/git-name-rev.txt index efcabdc272..abd2237e51 100644 --- a/Documentation/git-name-rev.txt +++ b/Documentation/git-name-rev.txt @@ -9,13 +9,13 @@ git-name-rev - Find symbolic names for given revs SYNOPSIS -------- [verse] -'git-name-rev' [--tags] [--refs=<pattern>] +'git name-rev' [--tags] [--refs=<pattern>] ( --all | --stdin | <committish>... ) DESCRIPTION ----------- Finds symbolic names suitable for human digestion for revisions given in any -format parsable by git-rev-parse. +format parsable by 'git-rev-parse'. OPTIONS @@ -38,8 +38,14 @@ OPTIONS Instead of printing both the SHA-1 and the name, print only the name. If given with --tags the usual tag prefix of "tags/" is also omitted from the name, matching the output - of linkgit:git-describe[1] more closely. This option - cannot be combined with --stdin. + of `git-describe` more closely. + +--no-undefined:: + Die with error code != 0 when a reference is undefined, + instead of printing `undefined`. + +--always:: + Show uniquely abbreviated commit object as fallback. EXAMPLE ------- @@ -49,7 +55,7 @@ wrote you about that fantastic commit 33db5f4d9027a10e477ccf054b2c1ab94f74c85a. Of course, you look into the commit, but that only tells you what happened, but not the context. -Enter git-name-rev: +Enter 'git-name-rev': ------------ % git name-rev 33db5f4d9027a10e477ccf054b2c1ab94f74c85a @@ -75,4 +81,4 @@ Documentation by Johannes Schindelin. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-pack-objects.txt b/Documentation/git-pack-objects.txt index 74cc7c1cb8..8c354bd470 100644 --- a/Documentation/git-pack-objects.txt +++ b/Documentation/git-pack-objects.txt @@ -9,7 +9,7 @@ git-pack-objects - Create a packed archive of objects SYNOPSIS -------- [verse] -'git-pack-objects' [-q] [--no-reuse-delta] [--delta-base-offset] [--non-empty] +'git pack-objects' [-q] [--no-reuse-delta] [--delta-base-offset] [--non-empty] [--local] [--incremental] [--window=N] [--depth=N] [--all-progress] [--revs [--unpacked | --all]*] [--stdout | base-name] < object-list @@ -22,14 +22,15 @@ archive with specified base-name, or to the standard output. A packed archive is an efficient way to transfer set of objects between two repositories, and also is an archival format which is efficient to access. The packed archive format (.pack) is -designed to be unpackable without having anything else, but for -random access, accompanied with the pack index file (.idx). +designed to be self contained so that it can be unpacked without +any further information, but for fast, random access to the objects +in the pack, a pack index file (.idx) will be generated. Placing both in the pack/ subdirectory of $GIT_OBJECT_DIRECTORY (or any of the directories on $GIT_ALTERNATE_OBJECT_DIRECTORIES) enables git to read from such an archive. -'git-unpack-objects' command can read the packed archive and +The 'git-unpack-objects' command can read the packed archive and expand the objects contained in the pack into "one-file one-object" format; this is typically done by the smart-pull commands when a pack is created on-the-fly for efficient network @@ -58,7 +59,7 @@ base-name:: --revs:: Read the revision arguments from the standard input, instead of individual object names. The revision arguments are processed - the same way as linkgit:git-rev-list[1] with `--objects` flag + the same way as 'git-rev-list' with the `--objects` flag uses its `commit` arguments to build the list of objects it outputs. The objects on the resulting list are packed. @@ -73,7 +74,13 @@ base-name:: as if all refs under `$GIT_DIR/refs` are specified to be included. ---window=[N], --depth=[N]:: +--include-tag:: + Include unasked-for annotated tags if the object they + reference was included in the resulting packfile. This + can be useful to send new tags to native git clients. + +--window=[N]:: +--depth=[N]:: These two options affect how the objects contained in the pack are stored using delta compression. The objects are first internally sorted by type, size and @@ -99,7 +106,8 @@ base-name:: --max-pack-size=<n>:: Maximum size of each output packfile, expressed in MiB. If specified, multiple packfiles may be created. - The default is unlimited. + The default is unlimited, unless the config variable + `pack.packSizeLimit` is set. --incremental:: This flag causes an object already in a pack ignored @@ -155,14 +163,14 @@ base-name:: generated pack. If not specified, pack compression level is determined first by pack.compression, then by core.compression, and defaults to -1, the zlib default, if neither is set. - Add \--no-reuse-object if you want to force a uniform compression + Add --no-reuse-object if you want to force a uniform compression level on all data no matter the source. --delta-base-offset:: A packed archive can express base object of a delta as either 20-byte object name or as an offset in the stream, but older version of git does not understand the - latter. By default, git-pack-objects only uses the + latter. By default, 'git-pack-objects' only uses the former format for better compatibility. This option allows the command to use the latter format for compactness. Depending on the average delta chain @@ -176,6 +184,8 @@ base-name:: This is meant to reduce packing time on multiprocessor machines. The required amount of memory for the delta search window is however multiplied by the number of threads. + Specifying 0 will cause git to auto-detect the number of CPU's + and set the number of threads accordingly. --index-version=<version>[,<offset>]:: This is intended to be used by the test suite only. It allows @@ -191,7 +201,7 @@ Documentation ------------- Documentation by Junio C Hamano -See Also +SEE ALSO -------- linkgit:git-rev-list[1] linkgit:git-repack[1] @@ -199,4 +209,4 @@ linkgit:git-prune-packed[1] GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-pack-redundant.txt b/Documentation/git-pack-redundant.txt index af4aa4a2e5..5f9435e59b 100644 --- a/Documentation/git-pack-redundant.txt +++ b/Documentation/git-pack-redundant.txt @@ -8,21 +8,21 @@ git-pack-redundant - Find redundant pack files SYNOPSIS -------- -'git-pack-redundant' [ --verbose ] [ --alt-odb ] < --all | .pack filename ... > +'git pack-redundant' [ --verbose ] [ --alt-odb ] < --all | .pack filename ... > DESCRIPTION ----------- This program computes which packs in your repository are redundant. The output is suitable for piping to -'xargs rm' if you are in the root of the repository. +`xargs rm` if you are in the root of the repository. -git-pack-redundant accepts a list of objects on standard input. Any objects +'git-pack-redundant' accepts a list of objects on standard input. Any objects given will be ignored when checking which packs are required. This makes the following command useful when wanting to remove packs which contain unreachable objects. -git-fsck --full --unreachable | cut -d ' ' -f3 | \ -git-pack-redundant --all | xargs rm +git fsck --full --unreachable | cut -d ' ' -f3 | \ +git pack-redundant --all | xargs rm OPTIONS ------- @@ -46,7 +46,7 @@ Documentation -------------- Documentation by Lukas Sandström <lukass@etek.chalmers.se> -See Also +SEE ALSO -------- linkgit:git-pack-objects[1] linkgit:git-repack[1] @@ -54,4 +54,4 @@ linkgit:git-prune-packed[1] GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-pack-refs.txt b/Documentation/git-pack-refs.txt index e4ff934711..a5244d35f4 100644 --- a/Documentation/git-pack-refs.txt +++ b/Documentation/git-pack-refs.txt @@ -7,7 +7,7 @@ git-pack-refs - Pack heads and tags for efficient repository access SYNOPSIS -------- -'git-pack-refs' [--all] [--no-prune] +'git pack-refs' [--all] [--no-prune] DESCRIPTION ----------- @@ -31,7 +31,7 @@ Subsequent updates to branches always creates new file under A recommended practice to deal with a repository with too many refs is to pack its refs with `--all --prune` once, and -occasionally run `git-pack-refs \--prune`. Tags are by +occasionally run `git pack-refs \--prune`. Tags are by definition stationary and are not expected to change. Branch heads will be packed with the initial `pack-refs --all`, but only the currently active branch heads will become unpacked, @@ -42,7 +42,7 @@ unpacked. OPTIONS ------- -\--all:: +--all:: The command by default packs all tags and refs that are already packed, and leaves other refs @@ -51,7 +51,7 @@ developed and packing their tips does not help performance. This option causes branch tips to be packed as well. Useful for a repository with many branches of historical interests. -\--no-prune:: +--no-prune:: The command usually removes loose refs under `$GIT_DIR/refs` hierarchy after packing them. This option tells it not to. @@ -63,4 +63,4 @@ Written by Linus Torvalds <torvalds@osdl.org> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-parse-remote.txt b/Documentation/git-parse-remote.txt index deb8b2f01e..cd43069874 100644 --- a/Documentation/git-parse-remote.txt +++ b/Documentation/git-parse-remote.txt @@ -8,7 +8,7 @@ git-parse-remote - Routines to help parsing remote repository access parameters SYNOPSIS -------- -'. git-parse-remote' +'. "$(git --exec-path)/git-parse-remote"' DESCRIPTION ----------- @@ -32,7 +32,7 @@ get_remote_refs_for_fetch:: get_remote_refs_for_push:: Given the list of user-supplied `<repo> <refspec>...`, return the list of refs to push in a form suitable to be - fed to the `git-send-pack` command. When `<refspec>...` + fed to the 'git-send-pack' command. When `<refspec>...` is empty the returned list of refs consists of the defaults for the given `<repo>`, if specified in `$GIT_DIR/remotes/`. @@ -47,4 +47,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-patch-id.txt b/Documentation/git-patch-id.txt index 894852a78b..477785e134 100644 --- a/Documentation/git-patch-id.txt +++ b/Documentation/git-patch-id.txt @@ -7,7 +7,7 @@ git-patch-id - Compute unique ID for a patch SYNOPSIS -------- -'git-patch-id' < <patch> +'git patch-id' < <patch> DESCRIPTION ----------- @@ -18,7 +18,7 @@ ID" are almost guaranteed to be the same thing. IOW, you can use this thing to look for likely duplicate commits. -When dealing with git-diff-tree output, it takes advantage of +When dealing with 'git-diff-tree' output, it takes advantage of the fact that the patch is prefixed with the object name of the commit, and outputs two 40-byte hexadecimal string. The first string is the patch ID, and the second string is the commit ID. @@ -39,4 +39,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-peek-remote.txt b/Documentation/git-peek-remote.txt index 0001710072..8282a5e82b 100644 --- a/Documentation/git-peek-remote.txt +++ b/Documentation/git-peek-remote.txt @@ -8,15 +8,15 @@ git-peek-remote - List the references in a remote repository SYNOPSIS -------- -'git-peek-remote' [--upload-pack=<git-upload-pack>] [<host>:]<directory> +'git peek-remote' [--upload-pack=<git-upload-pack>] [<host>:]<directory> DESCRIPTION ----------- -This command is deprecated; use `git-ls-remote` instead. +This command is deprecated; use 'git-ls-remote' instead. OPTIONS ------- -\--upload-pack=<git-upload-pack>:: +--upload-pack=<git-upload-pack>:: Use this to specify the path to 'git-upload-pack' on the remote side, if it is not found on your $PATH. Some installations of sshd ignores the user's environment @@ -39,7 +39,7 @@ OPTIONS Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -47,4 +47,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-prune-packed.txt b/Documentation/git-prune-packed.txt index 93ee82ae57..b5f26cee13 100644 --- a/Documentation/git-prune-packed.txt +++ b/Documentation/git-prune-packed.txt @@ -8,7 +8,7 @@ git-prune-packed - Remove extra objects that are already in pack files SYNOPSIS -------- -'git-prune-packed' [-n] [-q] +'git prune-packed' [-n] [-q] DESCRIPTION @@ -42,11 +42,11 @@ Documentation -------------- Documentation by Ryan Anderson <ryan@michonline.com> -See Also +SEE ALSO -------- linkgit:git-pack-objects[1] linkgit:git-repack[1] GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-prune.txt b/Documentation/git-prune.txt index f151cff5d9..54f1dab38d 100644 --- a/Documentation/git-prune.txt +++ b/Documentation/git-prune.txt @@ -13,13 +13,19 @@ SYNOPSIS DESCRIPTION ----------- -This runs `git-fsck --unreachable` using all the refs +NOTE: In most cases, users should run 'git-gc', which calls +'git-prune'. See the section "NOTES", below. + +This runs 'git-fsck --unreachable' using all the refs available in `$GIT_DIR/refs`, optionally with additional set of -objects specified on the command line, and prunes all +objects specified on the command line, and prunes all unpacked objects unreachable from any of these head objects from the object database. In addition, it prunes the unpacked objects that are also found in packs by -running `git prune-packed`. +running 'git-prune-packed'. + +Note that unreachable, packed objects will remain. If this is +not desired, see linkgit:git-repack[1]. OPTIONS ------- @@ -31,7 +37,7 @@ OPTIONS \--:: Do not interpret any more arguments as options. -\--expire <time>:: +--expire <time>:: Only expire loose objects older than <time>. <head>...:: @@ -47,9 +53,26 @@ borrows from your repository via its `.git/objects/info/alternates`: ------------ -$ git prune $(cd ../another && $(git-rev-parse --all)) +$ git prune $(cd ../another && $(git rev-parse --all)) ------------ +Notes +----- + +In most cases, users will not need to call 'git-prune' directly, but +should instead call 'git-gc', which handles pruning along with +many other housekeeping tasks. + +For a description of which objects are considered for pruning, see +'git-fsck''s --unreachable option. + +SEE ALSO +-------- + +linkgit:git-fsck[1], +linkgit:git-gc[1], +linkgit:git-reflog[1] + Author ------ Written by Linus Torvalds <torvalds@osdl.org> @@ -60,4 +83,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-pull.txt b/Documentation/git-pull.txt index 77fdaf146e..7578623edb 100644 --- a/Documentation/git-pull.txt +++ b/Documentation/git-pull.txt @@ -8,23 +8,45 @@ git-pull - Fetch from and merge with another repository or a local branch SYNOPSIS -------- -'git-pull' <options> <repository> <refspec>... +'git pull' <options> <repository> <refspec>... DESCRIPTION ----------- -Runs `git-fetch` with the given parameters, and calls `git-merge` +Runs 'git-fetch' with the given parameters, and calls 'git-merge' to merge the retrieved head(s) into the current branch. +With `--rebase`, calls 'git-rebase' instead of 'git-merge'. Note that you can use `.` (current directory) as the <repository> to pull from the local repository -- this is useful when merging local branches into the current branch. +Also note that options meant for 'git-pull' itself and underlying +'git-merge' must be given before the options meant for 'git-fetch'. OPTIONS ------- include::merge-options.txt[] +:git-pull: 1 + +--rebase:: + Instead of a merge, perform a rebase after fetching. If + there is a remote ref for the upstream branch, and this branch + was rebased since last fetched, the rebase uses that information + to avoid rebasing non-local changes. To make this the default + for branch `<name>`, set configuration `branch.<name>.rebase` + to `true`. ++ +[NOTE] +This is a potentially _dangerous_ mode of operation. +It rewrites history, which does not bode well when you +published that history already. Do *not* use this option +unless you have read linkgit:git-rebase[1] carefully. + +--no-rebase:: + Override earlier --rebase. + include::fetch-options.txt[] include::pull-fetch-param.txt[] @@ -33,16 +55,6 @@ include::urls-remotes.txt[] include::merge-strategies.txt[] -\--rebase:: - Instead of a merge, perform a rebase after fetching. - *NOTE:* This is a potentially _dangerous_ mode of operation. - It rewrites history, which does not bode well when you - published that history already. Do *not* use this option - unless you have read linkgit:git-rebase[1] carefully. - -\--no-rebase:: - Override earlier \--rebase. - DEFAULT BEHAVIOUR ----------------- @@ -100,40 +112,58 @@ rules apply: EXAMPLES -------- -git pull, git pull origin:: - Update the remote-tracking branches for the repository - you cloned from, then merge one of them into your - current branch. Normally the branch merged in is - the HEAD of the remote repository, but the choice is - determined by the branch.<name>.remote and - branch.<name>.merge options; see linkgit:git-config[1] - for details. - -git pull origin next:: - Merge into the current branch the remote branch `next`; - leaves a copy of `next` temporarily in FETCH_HEAD, but - does not update any remote-tracking branches. - -git pull . fixes enhancements:: - Bundle local branch `fixes` and `enhancements` on top of - the current branch, making an Octopus merge. This `git pull .` - syntax is equivalent to `git merge`. - -git pull -s ours . obsolete:: - Merge local branch `obsolete` into the current branch, - using `ours` merge strategy. - -git pull --no-commit . maint:: - Merge local branch `maint` into the current branch, but - do not make a commit automatically. This can be used - when you want to include further changes to the merge, - or want to write your own merge commit message. +* Update the remote-tracking branches for the repository + you cloned from, then merge one of them into your + current branch: ++ +------------------------------------------------ +$ git pull, git pull origin +------------------------------------------------ ++ +Normally the branch merged in is the HEAD of the remote repository, +but the choice is determined by the branch.<name>.remote and +branch.<name>.merge options; see linkgit:git-config[1] for details. + +* Merge into the current branch the remote branch `next`: ++ +------------------------------------------------ +$ git pull origin next +------------------------------------------------ ++ +This leaves a copy of `next` temporarily in FETCH_HEAD, but +does not update any remote-tracking branches. + +* Bundle local branch `fixes` and `enhancements` on top of + the current branch, making an Octopus merge: ++ +------------------------------------------------ +$ git pull . fixes enhancements +------------------------------------------------ ++ +This `git pull .` syntax is equivalent to `git merge`. + +* Merge local branch `obsolete` into the current branch, using `ours` + merge strategy: ++ +------------------------------------------------ +$ git pull -s ours . obsolete +------------------------------------------------ + +* Merge local branch `maint` into the current branch, but do not make + a commit automatically: ++ +------------------------------------------------ +$ git pull --no-commit . maint +------------------------------------------------ ++ +This can be used when you want to include further changes to the +merge, or want to write your own merge commit message. + You should refrain from abusing this option to sneak substantial changes into a merge commit. Small fixups like bumping release/version name would be acceptable. -Command line pull of multiple branches from one repository:: +* Command line pull of multiple branches from one repository: + ------------------------------------------------ $ git checkout master @@ -141,19 +171,18 @@ $ git fetch origin +pu:pu maint:tmp $ git pull . tmp ------------------------------------------------ + -This updates (or creates, as necessary) branches `pu` and `tmp` -in the local repository by fetching from the branches -(respectively) `pu` and `maint` from the remote repository. +This updates (or creates, as necessary) branches `pu` and `tmp` in +the local repository by fetching from the branches (respectively) +`pu` and `maint` from the remote repository. + -The `pu` branch will be updated even if it is does not -fast-forward; the others will not be. +The `pu` branch will be updated even if it is does not fast-forward; +the others will not be. + The final command then merges the newly fetched `tmp` into master. If you tried a pull which resulted in a complex conflicts and -would want to start over, you can recover with -linkgit:git-reset[1]. +would want to start over, you can recover with 'git-reset'. SEE ALSO @@ -164,7 +193,7 @@ linkgit:git-fetch[1], linkgit:git-merge[1], linkgit:git-config[1] Author ------ Written by Linus Torvalds <torvalds@osdl.org> -and Junio C Hamano <junkio@cox.net> +and Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -174,4 +203,4 @@ Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-push.txt b/Documentation/git-push.txt index 5f2494495b..45c96435fa 100644 --- a/Documentation/git-push.txt +++ b/Documentation/git-push.txt @@ -9,8 +9,9 @@ git-push - Update remote refs along with associated objects SYNOPSIS -------- [verse] -'git-push' [--all] [--dry-run] [--tags] [--receive-pack=<git-receive-pack>] - [--repo=all] [-f | --force] [-v | --verbose] [<repository> <refspec>...] +'git push' [--all] [--dry-run] [--tags] [--receive-pack=<git-receive-pack>] + [--repo=all] [-f | --force] [-v | --verbose] + [<repository> <refspec>...] DESCRIPTION ----------- @@ -29,28 +30,23 @@ OPTIONS The "remote" repository that is destination of a push operation. See the section <<URLS,GIT URLS>> below. -<refspec>:: +<refspec>...:: The canonical format of a <refspec> parameter is - `+?<src>:<dst>`; that is, an optional plus `+`, followed + `+?<src>:<dst>`; that is, an optional plus `{plus}`, followed by the source ref, followed by a colon `:`, followed by the destination ref. + -The <src> side can be an -arbitrary "SHA1 expression" that can be used as an -argument to `git-cat-file -t`. E.g. `master~4` (push -four parents before the current master head). +The <src> side represents the source branch (or arbitrary +"SHA1 expression", such as `master~4` (four parents before the +tip of `master` branch); see linkgit:git-rev-parse[1]) that you +want to push. The <dst> side represents the destination location. + The local ref that matches <src> is used -to fast forward the remote ref that matches <dst>. If -the optional plus `+` is used, the remote ref is updated +to fast forward the remote ref that matches <dst> (or, if no <dst> was +specified, the same ref that <src> referred to locally). If +the optional leading plus `+` is used, the remote ref is updated even if it does not result in a fast forward update. + -Note: If no explicit refspec is found, (that is neither -on the command line nor in any Push line of the -corresponding remotes file---see below), then all the -heads that exist both on the local side and on the remote -side are updated. -+ `tag <tag>` means the same as `refs/tags/<tag>:refs/tags/<tag>`. + A parameter <ref> without a colon pushes the <ref> from the source @@ -58,56 +54,118 @@ repository to the destination repository under the same name. + Pushing an empty <src> allows you to delete the <dst> ref from the remote repository. - -\--all:: ++ +The special refspec `:` (or `+:` to allow non-fast forward updates) +directs git to push "matching" heads: for every head that exists on +the local side, the remote side is updated if a head of the same name +already exists on the remote side. This is the default operation mode +if no explicit refspec is found (that is neither on the command line +nor in any Push line of the corresponding remotes file---see below). + +--all:: Instead of naming each ref to push, specifies that all refs under `$GIT_DIR/refs/heads/` be pushed. -\--mirror:: +--mirror:: Instead of naming each ref to push, specifies that all - refs under `$GIT_DIR/refs/heads/` and `$GIT_DIR/refs/tags/` + refs under `$GIT_DIR/refs/` (which includes but is not + limited to `refs/heads/`, `refs/remotes/`, and `refs/tags/`) be mirrored to the remote repository. Newly created local refs will be pushed to the remote end, locally updated refs will be force updated on the remote end, and deleted refs - will be removed from the remote end. + will be removed from the remote end. This is the default + if the configuration option `remote.<remote>.mirror` is + set. -\--dry-run:: +--dry-run:: Do everything except actually send the updates. -\--tags:: +--tags:: All refs under `$GIT_DIR/refs/tags` are pushed, in addition to refspecs explicitly listed on the command line. -\--receive-pack=<git-receive-pack>:: +--receive-pack=<git-receive-pack>:: Path to the 'git-receive-pack' program on the remote end. Sometimes useful when pushing to a remote repository over ssh, and you do not have the program in a directory on the default $PATH. -\--exec=<git-receive-pack>:: +--exec=<git-receive-pack>:: Same as \--receive-pack=<git-receive-pack>. --f, \--force:: +-f:: +--force:: Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it. This flag disables the check. This can cause the remote repository to lose commits; use it with care. -\--repo=<repo>:: +--repo=<repo>:: When no repository is specified the command defaults to "origin"; this overrides it. -\--thin, \--no-thin:: - These options are passed to `git-send-pack`. Thin +--thin:: +--no-thin:: + These options are passed to 'git-send-pack'. Thin transfer spends extra cycles to minimize the number of objects to be sent and meant to be used on slower connection. --v, \--verbose:: +-v:: +--verbose:: Run verbosely. include::urls-remotes.txt[] +OUTPUT +------ + +The output of "git push" depends on the transport method used; this +section describes the output when pushing over the git protocol (either +locally or via ssh). + +The status of the push is output in tabular form, with each line +representing the status of a single ref. Each line is of the form: + +------------------------------- + <flag> <summary> <from> -> <to> (<reason>) +------------------------------- + +flag:: + A single character indicating the status of the ref. This is + blank for a successfully pushed ref, `!` for a ref that was + rejected or failed to push, and '=' for a ref that was up to + date and did not need pushing (note that the status of up to + date refs is shown only when `git push` is running verbosely). + +summary:: + For a successfully pushed ref, the summary shows the old and new + values of the ref in a form suitable for using as an argument to + `git log` (this is `<old>..<new>` in most cases, and + `<old>...<new>` for forced non-fast forward updates). For a + failed update, more details are given for the failure. + The string `rejected` indicates that git did not try to send the + ref at all (typically because it is not a fast forward). The + string `remote rejected` indicates that the remote end refused + the update; this rejection is typically caused by a hook on the + remote side. The string `remote failure` indicates that the + remote end did not report the successful update of the ref + (perhaps because of a temporary error on the remote side, a + break in the network connection, or other transient error). + +from:: + The name of the local ref being pushed, minus its + `refs/<type>/` prefix. In the case of deletion, the + name of the local ref is omitted. + +to:: + The name of the remote ref being updated, minus its + `refs/<type>/` prefix. + +reason:: + A human-readable explanation. In the case of successfully pushed + refs, no explanation is needed. For a failed ref, the reason for + failure is described. Examples -------- @@ -116,27 +174,29 @@ git push origin master:: Find a ref that matches `master` in the source repository (most likely, it would find `refs/heads/master`), and update the same ref (e.g. `refs/heads/master`) in `origin` repository - with it. + with it. If `master` did not exist remotely, it would be + created. git push origin :experimental:: Find a ref that matches `experimental` in the `origin` repository (e.g. `refs/heads/experimental`), and delete it. -git push origin master:satellite/master:: - Find a ref that matches `master` in the source repository - (most likely, it would find `refs/heads/master`), and update - the ref that matches `satellite/master` (most likely, it would - be `refs/remotes/satellite/master`) in `origin` repository with it. +git push origin master:satellite/master dev:satellite/dev:: + Use the source ref that matches `master` (e.g. `refs/heads/master`) + to update the ref that matches `satellite/master` (most probably + `refs/remotes/satellite/master`) in the `origin` repository, then + do the same for `dev` and `satellite/dev`. git push origin master:refs/heads/experimental:: Create the branch `experimental` in the `origin` repository - by copying the current `master` branch. This form is usually - needed to create a new branch in the remote repository as - there is no `experimental` branch to match. + by copying the current `master` branch. This form is only + needed to create a new branch or tag in the remote repository when + the local name and the remote name are different; otherwise, + the ref name on its own will work. Author ------ -Written by Junio C Hamano <junkio@cox.net>, later rewritten in C +Written by Junio C Hamano <gitster@pobox.com>, later rewritten in C by Linus Torvalds <torvalds@osdl.org> Documentation @@ -145,4 +205,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-quiltimport.txt b/Documentation/git-quiltimport.txt index 0fc2b56c12..d4037de512 100644 --- a/Documentation/git-quiltimport.txt +++ b/Documentation/git-quiltimport.txt @@ -9,7 +9,7 @@ git-quiltimport - Applies a quilt patchset onto the current branch SYNOPSIS -------- [verse] -'git-quiltimport' [--dry-run] [--author <author>] [--patches <dir>] +'git quiltimport' [--dry-run] [--author <author>] [--patches <dir>] DESCRIPTION @@ -29,6 +29,8 @@ preserved as the 1 line subject in the git description. OPTIONS ------- + +-n:: --dry-run:: Walk through the patches in the series and warn if we cannot find all of the necessary information to commit @@ -57,4 +59,4 @@ Documentation by Eric Biederman <ebiederm@lnxi.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-read-tree.txt b/Documentation/git-read-tree.txt index 8421d1fd78..6f4b9b017f 100644 --- a/Documentation/git-read-tree.txt +++ b/Documentation/git-read-tree.txt @@ -8,7 +8,7 @@ git-read-tree - Reads tree information into the index SYNOPSIS -------- -'git-read-tree' (<tree-ish> | [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <tree-ish1> [<tree-ish2> [<tree-ish3>]]) +'git read-tree' (<tree-ish> | [[-m [--trivial] [--aggressive] | --reset | --prefix=<prefix>] [-u | -i]] [--exclude-per-directory=<gitignore>] [--index-output=<file>] <tree-ish1> [<tree-ish2> [<tree-ish3>]]) DESCRIPTION @@ -22,8 +22,8 @@ fast-forward (i.e. 2-way) merge, or a 3-way merge, with the `-m` flag. When used with `-m`, the `-u` flag causes it to also update the files in the work tree with the result of the merge. -Trivial merges are done by `git-read-tree` itself. Only conflicting paths -will be in unmerged state when `git-read-tree` returns. +Trivial merges are done by 'git-read-tree' itself. Only conflicting paths +will be in unmerged state when 'git-read-tree' returns. OPTIONS ------- @@ -50,14 +50,17 @@ OPTIONS trees that are not directly related to the current working tree status into a temporary index file. +-v:: + Show the progress of checking files out. + --trivial:: - Restrict three-way merge by `git-read-tree` to happen + Restrict three-way merge by 'git-read-tree' to happen only if there is no file-level merging required, instead of resolving merge for trivial cases and leaving conflicting files unresolved in the index. --aggressive:: - Usually a three-way merge by `git-read-tree` resolves + Usually a three-way merge by 'git-read-tree' resolves the merge for really trivial cases and leaves other cases unresolved in the index, so that Porcelains can implement different merge policies. This flag makes the @@ -110,7 +113,7 @@ OPTIONS Merging ------- -If `-m` is specified, `git-read-tree` can perform 3 kinds of +If `-m` is specified, 'git-read-tree' can perform 3 kinds of merge, a single tree merge if only 1 tree is given, a fast-forward merge with 2 trees, or a 3-way merge if 3 trees are provided. @@ -118,29 +121,29 @@ provided. Single Tree Merge ~~~~~~~~~~~~~~~~~ -If only 1 tree is specified, git-read-tree operates as if the user did not +If only 1 tree is specified, 'git-read-tree' operates as if the user did not specify `-m`, except that if the original index has an entry for a given pathname, and the contents of the path matches with the tree being read, the stat info from the index is used. (In other words, the index's stat()s take precedence over the merged tree's). -That means that if you do a `git-read-tree -m <newtree>` followed by a -`git-checkout-index -f -u -a`, the `git-checkout-index` only checks out +That means that if you do a `git read-tree -m <newtree>` followed by a +`git checkout-index -f -u -a`, the 'git-checkout-index' only checks out the stuff that really changed. -This is used to avoid unnecessary false hits when `git-diff-files` is -run after `git-read-tree`. +This is used to avoid unnecessary false hits when 'git-diff-files' is +run after 'git-read-tree'. Two Tree Merge ~~~~~~~~~~~~~~ -Typically, this is invoked as `git-read-tree -m $H $M`, where $H +Typically, this is invoked as `git read-tree -m $H $M`, where $H is the head commit of the current repository, and $M is the head of a foreign tree, which is simply ahead of $H (i.e. we are in a fast forward situation). -When two trees are specified, the user is telling git-read-tree +When two trees are specified, the user is telling 'git-read-tree' the following: 1. The current index and work tree is derived from $H, but @@ -148,7 +151,7 @@ the following: 2. The user wants to fast-forward to $M. -In this case, the `git-read-tree -m $H $M` command makes sure +In this case, the `git read-tree -m $H $M` command makes sure that no local change is lost as the result of this "merge". Here are the "carry forward" rules: @@ -190,18 +193,18 @@ Here are the "carry forward" rules: In all "keep index" cases, the index entry stays as in the original index file. If the entry were not up to date, -git-read-tree keeps the copy in the work tree intact when +'git-read-tree' keeps the copy in the work tree intact when operating under the -u flag. -When this form of git-read-tree returns successfully, you can +When this form of 'git-read-tree' returns successfully, you can see what "local changes" you made are carried forward by running -`git-diff-index --cached $M`. Note that this does not -necessarily match `git-diff-index --cached $H` would have +`git diff-index --cached $M`. Note that this does not +necessarily match `git diff-index --cached $H` would have produced before such a two tree merge. This is because of cases 18 and 19 --- if you already had the changes in $M (e.g. maybe -you picked it up via e-mail in a patch form), `git-diff-index +you picked it up via e-mail in a patch form), `git diff-index --cached $H` would have told you about the change before this -merge, but it would not show in `git-diff-index --cached $M` +merge, but it would not show in `git diff-index --cached $M` output after two-tree merge. @@ -210,13 +213,13 @@ output after two-tree merge. Each "index" entry has two bits worth of "stage" state. stage 0 is the normal one, and is the only one you'd see in any kind of normal use. -However, when you do `git-read-tree` with three trees, the "stage" +However, when you do 'git-read-tree' with three trees, the "stage" starts out at 1. This means that you can do ---------------- -$ git-read-tree -m <tree1> <tree2> <tree3> +$ git read-tree -m <tree1> <tree2> <tree3> ---------------- and you will end up with an index with all of the <tree1> entries in @@ -226,7 +229,7 @@ branch into the current branch, we use the common ancestor tree as <tree1>, the current branch head as <tree2>, and the other branch head as <tree3>. -Furthermore, `git-read-tree` has special-case logic that says: if you see +Furthermore, 'git-read-tree' has special-case logic that says: if you see a file that matches in all respects in the following states, it "collapses" back to "stage0": @@ -242,7 +245,7 @@ a file that matches in all respects in the following states, it - stage 1 and stage 3 are the same and stage 2 is different take stage 2 (we did something while they did nothing) -The `git-write-tree` command refuses to write a nonsensical tree, and it +The 'git-write-tree' command refuses to write a nonsensical tree, and it will complain about unmerged entries if it sees a single entry that is not stage 0. @@ -258,7 +261,7 @@ start a 3-way merge with an index file that is already populated. Here is an outline of how the algorithm works: - if a file exists in identical format in all three trees, it will - automatically collapse to "merged" state by git-read-tree. + automatically collapse to "merged" state by 'git-read-tree'. - a file that has _any_ difference what-so-ever in the three trees will stay as separate entries in the index. It's up to "porcelain @@ -282,8 +285,8 @@ populated. Here is an outline of how the algorithm works: matching "stage1" entry if it exists too. .. all the normal trivial rules .. -You would normally use `git-merge-index` with supplied -`git-merge-one-file` to do this last step. The script updates +You would normally use 'git-merge-index' with supplied +'git-merge-one-file' to do this last step. The script updates the files in the working tree as it merges each path and at the end of a successful merge. @@ -301,16 +304,16 @@ commit. To illustrate, suppose you start from what has been committed last to your repository: ---------------- -$ JC=`git-rev-parse --verify "HEAD^0"` -$ git-checkout-index -f -u -a $JC +$ JC=`git rev-parse --verify "HEAD^0"` +$ git checkout-index -f -u -a $JC ---------------- -You do random edits, without running git-update-index. And then +You do random edits, without running 'git-update-index'. And then you notice that the tip of your "upstream" tree has advanced since you pulled from him: ---------------- -$ git-fetch git://.... linus +$ git fetch git://.... linus $ LT=`cat .git/FETCH_HEAD` ---------------- @@ -320,10 +323,10 @@ added or modified index entries since $JC, and if you haven't, then does the right thing. So with the following sequence: ---------------- -$ git-read-tree -m -u `git-merge-base $JC $LT` $JC $LT -$ git-merge-index git-merge-one-file -a +$ git read-tree -m -u `git merge-base $JC $LT` $JC $LT +$ git merge-index git-merge-one-file -a $ echo "Merge with Linus" | \ - git-commit-tree `git-write-tree` -p $JC -p $LT + git commit-tree `git write-tree` -p $JC -p $LT ---------------- what you would commit is a pure merge between $JC and $LT without @@ -331,21 +334,21 @@ your work-in-progress changes, and your work tree would be updated to the result of the merge. However, if you have local changes in the working tree that -would be overwritten by this merge,`git-read-tree` will refuse +would be overwritten by this merge, 'git-read-tree' will refuse to run to prevent your changes from being lost. In other words, there is no need to worry about what exists only in the working tree. When you have local changes in a part of the project that is not involved in the merge, your changes do not interfere with the merge, and are kept intact. When they -*do* interfere, the merge does not even start (`git-read-tree` +*do* interfere, the merge does not even start ('git-read-tree' complains loudly and fails without modifying anything). In such a case, you can simply continue doing what you were in the middle of doing, and when your working tree is ready (i.e. you have finished your work-in-progress), attempt the merge again. -See Also +SEE ALSO -------- linkgit:git-write-tree[1]; linkgit:git-ls-files[1]; linkgit:gitignore[5] @@ -361,4 +364,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-rebase.txt b/Documentation/git-rebase.txt index c11c6453ea..59c1b021a6 100644 --- a/Documentation/git-rebase.txt +++ b/Documentation/git-rebase.txt @@ -8,14 +8,15 @@ git-rebase - Forward-port local commits to the updated upstream head SYNOPSIS -------- [verse] -'git-rebase' [-i | --interactive] [-v | --verbose] [-m | --merge] +'git rebase' [-i | --interactive] [-v | --verbose] [-m | --merge] + [-s <strategy> | --strategy=<strategy>] [-C<n>] [ --whitespace=<option>] [-p | --preserve-merges] [--onto <newbase>] <upstream> [<branch>] -'git-rebase' --continue | --skip | --abort +'git rebase' --continue | --skip | --abort DESCRIPTION ----------- -If <branch> is specified, git-rebase will perform an automatic +If <branch> is specified, 'git-rebase' will perform an automatic `git checkout <branch>` before doing anything else. Otherwise it remains on the current branch. @@ -25,7 +26,8 @@ of commits that would be shown by `git log <upstream>..HEAD`. The current branch is reset to <upstream>, or <newbase> if the --onto option was supplied. This has the exact same effect as -`git reset --hard <upstream>` (or <newbase>). +`git reset --hard <upstream>` (or <newbase>). ORIG_HEAD is set +to point at the tip of the branch before the reset. The commits that were previously saved into the temporary area are then reapplied to the current branch, one by one, in order. Note that @@ -37,8 +39,8 @@ It is possible that a merge failure will prevent this process from being completely automatic. You will have to resolve any such merge failure and run `git rebase --continue`. Another option is to bypass the commit that caused the merge failure with `git rebase --skip`. To restore the -original <branch> and remove the .dotest working files, use the command -`git rebase --abort` instead. +original <branch> and remove the .git/rebase-apply working files, use the +command `git rebase --abort` instead. Assume the following history exists and the current branch is "topic": @@ -51,8 +53,8 @@ Assume the following history exists and the current branch is "topic": From this point, the result of either of the following commands: - git-rebase master - git-rebase master topic + git rebase master + git rebase master topic would be: @@ -67,7 +69,7 @@ followed by `git rebase master`. If the upstream branch already contains a change you have made (e.g., because you mailed a patch which was applied upstream), then that commit -will be skipped. For example, running `git-rebase master` on the +will be skipped. For example, running `git rebase master` on the following history (in which A' and A introduce the same set of changes, but have different committer information): @@ -115,7 +117,7 @@ got merged into more stable 'master' branch, like this: We can get this using the following command: - git-rebase --onto master next topic + git rebase --onto master next topic Another example of --onto option is to rebase part of a @@ -131,7 +133,7 @@ branch. If we have the following situation: then the command - git-rebase --onto master topicA topicB + git rebase --onto master topicA topicB would result in: @@ -154,7 +156,7 @@ the following situation: then the command - git-rebase --onto topicA~5 topicA~3 topicA + git rebase --onto topicA~5 topicA~3 topicA would result in the removal of commits F and G: @@ -166,8 +168,8 @@ This is useful if F and G were flawed in some way, or should not be part of topicA. Note that the argument to --onto and the <upstream> parameter can be any valid commit-ish. -In case of conflict, git-rebase will stop at the first problematic commit -and leave conflict markers in the tree. You can use git diff to locate +In case of conflict, 'git-rebase' will stop at the first problematic commit +and leave conflict markers in the tree. You can use 'git-diff' to locate the markers (<<<<<<) and make edits to resolve the conflict. For each file you edit, you need to tell git that the conflict has been resolved, typically this would be done with @@ -183,7 +185,7 @@ desired resolution, you can continue the rebasing process with git rebase --continue -Alternatively, you can undo the git-rebase with +Alternatively, you can undo the 'git-rebase' with git rebase --abort @@ -212,19 +214,22 @@ OPTIONS --skip:: Restart the rebasing process by skipping the current patch. --m, \--merge:: +-m:: +--merge:: Use merging strategies to rebase. When the recursive (default) merge strategy is used, this allows rebase to be aware of renames on the upstream side. --s <strategy>, \--strategy=<strategy>:: +-s <strategy>:: +--strategy=<strategy>:: Use the given merge strategy; can be supplied more than once to specify them in the order they should be tried. If there is no `-s` option, a built-in list of strategies - is used instead (`git-merge-recursive` when merging a single - head, `git-merge-octopus` otherwise). This implies --merge. + is used instead ('git-merge-recursive' when merging a single + head, 'git-merge-octopus' otherwise). This implies --merge. --v, \--verbose:: +-v:: +--verbose:: Display a diffstat of what changed upstream since the last rebase. -C<n>:: @@ -234,15 +239,17 @@ OPTIONS ever ignored. --whitespace=<nowarn|warn|error|error-all|strip>:: - This flag is passed to the `git-apply` program + This flag is passed to the 'git-apply' program (see linkgit:git-apply[1]) that applies the patch. --i, \--interactive:: +-i:: +--interactive:: Make a list of the commits which are about to be rebased. Let the user edit that list before rebasing. This mode can also be used to split commits (see SPLITTING COMMITS below). --p, \--preserve-merges:: +-p:: +--preserve-merges:: Instead of ignoring merges, try to recreate them. This option only works in interactive mode. @@ -253,16 +260,15 @@ NOTES When you rebase a branch, you are changing its history in a way that will cause problems for anyone who already has a copy of the branch in their repository and tries to pull updates from you. You should -understand the implications of using 'git rebase' on a repository that +understand the implications of using 'git-rebase' on a repository that you share. -When the git rebase command is run, it will first execute a "pre-rebase" +When the git-rebase command is run, it will first execute a "pre-rebase" hook if one exists. You can use this hook to do sanity checks and reject the rebase if it isn't appropriate. Please see the template pre-rebase hook script for an example. -You must be in the top directory of your project to start (or continue) -a rebase. Upon completion, <branch> will be the current branch. +Upon completion, <branch> will be the current branch. INTERACTIVE MODE ---------------- @@ -309,12 +315,12 @@ pick fa1afe1 The oneline of the next commit ... ------------------------------------------- -The oneline descriptions are purely for your pleasure; `git-rebase` will +The oneline descriptions are purely for your pleasure; 'git-rebase' will not look at them but at the commit names ("deadbee" and "fa1afe1" in this example), so do not delete or edit the names. By replacing the command "pick" with the command "edit", you can tell -`git-rebase` to stop after applying that commit, so that you can edit +'git-rebase' to stop after applying that commit, so that you can edit the files and/or the commit message, amend the commit, and continue rebasing. @@ -329,7 +335,7 @@ the loop with `git rebase --continue`. For example, if you want to reorder the last 5 commits, such that what was HEAD~4 becomes the new HEAD. To achieve that, you would call -`git-rebase` like this: +'git-rebase' like this: ---------------------- $ git rebase -i HEAD~5 @@ -359,40 +365,40 @@ SPLITTING COMMITS ----------------- In interactive mode, you can mark commits with the action "edit". However, -this does not necessarily mean that 'git rebase' expects the result of this +this does not necessarily mean that 'git-rebase' expects the result of this edit to be exactly one commit. Indeed, you can undo the commit, or you can add other commits. This can be used to split a commit into two: -- Start an interactive rebase with 'git rebase -i <commit>^', where +- Start an interactive rebase with `git rebase -i <commit>^`, where <commit> is the commit you want to split. In fact, any commit range will do, as long as it contains that commit. - Mark the commit you want to split with the action "edit". -- When it comes to editing that commit, execute 'git reset HEAD^'. The +- When it comes to editing that commit, execute `git reset HEAD^`. The effect is that the HEAD is rewound by one, and the index follows suit. However, the working tree stays the same. - Now add the changes to the index that you want to have in the first - commit. You can use linkgit:git-add[1] (possibly interactively) and/or - linkgit:git-gui[1] to do that. + commit. You can use `git add` (possibly interactively) or + 'git-gui' (or both) to do that. - Commit the now-current index with whatever commit message is appropriate now. - Repeat the last two steps until your working tree is clean. -- Continue the rebase with 'git rebase --continue'. +- Continue the rebase with `git rebase --continue`. If you are not absolutely sure that the intermediate revisions are consistent (they compile, pass the testsuite, etc.) you should use -linkgit:git-stash[1] to stash away the not-yet-committed changes +'git-stash' to stash away the not-yet-committed changes after each commit, test, and amend the commit if fixes are necessary. Authors ------ -Written by Junio C Hamano <junkio@cox.net> and +Written by Junio C Hamano <gitster@pobox.com> and Johannes E. Schindelin <johannes.schindelin@gmx.de> Documentation @@ -401,4 +407,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-receive-pack.txt b/Documentation/git-receive-pack.txt index 4111434bb6..6b2f8c4de7 100644 --- a/Documentation/git-receive-pack.txt +++ b/Documentation/git-receive-pack.txt @@ -8,7 +8,7 @@ git-receive-pack - Receive what is pushed into the repository SYNOPSIS -------- -'git-receive-pack' <directory> +'git receive-pack' <directory> DESCRIPTION ----------- @@ -18,17 +18,17 @@ information fed from the remote end. This command is usually not invoked directly by the end user. The UI for the protocol is on the 'git-send-pack' side, and the program pair is meant to be used to push updates to remote -repository. For pull operations, see 'git-fetch-pack'. +repository. For pull operations, see linkgit:git-fetch-pack[1]. The command allows for creation and fast forwarding of sha1 refs (heads/tags) on the remote end (strictly speaking, it is the -local end receive-pack runs, but to the user who is sitting at +local end 'git-receive-pack' runs, but to the user who is sitting at the send-pack end, it is updating the remote. Confused?) There are other real-world examples of using update and post-update hooks found in the Documentation/howto directory. -git-receive-pack honours the receive.denyNonFastForwards config +'git-receive-pack' honours the receive.denyNonFastForwards config option, which tells it if updates to a ref should be denied if they are not fast-forwards. @@ -111,10 +111,10 @@ ref listing the commits pushed to the repository: if expr "$oval" : '0*$' >/dev/null then echo "Created a new ref, with the following commits:" - git-rev-list --pretty "$nval" + git rev-list --pretty "$nval" else echo "New commits:" - git-rev-list --pretty "$nval" "^$oval" + git rev-list --pretty "$nval" "^$oval" fi | mail -s "Changes to ref $ref" commit-list@mydomain done @@ -125,7 +125,7 @@ non-zero exit code will generate an error message. Note that it is possible for refname to not have sha1-new when this hook runs. This can easily occur if another user modifies the ref -after it was updated by receive-pack, but before the hook was able +after it was updated by 'git-receive-pack', but before the hook was able to evaluate it. It is recommended that hooks rely on sha1-new rather than the current value of refname. @@ -137,14 +137,14 @@ post-update will called with the list of refs that have been updated. This can be used to implement any repository wide cleanup tasks. The exit code from this hook invocation is ignored; the only thing -left for git-receive-pack to do at that point is to exit itself +left for 'git-receive-pack' to do at that point is to exit itself anyway. -This hook can be used, for example, to run "git-update-server-info" +This hook can be used, for example, to run `git update-server-info` if the repository is packed and is served via a dumb transport. #!/bin/sh - exec git-update-server-info + exec git update-server-info SEE ALSO @@ -162,4 +162,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-reflog.txt b/Documentation/git-reflog.txt index f9bba36c23..d99236e14d 100644 --- a/Documentation/git-reflog.txt +++ b/Documentation/git-reflog.txt @@ -16,10 +16,12 @@ The command takes various subcommands, and different options depending on the subcommand: [verse] -git reflog expire [--dry-run] [--stale-fix] [--verbose] +'git reflog expire' [--dry-run] [--stale-fix] [--verbose] [--expire=<time>] [--expire-unreachable=<time>] [--all] <refs>... - -git reflog [show] [log-options] [<ref>] ++ +'git reflog delete' ref@\{specifier\}... ++ +'git reflog' ['show'] [log-options] [<ref>] Reflog is a mechanism to record when the tip of branches are updated. This command is to manage the information recorded in it. @@ -34,7 +36,7 @@ The subcommand "show" (which is also the default, in the absence of any subcommands) will take all the normal log options, and show the log of the reference provided in the command-line (or `HEAD`, by default). The reflog will cover all recent actions (HEAD reflog records branch switching -as well). It is an alias for 'git log -g --abbrev-commit --pretty=oneline'; +as well). It is an alias for `git log -g --abbrev-commit --pretty=oneline`; see linkgit:git-log[1]. The reflog is useful in various git commands, to specify the old value @@ -43,6 +45,9 @@ two moves ago", `master@\{one.week.ago\}` means "where master used to point to one week ago", and so on. See linkgit:git-rev-parse[1] for more details. +To delete single entries from the reflog, use the subcommand "delete" +and specify the _exact_ entry (e.g. "`git reflog delete master@\{2\}`"). + OPTIONS ------- @@ -55,7 +60,7 @@ OPTIONS refs. + This computation involves traversing all the reachable objects, i.e. it -has the same cost as 'git prune'. Fortunately, once this is run, we +has the same cost as 'git-prune'. Fortunately, once this is run, we should not have to ever worry about missing objects, because the current prune and pack-objects know about reflogs and protect objects referred by them. @@ -75,12 +80,21 @@ them. --all:: Instead of listing <refs> explicitly, prune all refs. +--updateref:: + Update the ref with the sha1 of the top reflog entry (i.e. + <ref>@\{0\}) after expiring or deleting. + +--rewrite:: + While expiring or deleting, adjust each reflog entry to ensure + that the `old` sha1 field points to the `new` sha1 field of the + previous entry. + --verbose:: Print extra information on screen. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -88,4 +102,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-relink.txt b/Documentation/git-relink.txt index 1b024ded33..25ff8f9dcb 100644 --- a/Documentation/git-relink.txt +++ b/Documentation/git-relink.txt @@ -7,7 +7,7 @@ git-relink - Hardlink common objects in local repositories SYNOPSIS -------- -'git-relink' [--safe] <dir> [<dir>]\* <master_dir> +'git relink' [--safe] <dir> [<dir>]\* <master_dir> DESCRIPTION ----------- @@ -34,4 +34,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-remote.txt b/Documentation/git-remote.txt index 10f6fa58bf..bb99810ec7 100644 --- a/Documentation/git-remote.txt +++ b/Documentation/git-remote.txt @@ -9,12 +9,12 @@ git-remote - manage set of tracked repositories SYNOPSIS -------- [verse] -'git-remote' -'git-remote' add [-t <branch>] [-m <branch>] [-f] [--mirror] <name> <url> -'git-remote' rm <name> -'git-remote' show <name> -'git-remote' prune <name> -'git-remote' update [group] +'git remote' [-v | --verbose] +'git remote add' [-t <branch>] [-m <master>] [-f] [--mirror] <name> <url> +'git remote rm' <name> +'git remote show' [-n] <name> +'git remote prune' [-n | --dry-run] <name> +'git remote update' [group] DESCRIPTION ----------- @@ -22,6 +22,14 @@ DESCRIPTION Manage the set of repositories ("remotes") whose branches you track. +OPTIONS +------- + +-v:: +--verbose:: + Be a little more verbose and show remote url after name. + + COMMANDS -------- @@ -47,9 +55,11 @@ With `-m <master>` option, `$GIT_DIR/remotes/<name>/HEAD` is set up to point at remote's `<master>` branch instead of whatever branch the `HEAD` at the remote repository actually points at. + -In mirror mode, enabled with `--mirror`, the refs will not be stored +In mirror mode, enabled with `\--mirror`, the refs will not be stored in the 'refs/remotes/' namespace, but in 'refs/heads/'. This option -only makes sense in bare repositories. +only makes sense in bare repositories. If a remote uses mirror +mode, furthermore, `git push` will always behave as if `\--mirror` +was passed. 'rm':: @@ -70,9 +80,8 @@ These stale branches have already been removed from the remote repository referenced by <name>, but are still locally available in "remotes/<name>". + -With `-n` option, the remote heads are not confirmed first with `git -ls-remote <name>`; cached information is used instead. Use with -caution. +With `--dry-run` option, report what branches will be pruned, but do no +actually prune them. 'update':: @@ -115,7 +124,7 @@ $ git checkout -b nfs linux-nfs/master ... ------------ -* Imitate 'git clone' but track only selected branches +* Imitate 'git-clone' but track only selected branches + ------------ $ mkdir project.git @@ -126,7 +135,7 @@ $ git merge origin ------------ -See Also +SEE ALSO -------- linkgit:git-fetch[1] linkgit:git-branch[1] @@ -144,4 +153,4 @@ Documentation by J. Bruce Fields and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-repack.txt b/Documentation/git-repack.txt index 3d957492f8..38ac60947b 100644 --- a/Documentation/git-repack.txt +++ b/Documentation/git-repack.txt @@ -8,7 +8,7 @@ git-repack - Pack unpacked objects in a repository SYNOPSIS -------- -'git-repack' [-a] [-d] [-f] [-l] [-n] [-q] [--window=N] [--depth=N] +'git repack' [-a] [-A] [-d] [-f] [-l] [-n] [-q] [--window=N] [--depth=N] DESCRIPTION ----------- @@ -37,28 +37,45 @@ OPTIONS leaves behind, but `git fsck --full` shows as dangling. +-A:: + Same as `-a`, but any unreachable objects in a previous + pack become loose, unpacked objects, instead of being + left in the old pack. Unreachable objects are never + intentionally added to a pack, even when repacking. + When used with '-d', this option + prevents unreachable objects from being immediately + deleted by way of being left in the old pack and then + removed. Instead, the loose unreachable objects + will be pruned according to normal expiry rules + with the next 'git-gc' invocation. See linkgit:git-gc[1]. + -d:: After packing, if the newly created packs make some existing packs redundant, remove the redundant packs. - Also runs linkgit:git-prune-packed[1]. + Also run 'git-prune-packed' to remove redundant + loose object files. -l:: - Pass the `--local` option to `git pack-objects`, see + Pass the `--local` option to 'git-pack-objects'. See linkgit:git-pack-objects[1]. -f:: - Pass the `--no-reuse-delta` option to `git pack-objects`, see + Pass the `--no-reuse-delta` option to 'git-pack-objects'. See linkgit:git-pack-objects[1]. -q:: - Pass the `-q` option to `git pack-objects`, see + Pass the `-q` option to 'git-pack-objects'. See linkgit:git-pack-objects[1]. -n:: - Do not update the server information with - `git update-server-info`. - ---window=[N], --depth=[N]:: + Do not update the server information with + 'git-update-server-info'. This option skips + updating local catalog files needed to publish + this repository (or a direct copy of it) + over HTTP or FTP. See linkgit:git-update-server-info[1]. + +--window=[N]:: +--depth=[N]:: These two options affect how the objects contained in the pack are stored using delta compression. The objects are first internally sorted by type, size and optionally names and compared against the @@ -90,7 +107,7 @@ Configuration When configuration variable `repack.UseDeltaBaseOffset` is set for the repository, the command passes `--delta-base-offset` -option to `git-pack-objects`; this typically results in slightly +option to 'git-pack-objects'; this typically results in slightly smaller packs, but the generated packs are incompatible with versions of git older than (and including) v1.4.3; do not set the variable in a repository that older version of git needs to @@ -107,11 +124,11 @@ Documentation -------------- Documentation by Ryan Anderson <ryan@michonline.com> -See Also +SEE ALSO -------- linkgit:git-pack-objects[1] linkgit:git-prune-packed[1] GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-repo-config.txt b/Documentation/git-repo-config.txt index 2ca39946b7..e5bdb5533e 100644 --- a/Documentation/git-repo-config.txt +++ b/Documentation/git-repo-config.txt @@ -8,7 +8,7 @@ git-repo-config - Get and set repository or global options SYNOPSIS -------- -'git-repo-config' ... +'git repo-config' ... DESCRIPTION diff --git a/Documentation/git-request-pull.txt b/Documentation/git-request-pull.txt index 270df9b185..19335fddae 100644 --- a/Documentation/git-request-pull.txt +++ b/Documentation/git-request-pull.txt @@ -7,7 +7,7 @@ git-request-pull - Generates a summary of pending changes SYNOPSIS -------- -'git-request-pull' <start> <url> [<end>] +'git request-pull' <start> <url> [<end>] DESCRIPTION ----------- @@ -24,11 +24,11 @@ OPTIONS URL to include in the summary. <end>:: - Commit to send at; defaults to HEAD. + Commit to end at; defaults to HEAD. Author ------ -Written by Ryan Anderson <ryan@michonline.com> and Junio C Hamano <junkio@cox.net> +Written by Ryan Anderson <ryan@michonline.com> and Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -36,4 +36,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-rerere.txt b/Documentation/git-rerere.txt index a53858e250..64715c17da 100644 --- a/Documentation/git-rerere.txt +++ b/Documentation/git-rerere.txt @@ -7,7 +7,7 @@ git-rerere - Reuse recorded resolution of conflicted merges SYNOPSIS -------- -'git-rerere' [clear|diff|status|gc] +'git rerere' ['clear'|'diff'|'status'|'gc'] DESCRIPTION ----------- @@ -30,26 +30,26 @@ enable this command. COMMANDS -------- -Normally, git-rerere is run without arguments or user-intervention. +Normally, 'git-rerere' is run without arguments or user-intervention. However, it has several commands that allow it to interact with its working state. 'clear':: This resets the metadata used by rerere if a merge resolution is to be -is aborted. Calling linkgit:git-am[1] --skip or linkgit:git-rebase[1] -[--skip|--abort] will automatically invoke this command. +aborted. Calling 'git-am [--skip|--abort]' or 'git-rebase [--skip|--abort]' +will automatically invoke this command. 'diff':: This displays diffs for the current state of the resolution. It is useful for tracking what has changed while the user is resolving conflicts. Additional arguments are passed directly to the system -diff(1) command installed in PATH. +'diff' command installed in PATH. 'status':: -Like diff, but this only prints the filenames that will be tracked +Like 'diff', but this only prints the filenames that will be tracked for resolutions. 'gc':: @@ -90,15 +90,15 @@ One way to do it is to pull master into the topic branch: The commits marked with `*` touch the same area in the same file; you need to resolve the conflicts when creating the commit -marked with `+`. Then you can test the result to make sure your +marked with `{plus}`. Then you can test the result to make sure your work-in-progress still works with what is in the latest master. After this test merge, there are two ways to continue your work on the topic. The easiest is to build on top of the test merge -commit `+`, and when your work in the topic branch is finally +commit `{plus}`, and when your work in the topic branch is finally ready, pull the topic branch into master, and/or ask the upstream to pull from you. By that time, however, the master or -the upstream might have been advanced since the test merge `+`, +the upstream might have been advanced since the test merge `{plus}`, in which case the final commit graph would look like this: ------------ @@ -142,33 +142,33 @@ finally ready and merged into the master branch. This merge would require you to resolve the conflict, introduced by the commits marked with `*`. However, often this conflict is the same conflict you resolved when you created the test merge you -blew away. `git-rerere` command helps you to resolve this final +blew away. 'git-rerere' command helps you to resolve this final conflicted merge using the information from your earlier hand resolve. -Running `git-rerere` command immediately after a conflicted +Running the 'git-rerere' command immediately after a conflicted automerge records the conflicted working tree files, with the usual conflict markers `<<<<<<<`, `=======`, and `>>>>>>>` in them. Later, after you are done resolving the conflicts, -running `git-rerere` again records the resolved state of these +running 'git-rerere' again records the resolved state of these files. Suppose you did this when you created the test merge of master into the topic branch. -Next time, running `git-rerere` after seeing a conflicted +Next time, running 'git-rerere' after seeing a conflicted automerge, if the conflict is the same as the earlier one recorded, it is noticed and a three-way merge between the earlier conflicted automerge, the earlier manual resolution, and the current conflicted automerge is performed by the command. If this three-way merge resolves cleanly, the result is written out to your working tree file, so you would not have to manually -resolve it. Note that `git-rerere` leaves the index file alone, +resolve it. Note that 'git-rerere' leaves the index file alone, so you still need to do the final sanity checks with `git diff` -(or `git diff -c`) and `git add` when you are satisfied. +(or `git diff -c`) and 'git-add' when you are satisfied. -As a convenience measure, `git-merge` automatically invokes -`git-rerere` when it exits with a failed automerge, which +As a convenience measure, 'git-merge' automatically invokes +'git-rerere' when it exits with a failed automerge, which records it if it is a new conflict, or reuses the earlier hand -resolve when it is not. `git-commit` also invokes `git-rerere` +resolve when it is not. 'git-commit' also invokes 'git-rerere' when recording a merge result. What this means is that you do not have to do anything special yourself (Note: you still have to set the config variable rerere.enabled to enable this command). @@ -178,8 +178,8 @@ resolution is recorded, and it will be reused when you do the actual merge later with updated master and topic branch, as long as the earlier resolution is still applicable. -The information `git-rerere` records is also used when running -`git-rebase`. After blowing away the test merge and continuing +The information 'git-rerere' records is also used when running +'git-rebase'. After blowing away the test merge and continuing development on the topic branch: ------------ @@ -198,14 +198,14 @@ you could run `git rebase master topic`, to keep yourself up-to-date even before your topic is ready to be sent upstream. This would result in falling back to three-way merge, and it would conflict the same way the test merge you resolved earlier. -`git-rerere` is run by `git rebase` to help you resolve this +'git-rerere' is run by 'git-rebase' to help you resolve this conflict. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-reset.txt b/Documentation/git-reset.txt index a4e0a779de..6abaeac28c 100644 --- a/Documentation/git-reset.txt +++ b/Documentation/git-reset.txt @@ -8,8 +8,8 @@ git-reset - Reset current HEAD to the specified state SYNOPSIS -------- [verse] -'git-reset' [--mixed | --soft | --hard] [-q] [<commit>] -'git-reset' [--mixed] [-q] [<commit>] [--] <paths>... +'git reset' [--mixed | --soft | --hard] [-q] [<commit>] +'git reset' [-q] [<commit>] [--] <paths>... DESCRIPTION ----------- @@ -37,7 +37,7 @@ OPTIONS --soft:: Does not touch the index file nor the working tree at all, but requires them to be in a good order. This leaves all your changed - files "Added but not yet committed", as linkgit:git-status[1] would + files "Changes to be committed", as 'git-status' would put it. --hard:: @@ -176,9 +176,26 @@ $ git reset <3> committed as 'snapshot WIP'. This updates the index to show your WIP files as uncommitted. +Reset a single file in the index:: ++ +Suppose you have added a file to your index, but later decide you do not +want to add it to your commit. You can remove the file from the index +while keeping your changes with git reset. ++ +------------ +$ git reset -- frotz.c <1> +$ git commit -m "Commit files in index" <2> +$ git add frotz.c <3> +------------ ++ +<1> This removes the file from the index while keeping it in the working + directory. +<2> This commits all other changes in the index. +<3> Adds the file to the index again. + Author ------ -Written by Junio C Hamano <junkio@cox.net> and Linus Torvalds <torvalds@osdl.org> +Written by Junio C Hamano <gitster@pobox.com> and Linus Torvalds <torvalds@osdl.org> Documentation -------------- @@ -186,4 +203,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-rev-list.txt b/Documentation/git-rev-list.txt index 5b96eabfce..fd1de92e34 100644 --- a/Documentation/git-rev-list.txt +++ b/Documentation/git-rev-list.txt @@ -20,6 +20,9 @@ SYNOPSIS [ \--full-history ] [ \--not ] [ \--all ] + [ \--branches ] + [ \--tags ] + [ \--remotes ] [ \--stdin ] [ \--quiet ] [ \--topo-order ] @@ -31,6 +34,7 @@ SYNOPSIS [ \--(author|committer|grep)=<pattern> ] [ \--regexp-ignore-case | \-i ] [ \--extended-regexp | \-E ] + [ \--fixed-strings | \-F ] [ \--date={local|relative|default|iso|rfc|short} ] [ [\--objects | \--objects-edge] [ \--unpacked ] ] [ \--pretty | \--header ] @@ -55,7 +59,7 @@ stop at that point. Their parents are implied. Thus the following command: ----------------------------------------------------------------------- - $ git-rev-list foo bar ^baz + $ git rev-list foo bar ^baz ----------------------------------------------------------------------- means "list all the commits which are included in 'foo' and 'bar', but @@ -66,8 +70,8 @@ short-hand for "{caret}'<commit1>' '<commit2>'". For example, either of the following may be used interchangeably: ----------------------------------------------------------------------- - $ git-rev-list origin..HEAD - $ git-rev-list HEAD ^origin + $ git rev-list origin..HEAD + $ git rev-list HEAD ^origin ----------------------------------------------------------------------- Another special notation is "'<commit1>'...'<commit2>'" which is useful @@ -75,15 +79,15 @@ for merges. The resulting set of commits is the symmetric difference between the two operands. The following two commands are equivalent: ----------------------------------------------------------------------- - $ git-rev-list A B --not $(git-merge-base --all A B) - $ git-rev-list A...B + $ git rev-list A B --not $(git merge-base --all A B) + $ git rev-list A...B ----------------------------------------------------------------------- -linkgit:git-rev-list[1] is a very essential git program, since it +'git-rev-list' is a very essential git program, since it provides the ability to build and traverse commit ancestry graphs. For this reason, it has a lot of different options that enables it to be -used by commands as different as linkgit:git-bisect[1] and -linkgit:git-repack[1]. +used by commands as different as 'git-bisect' and +'git-repack'. OPTIONS ------- @@ -105,4 +109,4 @@ and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-rev-parse.txt b/Documentation/git-rev-parse.txt index 5d9c36985f..2921da320d 100644 --- a/Documentation/git-rev-parse.txt +++ b/Documentation/git-rev-parse.txt @@ -8,23 +8,23 @@ git-rev-parse - Pick out and massage parameters SYNOPSIS -------- -'git-rev-parse' [ --option ] <args>... +'git rev-parse' [ --option ] <args>... DESCRIPTION ----------- Many git porcelainish commands take mixture of flags (i.e. parameters that begin with a dash '-') and parameters -meant for underlying `git-rev-list` command they use internally -and flags and parameters for other commands they use as the -downstream of `git-rev-list`. This command is used to +meant for the underlying 'git-rev-list' command they use internally +and flags and parameters for the other commands they use +downstream of 'git-rev-list'. This command is used to distinguish between them. OPTIONS ------- --parseopt:: - Use `git-rev-parse` in option parsing mode (see PARSEOPT section below). + Use 'git-rev-parse' in option parsing mode (see PARSEOPT section below). --keep-dash-dash:: Only meaningful in `--parseopt` mode. Tells the option parser to echo @@ -32,11 +32,11 @@ OPTIONS --revs-only:: Do not output flags and parameters not meant for - `git-rev-list` command. + 'git-rev-list' command. --no-revs:: Do not output flags and parameters meant for - `git-rev-list` command. + 'git-rev-list' command. --flags:: Do not output non-flag parameters. @@ -52,13 +52,19 @@ OPTIONS The parameter given must be usable as a single, valid object name. Otherwise barf and abort. +-q:: +--quiet:: + Only meaningful in `--verify` mode. Do not output an error + message if the first argument is not a valid object name; + instead exit with non-zero status silently. + --sq:: Usually the output is made one line per flag and parameter. This option makes output a single line, properly quoted for consumption by shell. Useful when you expect your parameter to contain whitespaces and newlines (e.g. when using pickaxe `-S` with - `git-diff-\*`). + 'git-diff-\*'). --not:: When showing object names, prefix them with '{caret}' and @@ -114,18 +120,21 @@ OPTIONS --is-bare-repository:: When the repository is bare print "true", otherwise "false". ---short, --short=number:: +--short:: +--short=number:: Instead of outputting the full SHA1 values of object names try to abbreviate them to a shorter unique name. When no length is specified 7 is used. The minimum length is 4. ---since=datestring, --after=datestring:: - Parses the date string, and outputs corresponding - --max-age= parameter for git-rev-list command. +--since=datestring:: +--after=datestring:: + Parse the date string, and output the corresponding + --max-age= parameter for 'git-rev-list'. ---until=datestring, --before=datestring:: - Parses the date string, and outputs corresponding - --min-age= parameter for git-rev-list command. +--until=datestring:: +--before=datestring:: + Parse the date string, and output the corresponding + --min-age= parameter for 'git-rev-list'. <args>...:: Flags and parameters to be parsed. @@ -146,8 +155,9 @@ blobs contained in a commit. name the same commit object if there are no other object in your repository whose object name starts with dae86e. -* An output from `git-describe`; i.e. a closest tag, followed by a - dash, a `g`, and an abbreviated object name. +* An output from 'git-describe'; i.e. a closest tag, optionally + followed by a dash and a number of commits, followed by a dash, a + `g`, and an abbreviated object name. * A symbolic ref name. E.g. 'master' typically means the commit object referenced by $GIT_DIR/refs/heads/master. If you @@ -157,7 +167,7 @@ blobs contained in a commit. first match in the following rules: . if `$GIT_DIR/<name>` exists, that is what you mean (this is usually - useful only for `HEAD`, `FETCH_HEAD` and `MERGE_HEAD`); + useful only for `HEAD`, `FETCH_HEAD`, `ORIG_HEAD` and `MERGE_HEAD`); . otherwise, `$GIT_DIR/refs/<name>` if exists; @@ -168,6 +178,16 @@ blobs contained in a commit. . otherwise, `$GIT_DIR/refs/remotes/<name>` if exists; . otherwise, `$GIT_DIR/refs/remotes/<name>/HEAD` if exists. ++ +HEAD names the commit your changes in the working tree is based on. +FETCH_HEAD records the branch you fetched from a remote repository +with your last 'git-fetch' invocation. +ORIG_HEAD is created by commands that moves your HEAD in a drastic +way, to record the position of the HEAD before their operation, so that +you can change the tip of the branch back to the state before you ran +them easily. +MERGE_HEAD records the commit(s) you are merging into your branch +when you run 'git-merge'. * A ref followed by the suffix '@' with a date specification enclosed in a brace @@ -175,7 +195,10 @@ blobs contained in a commit. second ago\}' or '\{1979-02-26 18:30:00\}') to specify the value of the ref at a prior point in time. This suffix may only be used immediately following a ref name and the ref must have an - existing log ($GIT_DIR/logs/<ref>). + existing log ($GIT_DIR/logs/<ref>). Note that this looks up the state + of your *local* ref at a given time; e.g., what was in your local + `master` branch last week. If you want to look at commits made during + certain times, see `--since` and `--until`. * A ref followed by the suffix '@' with an ordinal specification enclosed in a brace pair (e.g. '\{1\}', '\{15\}') to specify @@ -229,25 +252,27 @@ blobs contained in a commit. * A colon, optionally followed by a stage number (0 to 3) and a colon, followed by a path; this names a blob object in the index at the given path. Missing stage number (and the colon - that follows it) names an stage 0 entry. During a merge, stage + that follows it) names a stage 0 entry. During a merge, stage 1 is the common ancestor, stage 2 is the target branch's version (typically the current branch), and stage 3 is the version from the branch being merged. -Here is an illustration, by Jon Loeliger. Both node B and C are -a commit parents of commit node A. Parent commits are ordered +Here is an illustration, by Jon Loeliger. Both commit nodes B +and C are parents of commit node A. Parent commits are ordered left-to-right. - G H I J - \ / \ / - D E F - \ | / \ - \ | / | - \|/ | - B C - \ / - \ / - A +........................................ +G H I J + \ / \ / + D E F + \ | / \ + \ | / | + \|/ | + B C + \ / + \ / + A +........................................ A = = A^0 B = A^ = A^1 = A~1 @@ -264,7 +289,7 @@ left-to-right. SPECIFYING RANGES ----------------- -History traversing commands such as `git-log` operate on a set +History traversing commands such as 'git-log' operate on a set of commits, not just a single commit. To these commands, specifying a single revision with the notation described in the previous section means the set of commits reachable from that @@ -275,23 +300,23 @@ notation is used. E.g. "`{caret}r1 r2`" means commits reachable from `r2` but exclude the ones reachable from `r1`. This set operation appears so often that there is a shorthand -for it. "`r1..r2`" is equivalent to "`{caret}r1 r2`". It is -the difference of two sets (subtract the set of commits -reachable from `r1` from the set of commits reachable from -`r2`). +for it. When you have two commits `r1` and `r2` (named according +to the syntax explained in SPECIFYING REVISIONS above), you can ask +for commits that are reachable from r2 excluding those that are reachable +from r1 by "`{caret}r1 r2`" and it can be written as "`r1..r2`". A similar notation "`r1\...r2`" is called symmetric difference of `r1` and `r2` and is defined as -"`r1 r2 --not $(git-merge-base --all r1 r2)`". +"`r1 r2 --not $(git merge-base --all r1 r2)`". It is the set of commits that are reachable from either one of `r1` or `r2` but not from both. Two other shorthands for naming a set that is formed by a commit -and its parent commits exists. `r1{caret}@` notation means all +and its parent commits exist. The `r1{caret}@` notation means all parents of `r1`. `r1{caret}!` includes commit `r1` but excludes -its all parents. +all of its parents. -Here are a handful examples: +Here are a handful of examples: D G H D D F G H I J D F @@ -305,7 +330,7 @@ Here are a handful examples: PARSEOPT -------- -In `--parseopt` mode, `git-rev-parse` helps massaging options to bring to shell +In `--parseopt` mode, 'git-rev-parse' helps massaging options to bring to shell scripts the same facilities C builtins have. It works as an option normalizer (e.g. splits single switches aggregate values), a bit like `getopt(1)` does. @@ -317,7 +342,7 @@ usage on the standard error stream, and exits with code 129. Input Format ~~~~~~~~~~~~ -`git-rev-parse --parseopt` input format is fully text based. It has two parts, +'git-rev-parse --parseopt' input format is fully text based. It has two parts, separated by a line that contains only `--`. The lines before the separator (should be more than one) are used for the usage. The lines after the separator describe the options. @@ -325,7 +350,7 @@ The lines after the separator describe the options. Each line of options has this format: ------------ -<opt_spec><arg_spec>? SP+ help LF +<opt_spec><flags>* SP+ help LF ------------ `<opt_spec>`:: @@ -334,10 +359,17 @@ Each line of options has this format: is necessary. `h,help`, `dry-run` and `f` are all three correct `<opt_spec>`. -`<arg_spec>`:: - an `<arg_spec>` tells the option parser if the option has an argument - (`=`), an optional one (`?` though its use is discouraged) or none - (no `<arg_spec>` in that case). +`<flags>`:: + `<flags>` are of `*`, `=`, `?` or `!`. + * Use `=` if the option takes an argument. + + * Use `?` to mean that the option is optional (though its use is discouraged). + + * Use `*` to mean that this option should not be listed in the usage + generated for the `-h` argument. It's shown for `--help-all` as + documented in linkgit:gitcli[7]. + + * Use `!` to not make the corresponding negated long option available. The remainder of the line, after stripping the spaces, is used as the help associated to the option. @@ -363,14 +395,39 @@ bar= some cool option --bar with an argument An option group Header C? option C with an optional argument" -eval `echo "$OPTS_SPEC" | git-rev-parse --parseopt -- "$@" || echo exit $?` +eval `echo "$OPTS_SPEC" | git rev-parse --parseopt -- "$@" || echo exit $?` +------------ + +EXAMPLES +-------- + +* Print the object name of the current commit: ++ +------------ +$ git rev-parse --verify HEAD +------------ + +* Print the commit object name from the revision in the $REV shell variable: ++ +------------ +$ git rev-parse --verify $REV +------------ ++ +This will error out if $REV is empty or not a valid revision. + +* Same as above: ++ +------------ +$ git rev-parse --default master --verify $REV ------------ ++ +but if $REV is empty, the commit object name from master will be printed. Author ------ Written by Linus Torvalds <torvalds@osdl.org> . -Junio C Hamano <junkio@cox.net> and Pierre Habouzit <madcoder@debian.org> +Junio C Hamano <gitster@pobox.com> and Pierre Habouzit <madcoder@debian.org> Documentation -------------- @@ -378,4 +435,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-revert.txt b/Documentation/git-revert.txt index 93e20f7752..98cfa3c0d0 100644 --- a/Documentation/git-revert.txt +++ b/Documentation/git-revert.txt @@ -7,7 +7,7 @@ git-revert - Revert an existing commit SYNOPSIS -------- -'git-revert' [--edit | --no-edit] [-n] [-m parent-number] <commit> +'git revert' [--edit | --no-edit] [-n] [-m parent-number] [-s] <commit> DESCRIPTION ----------- @@ -22,12 +22,14 @@ OPTIONS For a more complete list of ways to spell commit names, see "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1]. --e|--edit:: - With this option, `git-revert` will let you edit the commit +-e:: +--edit:: + With this option, 'git-revert' will let you edit the commit message prior to committing the revert. This is the default if you run the command from a terminal. --m parent-number|--mainline parent-number:: +-m parent-number:: +--mainline parent-number:: Usually you cannot revert a merge because you do not know which side of the merge should be considered the mainline. This option specifies the parent number (starting from 1) of @@ -35,26 +37,31 @@ OPTIONS relative to the specified parent. --no-edit:: - With this option, `git-revert` will not start the commit + With this option, 'git-revert' will not start the commit message editor. --n|--no-commit:: +-n:: +--no-commit:: Usually the command automatically creates a commit with - a commit log message stating which commit was reverted. - This flag applies the change necessary to revert the - named commit to your working tree, but does not make the - commit. In addition, when this option is used, your - working tree does not have to match the HEAD commit. - The revert is done against the beginning state of your - working tree. + a commit log message stating which commit was + reverted. This flag applies the change necessary + to revert the named commit to your working tree + and the index, but does not make the commit. In addition, + when this option is used, your index does not have to match + the HEAD commit. The revert is done against the + beginning state of your index. + This is useful when reverting more than one commits' -effect to your working tree in a row. +effect to your index in a row. + +-s:: +--signoff:: + Add Signed-off-by line at the end of the commit message. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -62,4 +69,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-rm.txt b/Documentation/git-rm.txt index dc36c662ae..5afb1e7428 100644 --- a/Documentation/git-rm.txt +++ b/Documentation/git-rm.txt @@ -7,32 +7,43 @@ git-rm - Remove files from the working tree and from the index SYNOPSIS -------- -'git-rm' [-f] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>... +'git rm' [-f | --force] [-n] [-r] [--cached] [--ignore-unmatch] [--quiet] [--] <file>... DESCRIPTION ----------- -Remove files from the working tree and from the index. The -files have to be identical to the tip of the branch, and no -updates to its contents must have been placed in the staging -area (aka index). When --cached is given, the staged content has to -match either the tip of the branch *or* the file on disk. +Remove files from the index, or from the working tree and the index. +'git-rm' will not remove a file from just your working directory. +(There is no option to remove a file only from the work tree +and yet keep it in the index; use `/bin/rm` if you want to do that.) +The files being removed have to be identical to the tip of the branch, +and no updates to their contents can be staged in the index, +though that default behavior can be overridden with the `-f` option. +When '--cached' is given, the staged content has to +match either the tip of the branch or the file on disk, +allowing the file to be removed from just the index. OPTIONS ------- <file>...:: Files to remove. Fileglobs (e.g. `*.c`) can be given to - remove all matching files. Also a leading directory name - (e.g. `dir` to add `dir/file1` and `dir/file2`) can be - given to remove all files in the directory, recursively, - but this requires `-r` option to be given for safety. + remove all matching files. If you want git to expand + file glob characters, you may need to shell-escape them. + A leading directory name + (e.g. `dir` to remove `dir/file1` and `dir/file2`) can be + given to remove all files in the directory, and recursively + all sub-directories, + but this requires the `-r` option to be explicitly given. -f:: +--force:: Override the up-to-date check. --n, \--dry-run:: - Don't actually remove the file(s), just show if they exist in - the index. +-n:: +--dry-run:: + Don't actually remove any file(s). Instead, just show + if they exist in the index and would otherwise be removed + by the command. -r:: Allow recursive removal when a leading directory name is @@ -43,45 +54,49 @@ OPTIONS the list of files, (useful when filenames might be mistaken for command-line options). -\--cached:: - This option can be used to tell the command to remove - the paths only from the index, leaving working tree - files. +--cached:: + Use this option to unstage and remove paths only from the index. + Working tree files, whether modified or not, will be + left alone. -\--ignore-unmatch:: +--ignore-unmatch:: Exit with a zero status even if no files matched. --q, \--quiet:: - git-rm normally outputs one line (in the form of an "rm" command) +-q:: +--quiet:: + 'git-rm' normally outputs one line (in the form of an "rm" command) for each file removed. This option suppresses that output. DISCUSSION ---------- -The list of <file> given to the command can be exact pathnames, -file glob patterns, or leading directory name. The command -removes only the paths that is known to git. Giving the name of +The <file> list given to the command can be exact pathnames, +file glob patterns, or leading directory names. The command +removes only the paths that are known to git. Giving the name of a file that you have not told git about does not remove that file. +File globbing matches across directory boundaries. Thus, given +two directories `d` and `d2`, there is a difference between +using `git rm \'d\*\'` and `git rm \'d/\*\'`, as the former will +also remove all of directory `d2`. EXAMPLES -------- -git-rm Documentation/\\*.txt:: +git rm Documentation/\\*.txt:: Removes all `\*.txt` files from the index that are under the `Documentation` directory and any of its subdirectories. + Note that the asterisk `\*` is quoted from the shell in this -example; this lets the command include the files from -subdirectories of `Documentation/` directory. +example; this lets git, and not the shell, expand the pathnames +of files and subdirectories under the `Documentation/` directory. -git-rm -f git-*.sh:: - Remove all git-*.sh scripts that are in the index. +git rm -f git-*.sh:: Because this example lets the shell expand the asterisk (i.e. you are listing the files explicitly), it does not remove `subdir/git-foo.sh`. -See Also +SEE ALSO -------- linkgit:git-add[1] @@ -95,4 +110,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-send-email.txt b/Documentation/git-send-email.txt index 4b8ec8a200..e2437f30ca 100644 --- a/Documentation/git-send-email.txt +++ b/Documentation/git-send-email.txt @@ -8,7 +8,7 @@ git-send-email - Send a collection of patches as emails SYNOPSIS -------- -'git-send-email' [options] <file|directory> [... file|directory] +'git send-email' [options] <file|directory> [... file|directory] @@ -40,7 +40,8 @@ The --cc option must be repeated for each user you want on the cc list. Output of this command must be single email address per line. Default is the value of 'sendemail.cccmd' configuration value. ---chain-reply-to, --no-chain-reply-to:: +--chain-reply-to:: +--no-chain-reply-to:: If this is set, each email will be sent as a reply to the previous email sent. If disabled with "--no-chain-reply-to", all emails after the first will be sent as replies to the first email sent. When using @@ -55,7 +56,7 @@ The --cc option must be repeated for each user you want on the cc list. --from:: Specify the sender of the emails. This will default to - the value GIT_COMMITTER_IDENT, as returned by "git-var -l". + the value GIT_COMMITTER_IDENT, as returned by "git var -l". The user will still be prompted to confirm this entry. --in-reply-to:: @@ -65,7 +66,8 @@ The --cc option must be repeated for each user you want on the cc list. Only necessary if --compose is also set. If --compose is not set, this will be prompted for. ---signed-off-by-cc, --no-signed-off-by-cc:: +--signed-off-by-cc:: +--no-signed-off-by-cc:: If this is set, add emails found in Signed-off-by: or Cc: lines to the cc list. Default is the value of 'sendemail.signedoffcc' configuration value; @@ -96,28 +98,73 @@ The --cc option must be repeated for each user you want on the cc list. servers typically listen to smtp port 25 and ssmtp port 465). ---smtp-user, --smtp-pass:: - Username and password for SMTP-AUTH. Defaults are the values of - the configuration values 'sendemail.smtpuser' and - 'sendemail.smtppass', but see also 'sendemail.identity'. - If not set, authentication is not attempted. +--smtp-user:: + Username for SMTP-AUTH. In place of this option, the following + configuration variables can be specified: ++ +-- + * sendemail.smtpuser + * sendemail.<identity>.smtpuser (see sendemail.identity). +-- ++ +However, --smtp-user always overrides these variables. ++ +If a username is not specified (with --smtp-user or a +configuration variable), then authentication is not attempted. + +--smtp-pass:: + Password for SMTP-AUTH. The argument is optional: If no + argument is specified, then the empty string is used as + the password. ++ +In place of this option, the following configuration variables +can be specified: ++ +-- + * sendemail.smtppass + * sendemail.<identity>.smtppass (see sendemail.identity). +-- ++ +However, --smtp-pass always overrides these variables. ++ +Furthermore, passwords need not be specified in configuration files +or on the command line. If a username has been specified (with +--smtp-user or a configuration variable), but no password has been +specified (with --smtp-pass or a configuration variable), then the +user is prompted for a password while the input is masked for privacy. + +--smtp-encryption:: + Specify the encryption to use, either 'ssl' or 'tls'. Any other + value reverts to plain SMTP. Default is the value of + 'sendemail.smtpencryption'. --smtp-ssl:: - If set, connects to the SMTP server using SSL. - Default is the value of the 'sendemail.smtpssl' configuration value; - if that is unspecified, does not use SSL. + Legacy alias for '--smtp-encryption=ssl'. --subject:: Specify the initial subject of the email thread. Only necessary if --compose is also set. If --compose is not set, this will be prompted for. ---suppress-from, --no-suppress-from:: +--suppress-from:: +--no-suppress-from:: If this is set, do not add the From: address to the cc: list. Default is the value of 'sendemail.suppressfrom' configuration value; if that is unspecified, default to --no-suppress-from. ---thread, --no-thread:: +--suppress-cc:: + Specify an additional category of recipients to suppress the + auto-cc of. 'self' will avoid including the sender, 'author' will + avoid including the patch author, 'cc' will avoid including anyone + mentioned in Cc lines in the patch, 'sob' will avoid including + anyone mentioned in Signed-off-by lines, and 'cccmd' will avoid + running the --cc-cmd. 'all' will suppress all auto cc values. + Default is the value of 'sendemail.suppresscc' configuration value; + if that is unspecified, default to 'self' if --suppress-from is + specified, as well as 'sob' if --no-signed-off-cc is specified. + +--thread:: +--no-thread:: If this is set, the In-Reply-To header will be set on each email sent. If disabled with "--no-thread", no emails will have the In-Reply-To header set. @@ -137,6 +184,8 @@ The --cc option must be repeated for each user you want on the cc list. Specify the primary recipient of the emails generated. Generally, this will be the upstream maintainer of the project involved. + Default is the value of the 'sendemail.to' configuration value; + if that is unspecified, this will be prompted for. + The --to option must be repeated for each user you want on the to list. @@ -174,14 +223,22 @@ sendemail.chainreplyto:: sendemail.smtpserver:: Default SMTP server to use. +sendemail.smtpserverport:: + Default SMTP server port to use. + sendemail.smtpuser:: Default SMTP-AUTH username. sendemail.smtppass:: Default SMTP-AUTH password. +sendemail.smtpencryption:: + Default encryption method. Use 'ssl' for SSL (and specify an + appropriate port), or 'tls' for TLS. Takes precedence over + 'smtpssl' if both are specified. + sendemail.smtpssl:: - Boolean value specifying the default to the '--smtp-ssl' parameter. + Legacy boolean that sets 'smtpencryption=ssl' if enabled. Author ------ @@ -196,4 +253,4 @@ Documentation by Ryan Anderson GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-send-pack.txt b/Documentation/git-send-pack.txt index 777515b12e..399821832c 100644 --- a/Documentation/git-send-pack.txt +++ b/Documentation/git-send-pack.txt @@ -8,12 +8,12 @@ git-send-pack - Push objects over git protocol to another repository SYNOPSIS -------- -'git-send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...] +'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>] [--verbose] [--thin] [<host>:]<directory> [<ref>...] DESCRIPTION ----------- -Usually you would want to use linkgit:git-push[1] which is a -higher level wrapper of this command instead. +Usually you would want to use 'git-push', which is a +higher-level wrapper of this command, instead. See linkgit:git-push[1]. Invokes 'git-receive-pack' on a possibly remote repository, and updates it from the current repository, sending named refs. @@ -21,33 +21,33 @@ updates it from the current repository, sending named refs. OPTIONS ------- -\--receive-pack=<git-receive-pack>:: +--receive-pack=<git-receive-pack>:: Path to the 'git-receive-pack' program on the remote end. Sometimes useful when pushing to a remote repository over ssh, and you do not have the program in a directory on the default $PATH. -\--exec=<git-receive-pack>:: +--exec=<git-receive-pack>:: Same as \--receive-pack=<git-receive-pack>. -\--all:: +--all:: Instead of explicitly specifying which refs to update, update all heads that locally exist. -\--dry-run:: +--dry-run:: Do everything except actually send the updates. -\--force:: +--force:: Usually, the command refuses to update a remote ref that is not an ancestor of the local ref used to overwrite it. This flag disables the check. What this means is that the remote repository can lose commits; use it with care. -\--verbose:: +--verbose:: Run verbosely. -\--thin:: +--thin:: Spend extra cycles to minimize the number of objects to be sent. Use it on slower connection. @@ -86,8 +86,8 @@ and the destination side (after the colon). The ref to be pushed is determined by finding a match that matches the source side, and where it is pushed is determined by using the destination side. The rules used to match a ref are the same -rules used by linkgit:git-rev-parse[1] to resolve a symbolic ref -name. +rules used by 'git-rev-parse' to resolve a symbolic ref +name. See linkgit:git-rev-parse[1]. - It is an error if <src> does not match exactly one of the local refs. @@ -125,4 +125,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-sh-setup.txt b/Documentation/git-sh-setup.txt index 16b8b75146..18f14b5be8 100644 --- a/Documentation/git-sh-setup.txt +++ b/Documentation/git-sh-setup.txt @@ -7,7 +7,7 @@ git-sh-setup - Common git shell script setup code SYNOPSIS -------- -'git-sh-setup' +'. "$(git --exec-path)/git-sh-setup"' DESCRIPTION ----------- @@ -16,7 +16,7 @@ This is not a command the end user would want to run. Ever. This documentation is meant for people who are studying the Porcelain-ish scripts and/or are writing new ones. -The `git-sh-setup` scriptlet is designed to be sourced (using +The 'git-sh-setup' scriptlet is designed to be sourced (using `.`) by other shell scripts to set up some variables pointing at the normal git directories and a few helper shell functions. @@ -77,4 +77,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-shell.txt b/Documentation/git-shell.txt index bc031e0cc2..ff420f8f8c 100644 --- a/Documentation/git-shell.txt +++ b/Documentation/git-shell.txt @@ -8,7 +8,7 @@ git-shell - Restricted login shell for GIT-only SSH access SYNOPSIS -------- -'git-shell' -c <command> <argument> +'$(git --exec-path)/git-shell' -c <command> <argument> DESCRIPTION ----------- @@ -18,7 +18,7 @@ of server-side GIT commands implementing the pull/push functionality. The commands can be executed only by the '-c' option; the shell is not interactive. -Currently, only the `git-receive-pack` and `git-upload-pack` commands +Currently, only the 'git-receive-pack' and 'git-upload-pack' commands are permitted to be called, with a single required argument. Author @@ -31,4 +31,4 @@ Documentation by Petr Baudis and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-shortlog.txt b/Documentation/git-shortlog.txt index c7752575d8..7ccf31ccc4 100644 --- a/Documentation/git-shortlog.txt +++ b/Documentation/git-shortlog.txt @@ -3,17 +3,17 @@ git-shortlog(1) NAME ---- -git-shortlog - Summarize 'git log' output +git-shortlog - Summarize 'git-log' output SYNOPSIS -------- [verse] -git-log --pretty=short | 'git-shortlog' [-h] [-n] [-s] [-e] -git-shortlog [-n|--numbered] [-s|--summary] [-e|--email] [<committish>...] +git log --pretty=short | 'git shortlog' [-h] [-n] [-s] [-e] [-w] +git shortlog [-n|--numbered] [-s|--summary] [-e|--email] [-w[<width>[,<indent1>[,<indent2>]]]] [<committish>...] DESCRIPTION ----------- -Summarizes 'git log' output in a format suitable for inclusion +Summarizes 'git-log' output in a format suitable for inclusion in release announcements. Each commit will be grouped by author and the first line of the commit message will be shown. @@ -22,19 +22,29 @@ Additionally, "[PATCH]" will be stripped from the commit description. OPTIONS ------- --h, \--help:: +-h:: +--help:: Print a short usage message and exit. --n, \--numbered:: +-n:: +--numbered:: Sort output according to the number of commits per author instead of author alphabetic order. --s, \--summary:: +-s:: +--summary:: Suppress commit description and provide a commit count summary only. --e, \--email:: +-e:: +--email:: Show the email address of each author. +-w[<width>[,<indent1>[,<indent2>]]]:: + Linewrap the output by wrapping each line at `width`. The first + line of each entry is indented by `indent1` spaces, and the second + and subsequent lines are indented by `indent2` spaces. `width`, + `indent1`, and `indent2` default to 76, 6 and 9 respectively. + FILES ----- @@ -59,4 +69,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-show-branch.txt b/Documentation/git-show-branch.txt index 0bb8250b20..d3f258869f 100644 --- a/Documentation/git-show-branch.txt +++ b/Documentation/git-show-branch.txt @@ -8,10 +8,10 @@ git-show-branch - Show branches and their commits SYNOPSIS -------- [verse] -'git-show-branch' [--all] [--remotes] [--topo-order] [--current] +'git show-branch' [--all] [--remotes] [--topo-order] [--current] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [<rev> | <glob>]... -'git-show-branch' (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>] +'git show-branch' (-g|--reflog)[=<n>[,<base>]] [--list] [<ref>] DESCRIPTION ----------- @@ -29,7 +29,7 @@ no <rev> nor <glob> is given on the command line. OPTIONS ------- <rev>:: - Arbitrary extended SHA1 expression (see `git-rev-parse`) + Arbitrary extended SHA1 expression (see linkgit:git-rev-parse[1]) that typically names a branch HEAD or a tag. <glob>:: @@ -38,10 +38,12 @@ OPTIONS branches under $GIT_DIR/refs/heads/topic, giving `topic/*` would show all of them. --r|--remotes:: +-r:: +--remotes:: Show the remote-tracking branches. --a|--all:: +-a:: +--all:: Show both remote-tracking branches and local branches. --current:: @@ -180,7 +182,7 @@ topologically related with each other. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation @@ -190,4 +192,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-show-index.txt b/Documentation/git-show-index.txt index 535a884642..e3285aacfd 100644 --- a/Documentation/git-show-index.txt +++ b/Documentation/git-show-index.txt @@ -8,13 +8,13 @@ git-show-index - Show packed archive index SYNOPSIS -------- -'git-show-index' < idx-file +'git show-index' < idx-file DESCRIPTION ----------- Reads given idx file for packed git archive created with -git-pack-objects command, and dumps its contents. +'git-pack-objects' command, and dumps its contents. The information it outputs is subset of what you can get from 'git-verify-pack -v'; this command only shows the packfile @@ -31,4 +31,4 @@ Documentation by Junio C Hamano GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-show-ref.txt b/Documentation/git-show-ref.txt index ce0e643fbe..2f173fff35 100644 --- a/Documentation/git-show-ref.txt +++ b/Documentation/git-show-ref.txt @@ -8,9 +8,9 @@ git-show-ref - List references in a local repository SYNOPSIS -------- [verse] -'git-show-ref' [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] +'git show-ref' [-q|--quiet] [--verify] [-h|--head] [-d|--dereference] [-s|--hash] [--abbrev] [--tags] [--heads] [--] <pattern>... -'git-show-ref' --exclude-existing[=pattern] +'git show-ref' --exclude-existing[=pattern] DESCRIPTION ----------- @@ -29,22 +29,26 @@ in the `.git` directory. OPTIONS ------- --h, --head:: +-h:: +--head:: Show the HEAD reference. ---tags, --heads:: +--tags:: +--heads:: Limit to only "refs/heads" and "refs/tags", respectively. These options are not mutually exclusive; when given both, references stored in "refs/heads" and "refs/tags" are displayed. --d, --dereference:: +-d:: +--dereference:: Dereference tags into object IDs as well. They will be shown with "^{}" appended. --s, --hash:: +-s:: +--hash:: Only show the SHA1 hash, not the reference name. When also using --dereference the dereferenced tag will still be shown after the SHA1. @@ -55,19 +59,22 @@ OPTIONS Aside from returning an error code of 1, it will also print an error message if '--quiet' was not specified. ---abbrev, --abbrev=len:: +--abbrev:: +--abbrev=len:: Abbreviate the object name. When using `--hash`, you do not have to say `--hash --abbrev`; `--hash=len` would do. --q, --quiet:: +-q:: +--quiet:: Do not print any results to stdout. When combined with '--verify' this can be used to silently check if a reference exists. ---exclude-existing, --exclude-existing=pattern:: +--exclude-existing:: +--exclude-existing=pattern:: - Make git-show-ref act as a filter that reads refs from stdin of the + Make 'git-show-ref' act as a filter that reads refs from stdin of the form "^(?:<anything>\s)?<refname>(?:\^\{\})?$" and performs the following actions on each: (1) strip "^{}" at the end of line if any; @@ -77,7 +84,7 @@ OPTIONS (5) otherwise output the line. -<pattern>:: +<pattern>...:: Show references matching one or more patterns. @@ -130,14 +137,14 @@ When using the '--verify' flag, the command requires an exact path: will only match the exact branch called "master". -If nothing matches, linkgit:git-show-ref[1] will return an error code of 1, +If nothing matches, 'git-show-ref' will return an error code of 1, and in the case of verification, it will show an error message. For scripting, you can ask it to be quiet with the "--quiet" flag, which allows you to do things like ----------------------------------------------------------------------------- - git-show-ref --quiet --verify -- "refs/heads/$headname" || + git show-ref --quiet --verify -- "refs/heads/$headname" || echo "$headname is not a valid branch" ----------------------------------------------------------------------------- @@ -169,4 +176,4 @@ Man page by Jonas Fonseca <fonseca@diku.dk>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-show.txt b/Documentation/git-show.txt index dccf0e20ec..48b612e2ae 100644 --- a/Documentation/git-show.txt +++ b/Documentation/git-show.txt @@ -8,7 +8,7 @@ git-show - Show various types of objects SYNOPSIS -------- -'git-show' [options] <object>... +'git show' [options] <object>... DESCRIPTION ----------- @@ -20,12 +20,12 @@ presents the merge commit in a special format as produced by For tags, it shows the tag message and the referenced objects. -For trees, it shows the names (equivalent to linkgit:git-ls-tree[1] +For trees, it shows the names (equivalent to 'git-ls-tree' with \--name-only). For plain blobs, it shows the plain contents. -The command takes options applicable to the linkgit:git-diff-tree[1] command to +The command takes options applicable to the 'git-diff-tree' command to control how the changes the commit introduces are shown. This manual page describes only the most frequently used options. @@ -33,8 +33,8 @@ This manual page describes only the most frequently used options. OPTIONS ------- -<object>:: - The name of the object to show. +<object>...:: + The names of objects to show. For a more complete list of ways to spell object names, see "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1]. @@ -71,7 +71,7 @@ include::i18n.txt[] Author ------ Written by Linus Torvalds <torvalds@osdl.org> and -Junio C Hamano <junkio@cox.net>. Significantly enhanced by +Junio C Hamano <gitster@pobox.com>. Significantly enhanced by Johannes Schindelin <Johannes.Schindelin@gmx.de>. @@ -79,8 +79,6 @@ Documentation ------------- Documentation by David Greaves, Petr Baudis and the git-list <git@vger.kernel.org>. -This manual page is a stub. You can help the git documentation by expanding it. - GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt index 9889806a5e..49e2296a24 100644 --- a/Documentation/git-stash.txt +++ b/Documentation/git-stash.txt @@ -8,22 +8,27 @@ git-stash - Stash the changes in a dirty working directory away SYNOPSIS -------- [verse] -'git-stash' (list | show [<stash>] | apply [<stash>] | clear) -'git-stash' [save] [message...] +'git stash' list [<options>] +'git stash' (show | drop | pop ) [<stash>] +'git stash' apply [--index] [<stash>] +'git stash' branch <branchname> [<stash>] +'git stash' [save [--keep-index] [<message>]] +'git stash' clear +'git stash' create DESCRIPTION ----------- -Use 'git-stash' when you want to record the current state of the +Use 'git stash' when you want to record the current state of the working directory and the index, but want to go back to a clean working directory. The command saves your local modifications away and reverts the working directory to match the `HEAD` commit. The modifications stashed away by this command can be listed with -`git-stash list`, inspected with `git-stash show`, and restored -(potentially on top of a different commit) with `git-stash apply`. -Calling git-stash without any arguments is equivalent to `git-stash -save`. A stash is by default listed as "WIP on 'branchname' ...", but +`git stash list`, inspected with `git stash show`, and restored +(potentially on top of a different commit) with `git stash apply`. +Calling `git stash` without any arguments is equivalent to `git stash save`. +A stash is by default listed as "WIP on 'branchname' ...", but you can give a more descriptive message on the command line when you create one. @@ -36,13 +41,17 @@ is also possible). OPTIONS ------- -save:: +save [--keep-index] [<message>]:: - Save your local modifications to a new 'stash', and run `git-reset + Save your local modifications to a new 'stash', and run `git reset --hard` to revert them. This is the default action when no - subcommand is given. + subcommand is given. The <message> part is optional and gives + the description along with the stashed state. ++ +If the `--keep-index` option is used, all changes already added to the +index are left intact. -list:: +list [<options>]:: List the stashes that you currently have. Each 'stash' is listed with its name (e.g. `stash@\{0}` is the latest stash, `stash@\{1}` is @@ -54,13 +63,16 @@ list:: stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation stash@{1}: On master: 9cc0589... Add git-stash ---------------------------------------------------------------- ++ +The command takes options applicable to the 'git-log' +command to control what is shown and how. See linkgit:git-log[1]. show [<stash>]:: Show the changes recorded in the stash as a diff between the stashed state and its original parent. When no `<stash>` is given, shows the latest one. By default, the command shows the diffstat, but - it will accept any format known to `git-diff` (e.g., `git-stash show + it will accept any format known to 'git-diff' (e.g., `git stash show -p stash@\{1}` to view the second most recent stash in patch form). apply [--index] [<stash>]:: @@ -77,10 +89,40 @@ tree's changes, but also the index's ones. However, this can fail, when you have conflicts (which are stored in the index, where you therefore can no longer apply the changes as they were originally). +branch <branchname> [<stash>]:: + + Creates and checks out a new branch named `<branchname>` starting from + the commit at which the `<stash>` was originally created, applies the + changes recorded in `<stash>` to the new working tree and index, then + drops the `<stash>` if that completes successfully. When no `<stash>` + is given, applies the latest one. ++ +This is useful if the branch on which you ran `git stash save` has +changed enough that `git stash apply` fails due to conflicts. Since +the stash is applied on top of the commit that was HEAD at the time +`git stash` was run, it restores the originally stashed state with +no conflicts. + clear:: Remove all the stashed states. Note that those states will then be subject to pruning, and may be difficult or impossible to recover. +drop [<stash>]:: + + Remove a single stashed state from the stash list. When no `<stash>` + is given, it removes the latest one. i.e. `stash@\{0}` + +pop [<stash>]:: + + Remove a single stashed state from the stash list and apply on top + of the current working tree state. When no `<stash>` is given, + `stash@\{0}` is assumed. See also `apply`. + +create:: + + Create a stash (which is a regular commit object) and return its + object name, without storing it anywhere in the ref namespace. + DISCUSSION ---------- @@ -143,7 +185,7 @@ $ git reset --soft HEAD^ ... continue hacking ... ---------------------------------------------------------------- + -You can use `git-stash` to simplify the above, like this: +You can use 'git-stash' to simplify the above, like this: + ---------------------------------------------------------------- ... hack hack hack ... @@ -154,6 +196,24 @@ $ git stash apply ... continue hacking ... ---------------------------------------------------------------- +Testing partial commits:: + +You can use `git stash save --keep-index` when you want to make two or +more commits out of the changes in the work tree, and you want to test +each change before committing: ++ +---------------------------------------------------------------- +... hack hack hack ... +$ git add --patch foo # add just first part to the index +$ git stash save --keep-index # save all other changes to the stash +$ edit/build/test first part +$ git commit foo -m 'First part' # commit fully tested change +$ git stash pop # prepare to work on all other changes +... repeat above five steps until one commit remains ... +$ edit/build/test remaining parts +$ git commit foo -m 'Remaining parts' +---------------------------------------------------------------- + SEE ALSO -------- linkgit:git-checkout[1], @@ -167,4 +227,4 @@ Written by Nanako Shiraishi <nanako3@bluebottle.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-status.txt b/Documentation/git-status.txt index 3ea269aa7a..84f60f3407 100644 --- a/Documentation/git-status.txt +++ b/Documentation/git-status.txt @@ -8,7 +8,7 @@ git-status - Show the working tree status SYNOPSIS -------- -'git-status' <options>... +'git status' <options>... DESCRIPTION ----------- @@ -17,16 +17,16 @@ current HEAD commit, paths that have differences between the working tree and the index file, and paths in the working tree that are not tracked by git (and are not ignored by linkgit:gitignore[5]). The first are what you _would_ commit by running `git commit`; the second and -third are what you _could_ commit by running `git add` before running +third are what you _could_ commit by running 'git-add' before running `git commit`. -The command takes the same set of options as `git-commit`; it +The command takes the same set of options as 'git-commit'; it shows what would be committed if the same options are given to -`git-commit`. +'git-commit'. If there is no path that is different between the index file and the current HEAD commit (i.e., there is nothing to commit by running -`git-commit`), the command exits with non-zero status. +`git commit`), the command exits with non-zero status. OUTPUT @@ -52,14 +52,19 @@ If the config variable `status.relativePaths` is set to false, then all paths shown are relative to the repository root, not to the current directory. -See Also +If `status.submodulesummary` is set to a non zero number or true (identical +to -1 or an unlimited number), the submodule summary will be enabled and a +summary of commits for modified submodules will be shown (see --summary-limit +option of linkgit:git-submodule[1]). + +SEE ALSO -------- linkgit:gitignore[5] Author ------ Written by Linus Torvalds <torvalds@osdl.org> and -Junio C Hamano <junkio@cox.net>. +Junio C Hamano <gitster@pobox.com>. Documentation -------------- @@ -67,4 +72,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-stripspace.txt b/Documentation/git-stripspace.txt index fc5687502e..7508c0e42d 100644 --- a/Documentation/git-stripspace.txt +++ b/Documentation/git-stripspace.txt @@ -8,7 +8,7 @@ git-stripspace - Filter out empty lines SYNOPSIS -------- -'git-stripspace' [-s | --strip-comments] < <stream> +'git stripspace' [-s | --strip-comments] < <stream> DESCRIPTION ----------- @@ -16,7 +16,8 @@ Remove multiple empty lines, and empty lines at beginning and end. OPTIONS ------- --s|--strip-comments:: +-s:: +--strip-comments:: In addition to empty lines, also strip lines starting with '#'. <stream>:: @@ -32,4 +33,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index cffc6d48fb..bf33b0cba0 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -9,59 +9,147 @@ git-submodule - Initialize, update or inspect submodules SYNOPSIS -------- [verse] -'git-submodule' [--quiet] [-b branch] add <repository> [<path>] -'git-submodule' [--quiet] [--cached] [status|init|update] [--] [<path>...] +'git submodule' [--quiet] add [-b branch] [--] <repository> <path> +'git submodule' [--quiet] status [--cached] [--] [<path>...] +'git submodule' [--quiet] init [--] [<path>...] +'git submodule' [--quiet] update [--init] [--] [<path>...] +'git submodule' [--quiet] summary [--summary-limit <n>] [commit] [--] [<path>...] + + +DESCRIPTION +----------- +Submodules allow foreign repositories to be embedded within +a dedicated subdirectory of the source tree, always pointed +at a particular commit. + +They are not to be confused with remotes, which are meant mainly +for branches of the same project; submodules are meant for +different projects you would like to make part of your source tree, +while the history of the two projects still stays completely +independent and you cannot modify the contents of the submodule +from within the main project. +If you want to merge the project histories and want to treat the +aggregated whole as a single project from then on, you may want to +add a remote for the other project and use the 'subtree' merge strategy, +instead of treating the other project as a submodule. Directories +that come from both projects can be cloned and checked out as a whole +if you choose to go that route. + +Submodules are composed from a so-called `gitlink` tree entry +in the main repository that refers to a particular commit object +within the inner repository that is completely separate. +A record in the `.gitmodules` file at the root of the source +tree assigns a logical name to the submodule and describes +the default URL the submodule shall be cloned from. +The logical name can be used for overriding this URL within your +local repository configuration (see 'submodule init'). + +This command will manage the tree entries and contents of the +gitmodules file for you, as well as inspect the status of your +submodules and update them. +When adding a new submodule to the tree, the 'add' subcommand +is to be used. However, when pulling a tree containing submodules, +these will not be checked out by default; +the 'init' and 'update' subcommands will maintain submodules +checked out and at appropriate revision in your working tree. +You can briefly inspect the up-to-date status of your submodules +using the 'status' subcommand and get a detailed overview of the +difference between the index and checkouts using the 'summary' +subcommand. COMMANDS -------- add:: Add the given repository as a submodule at the given path - to the changeset to be committed next. In particular, the - repository is cloned at the specified path, added to the - changeset and registered in .gitmodules. If no path is - specified, the path is deduced from the repository specification. - If the repository url begins with ./ or ../, it is stored as - given but resolved as a relative path from the main project's - url when cloning. + to the changeset to be committed next to the current + project: the current project is termed the "superproject". ++ +This requires two arguments: <repository> and <path>. ++ +<repository> is the URL of the new submodule's origin repository. +This may be either an absolute URL, or (if it begins with ./ +or ../), the location relative to the superproject's origin +repository. ++ +<path> is the relative location for the cloned submodule to +exist in the superproject. If <path> does not exist, then the +submodule is created by cloning from the named URL. If <path> does +exist and is already a valid git repository, then this is added +to the changeset without cloning. This second form is provided +to ease creating a new submodule from scratch, and presumes +the user will later push the submodule to the given URL. ++ +In either case, the given URL is recorded into .gitmodules for +use by subsequent users cloning the superproject. If the URL is +given relative to the superproject's repository, the presumption +is the superproject and submodule repositories will be kept +together in the same relative location, and only the +superproject's URL need be provided: git-submodule will correctly +locate the submodule using the relative URL in .gitmodules. status:: Show the status of the submodules. This will print the SHA-1 of the currently checked out commit for each submodule, along with the - submodule path and the output of linkgit:git-describe[1] for the + submodule path and the output of 'git-describe' for the SHA-1. Each SHA-1 will be prefixed with `-` if the submodule is not initialized and `+` if the currently checked out submodule commit does not match the SHA-1 found in the index of the containing - repository. This command is the default command for git-submodule. + repository. This command is the default command for 'git-submodule'. init:: - Initialize the submodules, i.e. register in .git/config each submodule - name and url found in .gitmodules. The key used in .git/config is - `submodule.$name.url`. This command does not alter existing information - in .git/config. + Initialize the submodules, i.e. register each submodule name + and url found in .gitmodules into .git/config. + The key used in .git/config is `submodule.$name.url`. + This command does not alter existing information in .git/config. + You can then customize the submodule clone URLs in .git/config + for your local setup and proceed to 'git submodule update'; + you can also just use 'git submodule update --init' without + the explicit 'init' step if you do not intend to customize + any submodule locations. update:: Update the registered submodules, i.e. clone missing submodules and checkout the commit specified in the index of the containing repository. This will make the submodules HEAD be detached. ++ +If the submodule is not yet initialized, and you just want to use the +setting as stored in .gitmodules, you can automatically initialize the +submodule with the --init option. +summary:: + Show commit summary between the given commit (defaults to HEAD) and + working tree/index. For a submodule in question, a series of commits + in the submodule between the given super project commit and the + index or working tree (switched by --cached) are shown. OPTIONS ------- --q, --quiet:: +-q:: +--quiet:: Only print error messages. --b, --branch:: +-b:: +--branch:: Branch of repository to add as submodule. --cached:: - Display the SHA-1 stored in the index, not the SHA-1 of the currently - checked out submodule commit. This option is only valid for the - status command. - -<path>:: - Path to submodule(s). When specified this will restrict the command + This option is only valid for status and summary commands. These + commands typically use the commit found in the submodule HEAD, but + with this option, the commit stored in the index is used instead. + +-n:: +--summary-limit:: + This option is only valid for the summary command. + Limit the summary size (number of commits shown in total). + Giving 0 will disable the summary; a negative number means unlimited + (the default). This limit only applies to modified submodules. The + size is always limited to 1 for added/deleted/typechanged submodules. + +<path>...:: + Paths to submodule(s). When specified this will restrict the command to only operate on the submodules found at the specified paths. + (This argument is required with add). FILES ----- @@ -78,4 +166,4 @@ Written by Lars Hjemli <hjemli@gmail.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt index e1a1d46a9f..1e644ca6dc 100644 --- a/Documentation/git-svn.txt +++ b/Documentation/git-svn.txt @@ -7,23 +7,23 @@ git-svn - Bidirectional operation between a single Subversion branch and git SYNOPSIS -------- -'git-svn' <command> [options] [arguments] +'git svn' <command> [options] [arguments] DESCRIPTION ----------- -git-svn is a simple conduit for changesets between Subversion and git. -It is not to be confused with linkgit:git-svnimport[1], which is -read-only. +'git-svn' is a simple conduit for changesets between Subversion and git. +It provides a bidirectional flow of changes between a Subversion and a git +repository. -git-svn was originally designed for an individual developer who wants a -bidirectional flow of changesets between a single branch in Subversion -and an arbitrary number of branches in git. Since its inception, -git-svn has gained the ability to track multiple branches in a manner -similar to git-svnimport. +'git-svn' can track a single Subversion branch simply by using a +URL to the branch, follow branches laid out in the Subversion recommended +method (trunk, branches, tags directories) with the --stdlayout option, or +follow branches in any layout with the -T/-t/-b options (see options to +'init' below, and also the 'clone' command). -git-svn is especially useful when it comes to tracking repositories -not organized in the way Subversion developers recommend (trunk, -branches, tags directories). +Once tracking a Subversion branch (with any of the above methods), the git +repository can be updated from Subversion by the 'fetch' command and +Subversion updated from git by the 'dcommit' command. COMMANDS -------- @@ -31,7 +31,7 @@ COMMANDS 'init':: Initializes an empty git repository with additional - metadata directories for git-svn. The Subversion URL + metadata directories for 'git-svn'. The Subversion URL may be specified as a command-line argument, or as full URL arguments to -T/-t/-b. Optionally, the target directory to operate on can be specified as a second @@ -61,6 +61,16 @@ COMMANDS Set the 'useSvnsyncProps' option in the [svn-remote] config. --rewrite-root=<URL>;; Set the 'rewriteRoot' option in the [svn-remote] config. +--use-log-author;; + When retrieving svn commits into git (as part of fetch, rebase, or + dcommit operations), look for the first From: or Signed-off-by: line + in the log message and use that as the author string. +--add-author-from;; + When committing to svn from git (as part of commit or dcommit + operations), if the existing log message doesn't already have a + From: or Signed-off-by: line, append a From: line based on the + git commit's author string. If you use this, then --use-log-author + will retrieve a valid author string for all commits. --username=<USER>;; For transports that SVN handles authentication for (http, https, and plain svn), specify the username. For other @@ -97,12 +107,12 @@ COMMANDS This fetches revisions from the SVN parent of the current HEAD and rebases the current (uncommitted to SVN) work against it. -This works similarly to 'svn update' or 'git-pull' except that +This works similarly to `svn update` or 'git-pull' except that it preserves linear history with 'git-rebase' instead of -'git-merge' for ease of dcommiting with git-svn. +'git-merge' for ease of dcommiting with 'git-svn'. This accepts all options that 'git-svn fetch' and 'git-rebase' -accepts. However '--fetch-all' only fetches from the current +accept. However, '--fetch-all' only fetches from the current [svn-remote], and not all [svn-remote] definitions. Like 'git-rebase'; this requires that the working tree be clean @@ -118,7 +128,7 @@ and have no uncommitted changes. repository, and then rebase or reset (depending on whether or not there is a diff between SVN and head). This will create a revision in SVN for each commit in git. - It is recommended that you run git-svn fetch and rebase (not + It is recommended that you run 'git-svn' fetch and rebase (not pull or merge) your commits against the latest changes in the SVN repository. An optional command-line argument may be specified as an @@ -128,6 +138,15 @@ and have no uncommitted changes. + --no-rebase;; After committing, do not rebase or reset. +--commit-url <URL>;; + Commit to this SVN URL (the full path). This is intended to + allow existing git-svn repositories created with one transport + method (e.g. `svn://` or `http://` for anonymous read) to be + reused if a user is later given access to an alternate transport + method (e.g. `svn+ssh://` or `https://`) for commit. + + Using this option for any other purpose (don't ask) + is very strongly discouraged. -- 'log':: @@ -159,7 +178,25 @@ New features: our version of --pretty=oneline -- + -Any other arguments are passed directly to `git log' +NOTE: SVN itself only stores times in UTC and nothing else. The regular svn +client converts the UTC time to the local time (or based on the TZ= +environment). This command has the same behaviour. ++ +Any other arguments are passed directly to 'git-log' + +'blame':: + Show what revision and author last modified each line of a file. The + output of this mode is format-compatible with the output of + `svn blame' by default. Like the SVN blame command, + local uncommitted changes in the working copy are ignored; + the version of the file in the HEAD revision is annotated. Unknown + arguments are passed directly to 'git-blame'. ++ +--git-format;; + Produce output in the same format as 'git-blame', but with + SVN revision numbers instead of git commit hashes. In this mode, + changes that haven't been committed to SVN (including local + working-copy edits) are shown as revision 0. -- 'find-rev':: @@ -175,7 +212,13 @@ Any other arguments are passed directly to `git log' absolutely no attempts to do patching when committing to SVN, it simply overwrites files with those specified in the tree or commit. All merging is assumed to have taken place - independently of git-svn functions. + independently of 'git-svn' functions. + +'create-ignore':: + Recursively finds the svn:ignore property on directories and + creates matching .gitignore files. The resulting files are staged to + be committed, but are not committed. Use -r/--revision to refer to a + specific revision. 'show-ignore':: Recursively finds and lists the svn:ignore property on @@ -184,13 +227,12 @@ Any other arguments are passed directly to `git log' 'commit-diff':: Commits the diff of two tree-ish arguments from the - command-line. This command is intended for interoperability with - git-svnimport and does not rely on being inside an git-svn - init-ed repository. This command takes three arguments, (a) the + command-line. This command does not rely on being inside an `git-svn + init`-ed repository. This command takes three arguments, (a) the original tree to diff against, (b) the new tree result, (c) the URL of the target Subversion repository. The final argument - (URL) may be omitted if you are working from a git-svn-aware - repository (that has been init-ed with git-svn). + (URL) may be omitted if you are working from a 'git-svn'-aware + repository (that has been `init`-ed with 'git-svn'). The -r<revision> option is required for this. 'info':: @@ -199,6 +241,19 @@ Any other arguments are passed directly to `git log' argument. Use the --url option to output only the value of the 'URL:' field. +'proplist':: + Lists the properties stored in the Subversion repository about a + given file or directory. Use -r/--revision to refer to a specific + Subversion revision. + +'propget':: + Gets the Subversion property given as the first argument, for a + file. A specific revision can be specified with -r/--revision. + +'show-externals':: + Shows the Subversion externals. Use -r/--revision to specify a + specific revision. + -- OPTIONS @@ -208,7 +263,7 @@ OPTIONS --shared[={false|true|umask|group|all|world|everybody}]:: --template=<template_directory>:: Only used with the 'init' command. - These are passed directly to linkgit:git-init[1]. + These are passed directly to 'git-init'. -r <ARG>:: --revision <ARG>:: @@ -230,7 +285,7 @@ Only used with the 'set-tree' command. Read a list of commits from stdin and commit them in reverse order. Only the leading sha1 is read from each line, so -git-rev-list --pretty=oneline output can be used. +'git-rev-list --pretty=oneline' output can be used. --rmdir:: @@ -260,7 +315,7 @@ config key: svn.edit Only used with the 'dcommit', 'set-tree' and 'commit-diff' commands. -They are both passed directly to git-diff-tree see +They are both passed directly to 'git-diff-tree'; see linkgit:git-diff-tree[1] for more information. [verse] @@ -270,24 +325,23 @@ config key: svn.findcopiesharder -A<filename>:: --authors-file=<filename>:: -Syntax is compatible with the files used by git-svnimport and -git-cvsimport: +Syntax is compatible with the file used by 'git-cvsimport': ------------------------------------------------------------------------ loginname = Joe User <user@example.com> ------------------------------------------------------------------------ -If this option is specified and git-svn encounters an SVN -committer name that does not exist in the authors-file, git-svn +If this option is specified and 'git-svn' encounters an SVN +committer name that does not exist in the authors-file, 'git-svn' will abort operation. The user will then have to add the -appropriate entry. Re-running the previous git-svn command +appropriate entry. Re-running the previous 'git-svn' command after the authors-file is modified should continue operation. config key: svn.authorsfile -q:: --quiet:: - Make git-svn less verbose. + Make 'git-svn' less verbose. --repack[=<n>]:: --repack-flags=<flags>:: @@ -299,7 +353,7 @@ with many revisions. to fetch before repacking. This defaults to repacking every 1000 commits fetched if no argument is specified. ---repack-flags are passed directly to linkgit:git-repack[1]. +--repack-flags are passed directly to 'git-repack'. [verse] config key: svn.repack @@ -312,17 +366,21 @@ config key: svn.repackflags These are only used with the 'dcommit' and 'rebase' commands. -Passed directly to git-rebase when using 'dcommit' if a -'git-reset' cannot be used (see dcommit). +Passed directly to 'git-rebase' when using 'dcommit' if a +'git-reset' cannot be used (see 'dcommit'). -n:: --dry-run:: -This is only used with the 'dcommit' command. +This can be used with the 'dcommit' and 'rebase' commands. -Print out the series of git arguments that would show +For 'dcommit', print out the series of git arguments that would show which diffs would be committed to SVN. +For 'rebase', display the local branch associated with the upstream svn +repository associated with the current branch and the URL of svn +repository that will be fetched from. + -- ADVANCED OPTIONS @@ -360,9 +418,9 @@ CONFIG FILE-ONLY OPTIONS svn.noMetadata:: svn-remote.<name>.noMetadata:: -This gets rid of the git-svn-id: lines at the end of every commit. +This gets rid of the 'git-svn-id:' lines at the end of every commit. -If you lose your .git/svn/git-svn/.rev_db file, git-svn will not +If you lose your .git/svn/git-svn/.rev_db file, 'git-svn' will not be able to rebuild it and you won't be able to fetch again, either. This is fine for one-shot imports. @@ -373,7 +431,7 @@ option for (hopefully) obvious reasons. svn.useSvmProps:: svn-remote.<name>.useSvmProps:: -This allows git-svn to re-map repository URLs and UUIDs from +This allows 'git-svn' to re-map repository URLs and UUIDs from mirrors created using SVN::Mirror (or svk) for metadata. If an SVN revision has a property, "svm:headrev", it is likely @@ -392,20 +450,21 @@ svn-remote.<name>.useSvnsyncprops:: svn-remote.<name>.rewriteRoot:: This allows users to create repositories from alternate - URLs. For example, an administrator could run git-svn on the + URLs. For example, an administrator could run 'git-svn' on the server locally (accessing via file://) but wish to distribute the repository with a public http:// or svn:// URL in the metadata so users of it will see the public URL. +-- + Since the noMetadata, rewriteRoot, useSvnsyncProps and useSvmProps -options all affect the metadata generated and used by git-svn; they +options all affect the metadata generated and used by 'git-svn'; they *must* be set in the configuration file before any history is imported and these settings should never be changed once they are set. Additionally, only one of these four options can be used per-svn-remote section because they affect the 'git-svn-id:' metadata line. --- BASIC EXAMPLES -------------- @@ -414,7 +473,7 @@ Tracking and contributing to the trunk of a Subversion-managed project: ------------------------------------------------------------------------ # Clone a repo (like git clone): - git-svn clone http://svn.foo.org/project/trunk + git svn clone http://svn.foo.org/project/trunk # Enter the newly cloned directory: cd trunk # You should be on master branch, double-check with git-branch @@ -423,12 +482,12 @@ Tracking and contributing to the trunk of a Subversion-managed project: git commit ... # Something is committed to SVN, rebase your local changes against the # latest changes in SVN: - git-svn rebase + git svn rebase # Now commit your changes (that were committed previously using git) to SVN, # as well as automatically updating your working HEAD: - git-svn dcommit + git svn dcommit # Append svn:ignore settings to the default git exclude file: - git-svn show-ignore >> .git/info/exclude + git svn show-ignore >> .git/info/exclude ------------------------------------------------------------------------ Tracking and contributing to an entire Subversion-managed project @@ -436,7 +495,7 @@ Tracking and contributing to an entire Subversion-managed project ------------------------------------------------------------------------ # Clone a repo (like git clone): - git-svn clone http://svn.foo.org/project -T trunk -b branches -t tags + git svn clone http://svn.foo.org/project -T trunk -b branches -t tags # View all branches and tags you have cloned: git branch -r # Reset your master to trunk (or any other branch, replacing 'trunk' @@ -449,42 +508,45 @@ Tracking and contributing to an entire Subversion-managed project The initial 'git-svn clone' can be quite time-consuming (especially for large Subversion repositories). If multiple people (or one person with multiple machines) want to use -git-svn to interact with the same Subversion repository, you can +'git-svn' to interact with the same Subversion repository, you can do the initial 'git-svn clone' to a repository on a server and -have each person clone that repository with 'git clone': +have each person clone that repository with 'git-clone': ------------------------------------------------------------------------ # Do the initial import on a server - ssh server "cd /pub && git-svn clone http://svn.foo.org/project -# Clone locally - git clone server:/pub/project -# Tell git-svn which branch contains the Subversion commits - git update-ref refs/remotes/git-svn origin/master + ssh server "cd /pub && git svn clone http://svn.foo.org/project +# Clone locally - make sure the refs/remotes/ space matches the server + mkdir project + cd project + git init + git remote add origin server:/pub/project + git config --add remote.origin.fetch '+refs/remotes/*:refs/remotes/*' + git fetch # Initialize git-svn locally (be sure to use the same URL and -T/-b/-t options as were used on server) - git-svn init http://svn.foo.org/project + git svn init http://svn.foo.org/project # Pull the latest changes from Subversion - git-svn rebase + git svn rebase ------------------------------------------------------------------------ REBASE VS. PULL/MERGE --------------------- -Originally, git-svn recommended that the remotes/git-svn branch be +Originally, 'git-svn' recommended that the 'remotes/git-svn' branch be pulled or merged from. This is because the author favored -'git-svn set-tree B' to commit a single head rather than the -'git-svn set-tree A..B' notation to commit multiple commits. +`git svn set-tree B` to commit a single head rather than the +`git svn set-tree A..B` notation to commit multiple commits. -If you use 'git-svn set-tree A..B' to commit several diffs and you do +If you use `git svn set-tree A..B` to commit several diffs and you do not have the latest remotes/git-svn merged into my-branch, you should -use 'git-svn rebase' to update your work branch instead of 'git pull' or -'git merge'. 'pull/merge' can cause non-linear history to be flattened +use `git svn rebase` to update your work branch instead of `git pull` or +`git merge`. `pull`/`merge' can cause non-linear history to be flattened when committing into SVN, which can lead to merge commits reversing previous commits in SVN. DESIGN PHILOSOPHY ----------------- Merge tracking in Subversion is lacking and doing branched development -with Subversion can be cumbersome as a result. While git-svn can track +with Subversion can be cumbersome as a result. While 'git-svn' can track copy history (including branches and tags) for repositories adopting a standard layout, it cannot yet represent merge history that happened inside git back upstream to SVN users. Therefore it is advised that @@ -495,30 +557,30 @@ CAVEATS ------- For the sake of simplicity and interoperating with a less-capable system -(SVN), it is recommended that all git-svn users clone, fetch and dcommit -directly from the SVN server, and avoid all git-clone/pull/merge/push +(SVN), it is recommended that all 'git-svn' users clone, fetch and dcommit +directly from the SVN server, and avoid all 'git-clone'/'pull'/'merge'/'push' operations between git repositories and branches. The recommended method of exchanging code between git branches and users is -git-format-patch and git-am, or just dcommiting to the SVN repository. +'git-format-patch' and 'git-am', or just 'dcommit'ing to the SVN repository. Running 'git-merge' or 'git-pull' is NOT recommended on a branch you -plan to dcommit from. Subversion does not represent merges in any +plan to 'dcommit' from. Subversion does not represent merges in any reasonable or useful fashion; so users using Subversion cannot see any merges you've made. Furthermore, if you merge or pull from a git branch -that is a mirror of an SVN branch, dcommit may commit to the wrong +that is a mirror of an SVN branch, 'dcommit' may commit to the wrong branch. 'git-clone' does not clone branches under the refs/remotes/ hierarchy or -any git-svn metadata, or config. So repositories created and managed with -using git-svn should use rsync(1) for cloning, if cloning is to be done +any 'git-svn' metadata, or config. So repositories created and managed with +using 'git-svn' should use 'rsync' for cloning, if cloning is to be done at all. -Since 'dcommit' uses rebase internally, any git branches you git-push to -before dcommit on will require forcing an overwrite of the existing ref +Since 'dcommit' uses rebase internally, any git branches you 'git-push' to +before 'dcommit' on will require forcing an overwrite of the existing ref on the remote repository. This is generally considered bad practice, -see the git-push(1) documentation for details. +see the linkgit:git-push[1] documentation for details. -Do not use the --amend option of git-commit(1) on a change you've +Do not use the --amend option of linkgit:git-commit[1] on a change you've already dcommitted. It is considered bad practice to --amend commits you've already pushed to a remote repository for other users, and dcommit with SVN is analogous to that. @@ -539,7 +601,7 @@ for git to detect them. CONFIGURATION ------------- -git-svn stores [svn-remote] configuration information in the +'git-svn' stores [svn-remote] configuration information in the repository .git/config file. It is similar the core git [remote] sections except 'fetch' keys do not accept glob arguments; but they are instead handled by the 'branches' @@ -560,8 +622,7 @@ Keep in mind that the '*' (asterisk) wildcard of the local ref however the remote wildcard may be anywhere as long as it's own independent path component (surrounded by '/' or EOL). This type of configuration is not automatically created by 'init' and -should be manually entered with a text-editor or using -linkgit:git-config[1] +should be manually entered with a text-editor or using 'git-config'. SEE ALSO -------- diff --git a/Documentation/git-symbolic-ref.txt b/Documentation/git-symbolic-ref.txt index a5b40f3e85..210fde03a1 100644 --- a/Documentation/git-symbolic-ref.txt +++ b/Documentation/git-symbolic-ref.txt @@ -7,7 +7,7 @@ git-symbolic-ref - Read and modify symbolic refs SYNOPSIS -------- -'git-symbolic-ref' [-q] [-m <reason>] <name> [<ref>] +'git symbolic-ref' [-q] [-m <reason>] <name> [<ref>] DESCRIPTION ----------- @@ -26,7 +26,8 @@ a regular file whose contents is `ref: refs/heads/master`. OPTIONS ------- --q, --quiet:: +-q:: +--quiet:: Do not issue an error message if the <name> is not a symbolic ref but a detached HEAD; instead exit with non-zero status silently. @@ -48,14 +49,14 @@ cumbersome. On some platforms, `ln -sf` does not even work as advertised (horrors). Therefore symbolic links are now deprecated and symbolic refs are used by default. -git-symbolic-ref will exit with status 0 if the contents of the +'git-symbolic-ref' will exit with status 0 if the contents of the symbolic ref were printed correctly, with status 1 if the requested name is not a symbolic ref, or 128 if another error occurs. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt index b62a3d1c58..046ab3542b 100644 --- a/Documentation/git-tag.txt +++ b/Documentation/git-tag.txt @@ -9,10 +9,11 @@ git-tag - Create, list, delete or verify a tag object signed with GPG SYNOPSIS -------- [verse] -'git-tag' [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] <name> [<head>] -'git-tag' -d <name>... -'git-tag' [-n [<num>]] -l [<pattern>] -'git-tag' -v <name>... +'git tag' [-a | -s | -u <key-id>] [-f] [-m <msg> | -F <file>] + <name> [<commit> | <object>] +'git tag' -d <name>... +'git tag' [-n[<num>]] -l [<pattern>] +'git tag' -v <name>... DESCRIPTION ----------- @@ -26,6 +27,9 @@ creates a 'tag' object, and requires the tag message. Unless `-m <msg>` or `-F <file>` is given, an editor is started for the user to type in the tag message. +If `-m <msg>` or `-F <file>` is given and `-a`, `-s`, and `-u <key-id>` +are absent, `-a` is implied. + Otherwise just the SHA1 object name of the commit object is written (i.e. a lightweight tag). @@ -54,7 +58,7 @@ OPTIONS -v:: Verify the gpg signature of the given tag names. --n <num>:: +-n<num>:: <num> specifies how many lines from the annotation, if any, are printed when using -l. The default is not to print any annotation lines. @@ -68,14 +72,18 @@ OPTIONS Use the given tag message (instead of prompting). If multiple `-m` options are given, there values are concatenated as separate paragraphs. + Implies `-a` if none of `-a`, `-s`, or `-u <key-id>` + is given. -F <file>:: Take the tag message from the given file. Use '-' to read the message from the standard input. + Implies `-a` if none of `-a`, `-s`, or `-u <key-id>` + is given. CONFIGURATION ------------- -By default, git-tag in sign-with-default mode (-s) will use your +By default, 'git-tag' in sign-with-default mode (-s) will use your committer identity (of the form "Your Name <your@email.address>") to find a key. If you want to use a different default key, you can specify it in the repository configuration as follows: @@ -111,12 +119,12 @@ and be done with it. . The insane thing. You really want to call the new version "X" too, 'even though' -others have already seen the old one. So just use "git tag -f" +others have already seen the old one. So just use 'git-tag -f' again, as if you hadn't already published the old one. However, Git does *not* (and it should not) change tags behind -users back. So if somebody already got the old tag, doing a "git -pull" on your tree shouldn't just make them overwrite the old +users back. So if somebody already got the old tag, doing a +'git-pull' on your tree shouldn't just make them overwrite the old one. If somebody got a release tag from you, you cannot just change @@ -170,7 +178,7 @@ private anchor point tags from the other person. You would notice "please pull" messages on the mailing list says repo URL and branch name alone. This is designed to be easily -cut&pasted to "git fetch" command line: +cut&pasted to a 'git-fetch' command line: ------------ Linus, please pull from @@ -226,21 +234,21 @@ the tag object affects, for example, the ordering of tags in the gitweb interface. To set the date used in future tag objects, set the environment -variable GIT_AUTHOR_DATE to one or more of the date and time. The +variable GIT_COMMITTER_DATE to one or more of the date and time. The date and time can be specified in a number of ways; the most common is "YYYY-MM-DD HH:MM". An example follows. ------------ -$ GIT_AUTHOR_DATE="2006-10-02 10:31" git tag -s v1.0.1 +$ GIT_COMMITTER_DATE="2006-10-02 10:31" git tag -s v1.0.1 ------------ Author ------ Written by Linus Torvalds <torvalds@osdl.org>, -Junio C Hamano <junkio@cox.net> and Chris Wright <chrisw@osdl.org>. +Junio C Hamano <gitster@pobox.com> and Chris Wright <chrisw@osdl.org>. Documentation -------------- @@ -248,4 +256,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-tar-tree.txt b/Documentation/git-tar-tree.txt index 65c68176e5..a5d9558dd1 100644 --- a/Documentation/git-tar-tree.txt +++ b/Documentation/git-tar-tree.txt @@ -8,23 +8,23 @@ git-tar-tree - Create a tar archive of the files in the named tree object SYNOPSIS -------- -'git-tar-tree' [--remote=<repo>] <tree-ish> [ <base> ] +'git tar-tree' [--remote=<repo>] <tree-ish> [ <base> ] DESCRIPTION ----------- -THIS COMMAND IS DEPRECATED. Use `git-archive` with `--format=tar` +THIS COMMAND IS DEPRECATED. Use 'git-archive' with `--format=tar` option instead (and move the <base> argument to `--prefix=base/`). Creates a tar archive containing the tree structure for the named tree. When <base> is specified it is added as a leading path to the files in the generated tar archive. -git-tar-tree behaves differently when given a tree ID versus when given +'git-tar-tree' behaves differently when given a tree ID versus when given a commit ID or tag ID. In the first case the current time is used as modification time of each file in the archive. In the latter case the commit time as recorded in the referenced commit object is used instead. Additionally the commit ID is stored in a global extended pax header. -It can be extracted using git-get-tar-commit-id. +It can be extracted using 'git-get-tar-commit-id'. OPTIONS ------- @@ -86,4 +86,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-unpack-file.txt b/Documentation/git-unpack-file.txt index 1864d13ed8..995db9fead 100644 --- a/Documentation/git-unpack-file.txt +++ b/Documentation/git-unpack-file.txt @@ -9,7 +9,7 @@ git-unpack-file - Creates a temporary file with a blob's contents SYNOPSIS -------- -'git-unpack-file' <blob> +'git unpack-file' <blob> DESCRIPTION ----------- @@ -32,4 +32,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-unpack-objects.txt b/Documentation/git-unpack-objects.txt index b79be3fd4c..36d1038056 100644 --- a/Documentation/git-unpack-objects.txt +++ b/Documentation/git-unpack-objects.txt @@ -8,7 +8,7 @@ git-unpack-objects - Unpack objects from a packed archive SYNOPSIS -------- -'git-unpack-objects' [-n] [-q] [-r] <pack-file +'git unpack-objects' [-n] [-q] [-r] [--strict] <pack-file DESCRIPTION @@ -21,7 +21,7 @@ Objects that already exist in the repository will *not* be unpacked from the pack-file. Therefore, nothing will be unpacked if you use this command on a pack-file that exists within the target repository. -Please see the `git-repack` documentation for options to generate +See linkgit:git-repack[1] for options to generate new packs and replace existing ones. OPTIONS @@ -40,6 +40,9 @@ OPTIONS and make the best effort to recover as many objects as possible. +--strict:: + Don't write objects with broken content or links. + Author ------ @@ -51,4 +54,4 @@ Documentation by Junio C Hamano GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-update-index.txt b/Documentation/git-update-index.txt index 66be18ef36..1d9d81a702 100644 --- a/Documentation/git-update-index.txt +++ b/Documentation/git-update-index.txt @@ -9,12 +9,13 @@ git-update-index - Register file contents in the working tree to the index SYNOPSIS -------- [verse] -'git-update-index' +'git update-index' [--add] [--remove | --force-remove] [--replace] [--refresh] [-q] [--unmerged] [--ignore-missing] [--cacheinfo <mode> <object> <file>]\* [--chmod=(+|-)x] [--assume-unchanged | --no-assume-unchanged] + [--ignore-submodules] [--really-refresh] [--unresolve] [--again | -g] [--info-only] [--index-info] [-z] [--stdin] @@ -30,7 +31,7 @@ cleared. See also linkgit:git-add[1] for a more user-friendly way to do some of the most common operations on the index. -The way "git-update-index" handles files it is told about can be modified +The way 'git-update-index' handles files it is told about can be modified using the various options: OPTIONS @@ -52,11 +53,15 @@ OPTIONS -q:: Quiet. If --refresh finds that the index needs an update, the default behavior is to error out. This option makes - git-update-index continue anyway. + 'git-update-index' continue anyway. + +--ignore-submodules: + Do not try to update submodules. This option is only respected + when passed before --refresh. --unmerged:: If --refresh finds unmerged changes in the index, the default - behavior is to error out. This option makes git-update-index + behavior is to error out. This option makes 'git-update-index' continue anyway. --ignore-missing:: @@ -71,7 +76,8 @@ OPTIONS --chmod=(+|-)x:: Set the execute permissions on the updated files. ---assume-unchanged, --no-assume-unchanged:: +--assume-unchanged:: +--no-assume-unchanged:: When these flags are specified, the object name recorded for the paths are not updated. Instead, these options sets and unsets the "assume unchanged" bit for the @@ -82,9 +88,20 @@ OPTIONS sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs). - ---again, -g:: - Runs `git-update-index` itself on the paths whose index ++ +This option can be also used as a coarse file-level mechanism +to ignore uncommitted changes in tracked files (akin to what +`.gitignore` does for untracked files). +You should remember that an explicit 'git add' operation will +still cause the file to be refreshed from the working tree. +Git will fail (gracefully) in case it needs to modify this file +in the index e.g. when merging in a commit; +thus, in case the assumed-untracked file is changed upstream, +you will need to handle the situation manually. + +-g:: +--again:: + Runs 'git-update-index' itself on the paths whose index entries are different from those from the `HEAD` commit. --unresolve:: @@ -102,7 +119,7 @@ OPTIONS --replace:: By default, when a file `path` exists in the index, - git-update-index refuses an attempt to add `path/file`. + 'git-update-index' refuses an attempt to add `path/file`. Similarly if a file `path/file` exists, a file `path` cannot be added. With --replace flag, existing entries that conflicts with the entry being added are @@ -138,7 +155,7 @@ up-to-date for mode/content changes. But what it *does* do is to can refresh the index for a file that hasn't been changed but where the stat entry is out of date. -For example, you'd want to do this after doing a "git-read-tree", to link +For example, you'd want to do this after doing a 'git-read-tree', to link up the stat index details with the proper files. Using --cacheinfo or --info-only @@ -150,7 +167,7 @@ merging. To pretend you have a file with mode and sha1 at path, say: ---------------- -$ git-update-index --cacheinfo mode sha1 path +$ git update-index --cacheinfo mode sha1 path ---------------- '--info-only' is used to register files without placing them in the object @@ -179,13 +196,13 @@ back on 3-way merge. . mode SP type SP sha1 TAB path + -The second format is to stuff git-ls-tree output +The second format is to stuff 'git-ls-tree' output into the index file. . mode SP sha1 SP stage TAB path + This format is to put higher order stages into the -index file and matches git-ls-files --stage output. +index file and matches 'git-ls-files --stage' output. To place a higher stage entry to the index, the path should first be removed by feeding a mode=0 entry for the path, and @@ -240,13 +257,13 @@ In order to set "assume unchanged" bit, use `--assume-unchanged` option. To unset, use `--no-assume-unchanged`. The command looks at `core.ignorestat` configuration variable. When -this is true, paths updated with `git-update-index paths...` and +this is true, paths updated with `git update-index paths...` and paths updated with other git commands that update both index and -working tree (e.g. `git-apply --index`, `git-checkout-index -u`, -and `git-read-tree -u`) are automatically marked as "assume +working tree (e.g. 'git-apply --index', 'git-checkout-index -u', +and 'git-read-tree -u') are automatically marked as "assume unchanged". Note that "assume unchanged" bit is *not* set if -`git-update-index --refresh` finds the working tree file matches -the index (use `git-update-index --really-refresh` if you want +`git update-index --refresh` finds the working tree file matches +the index (use `git update-index --really-refresh` if you want to mark them as "assume unchanged"). @@ -255,7 +272,7 @@ Examples To update and refresh only the files already checked out: ---------------- -$ git-checkout-index -n -f -a && git-update-index --ignore-missing --refresh +$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh ---------------- On an inefficient filesystem with `core.ignorestat` set:: @@ -296,7 +313,7 @@ unreliable, this should be set to 'false' (see linkgit:git-config[1]). This causes the command to ignore differences in file modes recorded in the index and the file mode on the filesystem if they differ only on executable bit. On such an unfortunate filesystem, you may -need to use `git-update-index --chmod=`. +need to use 'git-update-index --chmod='. Quite similarly, if `core.symlinks` configuration variable is set to 'false' (see linkgit:git-config[1]), symbolic links are checked out @@ -306,8 +323,13 @@ from symbolic link to regular file. The command looks at `core.ignorestat` configuration variable. See 'Using "assume unchanged" bit' section above. +The command also looks at `core.trustctime` configuration variable. +It can be useful when the inode change time is regularly modified by +something outside Git (file system crawlers and backup systems use +ctime for marking files processed) (see linkgit:git-config[1]). + -See Also +SEE ALSO -------- linkgit:git-config[1], linkgit:git-add[1] @@ -323,4 +345,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-update-ref.txt b/Documentation/git-update-ref.txt index 4dc475992e..9639f705af 100644 --- a/Documentation/git-update-ref.txt +++ b/Documentation/git-update-ref.txt @@ -7,18 +7,18 @@ git-update-ref - Update the object name stored in a ref safely SYNOPSIS -------- -'git-update-ref' [-m <reason>] (-d <ref> <oldvalue> | [--no-deref] <ref> <newvalue> [<oldvalue>]) +'git update-ref' [-m <reason>] (-d <ref> [<oldvalue>] | [--no-deref] <ref> <newvalue> [<oldvalue>]) DESCRIPTION ----------- Given two arguments, stores the <newvalue> in the <ref>, possibly -dereferencing the symbolic refs. E.g. `git-update-ref HEAD +dereferencing the symbolic refs. E.g. `git update-ref HEAD <newvalue>` updates the current branch head to the new object. Given three arguments, stores the <newvalue> in the <ref>, possibly dereferencing the symbolic refs, after verifying that the current value of the <ref> matches <oldvalue>. -E.g. `git-update-ref refs/heads/master <newvalue> <oldvalue>` +E.g. `git update-ref refs/heads/master <newvalue> <oldvalue>` updates the master branch head to <newvalue> only if its current value is <oldvalue>. You can specify 40 "0" or an empty string as <oldvalue> to make sure that the ref you are creating does @@ -41,7 +41,7 @@ the result of following the symbolic pointers. In general, using - git-update-ref HEAD "$head" + git update-ref HEAD "$head" should be a _lot_ safer than doing @@ -61,7 +61,7 @@ still contains <oldvalue>. Logging Updates --------------- If config parameter "core.logAllRefUpdates" is true or the file -"$GIT_DIR/logs/<ref>" exists then `git-update-ref` will append +"$GIT_DIR/logs/<ref>" exists then `git update-ref` will append a line to the log file "$GIT_DIR/logs/<ref>" (dereferencing all symbolic refs before creating the log name) describing the change in ref value. Log lines are formatted as: @@ -90,4 +90,4 @@ Written by Linus Torvalds <torvalds@osdl.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-update-server-info.txt b/Documentation/git-update-server-info.txt index 1cf89fd79e..35d27b0c7f 100644 --- a/Documentation/git-update-server-info.txt +++ b/Documentation/git-update-server-info.txt @@ -8,7 +8,7 @@ git-update-server-info - Update auxiliary info file to help dumb servers SYNOPSIS -------- -'git-update-server-info' [--force] +'git update-server-info' [--force] DESCRIPTION ----------- @@ -22,7 +22,8 @@ generates such auxiliary files. OPTIONS ------- --f|--force:: +-f:: +--force:: Update the info files from scratch. @@ -30,8 +31,8 @@ OUTPUT ------ Currently the command updates the following files. Please see -link:repository-layout.html[repository-layout] for description -of what they are for: +linkgit:gitrepository-layout[5] for description of +what they are for: * objects/info/packs @@ -46,7 +47,7 @@ info/refs file unless `--force` flag is given. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -54,4 +55,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-upload-archive.txt b/Documentation/git-upload-archive.txt index c1ef1440bc..bbd7617587 100644 --- a/Documentation/git-upload-archive.txt +++ b/Documentation/git-upload-archive.txt @@ -8,7 +8,7 @@ git-upload-archive - Send archive back to git-archive SYNOPSIS -------- -'git-upload-archive' <directory> +'git upload-archive' <directory> DESCRIPTION ----------- @@ -34,4 +34,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-upload-pack.txt b/Documentation/git-upload-pack.txt index 2330d13814..b8e49dce4a 100644 --- a/Documentation/git-upload-pack.txt +++ b/Documentation/git-upload-pack.txt @@ -8,7 +8,7 @@ git-upload-pack - Send objects packed back to git-fetch-pack SYNOPSIS -------- -'git-upload-pack' [--strict] [--timeout=<n>] <directory> +'git upload-pack' [--strict] [--timeout=<n>] <directory> DESCRIPTION ----------- @@ -24,10 +24,10 @@ repository. For push operations, see 'git-send-pack'. OPTIONS ------- -\--strict:: +--strict:: Do not try <directory>/.git/ if <directory> is no git directory. -\--timeout=<n>:: +--timeout=<n>:: Interrupt transfer after <n> seconds of inactivity. <directory>:: @@ -43,4 +43,4 @@ Documentation by Junio C Hamano. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-var.txt b/Documentation/git-var.txt index 2980283905..3647dd6c8f 100644 --- a/Documentation/git-var.txt +++ b/Documentation/git-var.txt @@ -8,7 +8,7 @@ git-var - Show a git logical variable SYNOPSIS -------- -'git-var' [ -l | <variable> ] +'git var' [ -l | <variable> ] DESCRIPTION ----------- @@ -20,11 +20,11 @@ OPTIONS Cause the logical variables to be listed. In addition, all the variables of the git configuration file .git/config are listed as well. (However, the configuration variables listing functionality - is deprecated in favor of `git-config -l`.) + is deprecated in favor of 'git-config -l'.) EXAMPLE -------- - $ git-var GIT_AUTHOR_IDENT + $ git var GIT_AUTHOR_IDENT Eric W. Biederman <ebiederm@lnxi.com> 1121223278 -0600 @@ -45,7 +45,7 @@ Your parents must have hated you!:: Your sysadmin must hate you!:: The password(5) name field is longer than a giant static buffer. -See Also +SEE ALSO -------- linkgit:git-commit-tree[1] linkgit:git-tag[1] @@ -61,4 +61,4 @@ Documentation by Eric Biederman and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-verify-pack.txt b/Documentation/git-verify-pack.txt index db019a2b8d..c8611632d1 100644 --- a/Documentation/git-verify-pack.txt +++ b/Documentation/git-verify-pack.txt @@ -8,13 +8,13 @@ git-verify-pack - Validate packed git archive files SYNOPSIS -------- -'git-verify-pack' [-v] [--] <pack>.idx ... +'git verify-pack' [-v] [--] <pack>.idx ... DESCRIPTION ----------- -Reads given idx file for packed git archive created with -git-pack-objects command and verifies idx file and the +Reads given idx file for packed git archive created with the +'git-pack-objects' command and verifies idx file and the corresponding pack file. OPTIONS @@ -32,17 +32,17 @@ OUTPUT FORMAT ------------- When specifying the -v option the format used is: - SHA1 type size offset-in-packfile + SHA1 type size size-in-pack-file offset-in-packfile for objects that are not deltified in the pack, and - SHA1 type size offset-in-packfile depth base-SHA1 + SHA1 type size size-in-packfile offset-in-packfile depth base-SHA1 for objects that are deltified. Author ------ -Written by Junio C Hamano <junkio@cox.net> +Written by Junio C Hamano <gitster@pobox.com> Documentation -------------- @@ -50,4 +50,4 @@ Documentation by Junio C Hamano GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-verify-tag.txt b/Documentation/git-verify-tag.txt index 7e9c1ed15b..84e70a0234 100644 --- a/Documentation/git-verify-tag.txt +++ b/Documentation/git-verify-tag.txt @@ -7,16 +7,16 @@ git-verify-tag - Check the GPG signature of tags SYNOPSIS -------- -'git-verify-tag' <tag>... +'git verify-tag' <tag>... DESCRIPTION ----------- -Validates the gpg signature created by git-tag. +Validates the gpg signature created by 'git-tag'. OPTIONS ------- -<tag>:: - SHA1 identifier of a git tag object. +<tag>...:: + SHA1 identifiers of git tag objects. Author ------ @@ -28,4 +28,4 @@ Documentation by Junio C Hamano and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-web--browse.txt b/Documentation/git-web--browse.txt new file mode 100644 index 0000000000..36afad8d4e --- /dev/null +++ b/Documentation/git-web--browse.txt @@ -0,0 +1,124 @@ +git-web--browse(1) +================== + +NAME +---- +git-web--browse - git helper script to launch a web browser + +SYNOPSIS +-------- +'git web--browse' [OPTIONS] URL/FILE ... + +DESCRIPTION +----------- + +This script tries, as much as possible, to display the URLs and FILEs +that are passed as arguments, as HTML pages in new tabs on an already +opened web browser. + +The following browsers (or commands) are currently supported: + +* firefox (this is the default under X Window when not using KDE) +* iceweasel +* konqueror (this is the default under KDE, see 'Note about konqueror' below) +* w3m (this is the default outside graphical environments) +* links +* lynx +* dillo +* open (this is the default under Mac OS X GUI) + +Custom commands may also be specified. + +OPTIONS +------- +-b BROWSER:: +--browser=BROWSER:: + Use the specified BROWSER. It must be in the list of supported + browsers. + +-t BROWSER:: +--tool=BROWSER:: + Same as above. + +-c CONF.VAR:: +--config=CONF.VAR:: + CONF.VAR is looked up in the git config files. If it's set, + then its value specify the browser that should be used. + +CONFIGURATION VARIABLES +----------------------- + +CONF.VAR (from -c option) and web.browser +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The web browser can be specified using a configuration variable passed +with the -c (or --config) command line option, or the 'web.browser' +configuration variable if the former is not used. + +browser.<tool>.path +~~~~~~~~~~~~~~~~~~~ + +You can explicitly provide a full path to your preferred browser by +setting the configuration variable 'browser.<tool>.path'. For example, +you can configure the absolute path to firefox by setting +'browser.firefox.path'. Otherwise, 'git-web--browse' assumes the tool +is available in PATH. + +browser.<tool>.cmd +~~~~~~~~~~~~~~~~~~ + +When the browser, specified by options or configuration variables, is +not among the supported ones, then the corresponding +'browser.<tool>.cmd' configuration variable will be looked up. If this +variable exists then 'git-web--browse' will treat the specified tool +as a custom command and will use a shell eval to run the command with +the URLs passed as arguments. + +Note about konqueror +-------------------- + +When 'konqueror' is specified by the a command line option or a +configuration variable, we launch 'kfmclient' to try to open the HTML +man page on an already opened konqueror in a new tab if possible. + +For consistency, we also try such a trick if 'browser.konqueror.path' is +set to something like 'A_PATH_TO/konqueror'. That means we will try to +launch 'A_PATH_TO/kfmclient' instead. + +If you really want to use 'konqueror', then you can use something like +the following: + +------------------------------------------------ + [web] + browser = konq + + [browser "konq"] + cmd = A_PATH_TO/konqueror +------------------------------------------------ + +Note about git-config --global +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Note that these configuration variables should probably be set using +the '--global' flag, for example like this: + +------------------------------------------------ +$ git config --global web.browser firefox +------------------------------------------------ + +as they are probably more user specific than repository specific. +See linkgit:git-config[1] for more information about this. + +Author +------ +Written by Christian Couder <chriscool@tuxfamily.org> and the git-list +<git@vger.kernel.org>, based on 'git-mergetool' by Theodore Y. Ts'o. + +Documentation +------------- +Documentation by Christian Couder <chriscool@tuxfamily.org> and the +git-list <git@vger.kernel.org>. + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/Documentation/git-whatchanged.txt b/Documentation/git-whatchanged.txt index 54947b6769..cadfbd9040 100644 --- a/Documentation/git-whatchanged.txt +++ b/Documentation/git-whatchanged.txt @@ -8,7 +8,7 @@ git-whatchanged - Show logs with difference each commit introduces SYNOPSIS -------- -'git-whatchanged' <option>... +'git whatchanged' <option>... DESCRIPTION ----------- @@ -38,11 +38,6 @@ OPTIONS Show git internal diff output, but for the whole tree, not just the top level. ---pretty=<format>:: - Controls the output format for the commit logs. - <format> can be one of 'raw', 'medium', 'short', 'full', - and 'oneline'. - -m:: By default, differences for merge commits are not shown. With this flag, show differences to that commit from all @@ -51,14 +46,18 @@ OPTIONS However, it is not very useful in general, although it *is* useful on a file-by-file basis. +include::pretty-options.txt[] + +include::pretty-formats.txt[] + Examples -------- -git-whatchanged -p v2.6.12.. include/scsi drivers/scsi:: +git whatchanged -p v2.6.12.. include/scsi drivers/scsi:: Show as patches the commits since version 'v2.6.12' that changed any file in the include/scsi or drivers/scsi subdirectories -git-whatchanged --since="2 weeks ago" \-- gitk:: +git whatchanged --since="2 weeks ago" \-- gitk:: Show the changes during the last two weeks to the file 'gitk'. The "--" is necessary to avoid confusion with the *branch* named @@ -68,7 +67,7 @@ git-whatchanged --since="2 weeks ago" \-- gitk:: Author ------ Written by Linus Torvalds <torvalds@osdl.org> and -Junio C Hamano <junkio@cox.net> +Junio C Hamano <gitster@pobox.com> Documentation @@ -77,4 +76,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git-write-tree.txt b/Documentation/git-write-tree.txt index 461c813f5a..26d3850e73 100644 --- a/Documentation/git-write-tree.txt +++ b/Documentation/git-write-tree.txt @@ -8,7 +8,7 @@ git-write-tree - Create a tree object from the current index SYNOPSIS -------- -'git-write-tree' [--missing-ok] [--prefix=<prefix>/] +'git write-tree' [--missing-ok] [--prefix=<prefix>/] DESCRIPTION ----------- @@ -16,17 +16,17 @@ Creates a tree object using the current index. The index must be in a fully merged state. -Conceptually, `git-write-tree` sync()s the current index contents +Conceptually, 'git-write-tree' sync()s the current index contents into a set of tree files. In order to have that match what is actually in your directory right -now, you need to have done a `git-update-index` phase before you did the -`git-write-tree`. +now, you need to have done a 'git-update-index' phase before you did the +'git-write-tree'. OPTIONS ------- --missing-ok:: - Normally `git-write-tree` ensures that the objects referenced by the + Normally 'git-write-tree' ensures that the objects referenced by the directory exist in the object database. This option disables this check. @@ -46,4 +46,4 @@ Documentation by David Greaves, Junio C Hamano and the git-list <git@vger.kernel GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/git.txt b/Documentation/git.txt index 4ece40d1eb..1bc295dd54 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -1,4 +1,4 @@ -git(7) +git(1) ====== NAME @@ -20,11 +20,11 @@ Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals. -See this link:tutorial.html[tutorial] to get started, then see +See linkgit:gittutorial[7] to get started, then see link:everyday.html[Everyday Git] for a useful minimum set of commands, and "man git-commandname" for documentation of each command. CVS users may -also want to read link:cvs-migration.html[CVS migration]. See -link:user-manual.html[Git User's Manual] for a more in-depth +also want to read linkgit:gitcvs-migration[7]. See +the link:user-manual.html[Git User's Manual] for a more in-depth introduction. The COMMAND is either a name of a Git command (see below) or an alias @@ -43,6 +43,40 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: +* link:v1.6.0/git.html[documentation for release 1.6.0] + +* release notes for + link:RelNotes-1.6.0.txt[1.6.0]. + +* link:v1.5.6.5/git.html[documentation for release 1.5.6.5] + +* release notes for + link:RelNotes-1.5.6.5.txt[1.5.6.5], + link:RelNotes-1.5.6.4.txt[1.5.6.4], + link:RelNotes-1.5.6.3.txt[1.5.6.3], + link:RelNotes-1.5.6.2.txt[1.5.6.2], + link:RelNotes-1.5.6.1.txt[1.5.6.1], + link:RelNotes-1.5.6.txt[1.5.6]. + +* link:v1.5.5.4/git.html[documentation for release 1.5.5.4] + +* release notes for + link:RelNotes-1.5.5.4.txt[1.5.5.4], + link:RelNotes-1.5.5.3.txt[1.5.5.3], + link:RelNotes-1.5.5.2.txt[1.5.5.2], + link:RelNotes-1.5.5.1.txt[1.5.5.1], + link:RelNotes-1.5.5.txt[1.5.5]. + +* link:v1.5.4.5/git.html[documentation for release 1.5.4.5] + +* release notes for + link:RelNotes-1.5.4.5.txt[1.5.4.5], + link:RelNotes-1.5.4.4.txt[1.5.4.4], + link:RelNotes-1.5.4.3.txt[1.5.4.3], + link:RelNotes-1.5.4.2.txt[1.5.4.2], + link:RelNotes-1.5.4.1.txt[1.5.4.1], + link:RelNotes-1.5.4.txt[1.5.4]. + * link:v1.5.3.8/git.html[documentation for release 1.5.3.8] * release notes for @@ -56,6 +90,8 @@ Documentation for older releases are available here: link:RelNotes-1.5.3.1.txt[1.5.3.1], link:RelNotes-1.5.3.txt[1.5.3]. +* link:v1.5.2.5/git.html[documentation for release 1.5.2.5] + * release notes for link:RelNotes-1.5.2.5.txt[1.5.2.5], link:RelNotes-1.5.2.4.txt[1.5.2.4], @@ -108,16 +144,17 @@ OPTIONS + Other options are available to control how the manual page is displayed. See linkgit:git-help[1] for more information, -because 'git --help ...' is converted internally into 'git -help ...'. +because `git --help ...` is converted internally into `git +help ...`. --exec-path:: Path to wherever your core git programs are installed. This can also be controlled by setting the GIT_EXEC_PATH - environment variable. If no path is given 'git' will print + environment variable. If no path is given, 'git' will print the current setting and then exit. --p|--paginate:: +-p:: +--paginate:: Pipe all output into 'less' (or if set, $PAGER). --no-pager:: @@ -125,7 +162,8 @@ help ...'. --git-dir=<path>:: Set the path to the repository. This can also be controlled by - setting the GIT_DIR environment variable. + setting the GIT_DIR environment variable. It can be an absolute + path or relative path to current working directory. --work-tree=<path>:: Set the path to the working tree. The value will not be @@ -133,7 +171,12 @@ help ...'. a .git directory (i.e. $GIT_DIR is not set). This can also be controlled by setting the GIT_WORK_TREE environment variable and the core.worktree configuration - variable. + variable. It can be an absolute path or relative path to + the directory specified by --git-dir or GIT_DIR. + Note: If --git-dir or GIT_DIR are specified but none of + --work-tree, GIT_WORK_TREE and core.worktree is specified, + the current working directory is regarded as the top directory + of your working tree. --bare:: Treat the repository as a bare repository. If GIT_DIR @@ -148,13 +191,14 @@ See the references above to get started using git. The following is probably more detail than necessary for a first-time user. The link:user-manual.html#git-concepts[git concepts chapter of the -user-manual] and the link:core-tutorial.html[Core tutorial] both provide +user-manual] and linkgit:gitcore-tutorial[7] both provide introductions to the underlying git architecture. See also the link:howto-index.html[howto] documents for some useful examples. -The internals are documented link:technical/api-index.html[here]. +The internals are documented in the +link:technical/api-index.html[GIT API documentation]. GIT COMMANDS ------------ @@ -338,9 +382,9 @@ For a more complete list of ways to spell object names, see File/Directory Structure ------------------------ -Please see the link:repository-layout.html[repository layout] document. +Please see the linkgit:gitrepository-layout[5] document. -Read link:hooks.html[hooks] for more details about each hook. +Read linkgit:githooks[5] for more details about each hook. Higher level SCMs may provide and manage additional information in the `$GIT_DIR`. @@ -348,7 +392,7 @@ Higher level SCMs may provide and manage additional information in the Terminology ----------- -Please see the link:glossary.html[glossary] document. +Please see linkgit:gitglossary[7]. Environment Variables @@ -375,9 +419,9 @@ git so take care if using Cogito etc. 'GIT_ALTERNATE_OBJECT_DIRECTORIES':: Due to the immutable nature of git objects, old objects can be archived into shared, read-only directories. This variable - specifies a ":" separated list of git object directories which - can be used to search for git objects. New objects will not be - written to these directories. + specifies a ":" separated (on Windows ";" separated) list + of git object directories which can be used to search for git + objects. New objects will not be written to these directories. 'GIT_DIR':: If the 'GIT_DIR' environment variable is set then it @@ -391,6 +435,14 @@ git so take care if using Cogito etc. This can also be controlled by the '--work-tree' command line option and the core.worktree configuration variable. +'GIT_CEILING_DIRECTORIES':: + This should be a colon-separated list of absolute paths. + If set, it is a list of directories that git should not chdir + up into while looking for a repository directory. + It will not exclude the current working directory or + a GIT_DIR set on the command line or in the environment. + (Useful for excluding slow-loading network directories.) + git Commits ~~~~~~~~~~~ 'GIT_AUTHOR_NAME':: @@ -448,10 +500,10 @@ other a pager. 'GIT_SSH':: - If this environment variable is set then linkgit:git-fetch[1] - and linkgit:git-push[1] will use this command instead - of `ssh` when they need to connect to a remote system. - The 'GIT_SSH' command will be given exactly two arguments: + If this environment variable is set then 'git-fetch' + and 'git-push' will use this command instead + of 'ssh' when they need to connect to a remote system. + The '$GIT_SSH' command will be given exactly two arguments: the 'username@host' (or just 'host') from the URL and the shell command to execute on that remote system. + @@ -465,8 +517,8 @@ for further details. 'GIT_FLUSH':: If this environment variable is set to "1", then commands such - as git-blame (in incremental mode), git-rev-list, git-log, - git-whatchanged, etc., will force a flush of the output stream + as 'git-blame' (in incremental mode), 'git-rev-list', 'git-log', + and 'git-whatchanged' will force a flush of the output stream after each commit-oriented record have been flushed. If this variable is set to "0", the output of these commands will be done using completely buffered I/O. If this environment variable is @@ -492,7 +544,7 @@ Discussion[[Discussion]] More detail on the following is available from the link:user-manual.html#git-concepts[git concepts chapter of the -user-manual] and the link:core-tutorial.html[Core tutorial]. +user-manual] and linkgit:gitcore-tutorial[7]. A git project normally consists of a working directory with a ".git" subdirectory at the top level. The .git directory contains, among other @@ -553,6 +605,13 @@ The documentation for git suite was started by David Greaves <david@dgreaves.com>, and later enhanced greatly by the contributors on the git-list <git@vger.kernel.org>. +SEE ALSO +-------- +linkgit:gittutorial[7], linkgit:gittutorial-2[7], +link:everyday.html[Everyday Git], linkgit:gitcvs-migration[7], +linkgit:gitglossary[7], linkgit:gitcore-tutorial[7], +linkgit:gitcli[7], link:user-manual.html[The Git User's Manual] + GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/gitattributes.txt b/Documentation/gitattributes.txt index 35a29fd60c..db16b0ca5b 100644 --- a/Documentation/gitattributes.txt +++ b/Documentation/gitattributes.txt @@ -63,6 +63,13 @@ path in question, and its parent directories (the further the directory that contains `.gitattributes` is from the path in question, the lower its precedence). +If you wish to affect only a single repository (i.e., to assign +attributes to files that are particular to one user's workflow), then +attributes should be placed in the `$GIT_DIR/info/attributes` file. +Attributes which should be version-controlled and distributed to other +repositories (i.e., attributes of interest to all users) should go into +`.gitattributes` files. + Sometimes you would need to override an setting of an attribute for a path to `unspecified` state. This can be done by listing the name of the attribute prefixed with an exclamation point `!`. @@ -80,9 +87,9 @@ Checking-out and checking-in These attributes affect how the contents stored in the repository are copied to the working tree files when commands -such as `git checkout` and `git merge` run. They also affect how +such as 'git-checkout' and 'git-merge' run. They also affect how git stores the contents you prepare in the working tree in the -repository upon `git add` and `git commit`. +repository upon 'git-add' and 'git-commit'. `crlf` ^^^^^^ @@ -133,6 +140,26 @@ When `core.autocrlf` is set to "input", line endings are converted to LF upon checkin, but there is no conversion done upon checkout. +If `core.safecrlf` is set to "true" or "warn", git verifies if +the conversion is reversible for the current setting of +`core.autocrlf`. For "true", git rejects irreversible +conversions; for "warn", git only prints a warning but accepts +an irreversible conversion. The safety triggers to prevent such +a conversion done to the files in the work tree, but there are a +few exceptions. Even though... + +- 'git-add' itself does not touch the files in the work tree, the + next checkout would, so the safety triggers; + +- 'git-apply' to update a text file with a patch does touch the files + in the work tree, but the operation is about text files and CRLF + conversion is about fixing the line ending inconsistencies, so the + safety does not trigger; + +- 'git-diff' itself does not touch the files in the work tree, it is + often run to inspect the changes you intend to next 'git-add'. To + catch potential problems early, safety triggers. + `ident` ^^^^^^^ @@ -187,7 +214,7 @@ with `crlf`, and then `ident` and fed to `filter`. Generating diff text ~~~~~~~~~~~~~~~~~~~~ -The attribute `diff` affects if `git diff` generates textual +The attribute `diff` affects if 'git-diff' generates textual patch for the path or just says `Binary files differ`. It also can affect what line is shown on the hunk header `@@ -k,l +n,m @@` line. @@ -238,7 +265,7 @@ When git needs to show you a diff for the path with `diff` attribute set to `jcdiff`, it calls the command you specified with the above configuration, i.e. `j-c-diff`, with 7 parameters, just like `GIT_EXTERNAL_DIFF` program is called. -See linkgit:git[7] for details. +See linkgit:git[1] for details. Defining a custom hunk-header @@ -251,7 +278,7 @@ is prefixed with a line of the form: The text is called 'hunk header', and by default a line that begins with an alphabet, an underscore or a dollar sign is used, -which matches what GNU `diff -p` output uses. This default +which matches what GNU 'diff -p' output uses. This default selection however is not suited for some contents, and you can use customized pattern to make a selection. @@ -280,9 +307,18 @@ backslash, and zero or more occurrences of `sub` followed by There are a few built-in patterns to make this easier, and `tex` is one of them, so you do not have to write the above in your configuration file (you still need to enable this with the -attribute mechanism, via `.gitattributes`). Another built-in -pattern is defined for `java` that defines a pattern suitable -for program text in Java language. +attribute mechanism, via `.gitattributes`). The following built in +patterns are available: + +- `bibtex` suitable for files with BibTeX coded references. + +- `java` suitable for source code in the Java lanugage. + +- `pascal` suitable for source code in the Pascal/Delphi language. + +- `ruby` suitable for source code in the Ruby language. + +- `tex` suitable for source code for LaTeX documents. Performing a three-way merge @@ -295,7 +331,7 @@ and other programs such as `git revert` and `git cherry-pick`. Set:: Built-in 3-way merge driver is used to merge the - contents in a way similar to `merge` command of `RCS` + contents in a way similar to 'merge' command of `RCS` suite. This is suitable for ordinary text files. Unset:: @@ -399,7 +435,7 @@ Checking whitespace errors ^^^^^^^^^^^^ The `core.whitespace` configuration variable allows you to define what -`diff` and `apply` should consider whitespace errors for all paths in +'diff' and 'apply' should consider whitespace errors for all paths in the project (See linkgit:git-config[1]). This attribute gives you finer control per path. @@ -423,6 +459,29 @@ String:: variable. +Creating an archive +~~~~~~~~~~~~~~~~~~~ + +`export-ignore` +^^^^^^^^^^^^^^^ + +Files and directories with the attribute `export-ignore` won't be added to +archive files. + +`export-subst` +^^^^^^^^^^^^^^ + +If the attribute `export-subst` is set for a file then git will expand +several placeholders when adding this file to an archive. The +expansion depends on the availability of a commit ID, i.e., if +linkgit:git-archive[1] has been given a tree instead of a commit or a +tag then no replacement will be done. The placeholders are the same +as those for the option `--pretty=format:` of linkgit:git-log[1], +except that they need to be wrapped like this: `$Format:PLACEHOLDERS$` +in the file. E.g. the string `$Format:%H$` will be replaced by the +commit hash. + + EXAMPLE ------- @@ -472,23 +531,7 @@ frotz unspecified ---------------------------------------------------------------- -Creating an archive -~~~~~~~~~~~~~~~~~~~ - -`export-subst` -^^^^^^^^^^^^^^ - -If the attribute `export-subst` is set for a file then git will expand -several placeholders when adding this file to an archive. The -expansion depends on the availability of a commit ID, i.e. if -linkgit:git-archive[1] has been given a tree instead of a commit or a -tag then no replacement will be done. The placeholders are the same -as those for the option `--pretty=format:` of linkgit:git-log[1], -except that they need to be wrapped like this: `$Format:PLACEHOLDERS$` -in the file. E.g. the string `$Format:%H$` will be replaced by the -commit hash. - GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/gitcli.txt b/Documentation/gitcli.txt index 7ee5ce386f..29e5929db2 100644 --- a/Documentation/gitcli.txt +++ b/Documentation/gitcli.txt @@ -1,4 +1,4 @@ -gitcli(5) +gitcli(7) ========= NAME @@ -13,8 +13,37 @@ gitcli DESCRIPTION ----------- -This manual describes best practice in how to use git CLI. Here are -the rules that you should follow when you are scripting git: +This manual describes the convention used throughout git CLI. + +Many commands take revisions (most often "commits", but sometimes +"tree-ish", depending on the context and command) and paths as their +arguments. Here are the rules: + + * Revisions come first and then paths. + E.g. in `git diff v1.0 v2.0 arch/x86 include/asm-x86`, + `v1.0` and `v2.0` are revisions and `arch/x86` and `include/asm-x86` + are paths. + + * When an argument can be misunderstood as either a revision or a path, + they can be disambiguated by placing `\--` between them. + E.g. `git diff \-- HEAD` is, "I have a file called HEAD in my work + tree. Please show changes between the version I staged in the index + and what I have in the work tree for that file". not "show difference + between the HEAD commit and the work tree as a whole". You can say + `git diff HEAD \--` to ask for the latter. + + * Without disambiguating `\--`, git makes a reasonable guess, but errors + out and asking you to disambiguate when ambiguous. E.g. if you have a + file called HEAD in your work tree, `git diff HEAD` is ambiguous, and + you have to say either `git diff HEAD \--` or `git diff \-- HEAD` to + disambiguate. + +When writing a script that is expected to handle random user-input, it is +a good practice to make it explicit which arguments are which by placing +disambiguating `\--` at appropriate places. + +Here are the rules regarding the "flags" that you should follow when you are +scripting git: * it's preferred to use the non dashed form of git commands, which means that you should prefer `"git foo"` to `"git-foo"`. @@ -34,8 +63,8 @@ the rules that you should follow when you are scripting git: if you happen to have a file called `HEAD` in the work tree. -ENHANCED CLI ------------- +ENHANCED OPTION PARSER +---------------------- From the git 1.5.4 series and further, many git commands (not all of them at the time of the writing though) come with an enhanced option parser. @@ -104,10 +133,46 @@ $ git describe --abbrev 10 HEAD # NOT WHAT YOU MEANT ---------------------------- +NOTES ON FREQUENTLY CONFUSED OPTIONS +------------------------------------ + +Many commands that can work on files in the working tree +and/or in the index can take `--cached` and/or `--index` +options. Sometimes people incorrectly think that, because +the index was originally called cache, these two are +synonyms. They are *not* -- these two options mean very +different things. + + * The `--cached` option is used to ask a command that + usually works on files in the working tree to *only* work + with the index. For example, `git grep`, when used + without a commit to specify from which commit to look for + strings in, usually works on files in the working tree, + but with the `--cached` option, it looks for strings in + the index. + + * The `--index` option is used to ask a command that + usually works on files in the working tree to *also* + affect the index. For example, `git stash apply` usually + merges changes recorded in a stash to the working tree, + but with the `--index` option, it also merges changes to + the index as well. + +`git apply` command can be used with `--cached` and +`--index` (but not at the same time). Usually the command +only affects the files in the working tree, but with +`--index`, it patches both the files and their index +entries, and with `--cached`, it modifies only the index +entries. + +See also http://marc.info/?l=git&m=116563135620359 and +http://marc.info/?l=git&m=119150393620273 for further +information. + Documentation ------------- -Documentation by Pierre Habouzit. +Documentation by Pierre Habouzit and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/core-tutorial.txt b/Documentation/gitcore-tutorial.txt index aa40dfd36a..a417e592ac 100644 --- a/Documentation/core-tutorial.txt +++ b/Documentation/gitcore-tutorial.txt @@ -1,15 +1,23 @@ -A git core tutorial for developers -================================== +gitcore-tutorial(7) +=================== -Introduction ------------- +NAME +---- +gitcore-tutorial - A git core tutorial for developers + +SYNOPSIS +-------- +git * + +DESCRIPTION +----------- This tutorial explains how to use the "core" git programs to set up and work with a git repository. If you just need to use git as a revision control system you may prefer -to start with link:tutorial.html[a tutorial introduction to git] or -link:user-manual.html[the git user manual]. +to start with "A Tutorial Introduction to GIT" (linkgit:gittutorial[7]) or +link:user-manual.html[the GIT User Manual]. However, an understanding of these low-level tools can be helpful if you want to understand git's internals. @@ -34,14 +42,14 @@ one for a totally new project, or an existing working tree that you want to import into git. For our first example, we're going to start a totally new repository from -scratch, with no pre-existing files, and we'll call it `git-tutorial`. +scratch, with no pre-existing files, and we'll call it 'git-tutorial'. To start up, create a subdirectory for it, change into that -subdirectory, and initialize the git infrastructure with `git-init`: +subdirectory, and initialize the git infrastructure with 'git-init': ------------------------------------------------ $ mkdir git-tutorial $ cd git-tutorial -$ git-init +$ git init ------------------------------------------------ to which git will reply @@ -53,7 +61,7 @@ Initialized empty Git repository in .git/ which is just git's way of saying that you haven't been doing anything strange, and that it will have created a local `.git` directory setup for your new project. You will now have a `.git` directory, and you can -inspect that with `ls`. For your new empty project, it should show you +inspect that with 'ls'. For your new empty project, it should show you three entries, among other things: - a file called `HEAD`, that has `ref: refs/heads/master` in it. @@ -100,8 +108,7 @@ references in these `refs` subdirectories when you actually start populating your tree. [NOTE] -An advanced user may want to take a look at the -link:repository-layout.html[repository layout] document +An advanced user may want to take a look at linkgit:gitrepository-layout[5] after finishing this tutorial. You have now created your first git repository. Of course, since it's @@ -132,7 +139,7 @@ but to actually check in your hard work, you will have to go through two steps: - commit that index file as an object. The first step is trivial: when you want to tell git about any changes -to your working tree, you use the `git-update-index` program. That +to your working tree, you use the 'git-update-index' program. That program normally just takes a list of filenames you want to update, but to avoid trivial mistakes, it refuses to add new entries to the index (or remove existing ones) unless you explicitly tell it that you're @@ -142,7 +149,7 @@ adding a new entry with the `\--add` flag (or removing an entry with the So to populate the index with the two files you just created, you can do ------------------------------------------------ -$ git-update-index --add hello example +$ git update-index --add hello example ------------------------------------------------ and you have now told git to track those two files. @@ -166,19 +173,19 @@ and see two files: which correspond with the objects with names of `557db...` and `f24c7...` respectively. -If you want to, you can use `git-cat-file` to look at those objects, but +If you want to, you can use 'git-cat-file' to look at those objects, but you'll have to use the object name, not the filename of the object: ---------------- -$ git-cat-file -t 557db03de997c86a4a028e1ebd3a1ceb225be238 +$ git cat-file -t 557db03de997c86a4a028e1ebd3a1ceb225be238 ---------------- -where the `-t` tells `git-cat-file` to tell you what the "type" of the +where the `-t` tells 'git-cat-file' to tell you what the "type" of the object is. git will tell you that you have a "blob" object (i.e., just a regular file), and you can see the contents with ---------------- -$ git-cat-file "blob" 557db03 +$ git cat-file "blob" 557db03 ---------------- which will print out "Hello World". The object `557db03` is nothing @@ -198,7 +205,7 @@ hexadecimal digits in most places. Anyway, as we mentioned previously, you normally never actually take a look at the objects themselves, and typing long 40-character hex names is not something you'd normally want to do. The above digression -was just to show that `git-update-index` did something magical, and +was just to show that 'git-update-index' did something magical, and actually saved away the contents of your files into the git object database. @@ -221,22 +228,22 @@ $ echo "It's a new day for git" >>hello and you can now, since you told git about the previous state of `hello`, ask git what has changed in the tree compared to your old index, using the -`git-diff-files` command: +'git-diff-files' command: ------------ -$ git-diff-files +$ git diff-files ------------ Oops. That wasn't very readable. It just spit out its own internal -version of a `diff`, but that internal version really just tells you +version of a 'diff', but that internal version really just tells you that it has noticed that "hello" has been modified, and that the old object contents it had have been replaced with something else. -To make it readable, we can tell git-diff-files to output the +To make it readable, we can tell 'git-diff-files' to output the differences as a patch, using the `-p` flag: ------------ -$ git-diff-files -p +$ git diff-files -p diff --git a/hello b/hello index 557db03..263414f 100644 --- a/hello @@ -248,11 +255,11 @@ index 557db03..263414f 100644 i.e. the diff of the change we caused by adding another line to `hello`. -In other words, `git-diff-files` always shows us the difference between +In other words, 'git-diff-files' always shows us the difference between what is recorded in the index, and what is currently in the working tree. That's very useful. -A common shorthand for `git-diff-files -p` is to just write `git +A common shorthand for `git diff-files -p` is to just write `git diff`, which will do the same thing. ------------ @@ -276,15 +283,15 @@ that in two phases: creating a 'tree' object, and committing that 'tree' object as a 'commit' object together with an explanation of what the tree was all about, along with information of how we came to that state. -Creating a tree object is trivial, and is done with `git-write-tree`. -There are no options or other input: git-write-tree will take the +Creating a tree object is trivial, and is done with 'git-write-tree'. +There are no options or other input: `git write-tree` will take the current index state, and write an object that describes that whole index. In other words, we're now tying together all the different filenames with their contents (and their permissions), and we're creating the equivalent of a git "directory" object: ------------------------------------------------ -$ git-write-tree +$ git write-tree ------------------------------------------------ and this will just output the name of the resulting tree, in this case @@ -295,34 +302,34 @@ and this will just output the name of the resulting tree, in this case ---------------- which is another incomprehensible object name. Again, if you want to, -you can use `git-cat-file -t 8988d\...` to see that this time the object +you can use `git cat-file -t 8988d\...` to see that this time the object is not a "blob" object, but a "tree" object (you can also use -`git-cat-file` to actually output the raw object contents, but you'll see +`git cat-file` to actually output the raw object contents, but you'll see mainly a binary mess, so that's less interesting). -However -- normally you'd never use `git-write-tree` on its own, because +However -- normally you'd never use 'git-write-tree' on its own, because normally you always commit a tree into a commit object using the -`git-commit-tree` command. In fact, it's easier to not actually use -`git-write-tree` on its own at all, but to just pass its result in as an -argument to `git-commit-tree`. +'git-commit-tree' command. In fact, it's easier to not actually use +'git-write-tree' on its own at all, but to just pass its result in as an +argument to 'git-commit-tree'. -`git-commit-tree` normally takes several arguments -- it wants to know +'git-commit-tree' normally takes several arguments -- it wants to know what the 'parent' of a commit was, but since this is the first commit ever in this new repository, and it has no parents, we only need to pass in -the object name of the tree. However, `git-commit-tree` also wants to get a +the object name of the tree. However, 'git-commit-tree' also wants to get a commit message on its standard input, and it will write out the resulting object name for the commit to its standard output. And this is where we create the `.git/refs/heads/master` file which is pointed at by `HEAD`. This file is supposed to contain the reference to the top-of-tree of the master branch, and since -that's exactly what `git-commit-tree` spits out, we can do this +that's exactly what 'git-commit-tree' spits out, we can do this all with a sequence of simple shell commands: ------------------------------------------------ -$ tree=$(git-write-tree) -$ commit=$(echo 'Initial commit' | git-commit-tree $tree) -$ git-update-ref HEAD $commit +$ tree=$(git write-tree) +$ commit=$(echo 'Initial commit' | git commit-tree $tree) +$ git update-ref HEAD $commit ------------------------------------------------ In this case this creates a totally new commit that is not related to @@ -338,37 +345,37 @@ instead, and it would have done the above magic scripting for you. Making a change --------------- -Remember how we did the `git-update-index` on file `hello` and then we +Remember how we did the 'git-update-index' on file `hello` and then we changed `hello` afterward, and could compare the new state of `hello` with the state we saved in the index file? -Further, remember how I said that `git-write-tree` writes the contents +Further, remember how I said that 'git-write-tree' writes the contents of the *index* file to the tree, and thus what we just committed was in fact the *original* contents of the file `hello`, not the new ones. We did that on purpose, to show the difference between the index state, and the state in the working tree, and how they don't have to match, even when we commit things. -As before, if we do `git-diff-files -p` in our git-tutorial project, +As before, if we do `git diff-files -p` in our git-tutorial project, we'll still see the same difference we saw last time: the index file hasn't changed by the act of committing anything. However, now that we have committed something, we can also learn to use a new command: -`git-diff-index`. +'git-diff-index'. -Unlike `git-diff-files`, which showed the difference between the index -file and the working tree, `git-diff-index` shows the differences +Unlike 'git-diff-files', which showed the difference between the index +file and the working tree, 'git-diff-index' shows the differences between a committed *tree* and either the index file or the working -tree. In other words, `git-diff-index` wants a tree to be diffed +tree. In other words, 'git-diff-index' wants a tree to be diffed against, and before we did the commit, we couldn't do that, because we didn't have anything to diff against. But now we can do ---------------- -$ git-diff-index -p HEAD +$ git diff-index -p HEAD ---------------- -(where `-p` has the same meaning as it did in `git-diff-files`), and it +(where `-p` has the same meaning as it did in 'git-diff-files'), and it will show us the same difference, but for a totally different reason. Now we're comparing the working tree not against the index file, but against the tree we just wrote. It just so happens that those two @@ -383,16 +390,16 @@ $ git diff HEAD which ends up doing the above for you. -In other words, `git-diff-index` normally compares a tree against the +In other words, 'git-diff-index' normally compares a tree against the working tree, but when given the `\--cached` flag, it is told to instead compare against just the index cache contents, and ignore the current working tree state entirely. Since we just wrote the index -file to HEAD, doing `git-diff-index \--cached -p HEAD` should thus return +file to HEAD, doing `git diff-index \--cached -p HEAD` should thus return an empty set of differences, and that's exactly what it does. [NOTE] ================ -`git-diff-index` really always uses the index for its +'git-diff-index' really always uses the index for its comparisons, and saying that it compares a tree against the working tree is thus not strictly accurate. In particular, the list of files to compare (the "meta-data") *always* comes from the index file, @@ -415,17 +422,17 @@ work through the index file, so the first thing we need to do is to update the index cache: ------------------------------------------------ -$ git-update-index hello +$ git update-index hello ------------------------------------------------ (note how we didn't need the `\--add` flag this time, since git knew about the file already). -Note what happens to the different `git-diff-\*` versions here. After -we've updated `hello` in the index, `git-diff-files -p` now shows no -differences, but `git-diff-index -p HEAD` still *does* show that the +Note what happens to the different 'git-diff-\*' versions here. After +we've updated `hello` in the index, `git diff-files -p` now shows no +differences, but `git diff-index -p HEAD` still *does* show that the current state is different from the state we committed. In fact, now -`git-diff-index` shows the same difference whether we use the `--cached` +'git-diff-index' shows the same difference whether we use the `--cached` flag or not, since now the index is coherent with the working tree. Now, since we've updated `hello` in the index, we can commit the new @@ -453,7 +460,7 @@ You've now made your first real git commit. And if you're interested in looking at what `git commit` really does, feel free to investigate: it's a few very simple shell scripts to generate the helpful (?) commit message headers, and a few one-liners that actually do the -commit itself (`git-commit`). +commit itself ('git-commit'). Inspecting Changes @@ -461,16 +468,16 @@ Inspecting Changes While creating changes is useful, it's even more useful if you can tell later what changed. The most useful command for this is another of the -`diff` family, namely `git-diff-tree`. +'diff' family, namely 'git-diff-tree'. -`git-diff-tree` can be given two arbitrary trees, and it will tell you the +'git-diff-tree' can be given two arbitrary trees, and it will tell you the differences between them. Perhaps even more commonly, though, you can give it just a single commit object, and it will figure out the parent of that commit itself, and show the difference directly. Thus, to get the same diff that we've already seen several times, we can now do ---------------- -$ git-diff-tree -p HEAD +$ git diff-tree -p HEAD ---------------- (again, `-p` means to show the difference as a human-readable patch), @@ -511,15 +518,15 @@ various diff-\* commands compare things. +-----------+ ============ -More interestingly, you can also give `git-diff-tree` the `--pretty` flag, +More interestingly, you can also give 'git-diff-tree' the `--pretty` flag, which tells it to also show the commit message and author and date of the commit, and you can tell it to show a whole series of diffs. Alternatively, you can tell it to be "silent", and not show the diffs at all, but just show the actual commit message. -In fact, together with the `git-rev-list` program (which generates a -list of revisions), `git-diff-tree` ends up being a veritable fount of -changes. A trivial (but very useful) script called `git-whatchanged` is +In fact, together with the 'git-rev-list' program (which generates a +list of revisions), 'git-diff-tree' ends up being a veritable fount of +changes. A trivial (but very useful) script called 'git-whatchanged' is included with git which does exactly this, and shows a log of recent activities. @@ -535,25 +542,25 @@ with the associated patches use the more complex (and much more powerful) ---------------- -$ git-whatchanged -p --root +$ git whatchanged -p ---------------- and you will see exactly what has changed in the repository over its short history. [NOTE] -The `\--root` flag is a flag to `git-diff-tree` to tell it to -show the initial aka 'root' commit too. Normally you'd probably not -want to see the initial import diff, but since the tutorial project -was started from scratch and is so small, we use it to make the result -a bit more interesting. +When using the above two commands, the initial commit will be shown. +If this is a problem because it is huge, you can hide it by setting +the log.showroot configuration variable to false. Having this, you +can still show it for each command just adding the `\--root` option, +which is a flag for 'git-diff-tree' accepted by both commands. With that, you should now be having some inkling of what git does, and can explore on your own. [NOTE] Most likely, you are not directly using the core -git Plumbing commands, but using Porcelain such as `git-add`, `git-rm' +git Plumbing commands, but using Porcelain such as 'git-add', `git-rm' and `git-commit'. @@ -588,7 +595,7 @@ pointer to the state you want to tag, but also a small tag name and message, along with optionally a PGP signature that says that yes, you really did that tag. You create these annotated tags with either the `-a` or -`-s` flag to `git tag`: +`-s` flag to 'git-tag': ---------------- $ git tag -s <tagname> @@ -635,7 +642,7 @@ and it will be gone. There's no external repository, and there's no history outside the project you created. - if you want to move or duplicate a git repository, you can do so. There - is `git clone` command, but if all you want to do is just to + is 'git-clone' command, but if all you want to do is just to create a copy of your repository (with all the full history that went along with it), you can do so with a regular `cp -a git-tutorial new-git-tutorial`. @@ -646,31 +653,31 @@ information for the files involved) will likely need to be refreshed. So after you do a `cp -a` to create a new copy, you'll want to do + ---------------- -$ git-update-index --refresh +$ git update-index --refresh ---------------- + in the new repository to make sure that the index file is up-to-date. Note that the second point is true even across machines. You can duplicate a remote git repository with *any* regular copy mechanism, be it -`scp`, `rsync` or `wget`. +'scp', 'rsync' or 'wget'. When copying a remote repository, you'll want to at a minimum update the index cache when you do this, and especially with other peoples' repositories you often want to make sure that the index cache is in some known state (you don't know *what* they've done and not yet checked in), -so usually you'll precede the `git-update-index` with a +so usually you'll precede the 'git-update-index' with a ---------------- -$ git-read-tree --reset HEAD -$ git-update-index --refresh +$ git read-tree --reset HEAD +$ git update-index --refresh ---------------- which will force a total index re-build from the tree pointed to by `HEAD`. -It resets the index contents to `HEAD`, and then the `git-update-index` +It resets the index contents to `HEAD`, and then the 'git-update-index' makes sure to match up all index entries with the checked-out files. If the original repository had uncommitted changes in its -working tree, `git-update-index --refresh` notices them and +working tree, `git update-index --refresh` notices them and tells you they need to be updated. The above can also be written as simply @@ -682,8 +689,8 @@ $ git reset and in fact a lot of the common git command combinations can be scripted with the `git xyz` interfaces. You can learn things by just looking at what the various git scripts do. For example, `git reset` used to be -the above two lines implemented in `git-reset`, but some things like -`git status` and `git commit` are slightly more complex scripts around +the above two lines implemented in 'git-reset', but some things like +'git-status' and 'git-commit' are slightly more complex scripts around the basic git commands. Many (most?) public remote repositories will not contain any of @@ -706,7 +713,7 @@ $ rsync -rL rsync://rsync.kernel.org/pub/scm/git/git.git/ .git followed by ---------------- -$ git-read-tree HEAD +$ git read-tree HEAD ---------------- to populate the index. However, now you have populated the index, and @@ -715,14 +722,14 @@ actually have any of the working tree files to work on. To get those, you'd check them out with ---------------- -$ git-checkout-index -u -a +$ git checkout-index -u -a ---------------- where the `-u` flag means that you want the checkout to keep the index up-to-date (so that you don't have to refresh it afterward), and the `-a` flag means "check out all files" (if you have a stale copy or an older version of a checked out tree you may also need to add the `-f` -flag first, to tell git-checkout-index to *force* overwriting of any old +flag first, to tell 'git-checkout-index' to *force* overwriting of any old files). Again, this can all be simplified with @@ -769,7 +776,7 @@ to it. ================================================ If you make the decision to start your new branch at some other point in the history than the current `HEAD`, you can do so by -just telling `git checkout` what the base of the checkout would be. +just telling 'git-checkout' what the base of the checkout would be. In other words, if you have an earlier tag or branch, you'd just do ------------ @@ -812,7 +819,7 @@ $ git branch <branchname> [startingpoint] which will simply _create_ the branch, but will not do anything further. You can then later -- once you decide that you want to actually develop -on that branch -- switch to that branch with a regular `git checkout` +on that branch -- switch to that branch with a regular 'git-checkout' with the branchname as the argument. @@ -832,7 +839,7 @@ $ git commit -m "Some work." -i hello ------------------------------------------------ Here, we just added another line to `hello`, and we used a shorthand for -doing both `git-update-index hello` and `git commit` by just giving the +doing both `git update-index hello` and `git commit` by just giving the filename directly to `git commit`, with an `-i` flag (it tells git to 'include' that file in addition to what you have done to the index file so far when making the commit). The `-m` flag is to give the @@ -871,10 +878,10 @@ means: normally it will just show you your current `HEAD`) and their histories. You can also see exactly how they came to be from a common source. -Anyway, let's exit `gitk` (`^Q` or the File menu), and decide that we want +Anyway, let's exit 'gitk' (`^Q` or the File menu), and decide that we want to merge the work we did on the `mybranch` branch into the `master` branch (which is currently our `HEAD` too). To do that, there's a nice -script called `git merge`, which wants to know which branches you want +script called 'git-merge', which wants to know which branches you want to resolve and what the merge is all about: ------------ @@ -918,7 +925,7 @@ $ git commit -i hello which will very loudly warn you that you're now committing a merge (which is correct, so never mind), and you can write a small merge -message about your adventures in git-merge-land. +message about your adventures in 'git-merge'-land. After you're done, start up `gitk \--all` to see graphically what the history looks like. Notice that `mybranch` still exists, and you can @@ -931,7 +938,7 @@ Another useful tool, especially if you do not always work in X-Window environment, is `git show-branch`. ------------------------------------------------ -$ git-show-branch --topo-order --more=1 master mybranch +$ git show-branch --topo-order --more=1 master mybranch * [master] Merge work in mybranch ! [mybranch] Some work. -- @@ -956,14 +963,14 @@ commits from the master branch. The string inside brackets before the commit log message is a short name you can use to name the commit. In the above example, 'master' and 'mybranch' are branch heads. 'master^' is the first parent of 'master' -branch head. Please see 'git-rev-parse' documentation if you +branch head. Please see linkgit:git-rev-parse[1] if you want to see more complex cases. [NOTE] Without the '--more=1' option, 'git-show-branch' would not output the '[master^]' commit, as '[mybranch]' commit is a common ancestor of -both 'master' and 'mybranch' tips. Please see 'git-show-branch' -documentation for details. +both 'master' and 'mybranch' tips. Please see linkgit:git-show-branch[1] +for details. [NOTE] If there were more commits on the 'master' branch after the merge, the @@ -974,7 +981,7 @@ merge commit visible in this case. Now, let's pretend you are the one who did all the work in `mybranch`, and the fruit of your hard work has finally been merged to the `master` branch. Let's go back to `mybranch`, and run -`git merge` to get the "upstream changes" back to your branch. +'git-merge' to get the "upstream changes" back to your branch. ------------ $ git checkout mybranch @@ -999,7 +1006,7 @@ the tree of your branch to that of the `master` branch. This is often called 'fast forward' merge. You can run `gitk \--all` again to see how the commit ancestry -looks like, or run `show-branch`, which tells you this. +looks like, or run 'show-branch', which tells you this. ------------------------------------------------ $ git show-branch master mybranch @@ -1016,12 +1023,12 @@ Merging external work It's usually much more common that you merge with somebody else than merging with your own branches, so it's worth pointing out that git makes that very easy too, and in fact, it's not that different from -doing a `git merge`. In fact, a remote merge ends up being nothing +doing a 'git-merge'. In fact, a remote merge ends up being nothing more than "fetch the work from a remote repository into a temporary tag" -followed by a `git merge`. +followed by a 'git-merge'. Fetching from a remote repository is done by, unsurprisingly, -`git fetch`: +'git-fetch': ---------------- $ git fetch <remote-repository> @@ -1059,9 +1066,9 @@ most efficient way to exchange git objects between repositories. Local directory:: `/path/to/repo.git/` + -This transport is the same as SSH transport but uses `sh` to run +This transport is the same as SSH transport but uses 'sh' to run both ends on the local machine instead of running other end on -the remote machine via `ssh`. +the remote machine via 'ssh'. git Native:: `git://remote.machine/path/to/repo.git/` @@ -1088,7 +1095,7 @@ The 'commit walkers' are sometimes also called 'dumb transports', because they do not require any git aware smart server like git Native transport does. Any stock HTTP server that does not even support directory index would suffice. But -you must prepare your repository with `git-update-server-info` +you must prepare your repository with 'git-update-server-info' to help dumb transport downloaders. Once you fetch from the remote repository, you `merge` that @@ -1108,7 +1115,7 @@ argument. [NOTE] You could do without using any branches at all, by keeping as many local repositories as you would like to have -branches, and merging between them with `git pull`, just like +branches, and merging between them with 'git-pull', just like you merge between branches. The advantage of this approach is that it lets you keep a set of files for each `branch` checked out and you may find it easier to switch back and forth if you @@ -1125,7 +1132,7 @@ like this: $ git config remote.linus.url http://www.kernel.org/pub/scm/git/git.git/ ------------------------------------------------ -and use the "linus" keyword with `git pull` instead of the full URL. +and use the "linus" keyword with 'git-pull' instead of the full URL. Examples. @@ -1161,7 +1168,7 @@ $ git show-branch --more=2 master mybranch +* [master^] Some fun. ------------ -Remember, before running `git merge`, our `master` head was at +Remember, before running 'git-merge', our `master` head was at "Some fun." commit, while our `mybranch` head was at "Some work." commit. @@ -1188,10 +1195,10 @@ Now we are ready to experiment with the merge by hand. `git merge` command, when merging two branches, uses 3-way merge algorithm. First, it finds the common ancestor between them. -The command it uses is `git-merge-base`: +The command it uses is 'git-merge-base': ------------ -$ mb=$(git-merge-base HEAD mybranch) +$ mb=$(git merge-base HEAD mybranch) ------------ The command writes the commit object name of the common ancestor @@ -1201,7 +1208,7 @@ ancestor commit is the "New day." commit in this case. You can tell it by: ------------ -$ git-name-rev $mb +$ git name-rev $mb my-first-tag ------------ @@ -1209,10 +1216,10 @@ After finding out a common ancestor commit, the second step is this: ------------ -$ git-read-tree -m -u $mb HEAD mybranch +$ git read-tree -m -u $mb HEAD mybranch ------------ -This is the same `git-read-tree` command we have already seen, +This is the same 'git-read-tree' command we have already seen, but it takes three trees, unlike previous examples. This reads the contents of each tree into different 'stage' in the index file (the first tree goes to stage 1, the second to stage 2, @@ -1228,7 +1235,7 @@ trees are left in non-zero stages. At this point, you can inspect the index file with this command: ------------ -$ git-ls-files --stage +$ git ls-files --stage 100644 7f8b141b65fdcee47321e399a2598a235a032422 0 example 100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello 100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello @@ -1245,7 +1252,7 @@ stages. To look at only non-zero stages, use `\--unmerged` flag: ------------ -$ git-ls-files --unmerged +$ git ls-files --unmerged 100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello 100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello 100644 cc44c73eb783565da5831b4d820c962954019b69 3 hello @@ -1253,29 +1260,29 @@ $ git-ls-files --unmerged The next step of merging is to merge these three versions of the file, using 3-way merge. This is done by giving -`git-merge-one-file` command as one of the arguments to -`git-merge-index` command: +'git-merge-one-file' command as one of the arguments to +'git-merge-index' command: ------------ -$ git-merge-index git-merge-one-file hello +$ git merge-index git-merge-one-file hello Auto-merging hello. merge: warning: conflicts during merge ERROR: Merge conflict in hello. fatal: merge program failed ------------ -`git-merge-one-file` script is called with parameters to +'git-merge-one-file' script is called with parameters to describe those three versions, and is responsible to leave the merge results in the working tree. It is a fairly straightforward shell script, and -eventually calls `merge` program from RCS suite to perform a -file-level 3-way merge. In this case, `merge` detects +eventually calls 'merge' program from RCS suite to perform a +file-level 3-way merge. In this case, 'merge' detects conflicts, and the merge result with conflict marks is left in the working tree.. This can be seen if you run `ls-files --stage` again at this point: ------------ -$ git-ls-files --stage +$ git ls-files --stage 100644 7f8b141b65fdcee47321e399a2598a235a032422 0 example 100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello 100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello @@ -1283,9 +1290,9 @@ $ git-ls-files --stage ------------ This is the state of the index file and the working file after -`git merge` returns control back to you, leaving the conflicting +'git-merge' returns control back to you, leaving the conflicting merge for you to resolve. Notice that the path `hello` is still -unmerged, and what you see with `git diff` at this point is +unmerged, and what you see with 'git-diff' at this point is differences since stage 2 (i.e. your version). @@ -1313,7 +1320,7 @@ how git repositories at `kernel.org` are managed. Publishing the changes from your local (private) repository to your remote (public) repository requires a write privilege on the remote machine. You need to have an SSH account there to -run a single command, `git-receive-pack`. +run a single command, 'git-receive-pack'. First, you need to create an empty repository on the remote machine that will house your public repository. This empty @@ -1322,8 +1329,8 @@ into it later. Obviously, this repository creation needs to be done only once. [NOTE] -`git push` uses a pair of programs, -`git-send-pack` on your local machine, and `git-receive-pack` +'git-push' uses a pair of programs, +'git-send-pack' on your local machine, and 'git-receive-pack' on the remote machine. The communication between the two over the network internally uses an SSH connection. @@ -1338,30 +1345,31 @@ $ mkdir my-git.git ------------ Then, make that directory into a git repository by running -`git init`, but this time, since its name is not the usual +'git-init', but this time, since its name is not the usual `.git`, we do things slightly differently: ------------ -$ GIT_DIR=my-git.git git-init +$ GIT_DIR=my-git.git git init ------------ Make sure this directory is available for others you want your changes to be pulled by via the transport of your choice. Also -you need to make sure that you have the `git-receive-pack` +you need to make sure that you have the 'git-receive-pack' program on the `$PATH`. [NOTE] Many installations of sshd do not invoke your shell as the login shell when you directly run programs; what this means is that if -your login shell is `bash`, only `.bashrc` is read and not +your login shell is 'bash', only `.bashrc` is read and not `.bash_profile`. As a workaround, make sure `.bashrc` sets up -`$PATH` so that you can run `git-receive-pack` program. +`$PATH` so that you can run 'git-receive-pack' program. [NOTE] If you plan to publish this repository to be accessed over http, -you should do `chmod +x my-git.git/hooks/post-update` at this -point. This makes sure that every time you push into this -repository, `git-update-server-info` is run. +you should do `mv my-git.git/hooks/post-update.sample +my-git.git/hooks/post-update` at this point. +This makes sure that every time you push into this +repository, `git update-server-info` is run. Your "public repository" is now ready to accept your changes. Come back to the machine you have your private repository. From @@ -1400,7 +1408,7 @@ $ git repack will do it for you. If you followed the tutorial examples, you would have accumulated about 17 objects in `.git/objects/??/` -directories by now. `git repack` tells you how many objects it +directories by now. 'git-repack' tells you how many objects it packed, and stores the packed file in `.git/objects/pack` directory. @@ -1413,7 +1421,7 @@ them together. The former holds all the data from the objects in the pack, and the latter holds the index for random access. -If you are paranoid, running `git-verify-pack` command would +If you are paranoid, running 'git-verify-pack' command would detect if you have a corrupt pack, but do not worry too much. Our programs are always perfect ;-). @@ -1479,18 +1487,18 @@ A recommended workflow for a "project lead" goes like this: If other people are pulling from your repository over dumb transport protocols (HTTP), you need to keep this repository 'dumb transport friendly'. After `git init`, -`$GIT_DIR/hooks/post-update` copied from the standard templates -would contain a call to `git-update-server-info` but the -`post-update` hook itself is disabled by default -- enable it -with `chmod +x post-update`. This makes sure `git-update-server-info` -keeps the necessary files up-to-date. +`$GIT_DIR/hooks/post-update.sample` copied from the standard templates +would contain a call to 'git-update-server-info' +but you need to manually enable the hook with +`mv post-update.sample post-update`. This makes sure +'git-update-server-info' keeps the necessary files up-to-date. 3. Push into the public repository from your primary repository. -4. `git repack` the public repository. This establishes a big +4. 'git-repack' the public repository. This establishes a big pack that contains the initial set of objects as the - baseline, and possibly `git prune` if the transport + baseline, and possibly 'git-prune' if the transport used for pulling from your repository supports packed repositories. @@ -1504,14 +1512,14 @@ You can repack this private repository whenever you feel like. 6. Push your changes to the public repository, and announce it to the public. -7. Every once in a while, "git repack" the public repository. +7. Every once in a while, "git-repack" the public repository. Go back to step 5. and continue working. A recommended work cycle for a "subsystem maintainer" who works on that project and has an own "public repository" goes like this: -1. Prepare your work repository, by `git clone` the public +1. Prepare your work repository, by 'git-clone' the public repository of the "project lead". The URL used for the initial cloning is stored in the remote.origin.url configuration variable. @@ -1526,7 +1534,7 @@ on that project and has an own "public repository" goes like this: point at the repository you are borrowing from. 4. Push into the public repository from your primary - repository. Run `git repack`, and possibly `git prune` if the + repository. Run 'git-repack', and possibly 'git-prune' if the transport used for pulling from your repository supports packed repositories. @@ -1543,7 +1551,7 @@ like. "project lead" and possibly your "sub-subsystem maintainers" to pull from it. -7. Every once in a while, `git repack` the public repository. +7. Every once in a while, 'git-repack' the public repository. Go back to step 5. and continue working. @@ -1551,7 +1559,7 @@ A recommended work cycle for an "individual developer" who does not have a "public" repository is somewhat different. It goes like this: -1. Prepare your work repository, by `git clone` the public +1. Prepare your work repository, by 'git-clone' the public repository of the "project lead" (or a "subsystem maintainer", if you work on a subsystem). The URL used for the initial cloning is stored in the remote.origin.url @@ -1581,7 +1589,7 @@ suggested in the previous section may be new to you. You do not have to worry. git supports "shared public repository" style of cooperation you are probably more familiar with as well. -See link:cvs-migration.html[git for CVS users] for the details. +See linkgit:gitcvs-migration[7] for the details. Bundling your work together --------------------------- @@ -1648,9 +1656,9 @@ branch before these two merges by resetting it to 'master~2': $ git reset --hard master~2 ------------ -You can make sure 'git show-branch' matches the state before -those two 'git merge' you just did. Then, instead of running -two 'git merge' commands in a row, you would merge these two +You can make sure `git show-branch` matches the state before +those two 'git-merge' you just did. Then, instead of running +two 'git-merge' commands in a row, you would merge these two branch heads (this is known as 'making an Octopus'): ------------ @@ -1679,3 +1687,13 @@ merge two at a time, documenting how you resolved the conflicts, and the reason why you preferred changes made in one side over the other. Otherwise it would make the project history harder to follow, not easier. + +SEE ALSO +-------- +linkgit:gittutorial[7], linkgit:gittutorial-2[7], +linkgit:everyday[7], linkgit:gitcvs-migration[7], +link:user-manual.html[The Git User's Manual] + +GIT +--- +Part of the linkgit:git[1] suite. diff --git a/Documentation/cvs-migration.txt b/Documentation/gitcvs-migration.txt index ea98900228..aaa7ef737a 100644 --- a/Documentation/cvs-migration.txt +++ b/Documentation/gitcvs-migration.txt @@ -1,5 +1,16 @@ -git for CVS users -================= +gitcvs-migration(7) +=================== + +NAME +---- +gitcvs-migration - git for CVS users + +SYNOPSIS +-------- +git cvsimport * + +DESCRIPTION +----------- Git differs from CVS in that every working tree contains a repository with a full copy of the project history, and no repository is inherently more @@ -7,8 +18,9 @@ important than any other. However, you can emulate the CVS model by designating a single shared repository which people can synchronize with; this document explains how to do that. -Some basic familiarity with git is required. This -link:tutorial.html[tutorial introduction to git] should be sufficient. +Some basic familiarity with git is required. Having gone through +linkgit:gittutorial[7] and +linkgit:gitglossary[7] should be sufficient. Developing against a shared repository -------------------------------------- @@ -22,7 +34,7 @@ $ git clone foo.com:/pub/repo.git/ my-project $ cd my-project ------------------------------------------------ -and hack away. The equivalent of `cvs update` is +and hack away. The equivalent of 'cvs update' is ------------------------------------------------ $ git pull origin @@ -34,28 +46,28 @@ them first before running git pull. [NOTE] ================================ -The `pull` command knows where to get updates from because of certain -configuration variables that were set by the first `git clone` +The 'pull' command knows where to get updates from because of certain +configuration variables that were set by the first 'git-clone' command; see `git config -l` and the linkgit:git-config[1] man page for details. ================================ You can update the shared repository with your changes by first committing -your changes, and then using the linkgit:git-push[1] command: +your changes, and then using the 'git-push' command: ------------------------------------------------ $ git push origin master ------------------------------------------------ to "push" those commits to the shared repository. If someone else has -updated the repository more recently, `git push`, like `cvs commit`, will +updated the repository more recently, 'git-push', like 'cvs commit', will complain, in which case you must pull any changes before attempting the push again. -In the `git push` command above we specify the name of the remote branch -to update (`master`). If we leave that out, `git push` tries to update +In the 'git-push' command above we specify the name of the remote branch +to update (`master`). If we leave that out, 'git-push' tries to update any branches in the remote repository that have the same name as a branch -in the local repository. So the last `push` can be done with either of: +in the local repository. So the last 'push' can be done with either of: ------------ $ git push origin @@ -69,8 +81,8 @@ Setting Up a Shared Repository ------------------------------ We assume you have already created a git repository for your project, -possibly created from scratch or from a tarball (see the -link:tutorial.html[tutorial]), or imported from an already existing CVS +possibly created from scratch or from a tarball (see +linkgit:gittutorial[7]), or imported from an already existing CVS repository (see the next section). Assume your existing repo is at /home/alice/myproject. Create a new "bare" @@ -106,7 +118,7 @@ Importing a CVS archive First, install version 2.1 or higher of cvsps from link:http://www.cobite.com/cvsps/[http://www.cobite.com/cvsps/] and make sure it is in your path. Then cd to a checked out CVS working directory -of the project you are interested in and run linkgit:git-cvsimport[1]: +of the project you are interested in and run 'git-cvsimport': ------------------------------------------- $ git cvsimport -C <destination> <module> @@ -131,12 +143,17 @@ work, you must not modify the imported branches; instead, create new branches for your own changes, and merge in the imported branches as necessary. +If you want a shared repository, you will need to make a bare clone +of the imported directory, as described above. Then treat the imported +directory as another development clone for purposes of merging +incremental imports. + Advanced Shared Repository Management ------------------------------------- Git allows you to specify scripts called "hooks" to be run at certain points. You can use these, for example, to send all commits to the shared -repository to a mailing list. See link:hooks.html[Hooks used by git]. +repository to a mailing list. See linkgit:githooks[5]. You can enforce finer grained permissions using update hooks. See link:howto/update-hook-example.txt[Controlling access to branches using @@ -169,3 +186,16 @@ variants of this model. With a small group, developers may just pull changes from each other's repositories without the need for a central maintainer. + +SEE ALSO +-------- +linkgit:gittutorial[7], +linkgit:gittutorial-2[7], +linkgit:gitcore-tutorial[7], +linkgit:gitglossary[7], +link:everyday.html[Everyday Git], +link:user-manual.html[The Git User's Manual] + +GIT +--- +Part of the linkgit:git[1] suite. diff --git a/Documentation/diffcore.txt b/Documentation/gitdiffcore.txt index c6a983a5d5..2bdbc3d4f6 100644 --- a/Documentation/diffcore.txt +++ b/Documentation/gitdiffcore.txt @@ -1,34 +1,40 @@ -Tweaking diff output -==================== -June 2005 +gitdiffcore(7) +============== +NAME +---- +gitdiffcore - Tweaking diff output (June 2005) -Introduction ------------- +SYNOPSIS +-------- +'git diff' * -The diff commands git-diff-index, git-diff-files, and git-diff-tree +DESCRIPTION +----------- + +The diff commands 'git-diff-index', 'git-diff-files', and 'git-diff-tree' can be told to manipulate differences they find in -unconventional ways before showing diff(1) output. The manipulation +unconventional ways before showing 'diff' output. The manipulation is collectively called "diffcore transformation". This short note -describes what they are and how to use them to produce diff outputs -that are easier to understand than the conventional kind. +describes what they are and how to use them to produce 'diff' output +that is easier to understand than the conventional kind. The chain of operation ---------------------- -The git-diff-* family works by first comparing two sets of +The 'git-diff-{asterisk}' family works by first comparing two sets of files: - - git-diff-index compares contents of a "tree" object and the + - 'git-diff-index' compares contents of a "tree" object and the working directory (when '\--cached' flag is not used) or a "tree" object and the index file (when '\--cached' flag is used); - - git-diff-files compares contents of the index file and the + - 'git-diff-files' compares contents of the index file and the working directory; - - git-diff-tree compares contents of two "tree" objects; + - 'git-diff-tree' compares contents of two "tree" objects; In all of these cases, the commands themselves compare corresponding paths in the two sets of files. The result of @@ -55,12 +61,12 @@ into another list. There are currently 6 such transformations: - diffcore-pickaxe - diffcore-order -These are applied in sequence. The set of filepairs git-diff-\* +These are applied in sequence. The set of filepairs 'git-diff-{asterisk}' commands find are used as the input to diffcore-pathspec, and the output from diffcore-pathspec is used as the input to the next transformation. The final result is then passed to the output routine and generates either diff-raw format (see Output -format sections of the manual for git-diff-\* commands) or +format sections of the manual for 'git-diff-{asterisk}' commands) or diff-patch format. @@ -69,7 +75,7 @@ diffcore-pathspec: For Ignoring Files Outside Our Consideration The first transformation in the chain is diffcore-pathspec, and is controlled by giving the pathname parameters to the -git-diff-* commands on the command line. The pathspec is used +'git-diff-{asterisk}' commands on the command line. The pathspec is used to limit the world diff operates in. It removes the filepairs outside the specified set of pathnames. E.g. If the input set of filepairs included: @@ -78,11 +84,11 @@ of filepairs included: :100644 100644 bcd1234... 0123456... M junkfile ------------------------------------------------ -but the command invocation was "git-diff-files myfile", then the +but the command invocation was `git diff-files myfile`, then the junkfile entry would be removed from the list because only "myfile" is under consideration. -Implementation note. For performance reasons, git-diff-tree +Implementation note. For performance reasons, 'git-diff-tree' uses the pathname parameters on the command line to cull set of filepairs it feeds the diffcore mechanism itself, and does not use diffcore-pathspec, but the end result is the same. @@ -92,7 +98,7 @@ diffcore-break: For Splitting Up "Complete Rewrites" ---------------------------------------------------- The second transformation in the chain is diffcore-break, and is -controlled by the -B option to the git-diff-* commands. This is +controlled by the -B option to the 'git-diff-{asterisk}' commands. This is used to detect a filepair that represents "complete rewrite" and break such filepair into two filepairs that represent delete and create. E.g. If the input contained this filepair: @@ -128,7 +134,7 @@ diffcore-rename: For Detection Renames and Copies This transformation is used to detect renames and copies, and is controlled by the -M option (to detect renames) and the -C option -(to detect copies as well) to the git-diff-* commands. If the +(to detect copies as well) to the 'git-diff-{asterisk}' commands. If the input contained these filepairs: ------------------------------------------------ @@ -173,11 +179,11 @@ number after the "-M" or "-C" option (e.g. "-M8" to tell it to use 8/10 = 80%). Note. When the "-C" option is used with `\--find-copies-harder` -option, git-diff-\* commands feed unmodified filepairs to +option, 'git-diff-{asterisk}' commands feed unmodified filepairs to diffcore mechanism as well as modified ones. This lets the copy detector consider unmodified files as copy source candidates at the expense of making it slower. Without `\--find-copies-harder`, -git-diff-\* commands can detect copies only if the file that was +'git-diff-{asterisk}' commands can detect copies only if the file that was copied happened to have been modified in the same changeset. @@ -228,7 +234,7 @@ diffcore-pickaxe: For Detecting Addition/Deletion of Specified String This transformation is used to find filepairs that represent changes that touch a specified string, and is controlled by the --S option and the `\--pickaxe-all` option to the git-diff-* +-S option and the `\--pickaxe-all` option to the 'git-diff-{asterisk}' commands. When diffcore-pickaxe is in use, it checks if there are @@ -251,7 +257,7 @@ diffcore-order: For Sorting the Output Based on Filenames This is used to reorder the filepairs according to the user's (or project's) taste, and is controlled by the -O option to the -git-diff-* commands. +'git-diff-{asterisk}' commands. This takes a text file each of whose lines is a shell glob pattern. Filepairs that match a glob pattern on an earlier line @@ -269,3 +275,18 @@ Documentation *.c t ------------------------------------------------ + +SEE ALSO +-------- +linkgit:git-diff[1], +linkgit:git-diff-files[1], +linkgit:git-diff-index[1], +linkgit:git-diff-tree[1], +linkgit:git-format-patch[1], +linkgit:git-log[1], +linkgit:gitglossary[7], +link:user-manual.html[The Git User's Manual] + +GIT +--- +Part of the linkgit:git[1] suite. diff --git a/Documentation/gitglossary.txt b/Documentation/gitglossary.txt new file mode 100644 index 0000000000..565719ed5f --- /dev/null +++ b/Documentation/gitglossary.txt @@ -0,0 +1,25 @@ +gitglossary(7) +============== + +NAME +---- +gitglossary - A GIT Glossary + +SYNOPSIS +-------- +* + +DESCRIPTION +----------- + +include::glossary-content.txt[] + +SEE ALSO +-------- +linkgit:gittutorial[7], linkgit:gittutorial-2[7], +linkgit:everyday[7], linkgit:gitcvs-migration[7], +link:user-manual.html[The Git User's Manual] + +GIT +--- +Part of the linkgit:git[1] suite. diff --git a/Documentation/hooks.txt b/Documentation/githooks.txt index f110162b01..046a2a7fe7 100644 --- a/Documentation/hooks.txt +++ b/Documentation/githooks.txt @@ -1,21 +1,34 @@ -Hooks used by git -================= +githooks(5) +=========== + +NAME +---- +githooks - Hooks used by git + +SYNOPSIS +-------- +$GIT_DIR/hooks/* + + +DESCRIPTION +----------- Hooks are little scripts you can place in `$GIT_DIR/hooks` directory to trigger action at certain points. When -`git-init` is run, a handful example hooks are copied in the +'git-init' is run, a handful example hooks are copied in the `hooks` directory of the new repository, but by default they are -all disabled. To enable a hook, make it executable with `chmod +x`. +all disabled. To enable a hook, rename it by removing its `.sample` +suffix. This document describes the currently defined hooks. applypatch-msg -------------- -This hook is invoked by `git-am` script. It takes a single +This hook is invoked by 'git-am' script. It takes a single parameter, the name of the file that holds the proposed commit log message. Exiting with non-zero status causes -`git-am` to abort before applying the patch. +'git-am' to abort before applying the patch. The hook is allowed to edit the message file in place, and can be used to normalize the message into some project standard @@ -28,10 +41,11 @@ The default 'applypatch-msg' hook, when enabled, runs the pre-applypatch -------------- -This hook is invoked by `git-am`. It takes no parameter, -and is invoked after the patch is applied, but before a commit -is made. Exiting with non-zero status causes the working tree -after application of the patch not committed. +This hook is invoked by 'git-am'. It takes no parameter, and is +invoked after the patch is applied, but before a commit is made. + +If it exits with non-zero status, then the working tree will not be +committed after applying the patch. It can be used to inspect the current working tree and refuse to make a commit if it does not pass certain test. @@ -42,32 +56,61 @@ The default 'pre-applypatch' hook, when enabled, runs the post-applypatch --------------- -This hook is invoked by `git-am`. It takes no parameter, +This hook is invoked by 'git-am'. It takes no parameter, and is invoked after the patch is applied and a commit is made. This hook is meant primarily for notification, and cannot affect -the outcome of `git-am`. +the outcome of 'git-am'. pre-commit ---------- -This hook is invoked by `git-commit`, and can be bypassed +This hook is invoked by 'git-commit', and can be bypassed with `\--no-verify` option. It takes no parameter, and is invoked before obtaining the proposed commit log message and making a commit. Exiting with non-zero status from this script -causes the `git-commit` to abort. +causes the 'git-commit' to abort. The default 'pre-commit' hook, when enabled, catches introduction of lines with trailing whitespaces and aborts the commit when such a line is found. +All the 'git-commit' hooks are invoked with the environment +variable `GIT_EDITOR=:` if the command will not bring up an editor +to modify the commit message. + +prepare-commit-msg +------------------ + +This hook is invoked by 'git-commit' right after preparing the +default log message, and before the editor is started. + +It takes one to three parameters. The first is the name of the file +that the commit log message. The second is the source of the commit +message, and can be: `message` (if a `\-m` or `\-F` option was +given); `template` (if a `\-t` option was given or the +configuration option `commit.template` is set); `merge` (if the +commit is a merge or a `.git/MERGE_MSG` file exists); `squash` +(if a `.git/SQUASH_MSG` file exists); or `commit`, followed by +a commit SHA1 (if a `\-c`, `\-C` or `\--amend` option was given). + +If the exit status is non-zero, 'git-commit' will abort. + +The purpose of the hook is to edit the message file in place, and +it is not suppressed by the `\--no-verify` option. A non-zero exit +means a failure of the hook and aborts the commit. It should not +be used as replacement for pre-commit hook. + +The sample `prepare-commit-msg` hook that comes with git comments +out the `Conflicts:` part of a merge's commit message. + commit-msg ---------- -This hook is invoked by `git-commit`, and can be bypassed +This hook is invoked by 'git-commit', and can be bypassed with `\--no-verify` option. It takes a single parameter, the name of the file that holds the proposed commit log message. -Exiting with non-zero status causes the `git-commit` to +Exiting with non-zero status causes the 'git-commit' to abort. The hook is allowed to edit the message file in place, and can @@ -81,21 +124,21 @@ The default 'commit-msg' hook, when enabled, detects duplicate post-commit ----------- -This hook is invoked by `git-commit`. It takes no +This hook is invoked by 'git-commit'. It takes no parameter, and is invoked after a commit is made. This hook is meant primarily for notification, and cannot affect -the outcome of `git-commit`. +the outcome of 'git-commit'. post-checkout ----------- -This hook is invoked when a `git-checkout` is run after having updated the +This hook is invoked when a 'git-checkout' is run after having updated the worktree. The hook is given three parameters: the ref of the previous HEAD, the ref of the new HEAD (which may or may not have changed), and a flag indicating whether the checkout was a branch checkout (changing branches, flag=1) or a file checkout (retrieving a file from the index, flag=0). -This hook cannot affect the outcome of `git-checkout`. +This hook cannot affect the outcome of 'git-checkout'. This hook can be used to perform repository validity checks, auto-display differences from the previous HEAD if different, or set working dir metadata @@ -104,10 +147,11 @@ properties. post-merge ----------- -This hook is invoked by `git-merge`, which happens when a `git pull` +This hook is invoked by 'git-merge', which happens when a 'git-pull' is done on a local repository. The hook takes a single parameter, a status flag specifying whether or not the merge being done was a squash merge. -This hook cannot affect the outcome of `git-merge`. +This hook cannot affect the outcome of 'git-merge' and is not executed, +if the merge failed due to conflicts. This hook can be used in conjunction with a corresponding pre-commit hook to save and restore any form of metadata associated with the working tree @@ -118,8 +162,8 @@ for an example of how to do this. pre-receive ----------- -This hook is invoked by `git-receive-pack` on the remote repository, -which happens when a `git push` is done on a local repository. +This hook is invoked by 'git-receive-pack' on the remote repository, +which happens when a 'git-push' is done on a local repository. Just before starting to update refs on the remote repository, the pre-receive hook is invoked. Its exit status determines the success or failure of the update. @@ -140,15 +184,15 @@ updated. If the hook exits with zero, updating of individual refs can still be prevented by the <<update,'update'>> hook. Both standard output and standard error output are forwarded to -`git-send-pack` on the other end, so you can simply `echo` messages +'git-send-pack' on the other end, so you can simply `echo` messages for the user. [[update]] update ------ -This hook is invoked by `git-receive-pack` on the remote repository, -which happens when a `git push` is done on a local repository. +This hook is invoked by 'git-receive-pack' on the remote repository, +which happens when a 'git-push' is done on a local repository. Just before updating the ref on the remote repository, the update hook is invoked. Its exit status determines the success or failure of the ref update. @@ -161,7 +205,7 @@ three parameters: - and the new objectname to be stored in the ref. A zero exit from the update hook allows the ref to be updated. -Exiting with a non-zero status prevents `git-receive-pack` +Exiting with a non-zero status prevents 'git-receive-pack' from updating that ref. This hook can be used to prevent 'forced' update on certain refs by @@ -179,7 +223,7 @@ implement access control which is finer grained than the one based on filesystem group. Both standard output and standard error output are forwarded to -`git-send-pack` on the other end, so you can simply `echo` messages +'git-send-pack' on the other end, so you can simply `echo` messages for the user. The default 'update' hook, when enabled--and with @@ -190,8 +234,8 @@ unannotated tags to be pushed. post-receive ------------ -This hook is invoked by `git-receive-pack` on the remote repository, -which happens when a `git push` is done on a local repository. +This hook is invoked by 'git-receive-pack' on the remote repository, +which happens when a 'git-push' is done on a local repository. It executes on the remote repository once after all the refs have been updated. @@ -200,7 +244,7 @@ arguments, but gets the same information as the <<pre-receive,'pre-receive'>> hook does on its standard input. -This hook does not affect the outcome of `git-receive-pack`, as it +This hook does not affect the outcome of 'git-receive-pack', as it is called after the real work is done. This supersedes the <<post-update,'post-update'>> hook in that it gets @@ -208,7 +252,7 @@ both old and new values of all the refs in addition to their names. Both standard output and standard error output are forwarded to -`git-send-pack` on the other end, so you can simply `echo` messages +'git-send-pack' on the other end, so you can simply `echo` messages for the user. The default 'post-receive' hook is empty, but there is @@ -220,8 +264,8 @@ emails. post-update ----------- -This hook is invoked by `git-receive-pack` on the remote repository, -which happens when a `git push` is done on a local repository. +This hook is invoked by 'git-receive-pack' on the remote repository, +which happens when a 'git-push' is done on a local repository. It executes on the remote repository once after all the refs have been updated. @@ -229,7 +273,7 @@ It takes a variable number of parameters, each of which is the name of ref that was actually updated. This hook is meant primarily for notification, and cannot affect -the outcome of `git-receive-pack`. +the outcome of 'git-receive-pack'. The 'post-update' hook can tell what are the heads that were pushed, but it does not know what their original and updated values are, @@ -239,11 +283,22 @@ updated values of the refs. You might consider it instead if you need them. When enabled, the default 'post-update' hook runs -`git-update-server-info` to keep the information used by dumb +'git-update-server-info' to keep the information used by dumb transports (e.g., HTTP) up-to-date. If you are publishing a git repository that is accessible via HTTP, you should probably enable this hook. Both standard output and standard error output are forwarded to -`git-send-pack` on the other end, so you can simply `echo` messages +'git-send-pack' on the other end, so you can simply `echo` messages for the user. + +pre-auto-gc +----------- + +This hook is invoked by 'git-gc --auto'. It takes no parameter, and +exiting with non-zero status from this script causes the 'git-gc --auto' +to abort. + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/Documentation/gitignore.txt b/Documentation/gitignore.txt index 08373f52bb..59321a2e82 100644 --- a/Documentation/gitignore.txt +++ b/Documentation/gitignore.txt @@ -13,9 +13,14 @@ DESCRIPTION ----------- A `gitignore` file specifies intentionally untracked files that -git should ignore. Each line in a `gitignore` file specifies a -pattern. - +git should ignore. +Note that all the `gitignore` files really concern only files +that are not already tracked by git; +in order to ignore uncommitted changes in already tracked files, +please refer to the 'git update-index --assume-unchanged' +documentation. + +Each line in a `gitignore` file specifies a pattern. When deciding whether to ignore a path, git normally checks `gitignore` patterns from multiple sources, with the following order of precedence, from highest to lowest (within one level of @@ -38,11 +43,23 @@ precedence, the last matching pattern decides the outcome): * Patterns read from the file specified by the configuration variable 'core.excludesfile'. +Which file to place a pattern in depends on how the pattern is meant to +be used. Patterns which should be version-controlled and distributed to +other repositories via clone (i.e., files that all developers will want +to ignore) should go into a `.gitignore` file. Patterns which are +specific to a particular repository but which do not need to be shared +with other related repositories (e.g., auxiliary files that live inside +the repository but are specific to one user's workflow) should go into +the `$GIT_DIR/info/exclude` file. Patterns which a user wants git to +ignore in all situations (e.g., backup or temporary files generated by +the user's editor of choice) generally go into a file specified by +`core.excludesfile` in the user's `~/.gitconfig`. + The underlying git plumbing tools, such as -linkgit:git-ls-files[1] and linkgit:git-read-tree[1], read +'git-ls-files' and 'git-read-tree', read `gitignore` patterns specified by command-line options, or from files specified by command-line options. Higher-level git -tools, such as linkgit:git-status[1] and linkgit:git-add[1], +tools, such as 'git-status' and 'git-add', use patterns from the sources specified above. Patterns have the following format: @@ -57,6 +74,13 @@ Patterns have the following format: included again. If a negated pattern matches, this will override lower precedence patterns sources. + - If the pattern ends with a slash, it is removed for the + purpose of the following description, but it would only find + a match with a directory. In other words, `foo/` will match a + directory `foo` and paths underneath it, but will not match a + regular file or a symbolic link `foo` (this is consistent + with the way how pathspec works in general in git). + - If the pattern does not contain a slash '/', git treats it as a shell glob pattern and checks for a match against the pathname without leading directories. @@ -73,7 +97,7 @@ Patterns have the following format: An example: -------------------------------------------------------------- - $ git-status + $ git status [...] # Untracked files: [...] @@ -91,7 +115,7 @@ An example: *.html # except foo.html which is maintained by hand !foo.html - $ git-status + $ git status [...] # Untracked files: [...] @@ -119,4 +143,4 @@ Frank Lichtenheld, and the git-list <git@vger.kernel.org>. GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/gitk.txt b/Documentation/gitk.txt index 29edafceda..6e827cd11c 100644 --- a/Documentation/gitk.txt +++ b/Documentation/gitk.txt @@ -22,10 +22,12 @@ git repository. OPTIONS ------- To control which revisions to shown, the command takes options applicable to -the linkgit:git-rev-list[1] command. This manual page describes only the most +the 'git-rev-list' command (see linkgit:git-rev-list[1]). +This manual page describes only the most frequently used options. --n <number>, --max-count=<number>:: +-n <number>:: +--max-count=<number>:: Limits the number of commits to show. @@ -41,6 +43,12 @@ frequently used options. Show all branches. +--merge:: + + After an attempt to merge stops with conflicts, show the commits on + the history between two branches (i.e. the HEAD and the MERGE_HEAD) + that modify the conflicted files. + <revs>:: Limit the revisions to show. This can be either a single revision @@ -50,7 +58,7 @@ frequently used options. For a more complete list of ways to spell object names, see "SPECIFYING REVISIONS" section in linkgit:git-rev-parse[1]. -<path>:: +<path>...:: Limit commits to the ones touching files in the given paths. Note, to avoid ambiguity wrt. revision names use "--" to separate the paths @@ -74,7 +82,12 @@ gitk --max-count=100 --all \-- Makefile:: Show at most 100 changes made to the file 'Makefile'. Instead of only looking for changes in the current branch look in all branches. -See Also +Files +----- +Gitk creates the .gitk file in your $HOME directory to store preferences +such as display options, font, and colors. + +SEE ALSO -------- 'qgit(1)':: A repository browser written in C++ using Qt. @@ -98,4 +111,4 @@ Documentation by Junio C Hamano, Jonas Fonseca, and the git-list GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/gitmodules.txt b/Documentation/gitmodules.txt index cc95b69f27..f8d122a8b9 100644 --- a/Documentation/gitmodules.txt +++ b/Documentation/gitmodules.txt @@ -59,4 +59,4 @@ Documentation by Lars Hjemli <hjemli@gmail.com> GIT --- -Part of the linkgit:git[7] suite +Part of the linkgit:git[1] suite diff --git a/Documentation/repository-layout.txt b/Documentation/gitrepository-layout.txt index 6939130094..a969b3fbc3 100644 --- a/Documentation/repository-layout.txt +++ b/Documentation/gitrepository-layout.txt @@ -1,9 +1,23 @@ -git repository layout -===================== +gitrepository-layout(5) +======================= + +NAME +---- +gitrepository-layout - Git Repository Layout + +SYNOPSIS +-------- +$GIT_DIR/* + +DESCRIPTION +----------- You may find these things in your git repository (`.git` directory for a repository associated with your working tree, or -`'project'.git` directory for a public 'bare' repository). +`<project>.git` directory for a public 'bare' repository. It is +also possible to have a working tree where `.git` is a plain +ascii file containing `gitdir: <path>`, i.e. the path to the +real git repository). objects:: Object store associated with this repository. Usually @@ -50,7 +64,7 @@ objects/info/packs:: are available in this object store. Whenever a pack is added or removed, `git update-server-info` should be run to keep this file up-to-date if the repository is - published for dumb transports. `git repack` does this + published for dumb transports. 'git-repack' does this by default. objects/info/alternates:: @@ -71,7 +85,7 @@ objects/info/http-alternates:: refs:: References are stored in subdirectories of this - directory. The `git prune` command knows to keep + directory. The 'git-prune' command knows to keep objects reachable from refs found in this directory and its subdirectories. @@ -111,17 +125,17 @@ details. branches:: A slightly deprecated way to store shorthands to be used - to specify URL to `git fetch`, `git pull` and `git push` - commands is to store a file in `branches/'name'` and + to specify URL to 'git-fetch', 'git-pull' and 'git-push' + commands is to store a file in `branches/<name>` and give 'name' to these commands in place of 'repository' argument. hooks:: Hooks are customization scripts used by various git commands. A handful of sample hooks are installed when - `git init` is run, but all of them are disabled by + 'git-init' is run, but all of them are disabled by default. To enable, they need to be made executable. - Read link:hooks.html[hooks] for more details about + Read linkgit:githooks[5] for more details about each hook. index:: @@ -136,10 +150,10 @@ info/refs:: This file helps dumb transports discover what refs are available in this repository. If the repository is published for dumb transports, this file should be - regenerated by `git update-server-info` every time a tag + regenerated by 'git-update-server-info' every time a tag or branch is created or modified. This is normally done from the `hooks/update` hook, which is run by the - `git-receive-pack` command when you `git push` into the + 'git-receive-pack' command when you 'git-push' into the repository. info/grafts:: @@ -153,18 +167,18 @@ info/grafts:: info/exclude:: This file, by convention among Porcelains, stores the exclude pattern list. `.gitignore` is the per-directory - ignore file. `git status`, `git add`, `git rm` and `git - clean` look at it but the core git commands do not look + ignore file. 'git-status', 'git-add', 'git-rm' and + 'git-clean' look at it but the core git commands do not look at it. See also: linkgit:gitignore[5]. remotes:: Stores shorthands to be used to give URL and default - refnames to interact with remote repository to `git - fetch`, `git pull` and `git push` commands. + refnames to interact with remote repository to + 'git-fetch', 'git-pull' and 'git-push' commands. logs:: Records of changes made to refs are stored in this - directory. See the documentation on git-update-ref + directory. See linkgit:git-update-ref[1] for more information. logs/refs/heads/`name`:: @@ -177,3 +191,18 @@ shallow:: This is similar to `info/grafts` but is internally used and maintained by shallow clone mechanism. See `--depth` option to linkgit:git-clone[1] and linkgit:git-fetch[1]. + +SEE ALSO +-------- +linkgit:git-init[1], +linkgit:git-clone[1], +linkgit:git-fetch[1], +linkgit:git-pack-refs[1], +linkgit:git-gc[1], +linkgit:git-checkout[1], +linkgit:gitglossary[7], +link:user-manual.html[The Git User's Manual] + +GIT +--- +Part of the linkgit:git[1] suite. diff --git a/Documentation/tutorial-2.txt b/Documentation/gittutorial-2.txt index 7fac47de8b..660904686c 100644 --- a/Documentation/tutorial-2.txt +++ b/Documentation/gittutorial-2.txt @@ -1,8 +1,18 @@ -A tutorial introduction to git: part two -======================================== +gittutorial-2(7) +================ -You should work through link:tutorial.html[A tutorial introduction to -git] before reading this tutorial. +NAME +---- +gittutorial-2 - A tutorial introduction to git: part two + +SYNOPSIS +-------- +git * + +DESCRIPTION +----------- + +You should work through linkgit:gittutorial[7] before reading this tutorial. The goal of this tutorial is to introduce two fundamental pieces of git's architecture--the object database and the index file--and to @@ -44,15 +54,15 @@ following the example above generates a different SHA1 hash than the one shown above because the commit object records the time when it was created and the name of the person performing the commit. -We can ask git about this particular object with the cat-file +We can ask git about this particular object with the `cat-file` command. Don't copy the 40 hex digits from this example but use those from your own version. Note that you can shorten it to only a few characters to save yourself typing all 40 hex digits: ------------------------------------------------ -$ git-cat-file -t 54196cc2 +$ git cat-file -t 54196cc2 commit -$ git-cat-file commit 54196cc2 +$ git cat-file commit 54196cc2 tree 92b8b694ffb1675e5975148e1121810081dbdffe author J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500 committer J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500 @@ -155,7 +165,7 @@ hello world! and the "parent" object refers to the previous commit: ------------------------------------------------ -$ git-cat-file commit 54196cc2 +$ git cat-file commit 54196cc2 tree 92b8b694ffb1675e5975148e1121810081dbdffe author J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500 committer J. Bruce Fields <bfields@puzzle.fieldses.org> 1143414668 -0500 @@ -202,8 +212,8 @@ designate such an argument. The index file -------------- -The primary tool we've been using to create commits is "git commit --a", which creates a commit including every change you've made to +The primary tool we've been using to create commits is `git-commit +-a`, which creates a commit including every change you've made to your working tree. But what if you want to commit changes only to certain files? Or only certain changes to certain files? @@ -235,7 +245,7 @@ The last diff is empty, but no new commits have been made, and the head still doesn't contain the new line: ------------------------------------------------ -$ git-diff HEAD +$ git diff HEAD diff --git a/file.txt b/file.txt index a042389..513feba 100644 --- a/file.txt @@ -245,7 +255,7 @@ index a042389..513feba 100644 +hello world, again ------------------------------------------------ -So "git diff" is comparing against something other than the head. +So 'git-diff' is comparing against something other than the head. The thing that it's comparing against is actually the index file, which is stored in .git/index in a binary format, but whose contents we can examine with ls-files: @@ -260,9 +270,9 @@ hello world! hello world, again ------------------------------------------------ -So what our "git add" did was store a new blob and then put +So what our 'git-add' did was store a new blob and then put a reference to it in the index file. If we modify the file again, -we'll see that the new modifications are reflected in the "git-diff" +we'll see that the new modifications are reflected in the 'git-diff' output: ------------------------------------------------ @@ -277,7 +287,7 @@ index 513feba..ba3da7b 100644 +again? ------------------------------------------------ -With the right arguments, git diff can also show us the difference +With the right arguments, 'git-diff' can also show us the difference between the working directory and the last commit, or between the index and the last commit: @@ -301,8 +311,8 @@ index a042389..513feba 100644 +hello world, again ------------------------------------------------ -At any time, we can create a new commit using "git commit" (without -the -a option), and verify that the state committed only includes the +At any time, we can create a new commit using 'git-commit' (without +the "-a" option), and verify that the state committed only includes the changes stored in the index file, not the additional change that is still only in our working tree: @@ -319,11 +329,11 @@ index 513feba..ba3da7b 100644 +again? ------------------------------------------------ -So by default "git commit" uses the index to create the commit, not -the working tree; the -a option to commit tells it to first update +So by default 'git-commit' uses the index to create the commit, not +the working tree; the "-a" option to commit tells it to first update the index with all changes in the working tree. -Finally, it's worth looking at the effect of "git add" on the index +Finally, it's worth looking at the effect of 'git-add' on the index file: ------------------------------------------------ @@ -331,7 +341,7 @@ $ echo "goodbye, world" >closing.txt $ git add closing.txt ------------------------------------------------ -The effect of the "git add" was to add one entry to the index file: +The effect of the 'git-add' was to add one entry to the index file: ------------------------------------------------ $ git ls-files --stage @@ -372,14 +382,14 @@ it is marked "changed but not updated". At this point, running "git commit" would create a commit that added closing.txt (with its new contents), but that didn't modify file.txt. -Also, note that a bare "git diff" shows the changes to file.txt, but +Also, note that a bare `git diff` shows the changes to file.txt, but not the addition of closing.txt, because the version of closing.txt in the index file is identical to the one in the working directory. In addition to being the staging area for new commits, the index file is also populated from the object database when checking out a branch, and is used to hold the trees involved in a merge operation. -See the link:core-tutorial.html[core tutorial] and the relevant man +See linkgit:gitcore-tutorial[7] and the relevant man pages for details. What next? @@ -388,19 +398,31 @@ What next? At this point you should know everything necessary to read the man pages for any of the git commands; one good place to start would be with the commands mentioned in link:everyday.html[Everyday git]. You -should be able to find any unknown jargon in the -link:glossary.html[Glossary]. +should be able to find any unknown jargon in linkgit:gitglossary[7]. The link:user-manual.html[Git User's Manual] provides a more comprehensive introduction to git. -The link:cvs-migration.html[CVS migration] document explains how to +linkgit:gitcvs-migration[7] explains how to import a CVS repository into git, and shows how to use git in a CVS-like way. For some interesting examples of git use, see the link:howto-index.html[howtos]. -For git developers, the link:core-tutorial.html[Core tutorial] goes +For git developers, linkgit:gitcore-tutorial[7] goes into detail on the lower-level git mechanisms involved in, for example, creating a new commit. + +SEE ALSO +-------- +linkgit:gittutorial[7], +linkgit:gitcvs-migration[7], +linkgit:gitcore-tutorial[7], +linkgit:gitglossary[7], +link:everyday.html[Everyday git], +link:user-manual.html[The Git User's Manual] + +GIT +--- +Part of the linkgit:git[1] suite. diff --git a/Documentation/tutorial.txt b/Documentation/gittutorial.txt index e2bbda53f0..48d1454a90 100644 --- a/Documentation/tutorial.txt +++ b/Documentation/gittutorial.txt @@ -1,5 +1,16 @@ -A tutorial introduction to git (for version 1.5.1 or newer) -=========================================================== +gittutorial(7) +============== + +NAME +---- +gittutorial - A tutorial introduction to git (for version 1.5.1 or newer) + +SYNOPSIS +-------- +git * + +DESCRIPTION +----------- This tutorial explains how to import a new project into git, make changes to it, and share changes with other developers. @@ -8,11 +19,11 @@ If you are instead primarily interested in using git to fetch a project, for example, to test the latest version, you may prefer to start with the first two chapters of link:user-manual.html[The Git User's Manual]. -First, note that you can get documentation for a command such as "git -diff" with: +First, note that you can get documentation for a command such as +`git log --graph` with: ------------------------------------------------ -$ man git-diff +$ man git-log ------------------------------------------------ It is a good idea to introduce yourself to git with your name and @@ -47,7 +58,7 @@ You've now initialized the working directory--you may notice a new directory created, named ".git". Next, tell git to take a snapshot of the contents of all files under the -current directory (note the '.'), with linkgit:git-add[1]: +current directory (note the '.'), with 'git-add': ------------------------------------------------ $ git add . @@ -55,7 +66,7 @@ $ git add . This snapshot is now stored in a temporary staging area which git calls the "index". You can permanently store the contents of the index in the -repository with linkgit:git-commit[1]: +repository with 'git-commit': ------------------------------------------------ $ git commit @@ -74,15 +85,15 @@ $ git add file1 file2 file3 ------------------------------------------------ You are now ready to commit. You can see what is about to be committed -using linkgit:git-diff[1] with the --cached option: +using 'git-diff' with the --cached option: ------------------------------------------------ $ git diff --cached ------------------------------------------------ -(Without --cached, linkgit:git-diff[1] will show you any changes that +(Without --cached, 'git-diff' will show you any changes that you've made but not yet added to the index.) You can also get a brief -summary of the situation with linkgit:git-status[1]: +summary of the situation with 'git-status': ------------------------------------------------ $ git status @@ -103,10 +114,10 @@ newly modified content to the index. Finally, commit your changes with: $ git commit ------------------------------------------------ -This will again prompt your for a message describing the change, and then +This will again prompt you for a message describing the change, and then record a new version of the project. -Alternatively, instead of running `git add` beforehand, you can use +Alternatively, instead of running 'git-add' beforehand, you can use ------------------------------------------------ $ git commit -a @@ -125,9 +136,9 @@ commit in the body. Git tracks content not files ---------------------------- -Many revision control systems provide an "add" command that tells the -system to start tracking changes to a new file. Git's "add" command -does something simpler and more powerful: `git add` is used both for new +Many revision control systems provide an `add` command that tells the +system to start tracking changes to a new file. Git's `add` command +does something simpler and more powerful: 'git-add' is used both for new and newly modified files, and in both cases it takes a snapshot of the given files and stages that content in the index, ready for inclusion in the next commit. @@ -263,7 +274,7 @@ same machine, wants to contribute. Bob begins with: ------------------------------------------------ -$ git clone /home/alice/project myrepo +bob$ git clone /home/alice/project myrepo ------------------------------------------------ This creates a new directory "myrepo" containing a clone of Alice's @@ -274,7 +285,7 @@ Bob then makes some changes and commits them: ------------------------------------------------ (edit files) -$ git commit -a +bob$ git commit -a (repeat as necessary) ------------------------------------------------ @@ -282,8 +293,8 @@ When he's ready, he tells Alice to pull changes from the repository at /home/bob/myrepo. She does this with: ------------------------------------------------ -$ cd /home/alice/project -$ git pull /home/bob/myrepo master +alice$ cd /home/alice/project +alice$ git pull /home/bob/myrepo master ------------------------------------------------ This merges the changes from Bob's "master" branch into Alice's @@ -295,30 +306,56 @@ is the default.) The "pull" command thus performs two operations: it fetches changes from a remote branch, then merges them into the current branch. +Note that in general, Alice would want her local changes committed before +initiating this "pull". If Bob's work conflicts with what Alice did since +their histories forked, Alice will use her working tree and the index to +resolve conflicts, and existing local changes will interfere with the +conflict resolution process (git will still perform the fetch but will +refuse to merge --- Alice will have to get rid of her local changes in +some way and pull again when this happens). + +Alice can peek at what Bob did without merging first, using the "fetch" +command; this allows Alice to inspect what Bob did, using a special +symbol "FETCH_HEAD", in order to determine if he has anything worth +pulling, like this: + +------------------------------------------------ +alice$ git fetch /home/bob/myrepo master +alice$ git log -p ..FETCH_HEAD +------------------------------------------------ + +This operation is safe even if Alice has uncommitted local changes. + +After inspecting what Bob did, if there is nothing urgent, Alice may +decide to continue working without pulling from Bob. If Bob's history +does have something Alice would immediately need, Alice may choose to +stash her work-in-progress first, do a "pull", and then finally unstash +her work-in-progress on top of the resulting history. + When you are working in a small closely knit group, it is not unusual to interact with the same repository over and over again. By defining 'remote' repository shorthand, you can make it easier: ------------------------------------------------ -$ git remote add bob /home/bob/myrepo +alice$ git remote add bob /home/bob/myrepo ------------------------------------------------ -With this, Alice can perform the first operation alone using the -"git fetch" command without merging them with her own branch, +With this, Alice can perform the first part of the "pull" operation alone using the +'git-fetch' command without merging them with her own branch, using: ------------------------------------- -$ git fetch bob +alice$ git fetch bob ------------------------------------- Unlike the longhand form, when Alice fetches from Bob using a -remote repository shorthand set up with `git remote`, what was +remote repository shorthand set up with 'git-remote', what was fetched is stored in a remote tracking branch, in this case `bob/master`. So after this: ------------------------------------- -$ git log -p master..bob/master +alice$ git log -p master..bob/master ------------------------------------- shows a list of all the changes that Bob made since he branched from @@ -328,14 +365,14 @@ After examining those changes, Alice could merge the changes into her master branch: ------------------------------------- -$ git merge bob/master +alice$ git merge bob/master ------------------------------------- This `merge` can also be done by 'pulling from her own remote tracking branch', like this: ------------------------------------- -$ git pull . remotes/bob/master +alice$ git pull . remotes/bob/master ------------------------------------- Note that git pull always merges into the current branch, @@ -344,7 +381,7 @@ regardless of what else is given on the command line. Later, Bob can update his repo with Alice's latest changes using ------------------------------------- -$ git pull +bob$ git pull ------------------------------------- Note that he doesn't need to give the path to Alice's repository; @@ -353,19 +390,19 @@ repository in the repository configuration, and that location is used for pulls: ------------------------------------- -$ git config --get remote.origin.url +bob$ git config --get remote.origin.url /home/alice/project ------------------------------------- -(The complete configuration created by git-clone is visible using -"git config -l", and the linkgit:git-config[1] man page +(The complete configuration created by 'git-clone' is visible using +`git config -l`, and the linkgit:git-config[1] man page explains the meaning of each option.) Git also keeps a pristine copy of Alice's master branch under the name "origin/master": ------------------------------------- -$ git branch -r +bob$ git branch -r origin/master ------------------------------------- @@ -373,7 +410,7 @@ If Bob later decides to work from a different host, he can still perform clones and pulls using the ssh protocol: ------------------------------------- -$ git clone alice.org:/home/alice/project myrepo +bob$ git clone alice.org:/home/alice/project myrepo ------------------------------------- Alternatively, git has a native protocol, or can use rsync or http; @@ -381,13 +418,13 @@ see linkgit:git-pull[1] for details. Git can also be used in a CVS-like mode, with a central repository that various users push changes to; see linkgit:git-push[1] and -link:cvs-migration.html[git for CVS users]. +linkgit:gitcvs-migration[7]. Exploring history ----------------- Git history is represented as a series of interrelated commits. We -have already seen that the git log command can list those commits. +have already seen that the 'git-log' command can list those commits. Note that first line of each git log entry also gives a name for the commit: @@ -400,7 +437,7 @@ Date: Tue May 16 17:18:22 2006 -0700 merge-base: Clarify the comments on post processing. ------------------------------------- -We can give this name to git show to see the details about this +We can give this name to 'git-show' to see the details about this commit. ------------------------------------- @@ -436,7 +473,7 @@ $ git show HEAD^2 # show the second parent of HEAD You can also give commits names of your own; after running ------------------------------------- -$ git-tag v2.5 1b2e1d63ff +$ git tag v2.5 1b2e1d63ff ------------------------------------- you can refer to 1b2e1d63ff by the name "v2.5". If you intend to @@ -458,13 +495,13 @@ $ git reset --hard HEAD^ # reset your current branch and working Be careful with that last command: in addition to losing any changes in the working directory, it will also remove all later commits from this branch. If this branch is the only branch containing those -commits, they will be lost. Also, don't use "git reset" on a +commits, they will be lost. Also, don't use 'git-reset' on a publicly-visible branch that other developers pull from, as it will force needless merges on other developers to clean up the history. -If you need to undo changes that you have pushed, use linkgit:git-revert[1] +If you need to undo changes that you have pushed, use 'git-revert' instead. -The git grep command can search for strings in any version of your +The 'git-grep' command can search for strings in any version of your project, so ------------------------------------- @@ -473,7 +510,7 @@ $ git grep "hello" v2.5 searches for all occurrences of "hello" in v2.5. -If you leave out the commit name, git grep will search any of the +If you leave out the commit name, 'git-grep' will search any of the files it manages in your current directory. So ------------------------------------- @@ -483,7 +520,7 @@ $ git grep "hello" is a quick way to search just the files that are tracked by git. Many git commands also take sets of commits, which can be specified -in a number of ways. Here are some examples with git log: +in a number of ways. Here are some examples with 'git-log': ------------------------------------- $ git log v2.5..v2.6 # commits between v2.5 and v2.6 @@ -493,7 +530,7 @@ $ git log v2.5.. Makefile # commits since v2.5 which modify # Makefile ------------------------------------- -You can also give git log a "range" of commits where the first is not +You can also give 'git-log' a "range" of commits where the first is not necessarily an ancestor of the second; for example, if the tips of the branches "stable-release" and "master" diverged from a common commit some time ago, then @@ -512,13 +549,13 @@ $ git log experimental..stable will show the list of commits made on the stable branch but not the experimental branch. -The "git log" command has a weakness: it must present commits in a +The 'git-log' command has a weakness: it must present commits in a list. When the history has lines of development that diverged and -then merged back together, the order in which "git log" presents +then merged back together, the order in which 'git-log' presents those commits is meaningless. Most projects with multiple contributors (such as the linux kernel, -or git itself) have frequent merges, and gitk does a better job of +or git itself) have frequent merges, and 'gitk' does a better job of visualizing their history. For example, ------------------------------------- @@ -538,7 +575,7 @@ of the file: $ git diff v2.5:Makefile HEAD:Makefile.in ------------------------------------- -You can also use "git show" to see any such file: +You can also use 'git-show' to see any such file: ------------------------------------- $ git show v2.5:Makefile @@ -560,9 +597,9 @@ is based: used to create commits, check out working directories, and hold the various trees involved in a merge. -link:tutorial-2.html[Part two of this tutorial] explains the object +Part two of this tutorial explains the object database, the index file, and a few other odds and ends that you'll -need to make the most of git. +need to make the most of git. You can find it at linkgit:gittutorial-2[7]. If you don't want to continue with that right away, a few other digressions that may be interesting at this point are: @@ -581,4 +618,17 @@ digressions that may be interesting at this point are: * link:everyday.html[Everyday GIT with 20 Commands Or So] - * link:cvs-migration.html[git for CVS users]. + * linkgit:gitcvs-migration[7]: Git for CVS users. + +SEE ALSO +-------- +linkgit:gittutorial-2[7], +linkgit:gitcvs-migration[7], +linkgit:gitcore-tutorial[7], +linkgit:gitglossary[7], +link:everyday.html[Everyday git], +link:user-manual.html[The Git User's Manual] + +GIT +--- +Part of the linkgit:git[1] suite. diff --git a/Documentation/glossary.txt b/Documentation/glossary-content.txt index ab4caf4e26..9b4a4f45e9 100644 --- a/Documentation/glossary.txt +++ b/Documentation/glossary-content.txt @@ -1,6 +1,3 @@ -GIT Glossary -============ - [[def_alternate_object_database]]alternate object database:: Via the alternates mechanism, a <<def_repository,repository>> can inherit part of its <<def_object_database,object database>> @@ -45,9 +42,12 @@ GIT Glossary "changesets" with git. [[def_checkout]]checkout:: - The action of updating the <<def_working_tree,working tree>> to a - <<def_revision,revision>> which was stored in the - <<def_object_database,object database>>. + The action of updating all or part of the + <<def_working_tree,working tree>> with a <<def_tree_object,tree object>> + or <<def_blob_object,blob>> from the + <<def_object_database,object database>>, and updating the + <<def_index,index>> and <<def_HEAD,HEAD>> if the whole working tree has + been pointed at a new <<def_branch,branch>>. [[def_cherry-picking]]cherry-picking:: In <<def_SCM,SCM>> jargon, "cherry pick" means to choose a subset of @@ -87,11 +87,10 @@ to point at the new commit. source code management tools. [[def_DAG]]DAG:: - Directed acyclic graph. The <<def_commit,commit>> objects form a + Directed acyclic graph. The <<def_commit_object,commit objects>> form a directed acyclic graph, because they have parents (directed), and the - graph of commit objects is acyclic (there is no - <<def_chain,chain>> which begins and ends with the same - <<def_object,object>>). + graph of commit objects is acyclic (there is no <<def_chain,chain>> + which begins and ends with the same <<def_object,object>>). [[def_dangling_object]]dangling object:: An <<def_unreachable_object,unreachable object>> which is not @@ -247,9 +246,10 @@ This commit is referred to as a "merge commit", or sometimes just a the <<def_hash,hash>> of the object. [[def_object_type]]object type:: - One of the identifiers - "<<def_commit,commit>>","<<def_tree,tree>>","<<def_tag,tag>>" or "<<def_blob_object,blob>>" - describing the type of an <<def_object,object>>. + One of the identifiers "<<def_commit_object,commit>>", + "<<def_tree_object,tree>>", "<<def_tag_object,tag>>" or + "<<def_blob_object,blob>>" describing the type of an + <<def_object,object>>. [[def_octopus]]octopus:: To <<def_merge,merge>> more than two <<def_branch,branches>>. Also denotes an diff --git a/Documentation/howto/rebase-from-internal-branch.txt b/Documentation/howto/rebase-from-internal-branch.txt index 7a76045eb7..d214d4bf9d 100644 --- a/Documentation/howto/rebase-from-internal-branch.txt +++ b/Documentation/howto/rebase-from-internal-branch.txt @@ -1,4 +1,4 @@ -From: Junio C Hamano <junkio@cox.net> +From: Junio C Hamano <gitster@pobox.com> To: git@vger.kernel.org Cc: Petr Baudis <pasky@suse.cz>, Linus Torvalds <torvalds@osdl.org> Subject: Re: sending changesets from the middle of a git tree diff --git a/Documentation/howto/rebuild-from-update-hook.txt b/Documentation/howto/rebuild-from-update-hook.txt index 8d55dfbfae..48c67568d3 100644 --- a/Documentation/howto/rebuild-from-update-hook.txt +++ b/Documentation/howto/rebuild-from-update-hook.txt @@ -1,6 +1,6 @@ Subject: [HOWTO] Using post-update hook Message-ID: <7vy86o6usx.fsf@assigned-by-dhcp.cox.net> -From: Junio C Hamano <junkio@cox.net> +From: Junio C Hamano <gitster@pobox.com> Date: Fri, 26 Aug 2005 18:19:10 -0700 Abstract: In this how-to article, JC talks about how he uses the post-update hook to automate git documentation page diff --git a/Documentation/howto/revert-branch-rebase.txt b/Documentation/howto/revert-branch-rebase.txt index 865a666324..e70d8a31e7 100644 --- a/Documentation/howto/revert-branch-rebase.txt +++ b/Documentation/howto/revert-branch-rebase.txt @@ -1,4 +1,4 @@ -From: Junio C Hamano <junkio@cox.net> +From: Junio C Hamano <gitster@pobox.com> To: git@vger.kernel.org Subject: [HOWTO] Reverting an existing commit Abstract: In this article, JC gives a small real-life example of using diff --git a/Documentation/howto/separating-topic-branches.txt b/Documentation/howto/separating-topic-branches.txt index 0d73b31224..6d3eb8ed00 100644 --- a/Documentation/howto/separating-topic-branches.txt +++ b/Documentation/howto/separating-topic-branches.txt @@ -1,4 +1,4 @@ -From: Junio C Hamano <junkio@cox.net> +From: Junio C Hamano <gitster@pobox.com> Subject: Separating topic branches Abstract: In this article, JC describes how to separate topic branches. diff --git a/Documentation/howto/setup-git-server-over-http.txt b/Documentation/howto/setup-git-server-over-http.txt index 8eadc20494..4032748608 100644 --- a/Documentation/howto/setup-git-server-over-http.txt +++ b/Documentation/howto/setup-git-server-over-http.txt @@ -1,5 +1,5 @@ From: Rutger Nijlunsing <rutger@nospam.com> -Subject: Setting up a git repository which can be pushed into and pulled from over HTTP. +Subject: Setting up a git repository which can be pushed into and pulled from over HTTP(S). Date: Thu, 10 Aug 2006 22:00:26 +0200 Since Apache is one of those packages people like to compile @@ -40,9 +40,13 @@ What's needed: - have permissions to chown a directory -- have git installed at the server _and_ client +- have git installed on the client, and -In effect, this probably means you're going to be root. +- either have git installed on the server or have a webdav client on + the client. + +In effect, this means you're going to be root, or that you're using a +preconfigured WebDAV server. Step 1: setup a bare GIT repository @@ -50,9 +54,9 @@ Step 1: setup a bare GIT repository At the time of writing, git-http-push cannot remotely create a GIT repository. So we have to do that at the server side with git. Another -option would be to generate an empty repository at the client and copy -it to the server with WebDAV. But then you're probably the first to -try that out :) +option is to generate an empty bare repository at the client and copy +it to the server with a WebDAV client (which is the only option if Git +is not installed on the server). Create the directory under the DocumentRoot of the directories served by Apache. As an example we take /usr/local/apache2, but try "grep @@ -169,7 +173,9 @@ On Debian: Most tests should pass. -A command line tool to test WebDAV is cadaver. +A command line tool to test WebDAV is cadaver. If you prefer GUIs, for +example, konqueror can open WebDAV URLs as "webdav://..." or +"webdavs://...". If you're into Windows, from XP onwards Internet Explorer supports WebDAV. For this, do Internet Explorer -> Open Location -> @@ -179,8 +185,9 @@ http://<servername>/my-new-repo.git [x] Open as webfolder -> login . Step 3: setup the client ------------------------ -Make sure that you have HTTP support, i.e. your git was built with curl. -The easiest way to check is to look for the executable 'git-http-push'. +Make sure that you have HTTP support, i.e. your git was built with +libcurl (version more recent than 7.10). The command 'git http-push' with +no argument should display a usage message. Then, add the following to your $HOME/.netrc (you can do without, but will be asked to input your password a _lot_ of times): @@ -197,10 +204,10 @@ instead of the server name. To check whether all is OK, do: - curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/ - -...this should give a directory listing in HTML of /var/www/my-new-repo.git . + curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/HEAD +...this should give something like 'ref: refs/heads/master', which is +the content of the file HEAD on the server. Now, add the remote in your existing repository which contains the project you want to export: @@ -225,6 +232,15 @@ want to export) to repository called 'upload', which we previously defined with git-config. +Using a proxy: +-------------- + +If you have to access the WebDAV server from behind an HTTP(S) proxy, +set the variable 'all_proxy' to 'http://proxy-host.com:port', or +'http://login-on-proxy:passwd-on-proxy@proxy-host.com:port'. See 'man +curl' for details. + + Troubleshooting: ---------------- @@ -248,9 +264,14 @@ Reading /usr/local/apache2/logs/error_log is often helpful. On Debian: Read /var/log/apache2/error.log instead. +If you access HTTPS locations, git may fail verifying the SSL +certificate (this is return code 60). Setting http.sslVerify=false can +help diagnosing the problem, but removes security checks. + Debian References: http://www.debian-administration.org/articles/285 Authors Johannes Schindelin <Johannes.Schindelin@gmx.de> Rutger Nijlunsing <git@wingding.demon.nl> + Matthieu Moy <Matthieu.Moy@imag.fr> diff --git a/Documentation/howto/update-hook-example.txt b/Documentation/howto/update-hook-example.txt index 88765b5575..697d918885 100644 --- a/Documentation/howto/update-hook-example.txt +++ b/Documentation/howto/update-hook-example.txt @@ -1,4 +1,4 @@ -From: Junio C Hamano <junkio@cox.net> and Carl Baldwin <cnb@fc.hp.com> +From: Junio C Hamano <gitster@pobox.com> and Carl Baldwin <cnb@fc.hp.com> Subject: control access to branches. Date: Thu, 17 Nov 2005 23:55:32 -0800 Message-ID: <7vfypumlu3.fsf@assigned-by-dhcp.cox.net> @@ -65,10 +65,10 @@ function info { # Implement generic branch and tag policies. # - Tags should not be updated once created. -# - Branches should only be fast-forwarded. +# - Branches should only be fast-forwarded unless their pattern starts with '+' case "$1" in refs/tags/*) - [ -f "$GIT_DIR/$1" ] && + git rev-parse --verify -q "$1" && deny >/dev/null "You can't overwrite an existing tag" ;; refs/heads/*) @@ -80,7 +80,7 @@ case "$1" in mb=$(git-merge-base "$2" "$3") case "$mb,$2" in "$2,$mb") info "Update is fast-forward" ;; - *) deny >/dev/null "This is not a fast-forward update." ;; + *) noff=y; info "This is not a fast-forward update.";; esac fi ;; @@ -95,21 +95,30 @@ allowed_users_file=$GIT_DIR/info/allowed-users username=$(id -u -n) info "The user is: '$username'" -if [ -f "$allowed_users_file" ]; then +if test -f "$allowed_users_file" +then rc=$(cat $allowed_users_file | grep -v '^#' | grep -v '^$' | - while read head_pattern user_patterns; do - matchlen=$(expr "$1" : "$head_pattern") - if [ "$matchlen" == "${#1}" ]; then - info "Found matching head pattern: '$head_pattern'" - for user_pattern in $user_patterns; do - info "Checking user: '$username' against pattern: '$user_pattern'" - matchlen=$(expr "$username" : "$user_pattern") - if [ "$matchlen" == "${#username}" ]; then - grant "Allowing user: '$username' with pattern: '$user_pattern'" - fi - done - deny "The user is not in the access list for this branch" - fi + while read heads user_patterns + do + # does this rule apply to us? + head_pattern=${heads#+} + matchlen=$(expr "$1" : "${head_pattern#+}") + test "$matchlen" = ${#1} || continue + + # if non-ff, $heads must be with the '+' prefix + test -n "$noff" && + test "$head_pattern" = "$heads" && continue + + info "Found matching head pattern: '$head_pattern'" + for user_pattern in $user_patterns; do + info "Checking user: '$username' against pattern: '$user_pattern'" + matchlen=$(expr "$username" : "$user_pattern") + if test "$matchlen" = "${#username}" + then + grant "Allowing user: '$username' with pattern: '$user_pattern'" + fi + done + deny "The user is not in the access list for this branch" done ) case "$rc" in @@ -124,23 +133,32 @@ groups=$(id -G -n) info "The user belongs to the following groups:" info "'$groups'" -if [ -f "$allowed_groups_file" ]; then +if test -f "$allowed_groups_file" +then rc=$(cat $allowed_groups_file | grep -v '^#' | grep -v '^$' | - while read head_pattern group_patterns; do - matchlen=$(expr "$1" : "$head_pattern") - if [ "$matchlen" == "${#1}" ]; then - info "Found matching head pattern: '$head_pattern'" - for group_pattern in $group_patterns; do - for groupname in $groups; do - info "Checking group: '$groupname' against pattern: '$group_pattern'" - matchlen=$(expr "$groupname" : "$group_pattern") - if [ "$matchlen" == "${#groupname}" ]; then - grant "Allowing group: '$groupname' with pattern: '$group_pattern'" - fi - done + while read heads group_patterns + do + # does this rule apply to us? + head_pattern=${heads#+} + matchlen=$(expr "$1" : "${head_pattern#+}") + test "$matchlen" = ${#1} || continue + + # if non-ff, $heads must be with the '+' prefix + test -n "$noff" && + test "$head_pattern" = "$heads" && continue + + info "Found matching head pattern: '$head_pattern'" + for group_pattern in $group_patterns; do + for groupname in $groups; do + info "Checking group: '$groupname' against pattern: '$group_pattern'" + matchlen=$(expr "$groupname" : "$group_pattern") + if test "$matchlen" = "${#groupname}" + then + grant "Allowing group: '$groupname' with pattern: '$group_pattern'" + fi done - deny "None of the user's groups are in the access list for this branch" - fi + done + deny "None of the user's groups are in the access list for this branch" done ) case "$rc" in @@ -159,6 +177,7 @@ allowed-groups, to describe which heads can be pushed into by whom. The format of each file would look like this: refs/heads/master junio + +refs/heads/pu junio refs/heads/cogito$ pasky refs/heads/bw/.* linus refs/heads/tmp/.* .* @@ -166,7 +185,8 @@ whom. The format of each file would look like this: With this, Linus can push or create "bw/penguin" or "bw/zebra" or "bw/panda" branches, Pasky can do only "cogito", and JC can -do master branch and make versioned tags. And anybody can do -tmp/blah branches. +do master and pu branches and make versioned tags. And anybody +can do tmp/blah branches. The '+' sign at the pu record means +that JC can make non-fast-forward pushes on it. ------------ diff --git a/Documentation/i18n.txt b/Documentation/i18n.txt index 1e188e6e74..fb0d7da56b 100644 --- a/Documentation/i18n.txt +++ b/Documentation/i18n.txt @@ -21,7 +21,7 @@ project find it more convenient to use legacy encodings, git does not forbid it. However, there are a few things to keep in mind. -. `git-commit-tree` (hence, `git-commit` which uses it) issues +. 'git-commit-tree' (hence, 'git-commit' which uses it) issues a warning if the commit log message given to it does not look like a valid UTF-8 string, unless you explicitly say your project uses a legacy encoding. The way to say this is to @@ -37,7 +37,7 @@ of `i18n.commitencoding` in its `encoding` header. This is to help other people who look at them later. Lack of this header implies that the commit log message is encoded in UTF-8. -. `git-log`, `git-show` and friends looks at the `encoding` +. 'git-log', 'git-show' and friends looks at the `encoding` header of a commit object, and tries to re-code the log message into UTF-8 unless otherwise specified. You can specify the desired output encoding with diff --git a/Documentation/install-doc-quick.sh b/Documentation/install-doc-quick.sh index 5433cf8ced..35f440876e 100755 --- a/Documentation/install-doc-quick.sh +++ b/Documentation/install-doc-quick.sh @@ -6,7 +6,7 @@ head="$1" mandir="$2" SUBDIRECTORY_OK=t USAGE='<refname> <target directory>' -. git-sh-setup +. "$(git --exec-path)"/git-sh-setup cd_to_toplevel test -z "$mandir" && usage diff --git a/Documentation/manpage-1.72.xsl b/Documentation/manpage-1.72.xsl new file mode 100644 index 0000000000..4065a3a27a --- /dev/null +++ b/Documentation/manpage-1.72.xsl @@ -0,0 +1,21 @@ +<!-- Based on callouts.xsl. Fixes man page callouts for DocBook 1.72 XSL --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + +<xsl:param name="man.output.quietly" select="1"/> +<xsl:param name="refentry.meta.get.quietly" select="1"/> + +<xsl:template match="co"> + <xsl:value-of select="concat('▓fB(',substring-after(@id,'-'),')▓fR')"/> +</xsl:template> +<xsl:template match="calloutlist"> + <xsl:text>⌂sp </xsl:text> + <xsl:apply-templates/> + <xsl:text> </xsl:text> +</xsl:template> +<xsl:template match="callout"> + <xsl:value-of select="concat('▓fB',substring-after(@arearefs,'-'),'. ▓fR')"/> + <xsl:apply-templates/> + <xsl:text>⌂br </xsl:text> +</xsl:template> + +</xsl:stylesheet> diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt new file mode 100644 index 0000000000..00277e0613 --- /dev/null +++ b/Documentation/merge-config.txt @@ -0,0 +1,40 @@ +merge.stat:: + Whether to print the diffstat between ORIG_HEAD and merge result + at the end of the merge. True by default. + +merge.log:: + Whether to include summaries of merged commits in newly created + merge commit messages. False by default. + +merge.renameLimit:: + The number of files to consider when performing rename detection + during a merge; if not specified, defaults to the value of + diff.renameLimit. + +merge.tool:: + Controls which merge resolution program is used by + linkgit:git-mergetool[1]. Valid built-in values are: "kdiff3", + "tkdiff", "meld", "xxdiff", "emerge", "vimdiff", "gvimdiff", and + "opendiff". Any other value is treated is custom merge tool + and there must be a corresponding mergetool.<tool>.cmd option. + +merge.verbosity:: + Controls the amount of output shown by the recursive merge + strategy. Level 0 outputs nothing except a final error + message if conflicts were detected. Level 1 outputs only + conflicts, 2 outputs conflicts and file changes. Level 5 and + above outputs debugging information. The default is level 2. + Can be overridden by 'GIT_MERGE_VERBOSITY' environment variable. + +merge.<driver>.name:: + Defines a human readable name for a custom low-level + merge driver. See linkgit:gitattributes[5] for details. + +merge.<driver>.driver:: + Defines the command that implements a custom low-level + merge driver. See linkgit:gitattributes[5] for details. + +merge.<driver>.recursive:: + Names a low-level merge driver to be used when + performing an internal merge between common ancestors. + See linkgit:gitattributes[5] for details. diff --git a/Documentation/merge-options.txt b/Documentation/merge-options.txt index 9f1fc82550..007909a82f 100644 --- a/Documentation/merge-options.txt +++ b/Documentation/merge-options.txt @@ -1,10 +1,25 @@ ---summary:: +--stat:: Show a diffstat at the end of the merge. The diffstat is also - controlled by the configuration option merge.diffstat. + controlled by the configuration option merge.stat. --n, \--no-summary:: +-n:: +--no-stat:: Do not show diffstat at the end of the merge. +--summary:: +--no-summary:: + Synonyms to --stat and --no-stat; these are deprecated and will be + removed in the future. + +--log:: + In addition to branch names, populate the log message with + one-line descriptions from the actual commits that are being + merged. + +--no-log:: + Do not list one-line descriptions from the actual commits being + merged. + --no-commit:: Perform the merge but pretend the merge failed and do not autocommit, to give the user a chance to inspect and @@ -36,9 +51,10 @@ a fast-forward, only update the branch pointer. This is the default behavior of git-merge. --s <strategy>, \--strategy=<strategy>:: +-s <strategy>:: +--strategy=<strategy>:: Use the given merge strategy; can be supplied more than once to specify them in the order they should be tried. If there is no `-s` option, a built-in list of strategies - is used instead (`git-merge-recursive` when merging a single - head, `git-merge-octopus` otherwise). + is used instead ('git-merge-recursive' when merging a single + head, 'git-merge-octopus' otherwise). diff --git a/Documentation/merge-strategies.txt b/Documentation/merge-strategies.txt index 7df0266ba8..1276f858ad 100644 --- a/Documentation/merge-strategies.txt +++ b/Documentation/merge-strategies.txt @@ -33,3 +33,10 @@ ours:: merge is always the current branch head. It is meant to be used to supersede old development history of side branches. + +subtree:: + This is a modified recursive strategy. When merging trees A and + B, if B corresponds to a subtree of A, B is first adjusted to + match the tree structure of A, instead of reading the trees at + the same level. This adjustment is also done to the common + ancestor tree. diff --git a/Documentation/pretty-formats.txt b/Documentation/pretty-formats.txt index 0193c3ce58..c11d495771 100644 --- a/Documentation/pretty-formats.txt +++ b/Documentation/pretty-formats.txt @@ -30,7 +30,7 @@ This is designed to be as compact as possible. commit <sha1> Author: <author> - Date: <date> + Date: <author date> <title line> @@ -50,9 +50,9 @@ This is designed to be as compact as possible. commit <sha1> Author: <author> - AuthorDate: <date & time> + AuthorDate: <author date> Commit: <committer> - CommitDate: <date & time> + CommitDate: <committer date> <title line> @@ -62,7 +62,7 @@ This is designed to be as compact as possible. From <sha1> <date> From: <author> - Date: <date & time> + Date: <author date> Subject: [PATCH] <title line> <full commit message> @@ -101,6 +101,7 @@ The placeholders are: - '%P': parent hashes - '%p': abbreviated parent hashes - '%an': author name +- '%aN': author name (respecting .mailmap) - '%ae': author email - '%ad': author date - '%aD': author date, RFC2822 style @@ -108,6 +109,7 @@ The placeholders are: - '%at': author date, UNIX timestamp - '%ai': author date, ISO 8601 format - '%cn': committer name +- '%cN': committer name (respecting .mailmap) - '%ce': committer email - '%cd': committer date - '%cD': committer date, RFC2822 style @@ -123,3 +125,26 @@ The placeholders are: - '%Creset': reset color - '%m': left, right or boundary mark - '%n': newline +- '%x00': print a byte from a hex code + +* 'tformat:' ++ +The 'tformat:' format works exactly like 'format:', except that it +provides "terminator" semantics instead of "separator" semantics. In +other words, each commit has the message terminator character (usually a +newline) appended, rather than a separator placed between entries. +This means that the final entry of a single-line format will be properly +terminated with a new line, just as the "oneline" format does. +For example: ++ +--------------------- +$ git log -2 --pretty=format:%h 4da45bef \ + | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' +4da45be +7134973 -- NO NEWLINE + +$ git log -2 --pretty=tformat:%h 4da45bef \ + | perl -pe '$_ .= " -- NO NEWLINE\n" unless /\n/' +4da45be +7134973 +--------------------- diff --git a/Documentation/pretty-options.txt b/Documentation/pretty-options.txt index 973d8dd733..6d66c74cc1 100644 --- a/Documentation/pretty-options.txt +++ b/Documentation/pretty-options.txt @@ -4,6 +4,9 @@ where '<format>' can be one of 'oneline', 'short', 'medium', 'full', 'fuller', 'email', 'raw' and 'format:<string>'. When omitted, the format defaults to 'medium'. ++ +Note: you can specify the default pretty format in the repository +configuration (see linkgit:git-config[1]). --abbrev-commit:: Instead of showing the full 40-byte hexadecimal commit object diff --git a/Documentation/pull-fetch-param.txt b/Documentation/pull-fetch-param.txt index b6eb7fc618..ebdd948cd2 100644 --- a/Documentation/pull-fetch-param.txt +++ b/Documentation/pull-fetch-param.txt @@ -1,10 +1,12 @@ <repository>:: The "remote" repository that is the source of a fetch - or pull operation. See the section <<URLS,GIT URLS>> below. + or pull operation. This parameter can be either a URL + (see the section <<URLS,GIT URLS>> below) or the name + of a remote (see the section <<REMOTES,REMOTES>> below). <refspec>:: The canonical format of a <refspec> parameter is - `+?<src>:<dst>`; that is, an optional plus `+`, followed + `+?<src>:<dst>`; that is, an optional plus `{plus}`, followed by the source ref, followed by a colon `:`, followed by the destination ref. + @@ -30,7 +32,7 @@ must know this is the expected usage pattern for a branch. [NOTE] You never do your own development on branches that appear on the right hand side of a <refspec> colon on `Pull:` lines; -they are to be updated by `git-fetch`. If you intend to do +they are to be updated by 'git-fetch'. If you intend to do development derived from a remote branch `B`, have a `Pull:` line to track it (i.e. `Pull: B:remote-B`), and have a separate branch `my-B` to do your development on top of it. The latter @@ -42,13 +44,13 @@ on the remote branch, merge it into your development branch with + [NOTE] There is a difference between listing multiple <refspec> -directly on `git-pull` command line and having multiple +directly on 'git-pull' command line and having multiple `Pull:` <refspec> lines for a <repository> and running -`git-pull` command without any explicit <refspec> parameters. +'git-pull' command without any explicit <refspec> parameters. <refspec> listed explicitly on the command line are always merged into the current branch after fetching. In other words, if you list more than one remote refs, you would be making -an Octopus. While `git-pull` run without any explicit <refspec> +an Octopus. While 'git-pull' run without any explicit <refspec> parameter takes default <refspec>s from `Pull:` lines, it merges only the first <refspec> found into the current branch, after fetching all the remote refs. This is because making an diff --git a/Documentation/rev-list-options.txt b/Documentation/rev-list-options.txt index a8138e27a1..735cf07b20 100644 --- a/Documentation/rev-list-options.txt +++ b/Documentation/rev-list-options.txt @@ -13,10 +13,11 @@ include::pretty-options.txt[] Synonym for `--date=relative`. ---date={relative,local,default,iso,rfc}:: +--date={relative,local,default,iso,rfc,short}:: Only takes effect for dates shown in human-readable format, such - as when using "--pretty". + as when using "--pretty". `log.date` config variable sets a default + value for log command's --date option. + `--date=relative` shows dates relative to the current time, e.g. "2 hours ago". @@ -33,17 +34,27 @@ format, often found in E-mail messages. `--date=default` shows timestamps in the original timezone (either committer's or author's). +ifdef::git-rev-list[] --header:: Print the contents of the commit in raw-format; each record is separated with a NUL character. +endif::git-rev-list[] --parents:: - Print the parents of the commit. + Print the parents of the commit. Also enables parent + rewriting, see 'History Simplification' below. + +--children:: + + Print the children of the commit. Also enables parent + rewriting, see 'History Simplification' below. +ifdef::git-rev-list[] --timestamp:: Print the raw commit timestamp. +endif::git-rev-list[] --left-right:: @@ -62,7 +73,7 @@ For example, if you have this topology: o---x---a---a branch A ----------------------------------------------------------------------- + -you would get an output line this: +you would get an output like this: + ----------------------------------------------------------------------- $ git rev-list --left-right --boundary --pretty=oneline A...B @@ -75,6 +86,17 @@ you would get an output line this: -xxxxxxx... 1st on a ----------------------------------------------------------------------- +--graph:: + + Draw a text-based graphical representation of the commit history + on the left hand side of the output. This may cause extra lines + to be printed in between commits, in order for the graph history + to be drawn properly. ++ +This implies the '--topo-order' option by default, but the +'--date-order' option may also be specified. + +ifndef::git-rev-list[] Diff Formatting ~~~~~~~~~~~~~~~ @@ -93,9 +115,9 @@ options may be given. See linkgit:git-diff-files[1] for more options. --cc:: This flag implies the '-c' options and further compresses the - patch output by omitting hunks that show differences from only - one parent, or show the same change from all but one parent for - an Octopus merge. + patch output by omitting uninteresting hunks whose contents in + the parents have only two variants and the merge result picks + one of them without modification. -r:: @@ -104,6 +126,7 @@ options may be given. See linkgit:git-diff-files[1] for more options. -t:: Show the tree objects in the diff output. This implies '-r'. +endif::git-rev-list[] Commit Limiting ~~~~~~~~~~~~~~~ @@ -114,7 +137,8 @@ limiting may be applied. -- --n 'number', --max-count='number':: +-n 'number':: +--max-count='number':: Limit the number of commits output. @@ -122,19 +146,25 @@ limiting may be applied. Skip 'number' commits before starting to show the commit output. ---since='date', --after='date':: +--since='date':: +--after='date':: Show commits more recent than a specific date. ---until='date', --before='date':: +--until='date':: +--before='date':: Show commits older than a specific date. ---max-age='timestamp', --min-age='timestamp':: +ifdef::git-rev-list[] +--max-age='timestamp':: +--min-age='timestamp':: Limit the commits output to specified time range. +endif::git-rev-list[] ---author='pattern', --committer='pattern':: +--author='pattern':: +--committer='pattern':: Limit the commits output to ones with author/committer header lines that match the specified pattern (regular expression). @@ -144,26 +174,26 @@ limiting may be applied. Limit the commits output to ones with log message that matches the specified pattern (regular expression). --i, --regexp-ignore-case:: +-i:: +--regexp-ignore-case:: Match the regexp limiting patterns without regard to letters case. --E, --extended-regexp:: +-E:: +--extended-regexp:: Consider the limiting patterns to be extended regular expressions instead of the default basic regular expressions. ---remove-empty:: +-F:: +--fixed-strings:: - Stop when a given path disappears from the tree. + Consider the limiting patterns to be fixed strings (don't interpret + pattern as a regular expression). ---full-history:: +--remove-empty:: - Show also parts of history irrelevant to current state of a given - path. This turns off history simplification, which removed merges - which didn't change anything at all at some child. It will still actually - simplify away merges that didn't change anything at all into either - child. + Stop when a given path disappears from the tree. --no-merges:: @@ -188,6 +218,7 @@ limiting may be applied. Pretend as if all the refs in `$GIT_DIR/refs/` are listed on the command line as '<commit>'. +ifdef::git-rev-list[] --stdin:: In addition to the '<commit>' listed on the command @@ -200,6 +231,7 @@ limiting may be applied. test the exit status to see if a range of objects is fully connected (or not). It is faster than redirecting stdout to /dev/null as the output does not have to be formatted. +endif::git-rev-list[] --cherry-pick:: @@ -215,7 +247,8 @@ from the other branch (for example, "3rd on b" may be cherry-picked from branch A). With this option, such pairs of commits are excluded from the output. --g, --walk-reflogs:: +-g:: +--walk-reflogs:: Instead of walking the commit ancestry chain, walk reflog entries from the most recent one to older ones. @@ -227,11 +260,10 @@ With '\--pretty' format other than oneline (for obvious reasons), this causes the output to have two extra lines of information taken from the reflog. By default, 'commit@\{Nth}' notation is used in the output. When the starting commit is specified as -'commit@{now}', output also uses 'commit@\{timestamp}' notation +'commit@\{now}', output also uses 'commit@\{timestamp}' notation instead. Under '\--pretty=oneline', the commit message is prefixed with this information on the same line. - -Cannot be combined with '\--reverse'. +This option cannot be combined with '\--reverse'. See also linkgit:git-reflog[1]. --merge:: @@ -244,17 +276,144 @@ See also linkgit:git-reflog[1]. Output uninteresting commits at the boundary, which are usually not shown. ---dense, --sparse:: +-- + +History Simplification +~~~~~~~~~~~~~~~~~~~~~~ + +When optional paths are given, 'git-rev-list' simplifies commits with +various strategies, according to the options you have selected. + +Suppose you specified `foo` as the <paths>. We shall call commits +that modify `foo` !TREESAME, and the rest TREESAME. (In a diff +filtered for `foo`, they look different and equal, respectively.) + +In the following, we will always refer to the same example history to +illustrate the differences between simplification settings. We assume +that you are filtering for a file `foo` in this commit graph: +----------------------------------------------------------------------- + .-A---M---N---O---P + / / / / / + I B C D E + \ / / / / + `-------------' +----------------------------------------------------------------------- +The horizontal line of history A--P is taken to be the first parent of +each merge. The commits are: + +* `I` is the initial commit, in which `foo` exists with contents + "asdf", and a file `quux` exists with contents "quux". Initial + commits are compared to an empty tree, so `I` is !TREESAME. + +* In `A`, `foo` contains just "foo". + +* `B` contains the same change as `A`. Its merge `M` is trivial and + hence TREESAME to all parents. + +* `C` does not change `foo`, but its merge `N` changes it to "foobar", + so it is not TREESAME to any parent. + +* `D` sets `foo` to "baz". Its merge `O` combines the strings from + `N` and `D` to "foobarbaz"; i.e., it is not TREESAME to any parent. + +* `E` changes `quux` to "xyzzy", and its merge `P` combines the + strings to "quux xyzzy". Despite appearing interesting, `P` is + TREESAME to all parents. -When optional paths are given, the default behaviour ('--dense') is to -only output commits that changes at least one of them, and also ignore -merges that do not touch the given paths. +'rev-list' walks backwards through history, including or excluding +commits based on whether '\--full-history' and/or parent rewriting +(via '\--parents' or '\--children') are used. The following settings +are available. + +Default mode:: + + Commits are included if they are not TREESAME to any parent + (though this can be changed, see '\--sparse' below). If the + commit was a merge, and it was TREESAME to one parent, follow + only that parent. (Even if there are several TREESAME + parents, follow only one of them.) Otherwise, follow all + parents. ++ +This results in: ++ +----------------------------------------------------------------------- + .-A---N---O + / / + I---------D +----------------------------------------------------------------------- ++ +Note how the rule to only follow the TREESAME parent, if one is +available, removed `B` from consideration entirely. `C` was +considered via `N`, but is TREESAME. Root commits are compared to an +empty tree, so `I` is !TREESAME. ++ +Parent/child relations are only visible with --parents, but that does +not affect the commits selected in default mode, so we have shown the +parent lines. + +--full-history without parent rewriting:: + + This mode differs from the default in one point: always follow + all parents of a merge, even if it is TREESAME to one of them. + Even if more than one side of the merge has commits that are + included, this does not imply that the merge itself is! In + the example, we get ++ +----------------------------------------------------------------------- + I A B N D O +----------------------------------------------------------------------- ++ +`P` and `M` were excluded because they are TREESAME to a parent. `E`, +`C` and `B` were all walked, but only `B` was !TREESAME, so the others +do not appear. ++ +Note that without parent rewriting, it is not really possible to talk +about the parent/child relationships between the commits, so we show +them disconnected. + +--full-history with parent rewriting:: + + Ordinary commits are only included if they are !TREESAME + (though this can be changed, see '\--sparse' below). ++ +Merges are always included. However, their parent list is rewritten: +Along each parent, prune away commits that are not included +themselves. This results in ++ +----------------------------------------------------------------------- + .-A---M---N---O---P + / / / / / + I B / D / + \ / / / / + `-------------' +----------------------------------------------------------------------- ++ +Compare to '\--full-history' without rewriting above. Note that `E` +was pruned away because it is TREESAME, but the parent list of P was +rewritten to contain `E`'s parent `I`. The same happened for `C` and +`N`. Note also that `P` was included despite being TREESAME. + +In addition to the above settings, you can change whether TREESAME +affects inclusion: + +--dense:: + + Commits that are walked are included if they are not TREESAME + to any parent. + +--sparse:: + + All commits that are walked are included. ++ +Note that without '\--full-history', this still simplifies merges: if +one of the parents is TREESAME, we follow only that one, so the other +sides of the merge are never walked. -Use the '--sparse' flag to makes the command output all eligible commits -(still subject to count and age limitation), but apply merge -simplification nevertheless. ifdef::git-rev-list[] +Bisection Helpers +~~~~~~~~~~~~~~~~~ + --bisect:: Limit output to the one commit object which is roughly halfway between @@ -304,7 +463,6 @@ after all the sorted commit objects, there will be the same text as if `--bisect-vars` had been used alone. endif::git-rev-list[] --- Commit Ordering ~~~~~~~~~~~~~~~ diff --git a/Documentation/technical/api-builtin.txt b/Documentation/technical/api-builtin.txt index 52cdb4c520..7ede1e64e5 100644 --- a/Documentation/technical/api-builtin.txt +++ b/Documentation/technical/api-builtin.txt @@ -4,7 +4,7 @@ builtin API Adding a new built-in --------------------- -There are 4 things to do to add a bulit-in command implementation to +There are 4 things to do to add a built-in command implementation to git: . Define the implementation of the built-in command `foo` with @@ -18,8 +18,8 @@ git: defined in `git.c`. The entry should look like: { "foo", cmd_foo, <options> }, - - where options is the bitwise-or of: ++ +where options is the bitwise-or of: `RUN_SETUP`:: @@ -33,6 +33,12 @@ git: If the standard output is connected to a tty, spawn a pager and feed our output to it. +`NEED_WORK_TREE`:: + + Make sure there is a work tree, i.e. the command cannot act + on bare repositories. + This makes only sense when `RUN_SETUP` is also set. + . Add `builtin-foo.o` to `BUILTIN_OBJS` in `Makefile`. Additionally, if `foo` is a new command, there are 3 more things to do: @@ -41,8 +47,7 @@ Additionally, if `foo` is a new command, there are 3 more things to do: . Write documentation in `Documentation/git-foo.txt`. -. Add an entry for `git-foo` to the list at the end of - `Documentation/cmd-list.perl`. +. Add an entry for `git-foo` to `command-list.txt`. How a built-in is called diff --git a/Documentation/technical/api-diff.txt b/Documentation/technical/api-diff.txt index 83b007e708..20b0241d30 100644 --- a/Documentation/technical/api-diff.txt +++ b/Documentation/technical/api-diff.txt @@ -39,7 +39,7 @@ Calling sequence * Once you finish feeding the pairs of files, call `diffcore_std()`. This will tell the diffcore library to go ahead and do its work. -* Calling `diffcore_flush()` will produce the output. +* Calling `diff_flush()` will produce the output. Data structures diff --git a/Documentation/technical/api-history-graph.txt b/Documentation/technical/api-history-graph.txt new file mode 100644 index 0000000000..e9559790a3 --- /dev/null +++ b/Documentation/technical/api-history-graph.txt @@ -0,0 +1,179 @@ +history graph API +================= + +The graph API is used to draw a text-based representation of the commit +history. The API generates the graph in a line-by-line fashion. + +Functions +--------- + +Core functions: + +* `graph_init()` creates a new `struct git_graph` + +* `graph_release()` destroys a `struct git_graph`, and frees the memory + associated with it. + +* `graph_update()` moves the graph to a new commit. + +* `graph_next_line()` outputs the next line of the graph into a strbuf. It + does not add a terminating newline. + +* `graph_padding_line()` outputs a line of vertical padding in the graph. It + is similar to `graph_next_line()`, but is guaranteed to never print the line + containing the current commit. Where `graph_next_line()` would print the + commit line next, `graph_padding_line()` prints a line that simply extends + all branch lines downwards one row, leaving their positions unchanged. + +* `graph_is_commit_finished()` determines if the graph has output all lines + necessary for the current commit. If `graph_update()` is called before all + lines for the current commit have been printed, the next call to + `graph_next_line()` will output an ellipsis, to indicate that a portion of + the graph was omitted. + +The following utility functions are wrappers around `graph_next_line()` and +`graph_is_commit_finished()`. They always print the output to stdout. +They can all be called with a NULL graph argument, in which case no graph +output will be printed. + +* `graph_show_commit()` calls `graph_next_line()` until it returns non-zero. + This prints all graph lines up to, and including, the line containing this + commit. Output is printed to stdout. The last line printed does not contain + a terminating newline. This should not be called if the commit line has + already been printed, or it will loop forever. + +* `graph_show_oneline()` calls `graph_next_line()` and prints the result to + stdout. The line printed does not contain a terminating newline. + +* `graph_show_padding()` calls `graph_padding_line()` and prints the result to + stdout. The line printed does not contain a terminating newline. + +* `graph_show_remainder()` calls `graph_next_line()` until + `graph_is_commit_finished()` returns non-zero. Output is printed to stdout. + The last line printed does not contain a terminating newline. Returns 1 if + output was printed, and 0 if no output was necessary. + +* `graph_show_strbuf()` prints the specified strbuf to stdout, prefixing all + lines but the first with a graph line. The caller is responsible for + ensuring graph output for the first line has already been printed to stdout. + (This can be done with `graph_show_commit()` or `graph_show_oneline()`.) If + a NULL graph is supplied, the strbuf is printed as-is. + +* `graph_show_commit_msg()` is similar to `graph_show_strbuf()`, but it also + prints the remainder of the graph, if more lines are needed after the strbuf + ends. It is better than directly calling `graph_show_strbuf()` followed by + `graph_show_remainder()` since it properly handles buffers that do not end in + a terminating newline. The output printed by `graph_show_commit_msg()` will + end in a newline if and only if the strbuf ends in a newline. + +Data structure +-------------- +`struct git_graph` is an opaque data type used to store the current graph +state. + +Calling sequence +---------------- + +* Create a `struct git_graph` by calling `graph_init()`. When using the + revision walking API, this is done automatically by `setup_revisions()` if + the '--graph' option is supplied. + +* Use the revision walking API to walk through a group of contiguous commits. + The `get_revision()` function automatically calls `graph_update()` each time + it is invoked. + +* For each commit, call `graph_next_line()` repeatedly, until + `graph_is_commit_finished()` returns non-zero. Each call go + `graph_next_line()` will output a single line of the graph. The resulting + lines will not contain any newlines. `graph_next_line()` returns 1 if the + resulting line contains the current commit, or 0 if this is merely a line + needed to adjust the graph before or after the current commit. This return + value can be used to determine where to print the commit summary information + alongside the graph output. + +Limitations +----------- + +* `graph_update()` must be called with commits in topological order. It should + not be called on a commit if it has already been invoked with an ancestor of + that commit, or the graph output will be incorrect. + +* `graph_update()` must be called on a contiguous group of commits. If + `graph_update()` is called on a particular commit, it should later be called + on all parents of that commit. Parents must not be skipped, or the graph + output will appear incorrect. ++ +`graph_update()` may be used on a pruned set of commits only if the parent list +has been rewritten so as to include only ancestors from the pruned set. + +* The graph API does not currently support reverse commit ordering. In + order to implement reverse ordering, the graphing API needs an + (efficient) mechanism to find the children of a commit. + +Sample usage +------------ + +------------ +struct commit *commit; +struct git_graph *graph = graph_init(opts); + +while ((commit = get_revision(opts)) != NULL) { + graph_update(graph, commit); + while (!graph_is_commit_finished(graph)) + { + struct strbuf sb; + int is_commit_line; + + strbuf_init(&sb, 0); + is_commit_line = graph_next_line(graph, &sb); + fputs(sb.buf, stdout); + + if (is_commit_line) + log_tree_commit(opts, commit); + else + putchar(opts->diffopt.line_termination); + } +} + +graph_release(graph); +------------ + +Sample output +------------- + +The following is an example of the output from the graph API. This output does +not include any commit summary information--callers are responsible for +outputting that information, if desired. + +------------ +* +* +M +|\ +* | +| | * +| \ \ +| \ \ +M-. \ \ +|\ \ \ \ +| | * | | +| | | | | * +| | | | | * +| | | | | M +| | | | | |\ +| | | | | | * +| * | | | | | +| | | | | M \ +| | | | | |\ | +| | | | * | | | +| | | | * | | | +* | | | | | | | +| |/ / / / / / +|/| / / / / / +* | | | | | | +|/ / / / / / +* | | | | | +| | | | | * +| | | | |/ +| | | | * +------------ diff --git a/Documentation/technical/api-parse-options.txt b/Documentation/technical/api-parse-options.txt index b7cda94f54..539863b1f9 100644 --- a/Documentation/technical/api-parse-options.txt +++ b/Documentation/technical/api-parse-options.txt @@ -1,6 +1,206 @@ parse-options API ================= -Talk about <parse-options.h> +The parse-options API is used to parse and massage options in git +and to provide a usage help with consistent look. -(Pierre) +Basics +------ + +The argument vector `argv[]` may usually contain mandatory or optional +'non-option arguments', e.g. a filename or a branch, and 'options'. +Options are optional arguments that start with a dash and +that allow to change the behavior of a command. + +* There are basically three types of options: + 'boolean' options, + options with (mandatory) 'arguments' and + options with 'optional arguments' + (i.e. a boolean option that can be adjusted). + +* There are basically two forms of options: + 'Short options' consist of one dash (`-`) and one alphanumeric + character. + 'Long options' begin with two dashes (`\--`) and some + alphanumeric characters. + +* Options are case-sensitive. + Please define 'lower-case long options' only. + +The parse-options API allows: + +* 'sticked' and 'separate form' of options with arguments. + `-oArg` is sticked, `-o Arg` is separate form. + `\--option=Arg` is sticked, `\--option Arg` is separate form. + +* Long options may be 'abbreviated', as long as the abbreviation + is unambiguous. + +* Short options may be bundled, e.g. `-a -b` can be specified as `-ab`. + +* Boolean long options can be 'negated' (or 'unset') by prepending + `no-`, e.g. `\--no-abbrev` instead of `\--abbrev`. + +* Options and non-option arguments can clearly be separated using the `\--` + option, e.g. `-a -b \--option \-- \--this-is-a-file` indicates that + `\--this-is-a-file` must not be processed as an option. + +Steps to parse options +---------------------- + +. `#include "parse-options.h"` + +. define a NULL-terminated + `static const char * const builtin_foo_usage[]` array + containing alternative usage strings + +. define `builtin_foo_options` array as described below + in section 'Data Structure'. + +. in `cmd_foo(int argc, const char **argv, const char *prefix)` + call + + argc = parse_options(argc, argv, builtin_foo_options, builtin_foo_usage, flags); ++ +`parse_options()` will filter out the processed options of `argv[]` and leave the +non-option arguments in `argv[]`. +`argc` is updated appropriately because of the assignment. ++ +Flags are the bitwise-or of: + +`PARSE_OPT_KEEP_DASHDASH`:: + Keep the `\--` that usually separates options from + non-option arguments. + +`PARSE_OPT_STOP_AT_NON_OPTION`:: + Usually the whole argument vector is massaged and reordered. + Using this flag, processing is stopped at the first non-option + argument. + +Data Structure +-------------- + +The main data structure is an array of the `option` struct, +say `static struct option builtin_add_options[]`. +There are some macros to easily define options: + +`OPT__ABBREV(&int_var)`:: + Add `\--abbrev[=<n>]`. + +`OPT__DRY_RUN(&int_var)`:: + Add `-n, \--dry-run`. + +`OPT__QUIET(&int_var)`:: + Add `-q, \--quiet`. + +`OPT__VERBOSE(&int_var)`:: + Add `-v, \--verbose`. + +`OPT_GROUP(description)`:: + Start an option group. `description` is a short string that + describes the group or an empty string. + Start the description with an upper-case letter. + +`OPT_BOOLEAN(short, long, &int_var, description)`:: + Introduce a boolean option. + `int_var` is incremented on each use. + +`OPT_BIT(short, long, &int_var, description, mask)`:: + Introduce a boolean option. + If used, `int_var` is bitwise-ored with `mask`. + +`OPT_SET_INT(short, long, &int_var, description, integer)`:: + Introduce a boolean option. + If used, set `int_var` to `integer`. + +`OPT_SET_PTR(short, long, &ptr_var, description, ptr)`:: + Introduce a boolean option. + If used, set `ptr_var` to `ptr`. + +`OPT_STRING(short, long, &str_var, arg_str, description)`:: + Introduce an option with string argument. + The string argument is put into `str_var`. + +`OPT_INTEGER(short, long, &int_var, description)`:: + Introduce an option with integer argument. + The integer is put into `int_var`. + +`OPT_DATE(short, long, &int_var, description)`:: + Introduce an option with date argument, see `approxidate()`. + The timestamp is put into `int_var`. + +`OPT_CALLBACK(short, long, &var, arg_str, description, func_ptr)`:: + Introduce an option with argument. + The argument will be fed into the function given by `func_ptr` + and the result will be put into `var`. + See 'Option Callbacks' below for a more elaborate description. + +`OPT_ARGUMENT(long, description)`:: + Introduce a long-option argument that will be kept in `argv[]`. + + +The last element of the array must be `OPT_END()`. + +If not stated otherwise, interpret the arguments as follows: + +* `short` is a character for the short option + (e.g. `\'e\'` for `-e`, use `0` to omit), + +* `long` is a string for the long option + (e.g. `"example"` for `\--example`, use `NULL` to omit), + +* `int_var` is an integer variable, + +* `str_var` is a string variable (`char *`), + +* `arg_str` is the string that is shown as argument + (e.g. `"branch"` will result in `<branch>`). + If set to `NULL`, three dots (`...`) will be displayed. + +* `description` is a short string to describe the effect of the option. + It shall begin with a lower-case letter and a full stop (`.`) shall be + omitted at the end. + +Option Callbacks +---------------- + +The function must be defined in this form: + + int func(const struct option *opt, const char *arg, int unset) + +The callback mechanism is as follows: + +* Inside `funct`, the only interesting member of the structure + given by `opt` is the void pointer `opt->value`. + `\*opt->value` will be the value that is saved into `var`, if you + use `OPT_CALLBACK()`. + For example, do `*(unsigned long *)opt->value = 42;` to get 42 + into an `unsigned long` variable. + +* Return value `0` indicates success and non-zero return + value will invoke `usage_with_options()` and, thus, die. + +* If the user negates the option, `arg` is `NULL` and `unset` is 1. + +Sophisticated option parsing +---------------------------- + +If you need, for example, option callbacks with optional arguments +or without arguments at all, or if you need other special cases, +that are not handled by the macros above, you need to specify the +members of the `option` structure manually. + +This is not covered in this document, but well documented +in `parse-options.h` itself. + +Examples +-------- + +See `test-parse-options.c` and +`builtin-add.c`, +`builtin-clone.c`, +`builtin-commit.c`, +`builtin-fetch.c`, +`builtin-fsck.c`, +`builtin-rm.c` +for real-world examples. diff --git a/Documentation/technical/api-path-list.txt b/Documentation/technical/api-path-list.txt deleted file mode 100644 index d077683171..0000000000 --- a/Documentation/technical/api-path-list.txt +++ /dev/null @@ -1,9 +0,0 @@ -path-list API -============= - -Talk about <path-list.h>, things like - -* it is not just paths but strings in general; -* the calling sequence. - -(Dscho) diff --git a/Documentation/technical/api-remote.txt b/Documentation/technical/api-remote.txt new file mode 100644 index 0000000000..073b22bd83 --- /dev/null +++ b/Documentation/technical/api-remote.txt @@ -0,0 +1,123 @@ +Remotes configuration API +========================= + +The API in remote.h gives access to the configuration related to +remotes. It handles all three configuration mechanisms historically +and currently used by git, and presents the information in a uniform +fashion. Note that the code also handles plain URLs without any +configuration, giving them just the default information. + +struct remote +------------- + +`name`:: + + The user's nickname for the remote + +`url`:: + + An array of all of the url_nr URLs configured for the remote + +`push`:: + + An array of refspecs configured for pushing, with + push_refspec being the literal strings, and push_refspec_nr + being the quantity. + +`fetch`:: + + An array of refspecs configured for fetching, with + fetch_refspec being the literal strings, and fetch_refspec_nr + being the quantity. + +`fetch_tags`:: + + The setting for whether to fetch tags (as a separate rule from + the configured refspecs); -1 means never to fetch tags, 0 + means to auto-follow tags based on the default heuristic, 1 + means to always auto-follow tags, and 2 means to fetch all + tags. + +`receivepack`, `uploadpack`:: + + The configured helper programs to run on the remote side, for + git-native protocols. + +`http_proxy`:: + + The proxy to use for curl (http, https, ftp, etc.) URLs. + +struct remotes can be found by name with remote_get(), and iterated +through with for_each_remote(). remote_get(NULL) will return the +default remote, given the current branch and configuration. + +struct refspec +-------------- + +A struct refspec holds the parsed interpretation of a refspec. If it +will force updates (starts with a '+'), force is true. If it is a +pattern (sides end with '*') pattern is true. src and dest are the two +sides (if a pattern, only the part outside of the wildcards); if there +is only one side, it is src, and dst is NULL; if sides exist but are +empty (i.e., the refspec either starts or ends with ':'), the +corresponding side is "". + +This parsing can be done to an array of strings to give an array of +struct refpsecs with parse_ref_spec(). + +remote_find_tracking(), given a remote and a struct refspec with +either src or dst filled out, will fill out the other such that the +result is in the "fetch" specification for the remote (note that this +evaluates patterns and returns a single result). + +struct branch +------------- + +Note that this may end up moving to branch.h + +struct branch holds the configuration for a branch. It can be looked +up with branch_get(name) for "refs/heads/{name}", or with +branch_get(NULL) for HEAD. + +It contains: + +`name`:: + + The short name of the branch. + +`refname`:: + + The full path for the branch ref. + +`remote_name`:: + + The name of the remote listed in the configuration. + +`remote`:: + + The struct remote for that remote. + +`merge_name`:: + + An array of the "merge" lines in the configuration. + +`merge`:: + + An array of the struct refspecs used for the merge lines. That + is, merge[i]->dst is a local tracking ref which should be + merged into this branch by default. + +`merge_nr`:: + + The number of merge configurations + +branch_has_merge_config() returns true if the given branch has merge +configuration given. + +Other stuff +----------- + +There is other stuff in remote.h that is related, in general, to the +process of interacting with remotes. + +(Daniel Barkalow) diff --git a/Documentation/technical/api-revision-walking.txt b/Documentation/technical/api-revision-walking.txt index 01a24551af..996da0503a 100644 --- a/Documentation/technical/api-revision-walking.txt +++ b/Documentation/technical/api-revision-walking.txt @@ -1,9 +1,67 @@ revision walking API ==================== +The revision walking API offers functions to build a list of revisions +and then iterate over that list. + +Calling sequence +---------------- + +The walking API has a given calling sequence: first you need to +initialize a rev_info structure, then add revisions to control what kind +of revision list do you want to get, finally you can iterate over the +revision list. + +Functions +--------- + +`init_revisions`:: + + Initialize a rev_info structure with default values. The second + parameter may be NULL or can be prefix path, and then the `.prefix` + variable will be set to it. This is typically the first function you + want to call when you want to deal with a revision list. After calling + this function, you are free to customize options, like set + `.ignore_merges` to 0 if you don't want to ignore merges, and so on. See + `revision.h` for a complete list of available options. + +`add_pending_object`:: + + This function can be used if you want to add commit objects as revision + information. You can use the `UNINTERESTING` object flag to indicate if + you want to include or exclude the given commit (and commits reachable + from the given commit) from the revision list. ++ +NOTE: If you have the commits as a string list then you probably want to +use setup_revisions(), instead of parsing each string and using this +function. + +`setup_revisions`:: + + Parse revision information, filling in the `rev_info` structure, and + removing the used arguments from the argument list. Returns the number + of arguments left that weren't recognized, which are also moved to the + head of the argument list. The last parameter is used in case no + parameter given by the first two arguments. + +`prepare_revision_walk`:: + + Prepares the rev_info structure for a walk. You should check if it + returns any error (non-zero return code) and if it does not, you can + start using get_revision() to do the iteration. + +`get_revision`:: + + Takes a pointer to a `rev_info` structure and iterates over it, + returning a `struct commit *` each time you call it. The end of the + revision list is indicated by returning a NULL pointer. + +Data structures +--------------- + Talk about <revision.h>, things like: * two diff_options, one for path limiting, another for output; -* calling sequence: init_revisions(), setup_revsions(), get_revision(); +* remaining functions; (Linus, JC, Dscho) diff --git a/Documentation/technical/api-run-command.txt b/Documentation/technical/api-run-command.txt index 19d2f64f73..75aa5d4923 100644 --- a/Documentation/technical/api-run-command.txt +++ b/Documentation/technical/api-run-command.txt @@ -1,10 +1,172 @@ run-command API =============== -Talk about <run-command.h>, and things like: +The run-command API offers a versatile tool to run sub-processes with +redirected input and output as well as with a modified environment +and an alternate current directory. -* Environment the command runs with (e.g. GIT_DIR); -* File descriptors and pipes; -* Exit status; +A similar API offers the capability to run a function asynchronously, +which is primarily used to capture the output that the function +produces in the caller in order to process it. -(Hannes, Dscho, Shawn) + +Functions +--------- + +`start_command`:: + + Start a sub-process. Takes a pointer to a `struct child_process` + that specifies the details and returns pipe FDs (if requested). + See below for details. + +`finish_command`:: + + Wait for the completion of a sub-process that was started with + start_command(). + +`run_command`:: + + A convenience function that encapsulates a sequence of + start_command() followed by finish_command(). Takes a pointer + to a `struct child_process` that specifies the details. + +`run_command_v_opt`, `run_command_v_opt_cd`, `run_command_v_opt_cd_env`:: + + Convenience functions that encapsulate a sequence of + start_command() followed by finish_command(). The argument argv + specifies the program and its arguments. The argument opt is zero + or more of the flags `RUN_COMMAND_NO_STDIN`, `RUN_GIT_CMD`, or + `RUN_COMMAND_STDOUT_TO_STDERR` that correspond to the members + .no_stdin, .git_cmd, .stdout_to_stderr of `struct child_process`. + The argument dir corresponds the member .dir. The argument env + corresponds to the member .env. + +`start_async`:: + + Run a function asynchronously. Takes a pointer to a `struct + async` that specifies the details and returns a pipe FD + from which the caller reads. See below for details. + +`finish_async`:: + + Wait for the completion of an asynchronous function that was + started with start_async(). + + +Data structures +--------------- + +* `struct child_process` + +This describes the arguments, redirections, and environment of a +command to run in a sub-process. + +The caller: + +1. allocates and clears (memset(&chld, 0, sizeof(chld));) a + struct child_process variable; +2. initializes the members; +3. calls start_command(); +4. processes the data; +5. closes file descriptors (if necessary; see below); +6. calls finish_command(). + +The .argv member is set up as an array of string pointers (NULL +terminated), of which .argv[0] is the program name to run (usually +without a path). If the command to run is a git command, set argv[0] to +the command name without the 'git-' prefix and set .git_cmd = 1. + +The members .in, .out, .err are used to redirect stdin, stdout, +stderr as follows: + +. Specify 0 to request no special redirection. No new file descriptor + is allocated. The child process simply inherits the channel from the + parent. + +. Specify -1 to have a pipe allocated; start_command() replaces -1 + by the pipe FD in the following way: + + .in: Returns the writable pipe end into which the caller writes; + the readable end of the pipe becomes the child's stdin. + + .out, .err: Returns the readable pipe end from which the caller + reads; the writable end of the pipe end becomes child's + stdout/stderr. + + The caller of start_command() must close the so returned FDs + after it has completed reading from/writing to it! + +. Specify a file descriptor > 0 to be used by the child: + + .in: The FD must be readable; it becomes child's stdin. + .out: The FD must be writable; it becomes child's stdout. + .err > 0 is not supported. + + The specified FD is closed by start_command(), even if it fails to + run the sub-process! + +. Special forms of redirection are available by setting these members + to 1: + + .no_stdin, .no_stdout, .no_stderr: The respective channel is + redirected to /dev/null. + + .stdout_to_stderr: stdout of the child is redirected to its + stderr. This happens after stderr is itself redirected. + So stdout will follow stderr to wherever it is + redirected. + +To modify the environment of the sub-process, specify an array of +string pointers (NULL terminated) in .env: + +. If the string is of the form "VAR=value", i.e. it contains '=' + the variable is added to the child process's environment. + +. If the string does not contain '=', it names an environment + variable that will be removed from the child process's environment. + +To specify a new initial working directory for the sub-process, +specify it in the .dir member. + + +* `struct async` + +This describes a function to run asynchronously, whose purpose is +to produce output that the caller reads. + +The caller: + +1. allocates and clears (memset(&asy, 0, sizeof(asy));) a + struct async variable; +2. initializes .proc and .data; +3. calls start_async(); +4. processes the data by reading from the fd in .out; +5. closes .out; +6. calls finish_async(). + +The function pointer in .proc has the following signature: + + int proc(int fd, void *data); + +. fd specifies a writable file descriptor to which the function must + write the data that it produces. The function *must* close this + descriptor before it returns. + +. data is the value that the caller has specified in the .data member + of struct async. + +. The return value of the function is 0 on success and non-zero + on failure. If the function indicates failure, finish_async() will + report failure as well. + + +There are serious restrictions on what the asynchronous function can do +because this facility is implemented by a pipe to a forked process on +UNIX, but by a thread in the same address space on Windows: + +. It cannot change the program's state (global variables, environment, + etc.) in a way that the caller notices; in other words, .out is the + only communication channel to the caller. + +. It must not change the program's state that the caller of the + facility also uses. diff --git a/Documentation/technical/api-strbuf.txt b/Documentation/technical/api-strbuf.txt index a52e4f36d5..a9668e5f2d 100644 --- a/Documentation/technical/api-strbuf.txt +++ b/Documentation/technical/api-strbuf.txt @@ -1,6 +1,241 @@ strbuf API ========== -Talk about <strbuf.h> +strbuf's are meant to be used with all the usual C string and memory +APIs. Given that the length of the buffer is known, it's often better to +use the mem* functions than a str* one (memchr vs. strchr e.g.). +Though, one has to be careful about the fact that str* functions often +stop on NULs and that strbufs may have embedded NULs. -(Pierre, JC) +An strbuf is NUL terminated for convenience, but no function in the +strbuf API actually relies on the string being free of NULs. + +strbufs has some invariants that are very important to keep in mind: + +. The `buf` member is never NULL, so you it can be used in any usual C +string operations safely. strbuf's _have_ to be initialized either by +`strbuf_init()` or by `= STRBUF_INIT` before the invariants, though. ++ +Do *not* assume anything on what `buf` really is (e.g. if it is +allocated memory or not), use `strbuf_detach()` to unwrap a memory +buffer from its strbuf shell in a safe way. That is the sole supported +way. This will give you a malloced buffer that you can later `free()`. ++ +However, it it totally safe to modify anything in the string pointed by +the `buf` member, between the indices `0` and `len-1` (inclusive). + +. The `buf` member is a byte array that has at least `len + 1` bytes + allocated. The extra byte is used to store a `'\0'`, allowing the + `buf` member to be a valid C-string. Every strbuf function ensure this + invariant is preserved. ++ +NOTE: It is OK to "play" with the buffer directly if you work it this + way: ++ +---- +strbuf_grow(sb, SOME_SIZE); <1> +strbuf_setlen(sb, sb->len + SOME_OTHER_SIZE); +---- +<1> Here, the memory array starting at `sb->buf`, and of length +`strbuf_avail(sb)` is all yours, and you can be sure that +`strbuf_avail(sb)` is at least `SOME_SIZE`. ++ +NOTE: `SOME_OTHER_SIZE` must be smaller or equal to `strbuf_avail(sb)`. ++ +Doing so is safe, though if it has to be done in many places, adding the +missing API to the strbuf module is the way to go. ++ +WARNING: Do _not_ assume that the area that is yours is of size `alloc +- 1` even if it's true in the current implementation. Alloc is somehow a +"private" member that should not be messed with. Use `strbuf_avail()` +instead. + +Data structures +--------------- + +* `struct strbuf` + +This is string buffer structure. The `len` member can be used to +determine the current length of the string, and `buf` member provides access to +the string itself. + +Functions +--------- + +* Life cycle + +`strbuf_init`:: + + Initialize the structure. The second parameter can be zero or a bigger + number to allocate memory, in case you want to prevent further reallocs. + +`strbuf_release`:: + + Release a string buffer and the memory it used. You should not use the + string buffer after using this function, unless you initialize it again. + +`strbuf_detach`:: + + Detach the string from the strbuf and returns it; you now own the + storage the string occupies and it is your responsibility from then on + to release it with `free(3)` when you are done with it. + +`strbuf_attach`:: + + Attach a string to a buffer. You should specify the string to attach, + the current length of the string and the amount of allocated memory. + The amount must be larger than the string length, because the string you + pass is supposed to be a NUL-terminated string. This string _must_ be + malloc()ed, and after attaching, the pointer cannot be relied upon + anymore, and neither be free()d directly. + +`strbuf_swap`:: + + Swap the contents of two string buffers. + +* Related to the size of the buffer + +`strbuf_avail`:: + + Determine the amount of allocated but unused memory. + +`strbuf_grow`:: + + Ensure that at least this amount of unused memory is available after + `len`. This is used when you know a typical size for what you will add + and want to avoid repetitive automatic resizing of the underlying buffer. + This is never a needed operation, but can be critical for performance in + some cases. + +`strbuf_setlen`:: + + Set the length of the buffer to a given value. This function does *not* + allocate new memory, so you should not perform a `strbuf_setlen()` to a + length that is larger than `len + strbuf_avail()`. `strbuf_setlen()` is + just meant as a 'please fix invariants from this strbuf I just messed + with'. + +`strbuf_reset`:: + + Empty the buffer by setting the size of it to zero. + +* Related to the contents of the buffer + +`strbuf_rtrim`:: + + Strip whitespace from the end of a string. + +`strbuf_cmp`:: + + Compare two buffers. Returns an integer less than, equal to, or greater + than zero if the first buffer is found, respectively, to be less than, + to match, or be greater than the second buffer. + +* Adding data to the buffer + +NOTE: All of these functions in this section will grow the buffer as + necessary. + +`strbuf_addch`:: + + Add a single character to the buffer. + +`strbuf_insert`:: + + Insert data to the given position of the buffer. The remaining contents + will be shifted, not overwritten. + +`strbuf_remove`:: + + Remove given amount of data from a given position of the buffer. + +`strbuf_splice`:: + + Remove the bytes between `pos..pos+len` and replace it with the given + data. + +`strbuf_add`:: + + Add data of given length to the buffer. + +`strbuf_addstr`:: + +Add a NUL-terminated string to the buffer. ++ +NOTE: This function will *always* be implemented as an inline or a macro +that expands to: ++ +---- +strbuf_add(..., s, strlen(s)); +---- ++ +Meaning that this is efficient to write things like: ++ +---- +strbuf_addstr(sb, "immediate string"); +---- + +`strbuf_addbuf`:: + + Copy the contents of an other buffer at the end of the current one. + +`strbuf_adddup`:: + + Copy part of the buffer from a given position till a given length to the + end of the buffer. + +`strbuf_expand`:: + + This function can be used to expand a format string containing + placeholders. To that end, it parses the string and calls the specified + function for every percent sign found. ++ +The callback function is given a pointer to the character after the `%` +and a pointer to the struct strbuf. It is expected to add the expanded +version of the placeholder to the strbuf, e.g. to add a newline +character if the letter `n` appears after a `%`. The function returns +the length of the placeholder recognized and `strbuf_expand()` skips +over it. ++ +All other characters (non-percent and not skipped ones) are copied +verbatim to the strbuf. If the callback returned zero, meaning that the +placeholder is unknown, then the percent sign is copied, too. ++ +In order to facilitate caching and to make it possible to give +parameters to the callback, `strbuf_expand()` passes a context pointer, +which can be used by the programmer of the callback as she sees fit. + +`strbuf_addf`:: + + Add a formatted string to the buffer. + +`strbuf_fread`:: + + Read a given size of data from a FILE* pointer to the buffer. ++ +NOTE: The buffer is rewinded if the read fails. If -1 is returned, +`errno` must be consulted, like you would do for `read(3)`. +`strbuf_read()`, `strbuf_read_file()` and `strbuf_getline()` has the +same behaviour as well. + +`strbuf_read`:: + + Read the contents of a given file descriptor. The third argument can be + used to give a hint about the file size, to avoid reallocs. + +`strbuf_read_file`:: + + Read the contents of a file, specified by its path. The third argument + can be used to give a hint about the file size, to avoid reallocs. + +`strbuf_getline`:: + + Read a line from a FILE* pointer. The second argument specifies the line + terminator character, typically `'\n'`. + +`stripspace`:: + + Strip whitespace from a buffer. The second parameter controls if + comments are considered contents to be removed or not. + +`launch_editor`:: diff --git a/Documentation/technical/api-string-list.txt b/Documentation/technical/api-string-list.txt new file mode 100644 index 0000000000..293bb15d20 --- /dev/null +++ b/Documentation/technical/api-string-list.txt @@ -0,0 +1,128 @@ +string-list API +=============== + +The string_list API offers a data structure and functions to handle sorted +and unsorted string lists. + +The 'string_list' struct used to be called 'path_list', but was renamed +because it is not specific to paths. + +The caller: + +. Allocates and clears a `struct string_list` variable. + +. Initializes the members. You might want to set the flag `strdup_strings` + if the strings should be strdup()ed. For example, this is necessary + when you add something like git_path("..."), since that function returns + a static buffer that will change with the next call to git_path(). ++ +If you need something advanced, you can manually malloc() the `items` +member (you need this if you add things later) and you should set the +`nr` and `alloc` members in that case, too. + +. Adds new items to the list, using `string_list_append` or + `string_list_insert`. + +. Can check if a string is in the list using `string_list_has_string` or + `unsorted_string_list_has_string` and get it from the list using + `string_list_lookup` for sorted lists. + +. Can sort an unsorted list using `sort_string_list`. + +. Finally it should free the list using `string_list_clear`. + +Example: + +---- +struct string_list list; +int i; + +memset(&list, 0, sizeof(struct string_list)); +string_list_append("foo", &list); +string_list_append("bar", &list); +for (i = 0; i < list.nr; i++) + printf("%s\n", list.items[i].string) +---- + +NOTE: It is more efficient to build an unsorted list and sort it +afterwards, instead of building a sorted list (`O(n log n)` instead of +`O(n^2)`). ++ +However, if you use the list to check if a certain string was added +already, you should not do that (using unsorted_string_list_has_string()), +because the complexity would be quadratic again (but with a worse factor). + +Functions +--------- + +* General ones (works with sorted and unsorted lists as well) + +`print_string_list`:: + + Dump a string_list to stdout, useful mainly for debugging purposes. It + can take an optional header argument and it writes out the + string-pointer pairs of the string_list, each one in its own line. + +`string_list_clear`:: + + Free a string_list. The `string` pointer of the items will be freed in + case the `strdup_strings` member of the string_list is set. The second + parameter controls if the `util` pointer of the items should be freed + or not. + +* Functions for sorted lists only + +`string_list_has_string`:: + + Determine if the string_list has a given string or not. + +`string_list_insert`:: + + Insert a new element to the string_list. The returned pointer can be + handy if you want to write something to the `util` pointer of the + string_list_item containing the just added string. ++ +Since this function uses xrealloc() (which die()s if it fails) if the +list needs to grow, it is safe not to check the pointer. I.e. you may +write `string_list_insert(...)->util = ...;`. + +`string_list_lookup`:: + + Look up a given string in the string_list, returning the containing + string_list_item. If the string is not found, NULL is returned. + +* Functions for unsorted lists only + +`string_list_append`:: + + Append a new string to the end of the string_list. + +`sort_string_list`:: + + Make an unsorted list sorted. + +`unsorted_string_list_has_string`:: + + It's like `string_list_has_string()` but for unsorted lists. ++ +This function needs to look through all items, as opposed to its +counterpart for sorted lists, which performs a binary search. + +Data structures +--------------- + +* `struct string_list_item` + +Represents an item of the list. The `string` member is a pointer to the +string, and you may use the `util` member for any purpose, if you want. + +* `struct string_list` + +Represents the list itself. + +. The array of items are available via the `items` member. +. The `nr` member contains the number of items stored in the list. +. The `alloc` member is used to avoid reallocating at every insertion. + You should not tamper with it. +. Setting the `strdup_strings` member to 1 will strdup() the strings + before adding them, see above. diff --git a/Documentation/technical/pack-format.txt b/Documentation/technical/pack-format.txt index aa87756a55..1803e64e46 100644 --- a/Documentation/technical/pack-format.txt +++ b/Documentation/technical/pack-format.txt @@ -103,10 +103,24 @@ Pack file entry: <+ packed object data: If it is not DELTA, then deflated bytes (the size above is the size before compression). - If it is DELTA, then + If it is REF_DELTA, then 20-byte base object name SHA1 (the size above is the size of the delta data that follows). delta data, deflated. + If it is OFS_DELTA, then + n-byte offset (see below) interpreted as a negative + offset from the type-byte of the header of the + ofs-delta entry (the size above is the size of + the delta data that follows). + delta data, deflated. + + offset encoding: + n bytes with MSB set in all but the last one. + The offset is then the number constructed by + concatenating the lower 7 bit of each byte, and + for n >= 2 adding 2^7 + 2^14 + ... + 2^(7*(n-1)) + to the result. + = Version 2 pack-*.idx files support packs larger than 4 GiB, and diff --git a/Documentation/technical/racy-git.txt b/Documentation/technical/racy-git.txt index 5030d9f2f8..6bdf034b3a 100644 --- a/Documentation/technical/racy-git.txt +++ b/Documentation/technical/racy-git.txt @@ -184,7 +184,7 @@ In a large project where raciness avoidance cost really matters, however, the initial computation of all object names in the index takes more than one second, and the index file is written out after all that happens. Therefore the timestamp of the -index file will be more than one seconds later than the the +index file will be more than one seconds later than the youngest file in the working tree. This means that in these cases there actually will not be any racily clean entry in the resulting index. diff --git a/Documentation/urls-remotes.txt b/Documentation/urls-remotes.txt index 5dd1f836c6..504ae8a53b 100644 --- a/Documentation/urls-remotes.txt +++ b/Documentation/urls-remotes.txt @@ -1,55 +1,82 @@ include::urls.txt[] -REMOTES -------- +REMOTES[[REMOTES]] +------------------ -In addition to the above, as a short-hand, the name of a -file in `$GIT_DIR/remotes` directory can be given; the -named file should be in the following format: +The name of one of the following can be used instead +of a URL as `<repository>` argument: ------------- - URL: one of the above URL format - Push: <refspec> - Pull: <refspec> +* a remote in the git configuration file: `$GIT_DIR/config`, +* a file in the `$GIT_DIR/remotes` directory, or +* a file in the `$GIT_DIR/branches` directory. ------------- +All of these also allow you to omit the refspec from the command line +because they each contain a refspec which git will use by default. -Then such a short-hand is specified in place of -<repository> without <refspec> parameters on the command -line, <refspec> specified on `Push:` lines or `Pull:` -lines are used for `git-push` and `git-fetch`/`git-pull`, -respectively. Multiple `Push:` and `Pull:` lines may -be specified for additional branch mappings. +Named remote in configuration file +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Or, equivalently, in the `$GIT_DIR/config` (note the use -of `fetch` instead of `Pull:`): +You can choose to provide the name of a remote which you had previously +configured using linkgit:git-remote[1], linkgit:git-config[1] +or even by a manual edit to the `$GIT_DIR/config` file. The URL of +this remote will be used to access the repository. The refspec +of this remote will be used by default when you do +not provide a refspec on the command line. The entry in the +config file would appear like this: ------------ - [remote "<remote>"] + [remote "<name>"] url = <url> push = <refspec> fetch = <refspec> - ------------ -The name of a file in `$GIT_DIR/branches` directory can be -specified as an older notation short-hand; the named -file should contain a single line, a URL in one of the -above formats, optionally followed by a hash `#` and the -name of remote head (URL fragment notation). -`$GIT_DIR/branches/<remote>` file that stores a <url> -without the fragment is equivalent to have this in the -corresponding file in the `$GIT_DIR/remotes/` directory. + +Named file in `$GIT_DIR/remotes` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can choose to provide the name of a +file in `$GIT_DIR/remotes`. The URL +in this file will be used to access the repository. The refspec +in this file will be used as default when you do not +provide a refspec on the command line. This file should have the +following format: + +------------ + URL: one of the above URL format + Push: <refspec> + Pull: <refspec> ------------ - URL: <url> - Pull: refs/heads/master:<remote> +`Push:` lines are used by 'git-push' and +`Pull:` lines are used by 'git-pull' and 'git-fetch'. +Multiple `Push:` and `Pull:` lines may +be specified for additional branch mappings. + +Named file in `$GIT_DIR/branches` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +You can choose to provide the name of a +file in `$GIT_DIR/branches`. +The URL in this file will be used to access the repository. +This file should have the following format: + + +------------ + <url>#<head> ------------ -while having `<url>#<head>` is equivalent to +`<url>` is required; `#<head>` is optional. +When you do not provide a refspec on the command line, +git will use the following refspec, where `<head>` defaults to `master`, +and `<repository>` is the name of this file +you provided in the command line. ------------ - URL: <url> - Pull: refs/heads/<head>:<remote> + refs/heads/<head>:<repository> ------------ + + + + diff --git a/Documentation/urls.txt b/Documentation/urls.txt index 81ac17f32a..fa34c67471 100644 --- a/Documentation/urls.txt +++ b/Documentation/urls.txt @@ -44,3 +44,26 @@ endif::git-clone[] ifdef::git-clone[] They are equivalent, except the former implies --local option. endif::git-clone[] + + +If there are a large number of similarly-named remote repositories and +you want to use a different format for them (such that the URLs you +use will be rewritten into URLs that work), you can create a +configuration section of the form: + +------------ + [url "<actual url base>"] + insteadOf = <other url base> +------------ + +For example, with this: + +------------ + [url "git://git.host.xz/"] + insteadOf = host.xz:/path/to/ + insteadOf = work: +------------ + +a URL like "work:repo.git" or like "host.xz:/path/to/repo.git" will be +rewritten in any context that takes a URL to be "git://git.host.xz/repo.git". + diff --git a/Documentation/user-manual.txt b/Documentation/user-manual.txt index 40b0de0877..08d1310bf5 100644 --- a/Documentation/user-manual.txt +++ b/Documentation/user-manual.txt @@ -18,7 +18,7 @@ People needing to do actual development will also want to read Further chapters cover more specialized topics. Comprehensive reference documentation is available through the man -pages. For a command such as "git clone", just use +pages. For a command such as "git clone <repo>", just use ------------------------------------------------ $ man git-clone @@ -178,7 +178,7 @@ As you can see, a commit shows who made the latest change, what they did, and why. Every commit has a 40-hexdigit id, sometimes called the "object name" or the -"SHA1 id", shown on the first line of the "git show" output. You can usually +"SHA1 id", shown on the first line of the "git-show" output. You can usually refer to a commit by a shorter name, such as a tag or a branch name, but this longer name can also be useful. Most importantly, it is a globally unique name for this commit: so if you tell somebody else the object name (for @@ -390,7 +390,7 @@ references with the same shorthand name, see the "SPECIFYING REVISIONS" section of linkgit:git-rev-parse[1]. [[Updating-a-repository-with-git-fetch]] -Updating a repository with git fetch +Updating a repository with git-fetch ------------------------------------ Eventually the developer cloned from will do additional work in her @@ -417,7 +417,7 @@ $ git fetch linux-nfs ------------------------------------------------- New remote-tracking branches will be stored under the shorthand name -that you gave "git remote add", in this case linux-nfs: +that you gave "git-remote add", in this case linux-nfs: ------------------------------------------------- $ git branch -r @@ -479,10 +479,10 @@ Bisecting: 3537 revisions left to test after this ------------------------------------------------- If you run "git branch" at this point, you'll see that git has -temporarily moved you to a new branch named "bisect". This branch -points to a commit (with commit id 65934...) that is reachable from -"master" but not from v2.6.18. Compile and test it, and see whether -it crashes. Assume it does crash. Then: +temporarily moved you in "(no branch)". HEAD is now detached from any +branch and points directly to a commit (with commit id 65934...) that +is reachable from "master" but not from v2.6.18. Compile and test it, +and see whether it crashes. Assume it does crash. Then: ------------------------------------------------- $ git bisect bad @@ -504,8 +504,7 @@ report with the commit id. Finally, run $ git bisect reset ------------------------------------------------- -to return you to the branch you were on before and delete the -temporary "bisect" branch. +to return you to the branch you were on before. Note that the version which git-bisect checks out for you at each point is just a suggestion, and you're free to try a different @@ -518,7 +517,7 @@ $ git bisect visualize ------------------------------------------------- which will run gitk and label the commit it chose with a marker that -says "bisect". Chose a safe-looking commit nearby, note its commit +says "bisect". Choose a safe-looking commit nearby, note its commit id, and check it out with: ------------------------------------------------- @@ -528,6 +527,22 @@ $ git reset --hard fb47ddb2db... then test, run "bisect good" or "bisect bad" as appropriate, and continue. +Instead of "git bisect visualize" and then "git reset --hard +fb47ddb2db...", you might just want to tell git that you want to skip +the current commit: + +------------------------------------------------- +$ git bisect skip +------------------------------------------------- + +In this case, though, git may not eventually be able to tell the first +bad one between some first skipped commits and a latter bad commit. + +There are also ways to automate the bisecting process if you have a +test script that can tell a good from a bad commit. See +linkgit:git-bisect[1] for more information about this and other "git +bisect" features. + [[naming-commits]] Naming commits -------------- @@ -1048,7 +1063,7 @@ $ git diff shows the difference between the working tree and the index file. -Note that "git add" always adds just the current contents of a file +Note that "git-add" always adds just the current contents of a file to the index; further changes to the same file will be ignored unless you run git-add on the file again. @@ -1111,10 +1126,10 @@ Ignoring files A project will often generate files that you do 'not' want to track with git. This typically includes files generated by a build process or temporary backup files made by your editor. Of course, 'not' tracking files with git -is just a matter of 'not' calling "`git add`" on them. But it quickly becomes +is just a matter of 'not' calling "`git-add`" on them. But it quickly becomes annoying to have these untracked files lying around; e.g. they make -"`git add .`" and "`git commit -a`" practically useless, and they keep -showing up in the output of "`git status`". +"`git add .`" practically useless, and they keep showing up in the output of +"`git status`". You can tell git to ignore certain files by creating a file called .gitignore in the top level of your working directory, with contents such as: @@ -1254,16 +1269,15 @@ these three "file stages" represents a different version of the file: ------------------------------------------------- $ git show :1:file.txt # the file in a common ancestor of both branches -$ git show :2:file.txt # the version from HEAD, but including any - # nonconflicting changes from MERGE_HEAD -$ git show :3:file.txt # the version from MERGE_HEAD, but including any - # nonconflicting changes from HEAD. +$ git show :2:file.txt # the version from HEAD. +$ git show :3:file.txt # the version from MERGE_HEAD. ------------------------------------------------- -Since the stage 2 and stage 3 versions have already been updated with -nonconflicting changes, the only remaining differences between them are -the important ones; thus linkgit:git-diff[1] can use the information in -the index to show only those conflicts. +When you ask linkgit:git-diff[1] to show the conflicts, it runs a +three-way diff between the conflicted merge results in the work tree with +stages 2 and 3 to show only hunks whose contents come from both sides, +mixed (in other words, when a hunk's merge results come only from stage 2, +that part is not conflicting and is not shown. Same for stage 3). The diff above shows the differences between the working-tree version of file.txt and the stage 2 and stage 3 versions. So instead of preceding @@ -1304,7 +1318,7 @@ $ git diff -3 file.txt # diff against stage 3 $ git diff --theirs file.txt # same as the above. ------------------------------------------------- -The linkgit:git-log[1] and gitk[1] commands also provide special help +The linkgit:git-log[1] and linkgit:gitk[1] commands also provide special help for merges: ------------------------------------------------- @@ -1450,7 +1464,7 @@ Checking out an old version of a file In the process of undoing a previous bad change, you may find it useful to check out an older version of a particular file using -linkgit:git-checkout[1]. We've used git checkout before to switch +linkgit:git-checkout[1]. We've used git-checkout before to switch branches, but it has quite different behavior if it is given a path name: the command @@ -1548,22 +1562,7 @@ dangling tree b24c2473f1fd3d91352a624795be026d64c8841f Dangling objects are not a problem. At worst they may take up a little extra disk space. They can sometimes provide a last-resort method for -recovering lost work--see <<dangling-objects>> for details. However, if -you wish, you can remove them with linkgit:git-prune[1] or the `--prune` -option to linkgit:git-gc[1]: - -------------------------------------------------- -$ git gc --prune -------------------------------------------------- - -This may be time-consuming. Unlike most other git operations (including -git-gc when run without any options), it is not safe to prune while -other git operations are in progress in the same repository. - -If linkgit:git-fsck[1] complains about sha1 mismatches or missing -objects, you may have a much more serious problem; your best option is -probably restoring from backups. See -<<recovering-from-repository-corruption>> for a detailed discussion. +recovering lost work--see <<dangling-objects>> for details. [[recovering-lost-changes]] Recovering lost changes @@ -1667,7 +1666,7 @@ Sharing development with others =============================== [[getting-updates-with-git-pull]] -Getting updates with git pull +Getting updates with git-pull ----------------------------- After you clone a repository and make a few changes of your own, you @@ -1786,7 +1785,7 @@ Public git repositories Another way to submit changes to a project is to tell the maintainer of that project to pull the changes from your repository using linkgit:git-pull[1]. In the section "<<getting-updates-with-git-pull, -Getting updates with git pull>>" we described this as a way to get +Getting updates with git-pull>>" we described this as a way to get updates from the "main" repository, but it works just as well in the other direction. @@ -1891,12 +1890,11 @@ adjustments to give web clients some extra information they need: $ mv proj.git /home/you/public_html/proj.git $ cd proj.git $ git --bare update-server-info -$ chmod a+x hooks/post-update +$ mv hooks/post-update.sample hooks/post-update ------------------------------------------------- (For an explanation of the last two lines, see -linkgit:git-update-server-info[1], and the documentation -link:hooks.html[Hooks used by git].) +linkgit:git-update-server-info[1] and linkgit:githooks[5].) Advertise the URL of proj.git. Anybody else should then be able to clone or pull from that URL, for example with a command line like: @@ -1980,10 +1978,10 @@ error: failed to push to 'ssh://yourserver.com/~you/proj.git' This can happen, for example, if you: - - use `git reset --hard` to remove already-published commits, or - - use `git commit --amend` to replace already-published commits + - use `git-reset --hard` to remove already-published commits, or + - use `git-commit --amend` to replace already-published commits (as in <<fixing-a-mistake-by-rewriting-history>>), or - - use `git rebase` to rebase any already-published commits (as + - use `git-rebase` to rebase any already-published commits (as in <<using-git-rebase>>). You may force git-push to perform the update anyway by preceding the @@ -2005,10 +2003,10 @@ intend to manage the branch. It's also possible for a push to fail in this way when other people have the right to push to the same repository. In that case, the correct -solution is to retry the push after first updating your work by either a -pull or a fetch followed by a rebase; see the +solution is to retry the push after first updating your work: either by a +pull, or by a fetch followed by a rebase; see the <<setting-up-a-shared-repository,next section>> and -link:cvs-migration.html[git for CVS users] for more. +linkgit:gitcvs-migration[7] for more. [[setting-up-a-shared-repository]] Setting up a shared repository @@ -2017,7 +2015,7 @@ Setting up a shared repository Another way to collaborate is by using a model similar to that commonly used in CVS, where several developers with special rights all push to and pull from a single shared repository. See -link:cvs-migration.html[git for CVS users] for instructions on how to +linkgit:gitcvs-migration[7] for instructions on how to set this up. However, while there is nothing wrong with git's support for shared @@ -2187,7 +2185,7 @@ they are for, or what status they are in. To get a reminder of what changes are in a specific branch, use: ------------------------------------------------- -$ git log linux..branchname | git-shortlog +$ git log linux..branchname | git shortlog ------------------------------------------------- To see whether it has already been merged into the test or release branches, @@ -2448,7 +2446,7 @@ $ git rebase origin ------------------------------------------------- This will remove each of your commits from mywork, temporarily saving -them as patches (in a directory named ".dotest"), update mywork to +them as patches (in a directory named ".git/rebase-apply"), update mywork to point at the latest version of origin, then apply each of the saved patches to the new mywork. The result will look like: @@ -2460,8 +2458,8 @@ patches to the new mywork. The result will look like: ................................................ In the process, it may discover conflicts. In that case it will stop -and allow you to fix the conflicts; after fixing conflicts, use "git -add" to update the index with those contents, and then, instead of +and allow you to fix the conflicts; after fixing conflicts, use "git-add" +to update the index with those contents, and then, instead of running git-commit, just run ------------------------------------------------- @@ -2717,8 +2715,8 @@ master branch. In more detail: git fetch and fast-forwards --------------------------- -In the previous example, when updating an existing branch, "git -fetch" checks to make sure that the most recent commit on the remote +In the previous example, when updating an existing branch, "git-fetch" +checks to make sure that the most recent commit on the remote branch is a descendant of the most recent commit on your copy of the branch before updating your copy of the branch to point at the new commit. Git calls this process a <<fast-forwards,fast forward>>. @@ -2743,7 +2741,7 @@ resulting in a situation like: o--o--o <-- new head of the branch ................................................ -In this case, "git fetch" will fail, and print out a warning. +In this case, "git-fetch" will fail, and print out a warning. In that case, you can still force git to update to the new head, as described in the following section. However, note that in the @@ -2752,7 +2750,7 @@ unless you've already created a reference of your own pointing to them. [[forcing-fetch]] -Forcing git fetch to do non-fast-forward updates +Forcing git-fetch to do non-fast-forward updates ------------------------------------------------ If git fetch fails because the new head of a branch is not a @@ -2828,7 +2826,7 @@ $ git config remote.example.fetch +master:ref/remotes/example/master ------------------------------------------------- Don't do this unless you're sure you won't mind "git fetch" possibly -throwing away commits on mybranch. +throwing away commits on 'example/master'. Also note that all of the above configuration can be performed by directly editing the file .git/config instead of using @@ -2878,7 +2876,7 @@ There are four different types of objects: "blob", "tree", "commit", and "tag". - A <<def_blob_object,"blob" object>> is used to store file data. -- A <<def_tree_object,"tree" object>> is an object that ties one or more +- A <<def_tree_object,"tree" object>> ties one or more "blob" objects into a directory structure. In addition, a tree object can refer to other tree objects, thus creating a directory hierarchy. - A <<def_commit_object,"commit" object>> ties such directory hierarchies @@ -3053,7 +3051,7 @@ Tag Object A tag object contains an object, object type, tag name, the name of the person ("tagger") who created the tag, and a message, which may contain -a signature, as can be seen using the linkgit:git-cat-file[1]: +a signature, as can be seen using linkgit:git-cat-file[1]: ------------------------------------------------ $ git cat-file tag v1.5.0 @@ -3123,7 +3121,7 @@ $ git prune to remove any of the "loose" objects that are now contained in the pack. This will also remove any unreferenced objects (which may be -created when, for example, you use "git reset" to remove a commit). +created when, for example, you use "git-reset" to remove a commit). You can verify that the loose objects are gone by looking at the .git/objects directory or by running @@ -3152,7 +3150,7 @@ branch still exists, as does everything it pointed to. The branch pointer itself just doesn't, since you replaced it with another one. There are also other situations that cause dangling objects. For -example, a "dangling blob" may arise because you did a "git add" of a +example, a "dangling blob" may arise because you did a "git-add" of a file, but then, before you actually committed it and made it part of the bigger picture, you changed something else in that file and committed that *updated* thing--the old state that you added originally ends up @@ -3202,7 +3200,7 @@ Usually, dangling blobs and trees aren't very interesting. They're almost always the result of either being a half-way mergebase (the blob will often even have the conflict markers from a merge in it, if you have had conflicting merges that you fixed up by hand), or simply -because you interrupted a "git fetch" with ^C or something like that, +because you interrupted a "git-fetch" with ^C or something like that, leaving _some_ of the new objects in the object database, but just dangling and useless. @@ -3251,7 +3249,7 @@ it is with linkgit:git-fsck[1]; this may be time-consuming. Assume the output looks like this: ------------------------------------------------ -$ git-fsck --full +$ git fsck --full broken link from tree 2d9263c6d23595e7cb2a21e5ebbb53655278dff8 to blob 4b9458b3786228369c63936db65827de3cc06200 missing blob 4b9458b3786228369c63936db65827de3cc06200 @@ -3475,23 +3473,23 @@ $ cd super $ git init $ for i in a b c d do - git submodule add ~/git/$i + git submodule add ~/git/$i $i done ------------------------------------------------- NOTE: Do not use local URLs here if you plan to publish your superproject! -See what files `git submodule` created: +See what files `git-submodule` created: ------------------------------------------------- $ ls -a . .. .git .gitmodules a b c d ------------------------------------------------- -The `git submodule add` command does a couple of things: +The `git-submodule add <repo> <path>` command does a couple of things: -- It clones the submodule under the current directory and by default checks out - the master branch. +- It clones the submodule from <repo> to the given <path> under the + current directory and by default checks out the master branch. - It adds the submodule's clone path to the linkgit:gitmodules[5] file and adds this file to the index, ready to be committed. - It adds the submodule's current commit ID to the index, ready to be @@ -3534,7 +3532,7 @@ init` to add the submodule repository URLs to `.git/config`: $ git submodule init ------------------------------------------------- -Now use `git submodule update` to clone the repositories and check out the +Now use `git-submodule update` to clone the repositories and check out the commits specified in the superproject: ------------------------------------------------- @@ -3544,8 +3542,8 @@ $ ls -a . .. .git a.txt ------------------------------------------------- -One major difference between `git submodule update` and `git submodule add` is -that `git submodule update` checks out a specific commit, rather than the tip +One major difference between `git-submodule update` and `git-submodule add` is +that `git-submodule update` checks out a specific commit, rather than the tip of a branch. It's like checking out a tag: the head is detached, so you're not working on a branch. @@ -3711,7 +3709,7 @@ removed. The only thing `--remove` means is that update-index will be considering a removed file to be a valid thing, and if the file really does not exist any more, it will update the index accordingly. -As a special case, you can also do `git-update-index --refresh`, which +As a special case, you can also do `git update-index --refresh`, which will refresh the "stat" information of each index to match the current stat information. It will 'not' update the object status itself, and it will only update the fields that are used to quickly test whether @@ -3746,7 +3744,7 @@ unsaved state that you might want to restore later!) your current index. Normal operation is just ------------------------------------------------- -$ git-read-tree <sha1 of tree> +$ git read-tree <sha1 of tree> ------------------------------------------------- and your index file will now be equivalent to the tree that you saved @@ -3769,7 +3767,7 @@ index file with read-tree, and then you need to check out the result with ------------------------------------------------- -$ git-checkout-index filename +$ git checkout-index filename ------------------------------------------------- or, if you want to check out all of the index, use `-a`. @@ -3787,7 +3785,7 @@ from one representation to the other: Tying it all together ~~~~~~~~~~~~~~~~~~~~~ -To commit a tree you have instantiated with "git-write-tree", you'd +To commit a tree you have instantiated with "git write-tree", you'd create a "commit" object that refers to that tree and the history behind it--most notably the "parent" commits that preceded it in history. @@ -3806,7 +3804,7 @@ You create a commit object by giving it the tree that describes the state at the time of the commit, and a list of parents: ------------------------------------------------- -$ git-commit-tree <tree> -p <parent> [-p <parent2> ..] +$ git commit-tree <tree> -p <parent> [-p <parent2> ..] ------------------------------------------------- and then giving the reason for the commit on stdin (either through @@ -3869,14 +3867,14 @@ linkgit:git-cat-file[1] to examine details about the object: ------------------------------------------------- -$ git-cat-file -t <objectname> +$ git cat-file -t <objectname> ------------------------------------------------- shows the type of the object, and once you have the type (which is usually implicit in where you find the object), you can use ------------------------------------------------- -$ git-cat-file blob|tree|commit|tag <objectname> +$ git cat-file blob|tree|commit|tag <objectname> ------------------------------------------------- to show its contents. NOTE! Trees have binary content, and as a result @@ -3890,7 +3888,7 @@ follow the convention of having the top commit name in `.git/HEAD`, you can do ------------------------------------------------- -$ git-cat-file commit HEAD +$ git cat-file commit HEAD ------------------------------------------------- to see what the top commit was. @@ -3914,7 +3912,7 @@ To get the "base" for the merge, you first look up the common parent of two commits with ------------------------------------------------- -$ git-merge-base <commit1> <commit2> +$ git merge-base <commit1> <commit2> ------------------------------------------------- which will return you the commit they are both based on. You should @@ -3922,7 +3920,7 @@ now look up the "tree" objects of those commits, which you can easily do with (for example) ------------------------------------------------- -$ git-cat-file commit <commitname> | head -1 +$ git cat-file commit <commitname> | head -1 ------------------------------------------------- since the tree object information is always the first line in a commit @@ -3939,12 +3937,12 @@ you have in your current index anyway). To do the merge, do ------------------------------------------------- -$ git-read-tree -m -u <origtree> <yourtree> <targettree> +$ git read-tree -m -u <origtree> <yourtree> <targettree> ------------------------------------------------- which will do all trivial merge operations for you directly in the index file, and you can just write the result out with -`git-write-tree`. +`git write-tree`. [[merging-multiple-trees-2]] @@ -3958,18 +3956,18 @@ entries" in it. Such an index tree can 'NOT' be written out to a tree object, and you will have to resolve any such merge clashes using other tools before you can write out the result. -You can examine such index state with `git-ls-files --unmerged` +You can examine such index state with `git ls-files --unmerged` command. An example: ------------------------------------------------ -$ git-read-tree -m $orig HEAD $target -$ git-ls-files --unmerged +$ git read-tree -m $orig HEAD $target +$ git ls-files --unmerged 100644 263414f423d0e4d70dae8fe53fa34614ff3e2860 1 hello.c 100644 06fa6a24256dc7e560efa5687fa84b51f0263c3a 2 hello.c 100644 cc44c73eb783565da5831b4d820c962954019b69 3 hello.c ------------------------------------------------ -Each line of the `git-ls-files --unmerged` output begins with +Each line of the `git ls-files --unmerged` output begins with the blob mode bits, blob SHA1, 'stage number', and the filename. The 'stage number' is git's way to say which tree it came from: stage 1 corresponds to `$orig` tree, stage 2 `HEAD` @@ -3987,9 +3985,9 @@ program, e.g. `diff3`, `merge`, or git's own merge-file, on the blob objects from these three stages yourself, like this: ------------------------------------------------ -$ git-cat-file blob 263414f... >hello.c~1 -$ git-cat-file blob 06fa6a2... >hello.c~2 -$ git-cat-file blob cc44c73... >hello.c~3 +$ git cat-file blob 263414f... >hello.c~1 +$ git cat-file blob 06fa6a2... >hello.c~2 +$ git cat-file blob cc44c73... >hello.c~3 $ git merge-file hello.c~2 hello.c~1 hello.c~3 ------------------------------------------------ @@ -4000,23 +3998,23 @@ merge result for this file is by: ------------------------------------------------- $ mv -f hello.c~2 hello.c -$ git-update-index hello.c +$ git update-index hello.c ------------------------------------------------- -When a path is in unmerged state, running `git-update-index` for +When a path is in the "unmerged" state, running `git-update-index` for that path tells git to mark the path resolved. The above is the description of a git merge at the lowest level, to help you understand what conceptually happens under the hood. -In practice, nobody, not even git itself, uses three `git-cat-file` -for this. There is `git-merge-index` program that extracts the +In practice, nobody, not even git itself, runs `git-cat-file` three times +for this. There is a `git-merge-index` program that extracts the stages to temporary files and calls a "merge" script on it: ------------------------------------------------- -$ git-merge-index git-merge-one-file hello.c +$ git merge-index git-merge-one-file hello.c ------------------------------------------------- -and that is what higher level `git merge -s resolve` is implemented with. +and that is what higher level `git-merge -s resolve` is implemented with. [[hacking-git]] Hacking git @@ -4078,7 +4076,7 @@ Note that terminology has changed since that revision. For example, the README in that revision uses the word "changeset" to describe what we now call a <<def_commit_object,commit>>. -Also, we do not call it "cache" any more, but "index", however, the +Also, we do not call it "cache" any more, but rather "index"; however, the file is still called `cache.h`. Remark: Not much reason to change it now, especially since there is no good single name for it anyway, because it is basically _the_ header file which is included by _all_ of Git's C sources. @@ -4112,7 +4110,7 @@ functions like `get_sha1_basic()` or the likes. This is just to get you into the groove for the most libified part of Git: the revision walker. -Basically, the initial version of `git log` was a shell script: +Basically, the initial version of `git-log` was a shell script: ---------------------------------------------------------------- $ git-rev-list --pretty $(git-rev-parse --default HEAD "$@") | \ @@ -4144,10 +4142,10 @@ commits one by one with the function `get_revision()`. If you are interested in more details of the revision walking process, just have a look at the first implementation of `cmd_log()`; call -`git-show v1.3.0~155^2~4` and scroll down to that function (note that you +`git show v1.3.0{tilde}155^2{tilde}4` and scroll down to that function (note that you no longer need to call `setup_pager()` directly). -Nowadays, `git log` is a builtin, which means that it is _contained_ in the +Nowadays, `git-log` is a builtin, which means that it is _contained_ in the command `git`. The source side of a builtin is - a function called `cmd_<bla>`, typically defined in `builtin-<bla>.c`, @@ -4163,7 +4161,7 @@ since they share quite a bit of code. In that case, the commands which are _not_ named like the `.c` file in which they live have to be listed in `BUILT_INS` in the `Makefile`. -`git log` looks more complicated in C than it does in the original script, +`git-log` looks more complicated in C than it does in the original script, but that allows for a much greater flexibility and performance. Here again it is a good point to take a pause. @@ -4174,9 +4172,9 @@ the organization of Git (after you know the basic concepts). So, think about something which you are interested in, say, "how can I access a blob just knowing the object name of it?". The first step is to find a Git command with which you can do it. In this example, it is either -`git show` or `git cat-file`. +`git-show` or `git-cat-file`. -For the sake of clarity, let's stay with `git cat-file`, because it +For the sake of clarity, let's stay with `git-cat-file`, because it - is plumbing, and @@ -4235,10 +4233,10 @@ To find out how the result can be used, just read on in `cmd_cat_file()`: ----------------------------------- Sometimes, you do not know where to look for a feature. In many such cases, -it helps to search through the output of `git log`, and then `git show` the +it helps to search through the output of `git log`, and then `git-show` the corresponding commit. -Example: If you know that there was some test case for `git bundle`, but +Example: If you know that there was some test case for `git-bundle`, but do not remember where it was (yes, you _could_ `git grep bundle t/`, but that does not illustrate the point!): @@ -4267,7 +4265,10 @@ You see, Git is actually the best tool to find out about the source of Git itself! [[glossary]] -include::glossary.txt[] +GIT Glossary +============ + +include::glossary-content.txt[] [[git-quick-start]] Appendix A: Git Quick Reference |