Go to file
Jacob Keller 09fb155f11 diff --no-index: support limiting by pathspec
The --no-index option of git-diff enables using the diff machinery from
git while operating outside of a repository. This mode of git diff is
able to compare directories and produce a diff of their contents.

When operating git diff in a repository, git has the notion of
"pathspecs" which can specify which files to compare. In particular,
when using git to diff two trees, you might invoke:

  $ git diff-tree -r <treeish1> <treeish2>.

where the treeish could point to a subdirectory of the repository.

When invoked this way, users can limit the selected paths of the tree by
using a pathspec. Either by providing some list of paths to accept, or
by removing paths via a negative refspec.

The git diff --no-index mode does not support pathspecs, and cannot
limit the diff output in this way. Other diff programs such as GNU
difftools have options for excluding paths based on a pattern match.
However, using git diff as a diff replacement has several advantages
over many popular diff tools, including coloring moved lines, rename
detections, and similar.

Teach git diff --no-index how to handle pathspecs to limit the
comparisons. This will only be supported if both provided paths are
directories.

For comparisons where one path isn't a directory, the --no-index mode
already has some DWIM shortcuts implemented in the fixup_paths()
function.

Modify the fixup_paths function to return 1 if both paths are
directories. If this is the case, interpret any extra arguments to git
diff as pathspecs via parse_pathspec.

Use parse_pathspec to load the remaining arguments (if any) to git diff
--no-index as pathspec items. Disable PATHSPEC_ATTR support since we do
not have a repository to do attribute lookup. Disable PATHSPEC_FROMTOP
since we do not have a repository root. All pathspecs are treated as
rooted at the provided comparison paths.

After loading the pathspec data, calculate skip offsets for skipping
past the root portion of the paths. This is required to ensure that
pathspecs start matching from the provided path, rather than matching
from the absolute path. We could instead pass the paths as prefix values
to parse_pathspec. This is slightly problematic because the paths come
from the command line and don't necessarily have the proper trailing
slash. Additionally, that would require parsing pathspecs multiple
times.

Pass the pathspec object and the skip offsets into queue_diff, which
in-turn must pass them along to read_directory_contents.

Modify read_directory_contents to check against the pathspecs when
scanning the directory. Use the skip offset to skip past the initial
root of the path, and only match against portions that are below the
intended directory structure being compared.

The search algorithm for finding paths is recursive with read_dir. To
make pathspec matching work properly, we must set both
DO_MATCH_DIRECTORY and DO_MATCH_LEADING_PATHSPEC.

Without DO_MATCH_DIRECTORY, paths like "a/b/c/d" will not match against
pathspecs like "a/b/c". This is usually achieved by setting the is_dir
parameter of match_pathspec.

Without DO_MATCH_LEADING_PATHSPEC, paths like "a/b/c" would not match
against pathspecs like "a/b/c/d". This is crucial because we recursively
iterate down the directories. We could simply avoid checking pathspecs
at subdirectories, but this would force recursion down directories
which would simply be skipped.

If we always passed DO_MATCH_LEADING_PATHSPEC, then we will
incorrectly match in certain cases such as matching 'a/c' against
':(glob)**/d'. The match logic will see that a matches the leading part
of the **/ and accept this even tho c doesn't match.

To avoid this, use the match_leading_pathspec() variant recently
introduced. This sets both flags when is_dir is set, but leaves them
both cleared when is_dir is 0.

Add test cases and documentation covering the new functionality. Note
for the documentation I opted not to move the placement of '--' which is
sometimes used to disambiguate arguments. The diff --no-index mode
requires exactly 2 arguments determining what to compare. Any additional
arguments are interpreted as pathspecs and must come afterwards. Use of
'--' would not actually disambiguate anything, since there will never be
ambiguity over which arguments represent paths or pathspecs.

Signed-off-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2025-05-22 14:20:11 -07:00
.github Merge branch 'kn/meson-hdr-check' 2025-05-05 14:56:25 -07:00
Documentation diff --no-index: support limiting by pathspec 2025-05-22 14:20:11 -07:00
bin-wrappers Introduce support for the Meson build system 2024-12-07 07:52:14 +09:00
block-sha1
builtin diff --no-index: support limiting by pathspec 2025-05-22 14:20:11 -07:00
ci Merge branch 'js/ci-buildsystems-cleanup' 2025-05-13 14:05:06 -07:00
compat Merge branch 'js/windows-arm64' 2025-05-05 14:56:24 -07:00
compiler-tricks intialize false_but_the_compiler_does_not_know_it_ 2025-05-07 09:11:47 -07:00
contrib Merge branch 'js/ci-buildsystems-cleanup' 2025-05-13 14:05:06 -07:00
ewah ewah: implement `struct ewah_or_iterator` 2025-03-21 04:34:04 -07:00
git-gui Merge branch 'master' of https://github.com/j6t/git-gui 2025-05-09 13:14:36 -07:00
gitk-git Merge branch 'master' of https://github.com/j6t/gitk 2025-05-09 13:16:51 -07:00
gitweb meson: distinguish build and target host binaries 2025-04-01 02:20:44 -07:00
mergetools Merge branch 'fr/vimdiff-layout-fixes' 2025-04-08 11:43:16 -07:00
negotiator prio-queue: use size_t rather than int for size 2024-12-20 07:21:45 -08:00
oss-fuzz object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
perl meson: allow customize perl installation path 2025-05-08 07:29:37 -07:00
po Merge branch 'js/po-update-workflow' 2025-05-09 19:17:19 +02:00
refs Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
reftable Merge branch 'ps/reftable-read-block-perffix' 2025-05-19 16:02:48 -07:00
sha1
sha1collisiondetection@855827c583
sha1dc
sha256
subprojects Introduce support for the Meson build system 2024-12-07 07:52:14 +09:00
t diff --no-index: support limiting by pathspec 2025-05-22 14:20:11 -07:00
templates meson: distinguish build and target host binaries 2025-04-01 02:20:44 -07:00
trace2 trace2/tr2_sysenv.c: *.txt -> *.adoc fixes 2025-03-03 13:49:26 -08:00
xdiff xdiff: disable cleanup_records heuristic with --minimal 2025-04-29 12:46:58 -07:00
.cirrus.yml
.clang-format
.editorconfig editorconfig: add .bash extension 2025-03-03 08:39:47 -08:00
.gitattributes merge-file doc: set conflict-marker-size attribute 2025-03-29 10:31:19 +09:00
.gitignore builtin: introduce diff-pairs command 2025-03-03 08:17:47 -08:00
.gitlab-ci.yml ci: use Visual Studio for win+meson job on GitHub Workflows 2025-04-01 02:20:44 -07:00
.gitmodules
.mailmap
.tsan-suppressions
CODE_OF_CONDUCT.md
COPYING
GIT-BUILD-OPTIONS.in GIT-BUILD-OPTIONS: propagate project's source directory 2025-02-18 11:40:02 -08:00
GIT-VERSION-FILE.in Makefile: refactor GIT-VERSION-GEN to be reusable 2024-12-07 07:52:08 +09:00
GIT-VERSION-GEN Start 2.50 cycle (batch #1) 2025-03-26 16:26:11 +09:00
INSTALL
LGPL-2.1
Makefile Merge branch 'bc/make-avoid-unneeded-rebuild-with-compdb-dir' 2025-05-19 16:02:46 -07:00
README.md README: *.txt -> *.adoc fixes 2025-03-03 13:49:19 -08:00
RelNotes Start 2.50 cycle (batch #1) 2025-03-26 16:26:11 +09:00
SECURITY.md
abspath.c
abspath.h
aclocal.m4
add-interactive.c add-interactive: stop using `the_repository` 2024-12-18 10:44:31 -08:00
add-interactive.h
add-patch.c pager: stop using `the_repository` 2024-12-18 10:44:30 -08:00
advice.c advice: allow disabling default branch name advice 2025-03-25 16:09:28 -07:00
advice.h advice: allow disabling default branch name advice 2025-03-25 16:09:28 -07:00
alias.c
alias.h
alloc.c
alloc.h
apply.c Merge branch 'ps/parse-options-integers' 2025-04-24 17:25:34 -07:00
apply.h
archive-tar.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
archive-zip.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
archive.c Merge branch 'ps/parse-options-integers' 2025-04-24 17:25:34 -07:00
archive.h
attr.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
attr.h
banned.h
base85.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
base85.h
bisect.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
bisect.h
blame.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
blame.h
blob.c
blob.h
bloom.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
bloom.h
branch.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
branch.h
builtin.h Merge branch 'jt/diff-pairs' 2025-03-26 16:26:09 +09:00
bulk-checkin.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
bulk-checkin.h object-file: drop `index_blob_stream()` 2025-04-15 08:24:36 -07:00
bundle-uri.c Merge branch 'sc/bundle-uri-use-all-refs-in-bundle' 2025-05-19 16:02:45 -07:00
bundle-uri.h
bundle.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
bundle.h bundle: avoid closing file descriptor twice 2025-01-25 18:38:11 -08:00
cache-tree.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
cache-tree.h
cbtree.c
cbtree.h
chdir-notify.c
chdir-notify.h
check-builtins.sh
checkout.c
checkout.h
chunk-format.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
chunk-format.h
color.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
color.h
column.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
column.h
combine-diff.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
command-list.txt builtin: introduce diff-pairs command 2025-03-03 08:17:47 -08:00
commit-graph.c raw_object_store: drop extra pointer to replace_map 2025-05-12 13:06:27 -07:00
commit-graph.h object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
commit-reach.c commit-reach: use `size_t` to track indices when computing merge bases 2024-12-27 08:12:40 -08:00
commit-reach.h commit-reach: use `size_t` to track indices when computing merge bases 2024-12-27 08:12:40 -08:00
commit-slab-decl.h
commit-slab-impl.h
commit-slab.h
commit.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
commit.h commit-reach: use `size_t` to track indices in `get_reachable_subset()` 2024-12-27 08:11:45 -08:00
common-exit.c common-main: split init and exit code into new files 2025-01-28 14:39:16 -08:00
common-init.c common-main: split init and exit code into new files 2025-01-28 14:39:16 -08:00
common-init.h common-main: split init and exit code into new files 2025-01-28 14:39:16 -08:00
common-main.c common-main: split init and exit code into new files 2025-01-28 14:39:16 -08:00
config.c Merge branch 'ps/object-wo-the-repository' 2025-04-15 13:50:15 -07:00
config.h config: teach repo_config to allow `repo` to be NULL 2025-03-07 16:52:00 -08:00
config.mak.dev Merge branch 'js/comma-semicolon-confusion' 2025-04-15 13:50:17 -07:00
config.mak.in
config.mak.uname Merge branch 'js/ci-buildsystems-cleanup' 2025-05-13 14:05:06 -07:00
configure.ac config.mak.uname: add sysinfo() configuration for cygwin 2025-04-16 20:43:45 -07:00
connect.c Merge branch 'cc/lop-remote' 2025-03-05 10:37:44 -08:00
connect.h
connected.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
connected.h
convert.c object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
convert.h
copy.c path: adjust last remaining users of `the_repository` 2025-02-28 13:54:11 -08:00
copy.h
credential.c Merge branch 'ps/the-repository' 2025-01-21 08:44:54 -08:00
credential.h Merge branch 'ps/the-repository' 2025-01-21 08:44:54 -08:00
csum-file.c csum-file: stop depending on `the_repository` 2025-03-10 13:16:18 -07:00
csum-file.h csum-file: stop depending on `the_repository` 2025-03-10 13:16:18 -07:00
ctype.c
daemon.c Merge branch 'ps/build-sign-compare' 2024-12-23 09:32:11 -08:00
date.c date.c: Fix type missmatch warings from msvc 2024-12-26 13:34:28 -08:00
date.h
decorate.c decorate: fix sign comparison warnings 2025-03-10 13:21:13 -07:00
decorate.h
delta-islands.c delta-islands: stop depending on `the_repository` 2025-03-10 13:16:20 -07:00
delta-islands.h delta-islands: stop depending on `the_repository` 2025-03-10 13:16:20 -07:00
delta.h
detect-compiler detect-compiler: detect clang even if it found CUDA 2025-03-28 17:38:12 -07:00
diagnose.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
diagnose.h diagnose: stop using `the_repository` 2024-12-18 10:44:31 -08:00
diff-delta.c diff-delta: avoid using the comma operator 2025-03-28 17:38:10 -07:00
diff-lib.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
diff-merges.c diff.h: fix index used to loop through unsigned integer 2024-12-06 20:20:03 +09:00
diff-merges.h
diff-no-index.c diff --no-index: support limiting by pathspec 2025-05-22 14:20:11 -07:00
diff.c Merge branch 'js/diff-codeql-false-positive-workaround' 2025-05-08 12:36:32 -07:00
diff.h Merge branch 'ps/object-wo-the-repository' 2025-04-15 13:50:15 -07:00
diffcore-break.c
diffcore-delta.c
diffcore-order.c diff.h: fix index used to loop through unsigned integer 2024-12-06 20:20:03 +09:00
diffcore-pickaxe.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
diffcore-rename.c object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
diffcore-rotate.c diff.h: fix index used to loop through unsigned integer 2024-12-06 20:20:03 +09:00
diffcore.h diffcore.h: *.txt -> *.adoc fixes 2025-03-03 13:49:23 -08:00
dir-iterator.c refs/iterator: separate lifecycle from iteration 2025-03-12 11:31:18 -07:00
dir-iterator.h refs/iterator: separate lifecycle from iteration 2025-03-12 11:31:18 -07:00
dir.c pathspec: add flag to indicate operation without repository 2025-05-22 14:20:11 -07:00
dir.h Merge branch 'am/dir-dedup-decl-of-repository' 2025-03-29 16:39:09 +09:00
editor.c path: refactor `repo_git_path()` family of functions 2025-02-07 09:59:21 -08:00
editor.h
entry.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
entry.h
environment.c Merge branch 'js/windows-arm64' 2025-05-05 14:56:24 -07:00
environment.h Merge branch 'ab/environment-clean-header' 2025-04-17 10:28:20 -07:00
exec-cmd.c
exec-cmd.h
fetch-negotiator.c
fetch-negotiator.h
fetch-pack.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
fetch-pack.h
fmt-merge-msg.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
fmt-merge-msg.h
fsck.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
fsck.h Merge branch 'sj/ref-consistency-checks-more' 2025-03-26 16:26:10 +09:00
fsmonitor--daemon.h
fsmonitor-ipc.c
fsmonitor-ipc.h
fsmonitor-ll.h
fsmonitor-path-utils.h
fsmonitor-settings.c
fsmonitor-settings.h
fsmonitor.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
fsmonitor.h
generate-cmdlist.sh doc: use .adoc extension for AsciiDoc files 2025-01-21 12:56:06 -08:00
generate-configlist.sh completion: take into account the formatting backticks for options 2025-03-20 19:27:29 -07:00
generate-hooklist.sh doc: use .adoc extension for AsciiDoc files 2025-01-21 12:56:06 -08:00
generate-perl.sh Makefile: use "generate-perl.sh" to massage Perl library 2024-12-07 07:52:10 +09:00
generate-python.sh Makefile: extract script to massage Python scripts 2024-12-07 07:52:10 +09:00
generate-script.sh Makefile: extract script to massage Shell scripts 2024-12-07 07:52:10 +09:00
gettext.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
gettext.h
git-archimport.perl
git-compat-util.h Merge branch 'ps/parse-options-integers' 2025-04-24 17:25:34 -07:00
git-curl-compat.h http.c: allow custom TCP keepalive behavior via config 2025-03-21 01:38:52 -07:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl Makefile: consistently use @PLACEHOLDER@ to substitute 2024-12-07 07:52:08 +09:00
git-difftool--helper.sh
git-filter-branch.sh filter-branch: stop depending on Perl 2025-04-16 07:30:29 -07:00
git-instaweb.sh instaweb: fix ip binding for the python http.server 2025-01-10 15:27:52 -08: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-quiltimport.sh
git-request-pull.sh request-pull: stop depending on Perl 2025-04-16 07:30:29 -07:00
git-send-email.perl Merge branch 'ag/doc-send-email' 2025-05-19 16:02:45 -07:00
git-sh-i18n.sh Makefile: consistently use @PLACEHOLDER@ to substitute 2024-12-07 07:52:08 +09:00
git-sh-setup.sh Makefile: consistently use @PLACEHOLDER@ to substitute 2024-12-07 07:52:08 +09:00
git-submodule.sh git-submodule.sh: rename some variables 2024-12-11 20:46:48 +09:00
git-svn.perl Makefile: consistently use @PLACEHOLDER@ to substitute 2024-12-07 07:52:08 +09:00
git-web--browse.sh
git-zlib.c Merge branch 'jk/zlib-inflate-fixes' 2025-04-15 13:50:14 -07:00
git-zlib.h git-zlib: use `struct z_stream_s` instead of typedef 2025-04-07 14:53:11 -07:00
git.c builtin: introduce diff-pairs command 2025-03-03 08:17:47 -08:00
git.rc.in Makefile: generate "git.rc" via GIT-VERSION-GEN 2024-12-07 07:52:09 +09:00
gpg-interface.c gpg-interface: address -Wsign-comparison warnings 2024-12-06 20:20:04 +09:00
gpg-interface.h
graph.c graph: stop using `the_repository` 2024-12-18 10:44:31 -08:00
graph.h
grep.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
grep.h
hash-lookup.c
hash-lookup.h
hash.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
hash.h Merge branch 'jt/help-sha-backend-info-in-build-options' 2025-04-16 13:54:20 -07:00
hashmap.c Merge branch 'en/hashmap-clear-fix' 2025-05-08 12:36:31 -07:00
hashmap.h
help.c help: include unsafe SHA-1 build info in version 2025-04-07 14:39:27 -07:00
help.h global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
hex-ll.c
hex-ll.h
hex.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
hex.h
hook.c path: refactor `repo_git_path()` family of functions 2025-02-07 09:59:21 -08:00
hook.h
http-backend.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
http-fetch.c
http-push.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
http-walker.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
http.c object-store: drop `loose_object_path()` 2025-04-29 10:08:12 -07:00
http.h hash: stop typedeffing the hash context 2025-01-31 10:06:10 -08:00
ident.c ident: stop assuming that `gw_gecos` is writable 2025-03-06 08:35:07 -08:00
ident.h
imap-send.c imap-send: explicitly verify the peer certificate 2025-03-25 15:48:58 -07:00
iterator.h refs/iterator: separate lifecycle from iteration 2025-03-12 11:31:18 -07:00
json-writer.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
json-writer.h
khash.h
kwset.c kwset: avoid using the comma operator unnecessarily 2025-03-28 17:38:09 -07:00
kwset.h
levenshtein.c
levenshtein.h
line-log.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
line-log.h
line-range.c
line-range.h
linear-assignment.c
linear-assignment.h
list-objects-filter-options.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
list-objects-filter-options.h list-objects-filter-options.h: *.txt -> *.adoc fixes 2025-03-03 13:49:23 -08:00
list-objects-filter.c oidmap: rename oidmap_free() to oidmap_clear() 2025-05-12 13:06:26 -07:00
list-objects-filter.h
list-objects.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
list-objects.h
list.h
lockfile.c
lockfile.h
log-tree.c object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
log-tree.h
loose.c path: adjust last remaining users of `the_repository` 2025-02-28 13:54:11 -08:00
loose.h
ls-refs.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
ls-refs.h
mailinfo.c mailinfo: stop using `the_repository` 2024-12-18 10:44:31 -08:00
mailinfo.h mailinfo: stop using `the_repository` 2024-12-18 10:44:31 -08:00
mailmap.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
mailmap.h
match-trees.c object-file: split out functions relating to object store subsystem 2025-04-15 08:24:36 -07:00
match-trees.h
mem-pool.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
mem-pool.h
merge-blobs.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
merge-blobs.h
merge-ll.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
merge-ll.h
merge-ort-wrappers.c merge-ort: support having merge verbosity be set to 0 2025-03-18 09:48:51 -07:00
merge-ort-wrappers.h merge-recursive.[ch]: thoroughly debug these 2025-04-08 13:59:13 -07:00
merge-ort.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
merge-ort.h merge-recursive.[ch]: thoroughly debug these 2025-04-08 13:59:13 -07:00
merge.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
merge.h
mergesort.h
meson.build Merge branch 'dd/meson-perl-custom-path' 2025-05-15 17:24:56 -07:00
meson_options.txt Merge branch 'dd/meson-perl-custom-path' 2025-05-15 17:24:56 -07:00
midx-write.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
midx.c object-file: move `git_open_cloexec()` to "compat/open.c" 2025-04-15 08:24:35 -07:00
midx.h
name-hash.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
name-hash.h
notes-cache.c object-file: split out functions relating to object store subsystem 2025-04-15 08:24:36 -07:00
notes-cache.h
notes-merge.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
notes-merge.h
notes-utils.c
notes-utils.h
notes.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
notes.h
object-file-convert.c object-file-convert: stop depending on `the_repository` 2025-03-10 13:16:19 -07:00
object-file-convert.h object-file-convert: stop depending on `the_repository` 2025-03-10 13:16:19 -07:00
object-file.c object-store: drop `loose_object_path()` 2025-04-29 10:08:12 -07:00
object-file.h object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
object-name.c object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
object-name.h object-name: introduce `repo_get_oid_with_flags()` 2025-03-12 11:31:16 -07:00
object-store.c Merge branch 'jk/oidmap-cleanup' 2025-05-19 16:02:47 -07:00
object-store.h Merge branch 'jk/oidmap-cleanup' 2025-05-19 16:02:47 -07:00
object.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
object.h Merge branch 'kn/bundle-dedup-optim' 2025-04-23 13:58:50 -07:00
oid-array.c
oid-array.h
oidmap.c oidmap: rename oidmap_free() to oidmap_clear() 2025-05-12 13:06:26 -07:00
oidmap.h oidmap: add size function 2025-05-12 13:06:26 -07:00
oidset.c
oidset.h
oidtree.c
oidtree.h
pack-bitmap-write.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
pack-bitmap.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
pack-bitmap.h Merge branch 'ps/cat-file-filter-batch' 2025-04-16 13:54:21 -07:00
pack-check.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
pack-mtimes.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
pack-mtimes.h
pack-objects.c
pack-objects.h object-store: move `struct packed_git` into "packfile.h" 2025-04-29 10:08:11 -07:00
pack-revindex.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
pack-revindex.h
pack-write.c pack-write: stop depending on `the_repository` and `the_hash_algo` 2025-03-10 13:16:18 -07:00
pack.h pack-write: stop depending on `the_repository` and `the_hash_algo` 2025-03-10 13:16:18 -07:00
packfile.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
packfile.h object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
pager.c pager: stop using `the_repository` 2024-12-18 10:44:30 -08:00
pager.h pager: stop using `the_repository` 2024-12-18 10:44:30 -08:00
parallel-checkout.c treewide: replace assert() with ASSERT() in special cases 2025-03-21 03:32:10 -07:00
parallel-checkout.h
parse-options-cb.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
parse-options.c parse-options: introduce precision handling for `OPTION_UNSIGNED` 2025-04-17 08:15:16 -07:00
parse-options.h parse-options: detect mismatches in integer signedness 2025-04-17 08:15:16 -07:00
parse.c parse-options: introduce precision handling for `OPTION_UNSIGNED` 2025-04-17 08:15:16 -07:00
parse.h parse-options: introduce precision handling for `OPTION_UNSIGNED` 2025-04-17 08:15:16 -07:00
patch-delta.c
patch-ids.c diff.h: fix index used to loop through unsigned integer 2024-12-06 20:20:03 +09:00
patch-ids.h
path-walk.c backfill: add --sparse option 2025-02-03 16:12:42 -08:00
path-walk.h backfill: add --sparse option 2025-02-03 16:12:42 -08:00
path.c object-store: move and rename `odb_pack_keep()` 2025-04-29 10:08:12 -07:00
path.h object-store: move and rename `odb_pack_keep()` 2025-04-29 10:08:12 -07:00
pathspec.c pathspec: add flag to indicate operation without repository 2025-05-22 14:20:11 -07:00
pathspec.h pathspec: add flag to indicate operation without repository 2025-05-22 14:20:11 -07:00
pkt-line.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
pkt-line.h
preload-index.c progress: stop using `the_repository` 2024-12-18 10:44:30 -08:00
preload-index.h
pretty.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
pretty.h
prio-queue.c prio-queue: use size_t rather than int for size 2024-12-20 07:21:45 -08:00
prio-queue.h prio-queue: fix type of `insertion_ctr` 2024-12-27 08:10:41 -08:00
progress.c progress: stop using `the_repository` 2024-12-18 10:44:30 -08:00
progress.h progress: stop using `the_repository` 2024-12-18 10:44:30 -08:00
promisor-remote.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
promisor-remote.h Add 'promisor-remote' capability to protocol v2 2025-02-18 11:05:37 -08:00
prompt.c
prompt.h
protocol-caps.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
protocol-caps.h
protocol.c
protocol.h
prune-packed.c object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
prune-packed.h
pseudo-merge.c progress: stop using `the_repository` 2024-12-18 10:44:30 -08:00
pseudo-merge.h Merge branch 'tb/bitamp-typofix' 2025-04-07 14:23:20 -07:00
quote.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
quote.h
range-diff.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
range-diff.h range-diff: optionally include merge commits' diffs in the analysis 2024-12-16 08:45:48 -08:00
reachable.c object-store: move function declarations to their respective subsystems 2025-04-29 10:08:12 -07:00
reachable.h
read-cache-ll.h
read-cache.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
read-cache.h
rebase-interactive.c
rebase-interactive.h
rebase.c
rebase.h
ref-filter.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
ref-filter.h global: use designated initializers for options 2025-04-17 08:15:15 -07:00
reflog-walk.c diff.h: fix index used to loop through unsigned integer 2024-12-06 20:20:03 +09:00
reflog-walk.h
reflog.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
reflog.h builtin/reflog: make functions regarding `reflog_expire_options` public 2025-04-08 07:53:27 -07:00
refs.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
refs.h Merge branch 'kn/non-transactional-batch-updates' 2025-04-16 13:54:19 -07:00
refspec.c refspec: replace `refspec_item_init()` with fetch/push variants 2025-03-21 01:45:16 -07:00
refspec.h refspec: replace `refspec_item_init()` with fetch/push variants 2025-03-21 01:45:16 -07:00
remote-curl.c remote-curl: avoid using the comma operator unnecessarily 2025-03-28 17:38:08 -07:00
remote.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
remote.h remote: allow `guess_remote_head()` to suppress advice 2025-03-25 16:09:27 -07:00
replace-object.c raw_object_store: drop extra pointer to replace_map 2025-05-12 13:06:27 -07:00
replace-object.h raw_object_store: drop extra pointer to replace_map 2025-05-12 13:06:27 -07:00
repo-settings.c environment: move access to "core.bigFileThreshold" into repo settings 2025-03-10 13:16:18 -07:00
repo-settings.h environment: move access to "core.bigFileThreshold" into repo settings 2025-03-10 13:16:18 -07:00
repository.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
repository.h
rerere.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
rerere.h rerere: let `rerere_path()` write paths into a caller-provided buffer 2025-02-28 13:54:11 -08:00
reset.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
reset.h
resolve-undo.c resolve-undo: stop using `the_repository` 2024-12-18 10:44:31 -08:00
resolve-undo.h resolve-undo: stop using `the_repository` 2024-12-18 10:44:31 -08:00
revision.c Merge branch 'ps/object-file-cleanup' 2025-04-24 17:25:33 -07:00
revision.h Merge branch 'lo/remove-log-reencode-from-rev-info' 2025-04-29 14:21:31 -07:00
run-command.c git-compat-util: add NOT_CONSTANT macro and use it in atfork_prepare() 2025-03-17 17:30:49 -07:00
run-command.h
sane-ctype.h
scalar.c treewide: replace assert() with ASSERT() in special cases 2025-03-21 03:32:10 -07:00
send-pack.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
send-pack.h send-pack: new return code "ERROR_SEND_PACK_BAD_REF_STATUS" 2025-02-03 15:24:57 -08:00
sequencer.c Merge branch 'jk/oidmap-cleanup' 2025-05-19 16:02:47 -07:00
sequencer.h
serve.c Add 'promisor-remote' capability to protocol v2 2025-02-18 11:05:37 -08:00
serve.h serve: stop using `the_repository` 2024-12-18 10:44:30 -08:00
server-info.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
server-info.h server-info: stop using `the_repository` 2024-12-18 10:44:30 -08:00
setup.c Merge branch 'tz/doc-txt-to-adoc-fixes' 2025-03-06 14:06:31 -08:00
setup.h
sh-i18n--envsubst.c
sha1dc_git.c
sha1dc_git.h
shallow.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
shallow.h shallow: fix -Wsign-compare warnings 2024-12-27 08:12:40 -08:00
shared.mak GIT-VERSION-GEN: fix overriding GIT_BUILT_FROM_COMMIT and GIT_DATE 2024-12-20 12:36:45 -08:00
shell.c
shortlog.h
sideband.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
sideband.h
sigchain.c
sigchain.h
simple-ipc.h simple-ipc.h: *.txt -> *.adoc fixes 2025-03-03 13:49:25 -08:00
sparse-index.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
sparse-index.h
split-index.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
split-index.h
stable-qsort.c
statinfo.c
statinfo.h
strbuf.c Git 2.47.2 2025-01-13 12:55:26 -08:00
strbuf.h Git 2.47.2 2025-01-13 12:55:26 -08:00
streaming.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
streaming.h
string-list.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
string-list.h
strmap.c
strmap.h
strvec.c Merge branch 'ps/build-sign-compare' 2024-12-23 09:32:11 -08:00
strvec.h
sub-process.c
sub-process.h
submodule-config.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
submodule-config.h
submodule.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
submodule.h submodule: refactor `submodule_to_gitdir()` to accept a repo 2025-02-07 09:59:21 -08:00
symlinks.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
symlinks.h
tag.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
tag.h
tar.h
tempfile.c path: adjust last remaining users of `the_repository` 2025-02-28 13:54:11 -08:00
tempfile.h
thread-utils.c
thread-utils.h Revert barrier-based LSan threading race workaround 2025-01-01 14:13:01 -08:00
tmp-objdir.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
tmp-objdir.h tmp-objdir: stop using `the_repository` 2024-12-18 10:44:31 -08:00
trace.c trace: stop using `the_repository` 2024-12-18 10:44:30 -08:00
trace.h trace: stop using `the_repository` 2024-12-18 10:44:30 -08:00
trace2.c Merge branch 'am/trace2-with-valueless-true' 2025-01-29 14:05:10 -08:00
trace2.h trace2.h: *.txt -> *.adoc fixes 2025-03-03 13:49:26 -08:00
trailer.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
trailer.h
transport-helper.c refspec: replace `refspec_init()` with fetch/push variants 2025-03-21 01:45:16 -07:00
transport-internal.h
transport.c Merge branch 'ps/send-pack-unhide-error-in-atomic-push' 2025-02-18 15:30:32 -08:00
transport.h transport.h: *.txt -> *.adoc fixes 2025-03-03 13:49:27 -08:00
tree-diff.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
tree-walk.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
tree-walk.h tree-walk.h: fix incorrect API comment 2025-05-02 12:44:04 -07:00
tree.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
tree.h
unicode-width.h
unimplemented.sh Makefile: consistently use @PLACEHOLDER@ to substitute 2024-12-07 07:52:08 +09:00
unix-socket.c Merge branch 'ps/leakfixes-0129' 2025-02-06 14:56:45 -08:00
unix-socket.h
unix-stream-server.c
unix-stream-server.h
unpack-trees.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
unpack-trees.h
upload-pack.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
upload-pack.h
url.c
url.h
urlmatch.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
urlmatch.h
usage.c usage: add show_usage_if_asked() 2025-01-17 13:30:02 -08:00
userdiff.c userdiff: add builtin driver for INI files 2025-04-01 03:02:09 -07:00
userdiff.h
utf8.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
utf8.h
varint.c
varint.h
version-def.h.in Makefile: propagate Git version via generated header 2024-12-07 07:52:08 +09:00
version.c Merge branch 'ua/os-version-capability' 2025-02-27 15:23:00 -08:00
version.h agent: advertise OS name via agent capability 2025-02-19 09:48:37 -08:00
versioncmp.c global: trivial conversions to fix `-Wsign-compare` warnings 2024-12-06 20:20:04 +09:00
versioncmp.h
walker.c treewide: convert users of `repo_has_object_file()` to `has_object()` 2025-04-29 10:08:13 -07:00
walker.h
wildmatch.c wildmatch: avoid using of the comma operator 2025-03-28 17:38:11 -07:00
wildmatch.h
worktree.c Merge branch 'sj/ref-consistency-checks-more' 2025-03-26 16:26:10 +09:00
worktree.h Merge branch 'sj/ref-consistency-checks-more' 2025-03-26 16:26:10 +09:00
wrapper.c Merge branch 'cf/wrapper-bsd-eloop' 2025-05-15 17:24:55 -07:00
wrapper.h wrapper: allow generating insecure random bytes 2025-01-07 09:04:18 -08:00
write-or-die.c
write-or-die.h
ws.c global: mark code units that generate warnings with `-Wsign-compare` 2024-12-06 20:20:02 +09:00
ws.h
wt-status.c hash: stop depending on `the_repository` in `null_oid()` 2025-03-10 13:16:20 -07:00
wt-status.h
xdiff-interface.c object-store: merge "object-store-ll.h" and "object-store.h" 2025-04-15 08:24:37 -07:00
xdiff-interface.h

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.adoc to get started, then see Documentation/giteveryday.adoc for a useful minimum set of commands, and Documentation/git-<commandname>.adoc 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.adoc (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 and Documentation/CodingGuidelines).

Those wishing to help with error message, usage and informational message string translations (localization l10) should see po/README.md (a po file is a Portable Object file that holds the translations).

To subscribe to the list, send an email to git+subscribe@vger.kernel.org (see https://subspace.kernel.org/subscribing.html for details). The mailing list archives are available at https://lore.kernel.org/git/, https://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