Git with broken hash generation to generate collisions between object IDs. Don't use this! https://undefinedbehavior.de/posts/commit-vandalism/
Go to file
Shawn O. Pearce f2cba9299b fetch-pack: Finish negotation if remote replies "ACK %s ready"
If multi_ack_detailed was selected in the protocol capabilities
(both client and server are >= Git 1.6.6) the upload-pack side will
send "ACK %s ready" when it knows how to safely cut the graph and
produce a reasonable pack for the want list that was already sent
on the connection.

Upon receiving "ACK %s ready" there is no point in looking at
the remaining commits inside of rev_list.  Sending additional
"have %s" lines to the remote will not construct a smaller pack.
It is unlikely a commit older than the current cut point will have
a better delta base than the cut point itself has.

The original design of this code had fetch-pack empty rev_list by
marking a commit and its transitive ancestors COMMON whenever the
remote side said "ACK %s {continue,common}" and skipping over any
already COMMON commits during get_rev().  This approach does not
work when most of rev_list is actually COMMON_REF, commits that
are pointed to by a reference on the remote, which exist locally,
and which have not yet been sent to the remote as a "have %s" line.

Most of the common references are tags in the ref/tags namespace,
using points in the commit graph that are more than 1 commit apart.
In git.git itself, this is currently 340 tags, 339 of which point to
commits in the commit graph.  fetch-pack pushes all of these into
rev_list, but is unable to mark them COMMON and discard during a
remote's "ACK %s {continue,common}" because it does not parse through
the entire parent chain.  Not parsing the entire parent chain is
an optimization to avoid walking back to the roots of the repository.

Assuming the client is only following the remote (and does not make
its own local commits), the client needs 11 rounds to spin through
the entire list of tags (32 commits per round, ceil(339/32) == 11).
Unfortunately the server knows on the first "have %s" line that
it can produce a good pack, and does not need to see the remaining
320 tags in the other 10 rounds.

Over git:// and ssh:// this isn't as bad as it sounds, the client is
only transmitting an extra 16,000 bytes that it doesn't need to send.

Over smart HTTP, the client must do an additional 10 HTTP POST
requests, each of which incurs round-trip latency, and must upload
the entire state vector of all known common objects.  On the final
POST request, this is 16 KiB worth of data.

Fix all of this by clearing rev_list as soon as the remote side
says it can construct a pack.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2011-03-14 17:25:45 -07:00
block-sha1 msvc: Select the "fast" definition of the {get,put}_be32() macros 2010-06-27 21:59:32 -07:00
builtin fetch-pack: Finish negotation if remote replies "ACK %s ready" 2011-03-14 17:25:45 -07:00
compat Merge branch 'rj/msvc-fix' 2010-12-16 12:55:36 -08:00
contrib Merge branch 'pd/bash-4-completion' 2010-12-22 14:40:55 -08:00
Documentation Git 1.7.4 2011-01-30 19:02:37 -08:00
git_remote_helpers remote-helpers: build in platform independent directory 2010-09-27 10:42:50 -07:00
git-gui Merge branch 'master' of git://repo.or.cz/git-gui 2010-11-05 10:41:09 -07:00
gitk-git Merge branch 'maint' 2011-01-08 23:48:47 -08:00
gitweb Don't pass "--xhtml" to hightlight in gitweb.perl script. 2011-01-27 12:13:07 -08:00
perl perl: bump the required Perl version to 5.8 from 5.6.[21] 2010-09-27 12:37:41 -07:00
ppc
t Merge branch 'maint' 2011-01-27 10:27:49 -08:00
templates Modernize git calling conventions in hook templates 2010-03-20 09:04:38 -07:00
vcs-svn svndump.c: Fix a printf format compiler warning 2011-01-18 16:48:47 -08:00
xdiff Merge branch 'cb/diff-fname-optim' into maint 2010-11-24 12:46:26 -08:00
.gitattributes
.gitignore Merge branch 'nd/setup' 2010-12-28 11:26:55 -08:00
.mailmap Martin Langhoff has a new e-mail address 2010-10-06 12:08:48 -07:00
abspath.c Fix 'clone' failure at DOS root directory. 2010-10-03 23:34:23 +01:00
aclocal.m4 Some platforms lack socklen_t type 2010-05-31 17:36:27 -07:00
advice.c
advice.h
alias.c split_cmdline: Allow caller to access error string 2010-08-11 09:36:23 -07:00
alloc.c
archive-tar.c
archive-zip.c
archive.c archive: improve --verbose description 2010-11-15 10:05:38 -08:00
archive.h
attr.c Add global and system-wide gitattributes 2010-09-01 12:19:36 -07:00
attr.h enums: omit trailing comma for portability 2010-05-31 16:59:27 -07:00
base85.c Standardize do { ... } while (0) style 2010-08-12 15:44:51 -07:00
bisect.c bisect: use find_commit_subject() instead of custom code 2010-07-23 16:12:47 -07:00
bisect.h
blob.c
blob.h
branch.c builtin/checkout: handle -B from detached HEAD correctly 2010-08-09 12:57:17 -07:00
branch.h Change incorrect "remote branch" to "remote tracking branch" in C code 2010-11-03 09:20:47 -07:00
builtin.h Merge branch 'il/remote-fd-ext' 2010-12-08 11:24:14 -08:00
bundle.c bundle: detect if bundle file cannot be created 2010-08-27 16:46:26 -07:00
bundle.h Move bundle specific stuff into bundle.[ch] 2007-09-19 03:22:30 -07:00
cache-tree.c cache_tree_free: Fix small memory leak 2010-09-06 17:32:28 -07:00
cache-tree.h
cache.h Merge branch 'nd/setup' 2010-12-28 11:26:55 -08:00
check_bindir
check-builtins.sh
check-racy.c
color.c default color.status.branch to "same as header" 2010-12-10 12:59:52 -08:00
color.h default color.status.branch to "same as header" 2010-12-10 12:59:52 -08:00
combine-diff.c Merge branch 'rs/diff-no-minimal' into maint 2010-06-21 05:38:50 -07:00
command-list.txt
commit.c Merge branch 'tf/commit-list-prefix' 2010-12-22 14:40:17 -08:00
commit.h Merge branch 'tf/commit-list-prefix' 2010-12-22 14:40:17 -08:00
config.c Merge branch 'nd/setup' 2010-12-28 11:26:55 -08:00
config.mak.in Merge branch 'jk/asciidoc-update' 2010-12-12 21:49:51 -08:00
configure.ac Merge branch 'jk/asciidoc-update' 2010-12-12 21:49:51 -08:00
connect.c Make sure that git_getpass() never returns NULL 2010-09-30 12:22:02 -07:00
convert.c convert filter: supply path to external driver 2010-12-22 10:19:32 -08:00
copy.c
COPYING
csum-file.c
csum-file.h Merge branch 'maint' 2008-10-10 08:39:20 -07:00
ctype.c enums: omit trailing comma for portability 2010-05-31 16:59:27 -07:00
daemon.c daemon: support <directory> arguments again 2011-01-04 11:23:42 -08:00
date.c Export parse_date_basic() to convert a date string to timestamp 2010-07-15 15:35:12 -07:00
decorate.c
decorate.h
delta.h
diff-delta.c fix >4GiB source delta assertion failure 2010-08-21 23:53:26 -07:00
diff-lib.c Submodules: Add the new "ignore" config option for diff and status 2010-08-09 09:01:52 -07:00
diff-no-index.c string_list: Add STRING_LIST_INIT macro and make use of it. 2010-07-05 11:47:57 -07:00
diff.c Merge branch 'ks/blame-worktree-textconv-cached' 2010-12-21 14:30:52 -08:00
diff.h Merge branch 'kb/merge-recursive-rename-threshold' 2010-10-26 21:54:04 -07:00
diffcore-break.c Add a macro DIFF_QUEUE_CLEAR. 2010-05-07 09:34:27 -07:00
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c diffcore-pickaxe.c: a void function shouldn't try to return something 2010-10-06 13:45:18 -07:00
diffcore-rename.c Add a macro DIFF_QUEUE_CLEAR. 2010-05-07 09:34:27 -07:00
diffcore.h diff: pass the entire diff-options to diffcore_pickaxe() 2010-08-31 14:30:28 -07:00
dir.c Merge branch 'nd/maint-relative' into maint 2011-01-19 08:25:31 -08:00
dir.h Merge branch 'nd/maint-fix-add-typo-detection' 2010-12-22 14:40:26 -08:00
editor.c editor: use run_command's shell feature 2010-01-05 23:41:51 -08:00
entry.c entry.c: remove "checkout-index" from error messages 2010-11-29 14:03:07 -08:00
environment.c Merge branch 'nd/setup' 2010-12-28 11:26:55 -08:00
exec_cmd.c exec_cmd: remove unused extern 2011-01-19 08:27:22 -08:00
exec_cmd.h
fast-import.c Merge branch 'maint' 2011-01-27 10:27:49 -08:00
fetch-pack.h
fixup-builtins
fsck.c fsck: fix bogus commit header check 2010-05-28 15:08:27 -07:00
fsck.h
generate-cmdlist.sh
git-add--interactive.perl Merge branch 'jl/add-p-reverse-message' into maint 2010-12-09 10:36:47 -08:00
git-am.sh Merge branch 'jc/maint-rebase-rewrite-last-skip' into maint 2010-12-28 13:43:10 -08:00
git-archimport.perl perl: use "use warnings" instead of -w 2010-09-27 12:37:56 -07:00
git-bisect.sh bisect: check for mandatory argument of 'bisect replay' 2010-10-13 15:07:50 -07:00
git-compat-util.h Merge branch 'jn/thinner-wrapper' 2010-12-03 16:13:06 -08:00
git-cvsexportcommit.perl perl: use "use warnings" instead of -w 2010-09-27 12:37:56 -07:00
git-cvsimport.perl Merge branch 'mg/cvsimport' 2011-01-05 13:30:29 -08:00
git-cvsserver.perl Merge branch 'ab/require-perl-5.8' 2010-10-26 21:57:31 -07:00
git-difftool--helper.sh difftool: provide basename to external tools 2010-12-16 13:01:36 -08:00
git-difftool.perl difftool: Fix failure on Cygwin 2010-12-14 11:13:41 -08:00
git-filter-branch.sh filter-branch: retire --remap-to-ancestor 2010-08-27 16:47:01 -07:00
git-instaweb.sh git instaweb: enable remote_heads 2010-11-17 13:04:52 -08:00
git-lost-found.sh
git-merge-octopus.sh merge-octopus: Work around environment issue on Windows 2010-10-01 23:08:46 +01:00
git-merge-one-file.sh build: propagate $DIFF to scripts 2010-06-05 09:36:13 -07:00
git-merge-resolve.sh
git-mergetool--lib.sh mergetool-lib: make the three-way diff the default for vim/gvim 2010-09-29 13:09:48 -07:00
git-mergetool.sh Merge branch 'cb/maint-mergetool-no-tty' 2010-09-03 09:43:44 -07:00
git-parse-remote.sh Merge branch 'mz/pull-rebase-rebased' 2010-12-12 21:49:51 -08:00
git-pull.sh Merge branch 'jl/fetch-submodule-recursive' 2010-12-16 12:57:15 -08:00
git-quiltimport.sh
git-rebase--interactive.sh Merge branch 'maint' 2011-01-27 10:27:49 -08:00
git-rebase.sh Merge branch 'maint' 2011-01-27 10:27:49 -08:00
git-relink.perl Merge branch 'ab/require-perl-5.8' into maint 2010-12-09 10:35:21 -08:00
git-remote-testgit.py Remove python 2.5'isms 2010-06-13 20:02:50 -07:00
git-repack.sh Merge branch 'tr/maint-git-repack-tmpfile' into maint 2010-11-24 12:47:10 -08:00
git-request-pull.sh git-request-pull.sh: remove -e switch to shell interpreter which breaks ksh 2010-06-02 09:28:12 -07:00
git-send-email.perl Merge branch 'ab/require-perl-5.8' into maint 2010-12-09 10:35:21 -08:00
git-sh-setup.sh Porcelain scripts: Rewrite cryptic "needs update" error message 2010-10-28 13:28:44 -07:00
git-stash.sh shell portability: no "export VAR=VAL" 2010-10-13 11:36:36 -07:00
git-submodule.sh Merge branch 'tr/submodule-relative-scp-url' into maint 2011-01-19 08:26:41 -08:00
git-svn.perl git-svn: allow the mergeinfo property to be set 2010-12-10 04:09:48 +08:00
GIT-VERSION-GEN Git 1.7.4 2011-01-30 19:02:37 -08:00
git-web--browse.sh web--browse: better support for chromium 2010-12-03 14:05:32 -08:00
git.c Merge branch 'nd/setup' 2010-12-28 11:26:55 -08:00
git.spec.in git.spec.in: Add gitweb subpackage 2010-06-30 15:49:18 -07:00
graph.c Merge branch 'maint' 2010-08-22 20:18:37 -07:00
graph.h Enable custom schemes for column colors in the graph API 2010-07-13 16:33:02 -07:00
grep.c log --author: take union of multiple "author" requests 2010-09-13 01:11:55 -07:00
grep.h log --author: take union of multiple "author" requests 2010-09-13 01:11:55 -07:00
hash.c
hash.h
help.c help: always suggest common-cmds if prefix of cmd 2010-12-05 12:15:12 -08:00
help.h builtin.h: Move two functions definitions to help.h. 2010-09-01 08:00:51 -07:00
hex.c
http-backend.c http-backend: use end_url_with_slash() 2010-11-26 14:50:45 -08:00
http-fetch.c http-fetch: rework url handling 2010-11-26 14:50:46 -08:00
http-push.c http-push: add trailing slash at arg-parse time, instead of later on 2010-11-26 14:50:46 -08:00
http-walker.c Merge branch 'gv/portable' 2010-06-21 06:02:44 -07:00
http.c Merge branch 'tc/http-urls-ends-with-slash' into maint 2010-12-14 07:36:10 -08:00
http.h shift end_url_with_slash() from http.[ch] to url.[ch] 2010-11-26 14:50:45 -08:00
ident.c ident: die on bogus date format 2010-12-20 10:28:19 -08:00
imap-send.c imap-send: Fix sprintf usage 2010-08-09 11:35:46 -07:00
INSTALL docs: default to more modern toolset 2010-11-24 15:13:58 -08:00
levenshtein.c
levenshtein.h
list-objects.c
list-objects.h
ll-merge.c ll-merge: simplify opts == NULL case 2011-01-15 20:34:14 -08:00
ll-merge.h merge-recursive --patience 2010-08-26 09:20:03 -07:00
lockfile.c
log-tree.c Allow customizable commit decorations colors 2010-06-24 12:57:34 -07:00
log-tree.h Allow customizable commit decorations colors 2010-06-24 12:57:34 -07:00
mailmap.c mailmap: fix use of freed memory 2010-10-13 19:11:26 -07:00
mailmap.h mailmap.c: remove unused function 2010-01-12 01:06:09 -08:00
Makefile Merge branch 'nd/setup' 2010-12-28 11:26:55 -08:00
match-trees.c
merge-file.c ll-merge: replace flag argument with options struct 2010-08-26 09:18:51 -07:00
merge-recursive.c Merge branch 'en/merge-recursive' 2010-11-29 17:52:35 -08:00
merge-recursive.h Merge branch 'kb/merge-recursive-rename-threshold' 2010-10-26 21:54:04 -07:00
name-hash.c Add case insensitivity support for directories when using git status 2010-10-06 11:19:58 -07:00
notes-cache.c notes.h/c: Propagate combine_notes_fn return value to add_note() and beyond 2010-11-17 13:21:02 -08:00
notes-cache.h
notes-merge.c git notes merge: Add another auto-resolving strategy: "cat_sort_uniq" 2010-11-17 13:22:53 -08:00
notes-merge.h git notes merge: Add another auto-resolving strategy: "cat_sort_uniq" 2010-11-17 13:22:53 -08:00
notes.c Merge branch 'jh/notes-merge' 2010-12-08 11:24:12 -08:00
notes.h Merge branch 'jh/notes-merge' 2010-12-08 11:24:12 -08:00
object.c Merge branch 'maint' 2010-09-06 00:12:04 -07:00
object.h object.h: Add OBJECT_ARRAY_INIT macro and make use of it. 2010-08-29 22:42:49 -07:00
pack-check.c Typos in code comments, an error message, documentation 2010-08-22 13:25:08 -07:00
pack-refs.c pack-refs: remove newly empty directories 2010-07-07 09:11:37 -07:00
pack-refs.h
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h Merge branch 'sp/maint-dumb-http-pack-reidx' into maint 2010-06-16 16:21:30 -07:00
pager.c
parse-options.c parse-options: make resuming easier after PARSE_OPT_STOP_AT_NON_OPTION 2010-12-07 14:19:32 -08:00
parse-options.h Merge branch 'jn/parse-options-extra' 2010-12-12 21:49:53 -08:00
patch-delta.c
patch-ids.c
patch-ids.h
path.c path helpers: move git_mkstemp* to wrapper.c 2010-11-10 11:04:26 -08:00
pkt-line.c
pkt-line.h
preload-index.c
pretty.c pretty.c: teach format_commit_message() to reencode the output 2010-11-04 13:53:34 -07:00
progress.c
progress.h
quote.c quote.c: separate quoting and relative path generation 2010-06-05 09:14:13 -07:00
quote.h quote.c: separate quoting and relative path generation 2010-06-05 09:14:13 -07:00
reachable.c object.h: Add OBJECT_ARRAY_INIT macro and make use of it. 2010-08-29 22:42:49 -07:00
reachable.h
read-cache.c Merge branch 'jj/icase-directory' 2010-12-03 16:10:34 -08:00
README
reflog-walk.c Merge branch 'jk/maint-reflog-bottom' into maint 2010-12-14 07:35:50 -08:00
reflog-walk.h
refs.c Merge branch 'hv/submodule-find-ff-merge' 2010-08-21 23:27:59 -07:00
refs.h setup_revisions(): Allow walking history in a submodule 2010-07-07 09:48:33 -07:00
RelNotes Prepare for 1.7.3.5 2010-12-28 13:48:54 -08:00
remote-curl.c Merge branch 'sp/fix-smart-http-deadlock-on-error' into maint 2010-08-18 16:30:11 -07:00
remote.c Change "tracking branch" to "remote-tracking branch" 2010-11-03 09:20:41 -07:00
remote.h enums: omit trailing comma for portability 2010-05-31 16:59:27 -07:00
replace_object.c
rerere.c Merge branch 'jf/merge-ignore-ws' 2010-10-26 21:40:54 -07:00
rerere.h
resolve-undo.c Convert the users of for_each_string_list to for_each_string_list_item macro 2010-07-05 11:44:35 -07:00
resolve-undo.h
revision.c Merge branch 'tf/commit-list-prefix' 2010-12-22 14:40:17 -08:00
revision.h setup_revisions(): Allow walking history in a submodule 2010-07-07 09:48:33 -07:00
run-command.c Merge branch 'js/async-thread' 2010-06-21 06:02:45 -07:00
run-command.h
send-pack.h push: pass --progress down to git-pack-objects 2010-10-18 16:20:19 -07:00
server-info.c update-server-info: Shorten read_pack_info_file() 2010-07-19 11:13:52 -07:00
setup.c Subject: setup: officially support --work-tree without --git-dir 2011-01-21 14:31:24 -08:00
sha1_file.c Correctly report corrupted objects 2011-01-20 13:18:51 -08:00
sha1_name.c Merge branch 'tf/commit-list-prefix' 2010-12-22 14:40:17 -08:00
sha1-lookup.c
sha1-lookup.h
shallow.c object.h: Add OBJECT_ARRAY_INIT macro and make use of it. 2010-08-29 22:42:49 -07:00
shell.c shell: Display errors from improperly-formatted command lines 2010-08-27 10:43:59 -07:00
shortlog.h
show-index.c
sideband.c
sideband.h
sigchain.c
sigchain.h
strbuf.c strbuf: move strbuf_branchname to sha1_name.c 2010-11-10 11:07:04 -08:00
strbuf.h strbuf.h: fix comment typo 2010-09-27 10:42:11 -07:00
string-list.c string_list: Fix argument order for string_list_append 2010-06-27 10:06:52 -07:00
string-list.h string_list: Add STRING_LIST_INIT macro and make use of it. 2010-07-05 11:47:57 -07:00
submodule.c fetch_populated_submodules(): document dynamic allocation 2010-12-09 23:42:05 -08:00
submodule.h Add the 'fetch.recurseSubmodules' config setting 2010-11-12 15:06:03 -08:00
symlinks.c do not overwrite files in leading path 2010-12-14 08:55:12 -08:00
tag.c tag: recognize rfc1991 signatures 2010-11-10 09:40:35 -08:00
tag.h verify-tag: factor out signature detection 2010-11-10 09:39:56 -08:00
tar.h
test-chmtime.c
test-ctype.c
test-date.c test-date: fix sscanf type conversion 2010-07-06 08:42:15 -07:00
test-delta.c
test-dump-cache-tree.c
test-genrandom.c
test-index-version.c
test-line-buffer.c Add stream helper library 2010-08-14 19:35:37 -07:00
test-match-trees.c
test-obj-pool.c Add memory pool library 2010-08-14 19:35:37 -07:00
test-parse-options.c add description parameter to OPT__QUIET 2010-11-15 09:58:13 -08:00
test-path-utils.c
test-run-command.c
test-sha1.c
test-sha1.sh
test-sigchain.c
test-string-pool.c Add string-specific memory pool 2010-08-14 19:35:37 -07:00
test-subprocess.c setup_work_tree: adjust relative $GIT_WORK_TREE after moving cwd 2010-12-27 08:34:19 -08:00
test-svn-fe.c SVN dump parser 2010-08-14 19:35:38 -07:00
test-treap.c treap: make treap_insert return inserted node 2010-12-07 16:03:55 -08:00
thread-utils.c
thread-utils.h thread-utils.h: simplify the inclusion 2010-12-10 12:58:06 -08:00
trace.c trace.c: ensure NULL is not passed to printf 2011-01-06 12:21:49 -08:00
transport-helper.c thread-utils.h: simplify the inclusion 2010-12-10 12:58:06 -08:00
transport.c push: pass --progress down to git-pack-objects 2010-10-18 16:20:19 -07:00
transport.h Add bidirectional_transfer_loop() 2010-10-13 16:08:58 -07:00
tree-diff.c Merge branch 'en/tree-walk-optim' 2010-10-26 21:37:49 -07:00
tree-walk.c unpack_trees: group error messages by type 2010-08-11 10:36:06 -07:00
tree-walk.h Merge branch 'maint' 2010-08-26 16:42:59 -07:00
tree.c
tree.h
unimplemented.sh
unpack-trees.c Merge branch 'nd/maint-fix-add-typo-detection' 2010-12-22 14:40:26 -08:00
unpack-trees.h use persistent memory for rejected paths 2010-12-14 08:55:13 -08:00
upload-pack.c commit: Add commit_list prefix in two function names. 2010-11-29 14:01:52 -08:00
url.c url: add str wrapper for end_url_with_slash() 2010-11-26 14:50:45 -08:00
url.h url: add str wrapper for end_url_with_slash() 2010-11-26 14:50:45 -08:00
usage.c
userdiff.c Merge branch 'as/userdiff-pascal' 2011-01-24 10:54:12 -08:00
userdiff.h
utf8.c
utf8.h
walker.c commit: Add commit_list prefix in two function names. 2010-11-29 14:01:52 -08:00
walker.h
wrap-for-bin.sh
wrapper.c set_try_to_free_routine(NULL) means "do nothing special" 2010-12-21 09:25:14 -08:00
write_or_die.c
ws.c Make the tab width used for whitespace checks configurable 2010-12-01 14:47:51 -08:00
wt-status.c Merge branch 'aa/status-hilite-branch' 2010-12-16 12:50:03 -08:00
wt-status.h status: show branchname with a configurable color 2010-11-29 16:31:34 -08:00
xdiff-interface.c Merge branch 'rs/maint-diff-fd-leak' into maint 2010-12-26 11:18:39 -08:00
xdiff-interface.h
zlib.c wrapper: give zlib wrappers their own translation unit 2010-11-10 11:07:51 -08:00

////////////////////////////////////////////////////////////////

	GIT - the stupid content tracker

////////////////////////////////////////////////////////////////

"git" can mean anything, depending on your mood.

 - random three-letter combination that is pronounceable, and not
   actually used by any common UNIX command.  The fact that it is a
   mispronunciation of "get" may or may not be relevant.
 - stupid. contemptible and despicable. simple. Take your pick from the
   dictionary of slang.
 - "global information tracker": you're in a good mood, and it actually
   works for you. Angels sing, and a light suddenly fills the room.
 - "goddamn idiotic truckload of sh*t": when it breaks

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.

Git is an Open Source project covered by the GNU General Public License.
It was originally written by Linus Torvalds with help of a group of
hackers around the net. It is currently maintained by Junio C Hamano.

Please read the file INSTALL for installation instructions.

See Documentation/gittutorial.txt to get started, then see
Documentation/everyday.txt for a useful minimum set of commands, and
Documentation/git-commandname.txt for documentation of each command.
If git has been correctly installed, then the tutorial can also be
read with "man gittutorial" or "git help tutorial", and the
documentation of each command with "man git-commandname" or "git help
commandname".

CVS users may also want to read Documentation/gitcvs-migration.txt
("man gitcvs-migration" or "git help cvs-migration" if git is
installed).

Many Git online resources are accessible from http://git-scm.com/
including full documentation and Git related tools.

The user discussion and development of Git take place on the Git
mailing list -- everyone is welcome to post bug reports, feature
requests, comments and patches to git@vger.kernel.org. To subscribe
to the list, send an email with just "subscribe git" in the body to
majordomo@vger.kernel.org. The mailing list archives are available at
http://marc.theaimsgroup.com/?l=git and other archival sites.

The messages titled "A note from the maintainer", "What's in
git.git (stable)" and "What's cooking in git.git (topics)" and
the discussion following them on the mailing list give a good
reference for project status, development direction and
remaining tasks.