Go to file
Jeff King a21781011f index-pack: downgrade twice-resolved REF_DELTA to die()
When we're resolving a REF_DELTA, we compare-and-swap its type from
REF_DELTA to whatever real type the base object has, as discussed in
ab791dd138 (index-pack: fix race condition with duplicate bases,
2014-08-29). If the old type wasn't a REF_DELTA, we consider that a
BUG(). But as discussed in that commit, we might see this case whenever
we try to resolve an object twice, which may happen because we have
multiple copies of the base object.

So this isn't a bug at all, but rather a sign that the input pack is
broken. And indeed, this case is triggered already in t5309.5 and
t5309.6, which create packs with delta cycles and duplicate bases. But
we never noticed because those tests are marked expect_failure.

Those tests were added by b2ef3d9ebb (test index-pack on packs with
recoverable delta cycles, 2013-08-23), which was leaving the door open
for cases that we theoretically _could_ handle. And when we see an
already-resolved object like this, in theory we could keep going after
confirming that the previously resolved child->real_type matches
base->obj->real_type. But:

  - enforcing the "only resolve once" rule here saves us from an
    infinite loop in other parts of the code. If we keep going, then the
    delta cycle in t5309.5 causes us to loop infinitely, as
    find_ref_delta_children() doesn't realize which objects have already
    been resolved. So there would be more changes needed to make this
    case work, and in the meantime we'd be worse off.

  - any pack that triggers this is broken anyway. It either has a
    duplicate base object, or it has a cycle which causes us to bring in
    a duplicate via --fix-thin. In either case, we'd end up rejecting
    the pack in write_idx_file(), which also detects duplicates.

So the tests have little value in documenting what we _could_ be doing
(and have been neglected for 6+ years). Let's switch them to confirming
that we handle this case cleanly (and switch out the BUG() for a more
informative die() so that we do so).

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-02-04 13:19:11 -08:00
.github
Documentation Git 2.24.1 2019-12-06 16:31:40 +01:00
block-sha1
builtin index-pack: downgrade twice-resolved REF_DELTA to die() 2020-02-04 13:19:11 -08:00
ci Merge branch 'sg/ci-osx-gcc8-fix' 2019-10-24 13:34:03 +09:00
compat msvc: accommodate for vcpkg's upgrade to OpenSSL v1.1.x 2020-01-16 12:18:23 -08:00
contrib msvc: accommodate for vcpkg's upgrade to OpenSSL v1.1.x 2020-01-16 12:18:23 -08:00
ewah
git-gui Merge https://github.com/prati0100/git-gui 2019-11-04 13:29:38 +09:00
gitk-git Merge gitk to pick up emergency build fix 2019-09-17 14:59:18 -07:00
gitweb gitweb: correctly store previous rev in javascript-actions mode 2019-10-28 11:06:57 +09:00
mergetools
negotiator
perl git-svn: trim leading and trailing whitespaces in author name 2019-09-28 13:51:42 +09:00
po l10n: zh_CN: for git v2.24.0 l10n round 1~2 2019-11-02 20:51:12 +08:00
ppc
refs
sha1collisiondetection@855827c583
sha1dc
sha256
t index-pack: downgrade twice-resolved REF_DELTA to die() 2020-02-04 13:19:11 -08:00
templates
trace2 trace2: write discard message to sentinel files 2019-10-05 17:53:51 +09:00
vcs-svn
xdiff xdiffi: fix typos and touch up comments 2019-10-09 10:58:34 +09:00
.clang-format
.editorconfig
.gitattributes Fix build with core.autocrlf=true 2019-09-24 19:48:27 +05:30
.gitignore Merge branch 'dl/honor-cflags-in-hdr-check' 2019-10-07 11:33:02 +09:00
.gitmodules
.mailmap .mailmap: update email address of Andrey Mazo 2019-09-20 22:21:28 -07:00
.travis.yml
.tsan-suppressions
CODE_OF_CONDUCT.md CODE_OF_CONDUCT: mention individual project-leader emails 2019-10-10 10:41:46 +09:00
COPYING
GIT-VERSION-GEN Git 2.24.1 2019-12-06 16:31:40 +01:00
INSTALL
LGPL-2.1
Makefile Merge branch 'dl/allow-running-cocci-verbosely' 2019-10-18 11:40:48 +09:00
README.md git-gui: add a readme 2019-10-12 21:29:30 +05:30
RelNotes Git 2.24.1 2019-12-06 16:31:40 +01:00
abspath.c
aclocal.m4
advice.c
advice.h
alias.c
alias.h
alloc.c
alloc.h
apply.c Merge branch 'tg/range-diff-output-update' 2019-10-15 13:48:02 +09:00
apply.h apply.h: include missing header 2019-09-28 14:04:16 +09:00
archive-tar.c Merge branch 'rs/pax-extended-header-length-fix' 2019-09-09 12:26:37 -07:00
archive-zip.c
archive.c
archive.h
argv-array.c
argv-array.h
attr.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
attr.h
azure-pipelines.yml Merge branch 'js/azure-pipelines-msvc' 2019-10-23 11:06:46 +09:00
banned.h
base85.c
bisect.c
bisect.h
blame.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
blame.h
blob.c
blob.h
branch.c
branch.h
builtin.h
bulk-checkin.c bulk-checkin: zero-initialize hashfile_checkpoint 2019-09-06 11:03:39 -07:00
bulk-checkin.h
bundle.c
bundle.h
cache-tree.c Merge branch 'en/merge-recursive-cleanup' 2019-10-15 13:47:59 +09:00
cache-tree.h
cache.h Merge branch 'js/azure-pipelines-msvc' 2019-10-15 13:48:00 +09:00
chdir-notify.c
chdir-notify.h
check-builtins.sh
check_bindir
checkout.c
checkout.h
color.c
color.h
column.c column: use utf8_strnwidth() to strip out ANSI color escapes 2019-10-15 10:54:15 +09:00
column.h
combine-diff.c
command-list.txt
commit-graph.c Merge branch 'ds/commit-graph-on-fetch' 2019-11-04 13:33:06 +09:00
commit-graph.h upload-pack: disable commit graph more gently for shallow traversal 2019-09-12 12:30:08 -07:00
commit-reach.c commit-graph: fix writing first commit-graph during fetch 2019-10-25 11:19:16 +09:00
commit-reach.h
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c Merge branch 'tb/commit-graph-harden' 2019-10-07 11:32:58 +09:00
commit.h
common-main.c
config.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
config.h
config.mak.dev
config.mak.in
config.mak.uname Sync with 2.23.1 2019-12-06 16:31:39 +01:00
configure.ac
connect.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
connect.h
connected.c Merge branch 'bc/object-id-part17' 2019-10-11 14:24:46 +09:00
connected.h
convert.c Merge branch 'rs/convert-fix-utf-without-dash' 2019-10-09 14:01:00 +09:00
convert.h
copy.c
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
credential.h
csum-file.c
csum-file.h
ctype.c
daemon.c
date.c Quit passing 'now' to date code 2019-09-12 11:03:51 -07:00
decorate.c
decorate.h
delta-islands.c
delta-islands.h
delta.h
detect-compiler
diff-delta.c diff-delta: set size out-parameter to 0 for NULL delta 2019-09-06 11:03:39 -07:00
diff-lib.c
diff-no-index.c
diff.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
diff.h
diffcore-break.c diffcore-break: use a goto instead of a redundant if statement 2019-10-02 15:04:21 +09:00
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
diffcore.h
dir-iterator.c
dir-iterator.h
dir.c Merge branch 'en/clean-nested-with-ignored' 2019-10-11 14:24:46 +09:00
dir.h Merge branch 'en/clean-nested-with-ignored' 2019-10-11 14:24:46 +09:00
editor.c
entry.c
environment.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
exec-cmd.c
exec-cmd.h
fast-import.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
fetch-negotiator.c
fetch-negotiator.h
fetch-pack.c Merge branch 'js/trace2-fetch-push' 2019-10-15 13:48:03 +09:00
fetch-pack.h
fmt-merge-msg.h
fsck.c Sync with 2.22.2 2019-12-06 16:31:30 +01:00
fsck.h
fsmonitor.c fsmonitor: don't fill bitmap with entries to be removed 2019-10-12 10:16:11 +09:00
fsmonitor.h
fuzz-commit-graph.c
fuzz-pack-headers.c
fuzz-pack-idx.c
generate-cmdlist.sh
gettext.c
gettext.h
git-add--interactive.perl add -i: show progress counter in the prompt 2019-10-04 07:12:19 +09:00
git-archimport.perl
git-bisect.sh
git-compat-util.h Sync with 2.23.1 2019-12-06 16:31:39 +01:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-filter-branch.sh Recommend git-filter-repo instead of git-filter-branch 2019-09-05 13:01:48 -07:00
git-instaweb.sh
git-legacy-stash.sh stash: avoid recursive hard reset on submodules 2019-10-15 10:34:44 +09:00
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py git-p4: auto-delete named temporary file 2019-10-06 20:43:37 +09:00
git-parse-remote.sh
git-quiltimport.sh
git-rebase--preserve-merges.sh
git-request-pull.sh
git-send-email.perl
git-sh-i18n.sh
git-sh-setup.sh
git-submodule.sh Sync with 2.21.1 2019-12-06 16:31:23 +01:00
git-svn.perl
git-web--browse.sh
git.c git: use COPY_ARRAY and MOVE_ARRAY in handle_alias() 2019-09-20 11:11:26 -07:00
git.rc
gpg-interface.c
gpg-interface.h
graph.c
graph.h
grep.c Merge branch 'cb/pcre2-chartables-leakfix' 2019-10-23 14:43:11 +09:00
grep.h Merge branch 'cb/pcre2-chartables-leakfix' 2019-10-23 14:43:11 +09:00
hash.h
hashmap.c hashmap: remove type arg from hashmap_{get,put,remove}_entry 2019-10-07 10:20:12 +09:00
hashmap.h hashmap_entry: remove first member requirement from docs 2019-10-07 10:20:12 +09:00
help.c Merge branch 'rs/help-unknown-ref-does-not-return' 2019-09-30 13:19:27 +09:00
help.h
hex.c
http-backend.c
http-fetch.c
http-push.c http-push: simplify deleting a list item 2019-10-15 10:53:50 +09:00
http-walker.c
http.c Merge branch 'mh/http-urlmatch-cleanup' 2019-09-30 13:19:24 +09:00
http.h
ident.c
imap-send.c
interdiff.c
interdiff.h
iterator.h
json-writer.c
json-writer.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c Merge branch 'sg/line-log-tree-diff-optim' 2019-09-18 11:50:09 -07:00
line-log.h
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c Merge branch 'jk/partial-clone-sparse-blob' 2019-10-07 11:32:54 +09:00
list-objects-filter-options.h Merge branch 'jk/partial-clone-sparse-blob' 2019-10-07 11:32:54 +09:00
list-objects-filter.c Merge branch 'jk/partial-clone-sparse-blob' 2019-10-07 11:32:54 +09:00
list-objects-filter.h
list-objects.c Merge branch 'jk/list-objects-optim-wo-trees' 2019-10-07 11:32:56 +09:00
list-objects.h
list.h
ll-merge.c
ll-merge.h
lockfile.c
lockfile.h
log-tree.c Merge branch 'rs/simplify-by-deco-with-deco-refs-exclude' 2019-10-07 11:32:54 +09:00
log-tree.h
ls-refs.c
ls-refs.h
mailinfo.c
mailinfo.h
mailmap.c
mailmap.h
match-trees.c
mem-pool.c
mem-pool.h
merge-blobs.c
merge-blobs.h
merge-recursive.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
merge-recursive.h hashmap_entry: remove first member requirement from docs 2019-10-07 10:20:12 +09:00
merge.c
mergesort.c
mergesort.h
midx.c
midx.h
name-hash.c hashmap: remove type arg from hashmap_{get,put,remove}_entry 2019-10-07 10:20:12 +09:00
notes-cache.c
notes-cache.h
notes-merge.c
notes-merge.h
notes-utils.c
notes-utils.h
notes.c Merge branch 'mh/notes-duplicate-entries' 2019-09-30 13:19:25 +09:00
notes.h
object-store.h
object.c treewide: remove duplicate #include directives 2019-10-04 08:16:00 +09:00
object.h commit-graph: fix writing first commit-graph during fetch 2019-10-25 11:19:16 +09:00
oidmap.c hashmap: introduce hashmap_free_entries 2019-10-07 10:20:11 +09:00
oidmap.h hashmap: use *_entry APIs for iteration 2019-10-07 10:20:11 +09:00
oidset.c
oidset.h
pack-bitmap-write.c pack-objects: drop packlist index_pos optimization 2019-09-06 11:03:42 -07:00
pack-bitmap.c Merge branch 'jk/misc-uninitialized-fixes' 2019-09-30 13:19:30 +09:00
pack-bitmap.h pack-bitmap.h: remove magic number 2019-09-28 14:04:20 +09:00
pack-check.c
pack-objects.c pack-objects: drop packlist index_pos optimization 2019-09-06 11:03:42 -07:00
pack-objects.h pack-objects: drop packlist index_pos optimization 2019-09-06 11:03:42 -07:00
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h
packfile.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
packfile.h Merge branch 'ds/midx-expire-repack' 2019-09-09 12:26:38 -07:00
pager.c
parse-options-cb.c
parse-options.c
parse-options.h Merge branch 'nd/diff-parseopt' 2019-09-09 12:26:38 -07:00
patch-delta.c
patch-ids.c hashmap: remove type arg from hashmap_{get,put,remove}_entry 2019-10-07 10:20:12 +09:00
patch-ids.h
path.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
path.h
pathspec.c
pathspec.h
pkt-line.c
pkt-line.h
preload-index.c
pretty.c log-tree: call load_ref_decorations() in get_name_decoration() 2019-09-09 11:16:40 -07:00
pretty.h
prio-queue.c
prio-queue.h
progress.c Test the progress display 2019-09-17 09:39:16 -07:00
progress.h
promisor-remote.c promisor-remote: skip move_to_tail when no-op 2019-10-02 14:56:54 +09:00
promisor-remote.h Merge branch 'dl/honor-cflags-in-hdr-check' 2019-10-07 11:33:02 +09:00
prompt.c
prompt.h
protocol.c
protocol.h
quote.c Merge branch 'gs/sq-quote-buf-pretty' 2019-10-15 13:48:02 +09:00
quote.h
range-diff.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
range-diff.h
reachable.c
reachable.h
read-cache.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
rebase-interactive.c
rebase-interactive.h
ref-filter.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
ref-filter.h
reflog-walk.c
reflog-walk.h
refs.c hashmap_entry: remove first member requirement from docs 2019-10-07 10:20:12 +09:00
refs.h
refspec.c
refspec.h
remote-curl.c Merge branch 'bc/smart-http-atomic-push' 2019-10-23 14:43:11 +09:00
remote-testsvn.c
remote.c hashmap: remove type arg from hashmap_{get,put,remove}_entry 2019-10-07 10:20:12 +09:00
remote.h hashmap_entry: remove first member requirement from docs 2019-10-07 10:20:12 +09:00
replace-object.c
replace-object.h
repo-settings.c Merge branch 'ds/feature-macros' 2019-10-24 13:34:03 +09:00
repository.c
repository.h Merge branch 'jk/disable-commit-graph-during-upload-pack' 2019-10-07 11:32:55 +09:00
rerere.c
rerere.h
resolve-undo.c
resolve-undo.h
revision.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
revision.h
run-command.c
run-command.h
send-pack.c send-pack: never fetch when checking exclusions 2019-10-09 10:46:41 +09:00
send-pack.h
sequencer.c Merge branch 'ew/hashmap' 2019-10-15 13:48:02 +09:00
sequencer.h Merge branch 'js/rebase-r-strategy' 2019-09-18 11:50:07 -07:00
serve.c
serve.h
server-info.c
setup.c Merge branch 'js/gitdir-at-unc-root' 2019-09-30 13:19:26 +09:00
sh-i18n--envsubst.c
sha1-array.c
sha1-array.h
sha1-file.c Merge branch 'bc/object-id-part17' 2019-10-11 14:24:46 +09:00
sha1-lookup.c Merge branch 'js/azure-pipelines-msvc' 2019-10-15 13:48:00 +09:00
sha1-lookup.h
sha1-name.c Merge branch 'rs/nth-switch-code-simplification' 2019-10-07 11:33:00 +09:00
sha1dc_git.c
sha1dc_git.h
shallow.c Merge branch 'rs/dedup-includes' 2019-10-11 14:24:48 +09:00
shell.c
shortlog.h
sideband.c
sideband.h
sigchain.c
sigchain.h
split-index.c
split-index.h
stable-qsort.c Move git_sort(), a stable sort, into into libgit.a 2019-10-02 14:44:51 +09:00
strbuf.c Merge branch 'md/list-objects-filter-combo' 2019-09-18 11:50:09 -07:00
strbuf.h Merge branch 'md/list-objects-filter-combo' 2019-09-18 11:50:09 -07:00
streaming.c
streaming.h
string-list.c
string-list.h
sub-process.c hashmap: remove type arg from hashmap_{get,put,remove}_entry 2019-10-07 10:20:12 +09:00
sub-process.h hashmap_entry: remove first member requirement from docs 2019-10-07 10:20:12 +09:00
submodule-config.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
submodule-config.h
submodule.c Sync with 2.22.2 2019-12-06 16:31:30 +01:00
submodule.h Sync with 2.22.2 2019-12-06 16:31:30 +01:00
symlinks.c
tag.c tag: factor out get_tagged_oid() 2019-09-05 14:10:18 -07:00
tag.h tag: factor out get_tagged_oid() 2019-09-05 14:10:18 -07:00
tar.h
tempfile.c
tempfile.h
thread-utils.c
thread-utils.h
tmp-objdir.c
tmp-objdir.h
trace.c
trace.h
trace2.c
trace2.h
trailer.c
trailer.h
transport-helper.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
transport-internal.h
transport.c transport: push codepath can take arbitrary repository 2019-10-08 13:20:01 +09:00
transport.h remote-curl: pass on atomic capability to remote side 2019-10-17 16:08:22 +09:00
tree-diff.c
tree-walk.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
tree-walk.h
tree.c
tree.h
unicode-width.h
unimplemented.sh
unix-socket.c
unix-socket.h
unpack-trees.c Sync with 2.23.1 2019-12-06 16:31:39 +01:00
unpack-trees.h treewide: rename 'struct exclude_list' to 'struct pattern_list' 2019-09-05 14:05:11 -07:00
upload-pack.c Merge branch 'jk/disable-commit-graph-during-upload-pack' 2019-10-07 11:32:55 +09:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c userdiff: fix some corner cases in dts regex 2019-10-21 17:44:12 +09:00
userdiff.h
utf8.c utf8: use ARRAY_SIZE() in git_wcwidth() 2019-10-12 10:57:39 +09:00
utf8.h
varint.c
varint.h
version.c
version.h
versioncmp.c
walker.c
walker.h
wildmatch.c
wildmatch.h
worktree.c
worktree.h
wrap-for-bin.sh
wrapper.c Merge branch 'ah/cleanups' 2019-10-09 14:01:00 +09:00
write-or-die.c
ws.c
wt-status.c Merge branch 'bc/object-id-part17' 2019-10-11 14:24:46 +09:00
wt-status.h
xdiff-interface.c
xdiff-interface.h
zlib.c

README.md

Build Status

Git - fast, scalable, distributed revision control system

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 version 2 (some parts of it are under different licenses, compatible with the GPLv2). It was originally written by Linus Torvalds with help of a group of hackers around the net.

Please read the file INSTALL for installation instructions.

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

See Documentation/gittutorial.txt to get started, then see Documentation/giteveryday.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).

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 (read Documentation/SubmittingPatches for instructions on patch submission). 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 https://public-inbox.org/git/, http://marc.info/?l=git and other archival sites.

Issues which are security relevant should be disclosed privately to the Git Security mailing list git-security@googlegroups.com.

The maintainer frequently sends the "What's cooking" reports that list the current status of various development topics to the mailing list. The discussion following them give a good reference for project status, development direction and remaining tasks.

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (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