Go to file
Derrick Stolee e05cdb17e8 unpack-trees: resolve sparse-directory/file conflicts
When running unpack_trees() with a sparse index, we attempt to operate
on the index without expanding the sparse directory entries. Thus, we
operate by manipulating entire directories and passing them to the
unpack function. In the case of the 'git checkout' command, this is the
twoway_merge() function.

There are several cases in twoway_merge() that handle different
situations. One new one to add is the case of a directory/file conflict
where the directory is sparse. Before the sparse index, such a conflict
would appear as a list of file additions and deletions. Now,
twoway_merge() initializes 'current', 'oldtree', and 'newtree' from
src[0], src[1], and src[2], then sets 'oldtree' to NULL because it is
equal to the df_conflict_entry. The way to determine that we have a
directory/file conflict is to test that 'current' and 'newtree' disagree
on being sparse directory entries.

When we are in this case, we want to resolve the situation by calling
merged_entry(). This allows replacing the 'current' entry with the
'newtree' entry. This is important for cases where we want to run 'git
checkout' across the conflict and have the new HEAD represent the new
file type at that path. The first NEEDSWORK comment dropped in t1092
demonstrates this necessary behavior.

However, we still are in a confusing state when 'current' corresponds to
a staged change within a sparse directory that is not present at HEAD.
This should be atypical, because it requires adding a change outside of
the sparse-checkout cone, but it is possible. Since we are unable to
determine that this is a staged change within twoway_merge(), we cannot
add a case to reject the merge at this point. I believe this is due to
the use of df_conflict_entry in the place of 'oldtree' instead of using
the valud at HEAD, which would provide some perspective to this
decision. Any change that would allow this differentiation for staged
entries would need to involve information further up in unpack_trees().

That work should be done, sometime, because we are further confusing the
behavior of a directory/file conflict when staging a change in the
directory. The two cases 'checkout behaves oddly with df-conflict-?' in
t1092 demonstrate that even without a sparse-checkout, Git is not
consistent in its behavior. Neither of the two options seems correct,
either. This change makes the sparse-index behave differently than the
typcial sparse-checkout case, but it does match the full checkout
behavior in the df-conflict-2 case.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-07-20 14:59:11 -07:00
.github
Documentation The second batch 2021-06-14 13:34:28 +09:00
block-sha1
builtin checkout: stop expanding sparse indexes 2021-07-14 15:05:53 -07:00
ci Merge branch 'mt/parallel-checkout-part-3' 2021-05-16 21:05:23 +09:00
compat Merge branch 'jh/simple-ipc-sans-pthread' 2021-05-22 18:29:01 +09:00
contrib contrib/completion: fix zsh completion regression from 59d85a2a05 2021-06-02 12:49:40 +09:00
ewah
git-gui
gitk-git
gitweb
mergetools
negotiator
perl Merge branch 'so/log-m-implies-p' 2021-06-14 13:33:27 +09:00
po l10n: es: 2.32.0 round 1 2021-06-05 20:06:23 -05:00
ppc
refs Merge branch 'wc/packed-ref-removal-cleanup' 2021-05-16 21:05:24 +09:00
sha1collisiondetection@855827c583
sha1dc
sha256
t unpack-trees: resolve sparse-directory/file conflicts 2021-07-20 14:59:11 -07:00
templates
trace2 Merge branch 'ab/trace2-squelch-gcc-warning' 2021-06-14 13:33:28 +09:00
xdiff Merge branch 'pw/patience-diff-clean-up' 2021-05-14 08:26:08 +09:00
.cirrus.yml
.clang-format
.editorconfig
.gitattributes
.gitignore Merge branch 'ls/subtree' 2021-05-10 16:59:47 +09:00
.gitmodules
.mailmap
.travis.yml
.tsan-suppressions
CODE_OF_CONDUCT.md
COPYING
GIT-VERSION-GEN Git 2.32 2021-06-06 15:40:01 +09:00
INSTALL
LGPL-2.1
Makefile Merge branch 'jh/simple-ipc-sans-pthread' 2021-05-22 18:29:01 +09:00
README.md
RelNotes The first batch post Git 2.32 2021-06-10 12:04:27 +09:00
SECURITY.md
abspath.c
aclocal.m4
add-interactive.c
add-interactive.h
add-patch.c
advice.c
advice.h
alias.c
alias.h
alloc.c
alloc.h
apply.c Merge branch 'jz/apply-3way-first-message-fix' 2021-05-07 12:47:38 +09:00
apply.h
archive-tar.c
archive-zip.c
archive.c
archive.h
attr.c Merge branch 'ds/sparse-index-protections' 2021-04-30 13:50:26 +09:00
attr.h
banned.h
base85.c
bisect.c
bisect.h
blame.c
blame.h
blob.c
blob.h
bloom.c Merge branch 'ah/plugleaks' 2021-05-07 12:47:41 +09:00
bloom.h
branch.c Merge branch 'bc/hash-transition-interop-part-1' 2021-05-10 16:59:46 +09:00
branch.h
builtin.h
bulk-checkin.c
bulk-checkin.h
bundle.c
bundle.h
cache-tree.c commit: integrate with sparse-index 2021-07-14 15:05:53 -07:00
cache-tree.h
cache.h Merge branch 'mt/parallel-checkout-part-3' 2021-05-16 21:05:23 +09:00
chdir-notify.c
chdir-notify.h
check-builtins.sh
check_bindir
checkout.c
checkout.h
chunk-format.c csum-file.h: increase hashfile buffer size 2021-05-19 16:41:21 +09:00
chunk-format.h
color.c
color.h
column.c
column.h
combine-diff.c
command-list.txt
commit-graph.c
commit-graph.h
commit-reach.c
commit-reach.h
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c
commit.h
common-main.c
config.c Merge branch 'ps/config-global-override' 2021-05-07 12:47:39 +09:00
config.h
config.mak.dev
config.mak.in
config.mak.uname
configure.ac
connect.c
connect.h
connected.c
connected.h
convert.c Merge branch 'ds/sparse-index-protections' 2021-04-30 13:50:26 +09:00
convert.h Merge branch 'ds/sparse-index-protections' 2021-04-30 13:50:26 +09:00
copy.c
credential.c
credential.h
csum-file.c csum-file.h: increase hashfile buffer size 2021-05-19 16:41:21 +09:00
csum-file.h csum-file.h: increase hashfile buffer size 2021-05-19 16:41:21 +09:00
ctype.c
daemon.c
date.c
decorate.c
decorate.h
delta-islands.c
delta-islands.h
delta.h
detect-compiler
diff-delta.c
diff-lib.c diff-lib: handle index diffs with sparse dirs 2021-07-14 13:42:49 -07:00
diff-merges.c diff-merges: let "-m" imply "-p" 2021-05-21 09:24:14 +09:00
diff-merges.h diff-merges: move specific diff-index "-m" handling to diff-index 2021-05-21 09:24:14 +09:00
diff-no-index.c dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
diff.c Merge branch 'pw/word-diff-zero-width-matches' 2021-05-14 08:26:06 +09:00
diff.h
diffcore-break.c
diffcore-delta.c
diffcore-order.c
diffcore-pickaxe.c
diffcore-rename.c Merge branch 'en/ort-perf-batch-11' 2021-06-14 13:33:27 +09:00
diffcore-rotate.c
diffcore.h Merge branch 'en/ort-perf-batch-11' 2021-06-14 13:33:27 +09:00
dir-iterator.c
dir-iterator.h
dir.c dir.c: accept a directory as part of cone-mode patterns 2021-07-14 13:42:49 -07:00
dir.h dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
editor.c
entry.c dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
entry.h
environment.c
environment.h
exec-cmd.c
exec-cmd.h
fetch-negotiator.c
fetch-negotiator.h
fetch-pack.c fetch-pack: signal v2 server that we are done making requests 2021-05-20 07:38:40 +09:00
fetch-pack.h fetch: teach independent negotiation (no packfile) 2021-05-05 10:41:29 +09:00
fmt-merge-msg.c
fmt-merge-msg.h
fsck.c fsck: warn about symlinked dotfiles we'll open with O_NOFOLLOW 2021-05-04 11:52:02 +09:00
fsck.h fsck: warn about symlinked dotfiles we'll open with O_NOFOLLOW 2021-05-04 11:52:02 +09:00
fsmonitor.c
fsmonitor.h
fuzz-commit-graph.c
fuzz-pack-headers.c
fuzz-pack-idx.c
generate-cmdlist.sh
generate-configlist.sh
gettext.c
gettext.h
git-add--interactive.perl
git-archimport.perl
git-bisect.sh
git-compat-util.h Merge branch 'jn/size-t-casted-to-off-t-fix' 2021-06-10 12:04:23 +09:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-filter-branch.sh
git-instaweb.sh
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: speed up search for branch parent 2021-05-06 12:51:33 +09:00
git-quiltimport.sh
git-rebase--preserve-merges.sh
git-request-pull.sh
git-send-email.perl Merge branch 'ga/send-email-sendmail-cmd' 2021-06-14 13:33:26 +09:00
git-sh-i18n.sh
git-sh-setup.sh
git-submodule.sh submodule update: silence underlying fetch with "--quiet" 2021-05-03 12:24:38 +09:00
git-svn.perl
git-web--browse.sh
git.c Merge branch 'ps/config-env-option-with-separate-value' 2021-05-07 12:47:37 +09:00
git.rc
gpg-interface.c
gpg-interface.h
graph.c
graph.h
grep.c
grep.h
hash-lookup.c
hash-lookup.h
hash.h parallel-checkout: send the new object_id algo field to the workers 2021-05-18 05:38:54 +09:00
hashmap.c
hashmap.h
help.c
help.h
hex.c
http-backend.c
http-fetch.c
http-push.c Merge branch 'bc/hash-transition-interop-part-1' 2021-05-10 16:59:46 +09:00
http-walker.c
http.c Merge branch 'cs/http-use-basic-after-failed-negotiate' 2021-05-21 05:49:41 +09:00
http.h
ident.c
imap-send.c
iterator.h
json-writer.c
json-writer.h
khash.h
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c
line-log.h
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c help: fix small typo in error message 2021-05-21 07:52:10 +09:00
list-objects-filter-options.h
list-objects-filter.c
list-objects-filter.h
list-objects.c
list-objects.h
list.h
ll-merge.c
ll-merge.h
lockfile.c
lockfile.h
log-tree.c
log-tree.h
ls-refs.c
ls-refs.h
mailinfo.c Merge branch 'ef/mailinfo-short-name' 2021-06-10 12:04:22 +09:00
mailinfo.h am: learn to process quoted lines that ends with CRLF 2021-05-10 15:06:22 +09:00
mailmap.c
mailmap.h
match-trees.c
mem-pool.c
mem-pool.h
merge-blobs.c
merge-blobs.h
merge-ort-wrappers.c merge(s): apply consistent punctuation to "up to date" messages 2021-05-03 14:14:56 +09:00
merge-ort-wrappers.h
merge-ort.c Merge branch 'en/ort-perf-batch-11' 2021-06-14 13:33:27 +09:00
merge-ort.h merge-ort: avoid accidental API mis-use 2021-05-20 15:40:39 +09:00
merge-recursive.c Merge branch 'js/merge-already-up-to-date-message-reword' 2021-05-11 15:27:22 +09:00
merge-recursive.h
merge.c
mergesort.c
mergesort.h
midx.c
midx.h
name-hash.c Merge branch 'ds/sparse-index-protections' 2021-04-30 13:50:26 +09:00
notes-cache.c
notes-cache.h
notes-merge.c dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
notes-merge.h
notes-utils.c
notes-utils.h
notes.c
notes.h
object-file.c dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
object-name.c
object-store.h
object.c
object.h Merge branch 'jt/push-negotiation' 2021-05-16 21:05:22 +09:00
oid-array.c
oid-array.h
oidmap.c
oidmap.h
oidset.c
oidset.h
pack-bitmap-write.c
pack-bitmap.c Merge branch 'ps/rev-list-object-type-filter' 2021-05-07 12:47:41 +09:00
pack-bitmap.h Merge branch 'ps/rev-list-object-type-filter' 2021-05-07 12:47:41 +09:00
pack-check.c
pack-objects.c
pack-objects.h pack-objects: move static inline from a header to the sole consumer 2021-05-27 12:14:41 +09:00
pack-revindex.c
pack-revindex.h
pack-write.c
pack.h
packfile.c dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
packfile.h
pager.c
parallel-checkout.c parallel-checkout: send the new object_id algo field to the workers 2021-05-18 05:38:54 +09:00
parallel-checkout.h
parse-options-cb.c
parse-options.c
parse-options.h
patch-delta.c
patch-ids.c
patch-ids.h
path.c t0060: test ntfs/hfs-obscured dotfiles 2021-05-04 11:52:02 +09:00
path.h
pathspec.c Merge branch 'mt/add-rm-in-sparse-checkout' 2021-05-07 12:47:40 +09:00
pathspec.h Merge branch 'mt/add-rm-in-sparse-checkout' 2021-05-07 12:47:40 +09:00
pkt-line.c
pkt-line.h
preload-index.c
pretty.c
pretty.h
prio-queue.c
prio-queue.h
progress.c
progress.h
promisor-remote.c
promisor-remote.h
prompt.c
prompt.h
protocol-caps.c
protocol-caps.h
protocol.c
protocol.h
prune-packed.c
prune-packed.h
quote.c
quote.h
range-diff.c
range-diff.h
reachable.c Merge branch 'ps/rev-list-object-type-filter' 2021-05-07 12:47:41 +09:00
reachable.h
read-cache.c status: use sparse-index throughout 2021-07-14 13:42:49 -07:00
rebase-interactive.c
rebase-interactive.h
rebase.c
rebase.h
ref-filter.c Merge branch 'zh/ref-filter-push-remote-fix' 2021-05-20 08:55:00 +09:00
ref-filter.h
reflog-walk.c
reflog-walk.h
refs.c Merge branch 'bc/hash-transition-interop-part-1' 2021-05-10 16:59:46 +09:00
refs.h
refspec.c
refspec.h
remote-curl.c remote-curl: fix clone on sha256 repos 2021-05-12 12:14:44 +09:00
remote.c
remote.h
replace-object.c
replace-object.h
repo-settings.c
repository.c Merge branch 'ds/sparse-index-protections' 2021-04-30 13:50:26 +09:00
repository.h
rerere.c dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
rerere.h
reset.c
reset.h
resolve-undo.c Merge branch 'ds/sparse-index-protections' 2021-04-30 13:50:26 +09:00
resolve-undo.h
revision.c Merge branch 'ah/plugleaks' 2021-05-07 12:47:41 +09:00
revision.h Merge branch 'so/log-m-implies-p' 2021-06-14 13:33:27 +09:00
run-command.c
run-command.h
send-pack.c send-pack: support push negotiation 2021-05-05 10:41:29 +09:00
send-pack.h
sequencer.c Merge branch 'bc/hash-transition-interop-part-1' 2021-05-10 16:59:46 +09:00
sequencer.h
serve.c
serve.h
server-info.c
setup.c setup: split "extensions found" messages into singular and plural 2021-05-20 13:36:58 +09:00
sh-i18n--envsubst.c
sha1dc_git.c
sha1dc_git.h
shallow.c
shallow.h
shell.c
shortlog.h
sideband.c
sideband.h
sigchain.c
sigchain.h
simple-ipc.h simple-ipc: correct ifdefs when NO_PTHREADS is defined 2021-05-21 07:55:00 +09:00
sparse-index.c sparse-index: recompute cache-tree 2021-07-14 15:05:53 -07:00
sparse-index.h
split-index.c
split-index.h
stable-qsort.c
strbuf.c mailinfo: also free strbuf lists when clearing mailinfo 2021-04-28 09:25:45 +09:00
strbuf.h
streaming.c streaming.c: move {open,close,read} from vtable to "struct git_istream" 2021-05-06 12:56:10 +09:00
streaming.h
string-list.c
string-list.h
strmap.c
strmap.h
strvec.c
strvec.h
sub-process.c
sub-process.h
submodule-config.c
submodule-config.h
submodule.c Merge branch 'bc/hash-transition-interop-part-1' 2021-05-10 16:59:46 +09:00
submodule.h
symlinks.c
tag.c
tag.h
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: add new .cmd config option 2021-05-04 12:09:43 +09:00
trailer.h
transport-helper.c fetch: teach independent negotiation (no packfile) 2021-05-05 10:41:29 +09:00
transport-internal.h
transport.c fetch-pack: signal v2 server that we are done making requests 2021-05-20 07:38:40 +09:00
transport.h fetch: teach independent negotiation (no packfile) 2021-05-05 10:41:29 +09:00
tree-diff.c
tree-walk.c
tree-walk.h
tree.c
tree.h
unicode-width.h
unimplemented.sh
unix-socket.c
unix-socket.h
unix-stream-server.c
unix-stream-server.h
unpack-trees.c unpack-trees: resolve sparse-directory/file conflicts 2021-07-20 14:59:11 -07:00
unpack-trees.h
upload-pack.c Merge branch 'jt/push-negotiation' 2021-05-16 21:05:22 +09:00
upload-pack.h
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c
userdiff.h
utf8.c t0060: test ntfs/hfs-obscured dotfiles 2021-05-04 11:52:02 +09:00
utf8.h t0060: test ntfs/hfs-obscured dotfiles 2021-05-04 11:52:02 +09:00
varint.c
varint.h
version.c
version.h
versioncmp.c
walker.c
walker.h
wildmatch.c
wildmatch.h
worktree.c dir: introduce readdir_skip_dot_and_dotdot() helper 2021-05-27 14:02:37 +09:00
worktree.h
wrap-for-bin.sh
wrapper.c
write-or-die.c fsync(): be prepared to see EINTR 2021-06-05 22:13:40 +09:00
ws.c
wt-status.c wt-status: expand added sparse directory entries 2021-07-14 13:42:49 -07:00
wt-status.h status: skip sparse-checkout percentage with sparse-index 2021-07-14 13:42:49 -07:00
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://lore.kernel.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