Compare commits

..

27 Commits

Author SHA1 Message Date
9fb2a1fb08 Git 2.19.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2021-02-12 15:47:48 +01:00
fb049fd85b Sync with 2.18.5
* maint-2.18:
  Git 2.18.5
  Git 2.17.6
  unpack_trees(): start with a fresh lstat cache
  run-command: invalidate lstat cache after a command finished
  checkout: fix bug that makes checkout follow symlinks in leading path
2021-02-12 15:47:47 +01:00
6eed462c8f Git 2.18.5
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2021-02-12 15:47:43 +01:00
9b77cec89b Sync with 2.17.6
* maint-2.17:
  Git 2.17.6
  unpack_trees(): start with a fresh lstat cache
  run-command: invalidate lstat cache after a command finished
  checkout: fix bug that makes checkout follow symlinks in leading path
2021-02-12 15:47:42 +01:00
6b82d3eea6 Git 2.17.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2021-02-12 15:47:02 +01:00
22539ec3b5 unpack_trees(): start with a fresh lstat cache
We really want to avoid relying on stale information.

Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2021-02-12 15:47:02 +01:00
0d58fef58a run-command: invalidate lstat cache after a command finished
In the previous commit, we intercepted calls to `rmdir()` to invalidate
the lstat cache in the successful case, so that the lstat cache could
not have the idea that a directory exists where there is none.

The same situation can arise, of course, when a separate process is
spawned (most notably, this is the case in `submodule_move_head()`).
Obviously, we cannot know whether a directory was removed in that
process, therefore we must invalidate the lstat cache afterwards.

Note: in contrast to `lstat_cache_aware_rmdir()`, we invalidate the
lstat cache even in case of an error: the process might have removed a
directory and still have failed afterwards.

Co-authored-by: Matheus Tavares <matheus.bernardino@usp.br>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2021-02-12 15:47:02 +01:00
684dd4c2b4 checkout: fix bug that makes checkout follow symlinks in leading path
Before checking out a file, we have to confirm that all of its leading
components are real existing directories. And to reduce the number of
lstat() calls in this process, we cache the last leading path known to
contain only directories. However, when a path collision occurs (e.g.
when checking out case-sensitive files in case-insensitive file
systems), a cached path might have its file type changed on disk,
leaving the cache on an invalid state. Normally, this doesn't bring
any bad consequences as we usually check out files in index order, and
therefore, by the time the cached path becomes outdated, we no longer
need it anyway (because all files in that directory would have already
been written).

But, there are some users of the checkout machinery that do not always
follow the index order. In particular: checkout-index writes the paths
in the same order that they appear on the CLI (or stdin); and the
delayed checkout feature -- used when a long-running filter process
replies with "status=delayed" -- postpones the checkout of some entries,
thus modifying the checkout order.

When we have to check out an out-of-order entry and the lstat() cache is
invalid (due to a previous path collision), checkout_entry() may end up
using the invalid data and thrusting that the leading components are
real directories when, in reality, they are not. In the best case
scenario, where the directory was replaced by a regular file, the user
will get an error: "fatal: unable to create file 'foo/bar': Not a
directory". But if the directory was replaced by a symlink, checkout
could actually end up following the symlink and writing the file at a
wrong place, even outside the repository. Since delayed checkout is
affected by this bug, it could be used by an attacker to write
arbitrary files during the clone of a maliciously crafted repository.

Some candidate solutions considered were to disable the lstat() cache
during unordered checkouts or sort the entries before passing them to
the checkout machinery. But both ideas include some performance penalty
and they don't future-proof the code against new unordered use cases.

Instead, we now manually reset the lstat cache whenever we successfully
remove a directory. Note: We are not even checking whether the directory
was the same as the lstat cache points to because we might face a
scenario where the paths refer to the same location but differ due to
case folding, precomposed UTF-8 issues, or the presence of `..`
components in the path. Two regression tests, with case-collisions and
utf8-collisions, are also added for both checkout-index and delayed
checkout.

Note: to make the previously mentioned clone attack unfeasible, it would
be sufficient to reset the lstat cache only after the remove_subtree()
call inside checkout_entry(). This is the place where we would remove a
directory whose path collides with the path of another entry that we are
currently trying to check out (possibly a symlink). However, in the
interest of a thorough fix that does not leave Git open to
similar-but-not-identical attack vectors, we decided to intercept
all `rmdir()` calls in one fell swoop.

This addresses CVE-2021-21300.

Co-authored-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Matheus Tavares <matheus.bernardino@usp.br>
2021-02-12 15:47:02 +01:00
76b54ee9b9 Git 2.19.5
This merges up the security fix from v2.17.5.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:26:41 -07:00
ba6f0905fd Git 2.18.4
This merges up the security fix from v2.17.5.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:24:14 -07:00
df5be6dc3f Git 2.17.5
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:10:58 -07:00
1a3609e402 fsck: reject URL with empty host in .gitmodules
Git's URL parser interprets

	https:///example.com/repo.git

to have no host and a path of "example.com/repo.git".  Curl, on the
other hand, internally redirects it to https://example.com/repo.git.  As
a result, until "credential: parse URL without host as empty host, not
unset", tricking a user into fetching from such a URL would cause Git to
send credentials for another host to example.com.

Teach fsck to block and detect .gitmodules files using such a URL to
prevent sharing them with Git versions that are not yet protected.

A relative URL in a .gitmodules file could also be used to trigger this.
The relative URL resolver used for .gitmodules does not normalize
sequences of slashes and can follow ".." components out of the path part
and to the host part of a URL, meaning that such a relative URL can be
used to traverse from a https://foo.example.com/innocent superproject to
a https:///attacker.example.com/exploit submodule. Fortunately,
redundant extra slashes in .gitmodules are rare, so we can catch this by
detecting one after a leading sequence of "./" and "../" components.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
2020-04-19 16:10:58 -07:00
e7fab62b73 credential: treat URL with empty scheme as invalid
Until "credential: refuse to operate when missing host or protocol",
Git's credential handling code interpreted URLs with empty scheme to
mean "give me credentials matching this host for any protocol".

Luckily libcurl does not recognize such URLs (it tries to look for a
protocol named "" and fails). Just in case that changes, let's reject
them within Git as well. This way, credential_from_url is guaranteed to
always produce a "struct credential" with protocol and host set.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:10:58 -07:00
c44088ecc4 credential: treat URL without scheme as invalid
libcurl permits making requests without a URL scheme specified.  In
this case, it guesses the URL from the hostname, so I can run

	git ls-remote http::ftp.example.com/path/to/repo

and it would make an FTP request.

Any user intentionally using such a URL is likely to have made a typo.
Unfortunately, credential_from_url is not able to determine the host and
protocol in order to determine appropriate credentials to send, and
until "credential: refuse to operate when missing host or protocol",
this resulted in another host's credentials being leaked to the named
host.

Teach credential_from_url_gently to consider such a URL to be invalid
so that fsck can detect and block gitmodules files with such URLs,
allowing server operators to avoid serving them to downstream users
running older versions of Git.

This also means that when such URLs are passed on the command line, Git
will print a clearer error so affected users can switch to the simpler
URL that explicitly specifies the host and protocol they intend.

One subtlety: .gitmodules files can contain relative URLs, representing
a URL relative to the URL they were cloned from.  The relative URL
resolver used for .gitmodules can follow ".." components out of the path
part and past the host part of a URL, meaning that such a relative URL
can be used to traverse from a https://foo.example.com/innocent
superproject to a https::attacker.example.com/exploit submodule.
Fortunately a leading ':' in the first path component after a series of
leading './' and '../' components is unlikely to show up in other
contexts, so we can catch this by detecting that pattern.

Reported-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
2020-04-19 16:10:58 -07:00
fe29a9b7b0 credential: die() when parsing invalid urls
When we try to initialize credential loading by URL and find that the
URL is invalid, we set all fields to NULL in order to avoid acting on
malicious input. Later when we request credentials, we diagonse the
erroneous input:

	fatal: refusing to work with credential missing host field

This is problematic in two ways:

- The message doesn't tell the user *why* we are missing the host
  field, so they can't tell from this message alone how to recover.
  There can be intervening messages after the original warning of
  bad input, so the user may not have the context to put two and two
  together.

- The error only occurs when we actually need to get a credential.  If
  the URL permits anonymous access, the only encouragement the user gets
  to correct their bogus URL is a quiet warning.

  This is inconsistent with the check we perform in fsck, where any use
  of such a URL as a submodule is an error.

When we see such a bogus URL, let's not try to be nice and continue
without helpers. Instead, die() immediately. This is simpler and
obviously safe. And there's very little chance of disrupting a normal
workflow.

It's _possible_ that somebody has a legitimate URL with a raw newline in
it. It already wouldn't work with credential helpers, so this patch
steps that up from an inconvenience to "we will refuse to work with it
at all". If such a case does exist, we should figure out a way to work
with it (especially if the newline is only in the path component, which
we normally don't even pass to helpers). But until we see a real report,
we're better off being defensive.

Reported-by: Carlo Arenas <carenas@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:10:58 -07:00
a2b26ffb1a fsck: convert gitmodules url to URL passed to curl
In 07259e74ec (fsck: detect gitmodules URLs with embedded newlines,
2020-03-11), git fsck learned to check whether URLs in .gitmodules could
be understood by the credential machinery when they are handled by
git-remote-curl.

However, the check is overbroad: it checks all URLs instead of only
URLs that would be passed to git-remote-curl. In principle a git:// or
file:/// URL does not need to follow the same conventions as an http://
URL; in particular, git:// and file:// protocols are not succeptible to
issues in the credential API because they do not support attaching
credentials.

In the HTTP case, the URL in .gitmodules does not always match the URL
that would be passed to git-remote-curl and the credential machinery:
Git's URL syntax allows specifying a remote helper followed by a "::"
delimiter and a URL to be passed to it, so that

	git ls-remote http::https://example.com/repo.git

invokes git-remote-http with https://example.com/repo.git as its URL
argument. With today's checks, that distinction does not make a
difference, but for a check we are about to introduce (for empty URL
schemes) it will matter.

.gitmodules files also support relative URLs. To ensure coverage for the
https based embedded-newline attack, urldecode and check them directly
for embedded newlines.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Reviewed-by: Jeff King <peff@peff.net>
2020-04-19 16:10:58 -07:00
8ba8ed568e credential: refuse to operate when missing host or protocol
The credential helper protocol was designed to be very flexible: the
fields it takes as input are treated as a pattern, and any missing
fields are taken as wildcards. This allows unusual things like:

  echo protocol=https | git credential reject

to delete all stored https credentials (assuming the helpers themselves
treat the input that way). But when helpers are invoked automatically by
Git, this flexibility works against us. If for whatever reason we don't
have a "host" field, then we'd match _any_ host. When you're filling a
credential to send to a remote server, this is almost certainly not what
you want.

Prevent this at the layer that writes to the credential helper. Add a
check to the credential API that the host and protocol are always passed
in, and add an assertion to the credential_write function that speaks
credential helper protocol to be doubly sure.

There are a few ways this can be triggered in practice:

  - the "git credential" command passes along arbitrary credential
    parameters it reads from stdin.

  - until the previous patch, when the host field of a URL is empty, we
    would leave it unset (rather than setting it to the empty string)

  - a URL like "example.com/foo.git" is treated by curl as if "http://"
    was present, but our parser sees it as a non-URL and leaves all
    fields unset

  - the recent fix for URLs with embedded newlines blanks the URL but
    otherwise continues. Rather than having the desired effect of
    looking up no credential at all, many helpers will return _any_
    credential

Our earlier test for an embedded newline didn't catch this because it
only checked that the credential was cleared, but didn't configure an
actual helper. Configuring the "verbatim" helper in the test would show
that it is invoked (it's obviously a silly helper which doesn't look at
its input, but the point is that it shouldn't be run at all). Since
we're switching this case to die(), we don't need to bother with a
helper. We can see the new behavior just by checking that the operation
fails.

We'll add new tests covering partial input as well (these can be
triggered through various means with url-parsing, but it's simpler to
just check them directly, as we know we are covered even if the url
parser changes behavior in the future).

[jn: changed to die() instead of logging and showing a manual
 username/password prompt]

Reported-by: Carlo Arenas <carenas@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:10:58 -07:00
24036686c4 credential: parse URL without host as empty host, not unset
We may feed a URL like "cert:///path/to/cert.pem" into the credential
machinery to get the key for a client-side certificate. That
credential has no hostname field, which is about to be disallowed (to
avoid confusion with protocols where a helper _would_ expect a
hostname).

This means as of the next patch, credential helpers won't work for
unlocking certs. Let's fix that by doing two things:

  - when we parse a url with an empty host, set the host field to the
    empty string (asking only to match stored entries with an empty
    host) rather than NULL (asking to match _any_ host).

  - when we build a cert:// credential by hand, similarly assign an
    empty string

It's the latter that is more likely to impact real users in practice,
since it's what's used for http connections. But we don't have good
infrastructure to test it.

The url-parsing version will help anybody using git-credential in a
script, and is easy to test.

Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:10:57 -07:00
73aafe9bc2 t0300: use more realistic inputs
Many of the tests in t0300 give partial inputs to git-credential,
omitting a protocol or hostname. We're checking only high-level things
like whether and how helpers are invoked at all, and we don't care about
specific hosts. However, in preparation for tightening up the rules
about when we're willing to run a helper, let's start using input that's
a bit more realistic: pretend as if http://example.com is being
examined.

This shouldn't change the point of any of the tests, but do note we have
to adjust the expected output to accommodate this (filling a credential
will repeat back the protocol/host fields to stdout, and the helper
debug messages and askpass prompt will change on stderr).

Signed-off-by: Jeff King <peff@peff.net>
Reviewed-by: Taylor Blau <me@ttaylorr.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:10:57 -07:00
a88dbd2f8c t0300: make "quit" helper more realistic
We test a toy credential helper that writes "quit=1" and confirms that
we stop running other helpers. However, that helper is unrealistic in
that it does not bother to read its stdin at all.

For now we don't send any input to it, because we feed git-credential a
blank credential. But that will change in the next patch, which will
cause this test to racily fail, as git-credential will get SIGPIPE
writing to the helper rather than exiting because it was asked to.

Let's make this one-off helper more like our other sample helpers, and
have it source the "dump" script. That will read stdin, fixing the
SIGPIPE problem. But it will also write what it sees to stderr. We can
make the test more robust by checking that output, which confirms that
we do run the quit helper, don't run any other helpers, and exit for the
reason we expected.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
2020-04-19 16:10:52 -07:00
a5979d7009 Git 2.19.4
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-03-17 13:43:08 -07:00
21a3e5016b Git 2.18.3
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-03-17 13:34:12 -07:00
c42c0f1297 Git 2.17.4
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-03-17 13:25:33 -07:00
07259e74ec fsck: detect gitmodules URLs with embedded newlines
The credential protocol can't handle values with newlines. We already
detect and block any such URLs from being used with credential helpers,
but let's also add an fsck check to detect and block gitmodules files
with such URLs. That will let us notice the problem earlier when
transfer.fsckObjects is turned on. And in particular it will prevent bad
objects from spreading, which may protect downstream users running older
versions of Git.

We'll file this under the existing gitmodulesUrl flag, which covers URLs
with option injection. There's really no need to distinguish the exact
flaw in the URL in this context. Likewise, I've expanded the description
of t7416 to cover all types of bogus URLs.
2020-03-12 02:56:50 -04:00
c716fe4bd9 credential: detect unrepresentable values when parsing urls
The credential protocol can't represent newlines in values, but URLs can
embed percent-encoded newlines in various components. A previous commit
taught the low-level writing routines to die() when encountering this,
but we can be a little friendlier to the user by detecting them earlier
and handling them gracefully.

This patch teaches credential_from_url() to notice such components,
issue a warning, and blank the credential (which will generally result
in prompting the user for a username and password). We blank the whole
credential in this case. Another option would be to blank only the
invalid component. However, we're probably better off not feeding a
partially-parsed URL result to a credential helper. We don't know how a
given helper would handle it, so we're better off to err on the side of
matching nothing rather than something unexpected.

The die() call in credential_write() is _probably_ impossible to reach
after this patch. Values should end up in credential structs only by URL
parsing (which is covered here), or by reading credential protocol input
(which by definition cannot read a newline into a value). But we should
definitely keep the low-level check, as it's our final and most accurate
line of defense against protocol injection attacks. Arguably it could
become a BUG(), but it probably doesn't matter much either way.

Note that the public interface of credential_from_url() grows a little
more than we need here. We'll use the extra flexibility in a future
patch to help fsck catch these cases.
2020-03-12 02:55:24 -04:00
17f1c0b8c7 t/lib-credential: use test_i18ncmp to check stderr
The credential tests have a "check" function which feeds some input to
git-credential and checks the stdout and stderr. We look for exact
matches in the output. For stdout, this makes sense; the output is
the credential protocol. But for stderr, we may be showing various
diagnostic messages, or the prompts fed to the askpass program, which
could be translated. Let's mark them as such.
2020-03-12 02:55:17 -04:00
9a6bbee800 credential: avoid writing values with newlines
The credential protocol that we use to speak to helpers can't represent
values with newlines in them. This was an intentional design choice to
keep the protocol simple, since none of the values we pass should
generally have newlines.

However, if we _do_ encounter a newline in a value, we blindly transmit
it in credential_write(). Such values may break the protocol syntax, or
worse, inject new valid lines into the protocol stream.

The most likely way for a newline to end up in a credential struct is by
decoding a URL with a percent-encoded newline. However, since the bug
occurs at the moment we write the value to the protocol, we'll catch it
there. That should leave no possibility of accidentally missing a code
path that can trigger the problem.

At this level of the code we have little choice but to die(). However,
since we'd not ever expect to see this case outside of a malicious URL,
that's an acceptable outcome.

Reported-by: Felix Wilhelm <fwilhelm@google.com>
2020-03-12 02:55:16 -04:00
1491 changed files with 86738 additions and 237666 deletions

View File

@ -1,15 +0,0 @@
env:
CIRRUS_CLONE_DEPTH: 1
freebsd_12_task:
freebsd_instance:
image: freebsd-12-1-release-amd64
install_script:
pkg install -y gettext gmake perl5
create_user_script:
- pw useradd git
- chown -R git:git .
build_script:
- su git -c gmake
test_script:
- su git -c 'gmake test'

View File

@ -6,8 +6,6 @@
# Use tabs whenever we need to fill whitespace that spans at least from one tab
# stop to the next one.
#
# These settings are mirrored in .editorconfig. Keep them in sync.
UseTab: Always
TabWidth: 8
IndentWidth: 8
@ -148,21 +146,8 @@ SpacesInSquareBrackets: false
Cpp11BracedListStyle: false
# A list of macros that should be interpreted as foreach loops instead of as
# function calls. Taken from:
# git grep -h '^#define [^[:space:]]*for_each[^[:space:]]*(' \
# | sed "s,^#define \([^[:space:]]*for_each[^[:space:]]*\)(.*$, - '\1'," \
# | sort | uniq
ForEachMacros:
- 'for_each_abbrev'
- 'for_each_builtin'
- 'for_each_string_list_item'
- 'for_each_ut'
- 'for_each_wanted_builtin'
- 'list_for_each'
- 'list_for_each_dir'
- 'list_for_each_prev'
- 'list_for_each_prev_safe'
- 'list_for_each_safe'
# function calls.
ForEachMacros: ['for_each_string_list_item']
# The maximum number of consecutive empty lines to keep.
MaxEmptyLinesToKeep: 1

View File

@ -1,16 +0,0 @@
[*]
charset = utf-8
insert_final_newline = true
# The settings for C (*.c and *.h) files are mirrored in .clang-format. Keep
# them in sync.
[*.{c,h,sh,perl,pl,pm}]
indent_style = tab
tab_width = 8
[*.py]
indent_style = space
indent_size = 4
[COMMIT_EDITMSG]
max_line_length = 72

4
.gitattributes vendored
View File

@ -5,12 +5,10 @@
*.pl eof=lf diff=perl
*.pm eol=lf diff=perl
*.py eol=lf diff=python
*.bat eol=crlf
/Documentation/**/*.txt eol=lf
/Documentation/git-*.txt eol=lf
/command-list.txt eol=lf
/GIT-VERSION-GEN eol=lf
/mergetools/* eol=lf
/t/oid-info/* eol=lf
/Documentation/git-merge.txt conflict-marker-size=32
/Documentation/gitk.txt conflict-marker-size=32
/Documentation/user-manual.txt conflict-marker-size=32

View File

@ -5,7 +5,7 @@ Git community does not use github.com for their contributions. Instead, we use
a mailing list (git@vger.kernel.org) for code submissions, code
reviews, and bug reports.
Nevertheless, you can use [GitGitGadget](https://gitgitgadget.github.io/) to
Nevertheless, you can use [submitGit](http://submitgit.herokuapp.com/) to
conveniently send your Pull Requests commits to our mailing list.
Please read ["A note from the maintainer"](https://git.kernel.org/pub/scm/git/git.git/plain/MaintNotes?h=todo)

View File

@ -1,7 +1,7 @@
Thanks for taking the time to contribute to Git! Please be advised that the
Git community does not use github.com for their contributions. Instead, we use
a mailing list (git@vger.kernel.org) for code submissions, code reviews, and
bug reports. Nevertheless, you can use GitGitGadget (https://gitgitgadget.github.io/)
to conveniently send your Pull Requests commits to our mailing list.
bug reports. Nevertheless, you can use submitGit to conveniently send your Pull
Requests commits to our mailing list.
Please read the "guidelines for contributing" linked above!

31
.gitignore vendored
View File

@ -1,7 +1,3 @@
/fuzz-commit-graph
/fuzz_corpora
/fuzz-pack-headers
/fuzz-pack-idx
/GIT-BUILD-OPTIONS
/GIT-CFLAGS
/GIT-LDFLAGS
@ -58,7 +54,6 @@
/git-difftool
/git-difftool--helper
/git-describe
/git-env--helper
/git-fast-export
/git-fast-import
/git-fetch
@ -83,7 +78,6 @@
/git-init-db
/git-interpret-trailers
/git-instaweb
/git-legacy-stash
/git-log
/git-ls-files
/git-ls-remote
@ -105,9 +99,8 @@
/git-mergetool--lib
/git-mktag
/git-mktree
/git-multi-pack-index
/git-mv
/git-name-rev
/git-mv
/git-notes
/git-p4
/git-pack-redundant
@ -123,6 +116,10 @@
/git-range-diff
/git-read-tree
/git-rebase
/git-rebase--am
/git-rebase--helper
/git-rebase--interactive
/git-rebase--merge
/git-rebase--preserve-merges
/git-receive-pack
/git-reflog
@ -133,6 +130,7 @@
/git-remote-ftps
/git-remote-fd
/git-remote-ext
/git-remote-testgit
/git-remote-testpy
/git-remote-testsvn
/git-repack
@ -140,7 +138,6 @@
/git-request-pull
/git-rerere
/git-reset
/git-restore
/git-rev-list
/git-rev-parse
/git-revert
@ -158,7 +155,6 @@
/git-show-branch
/git-show-index
/git-show-ref
/git-sparse-checkout
/git-stage
/git-stash
/git-status
@ -166,7 +162,6 @@
/git-submodule
/git-submodule--helper
/git-svn
/git-switch
/git-symbolic-ref
/git-tag
/git-unpack-file
@ -217,7 +212,6 @@
/tags
/TAGS
/cscope*
*.hcc
*.obj
*.lib
*.res
@ -228,14 +222,5 @@
*.user
*.idb
*.pdb
*.ilk
*.iobj
*.ipdb
*.dll
.vs/
Debug/
Release/
/UpgradeLog*.htm
/git.VC.VC.opendb
/git.VC.db
*.dSYM
/Debug/
/Release/

View File

@ -18,17 +18,13 @@ Alexey Shumkin <alex.crezoff@gmail.com> <zapped@mail.ru>
Alexey Shumkin <alex.crezoff@gmail.com> <Alex.Crezoff@gmail.com>
Anders Kaseorg <andersk@MIT.EDU> <andersk@ksplice.com>
Anders Kaseorg <andersk@MIT.EDU> <andersk@mit.edu>
Andrey Mazo <ahippo@yandex.com> Mazo, Andrey <amazo@checkvideo.com>
Aneesh Kumar K.V <aneesh.kumar@gmail.com>
Amos Waterland <apw@debian.org> <apw@rossby.metr.ou.edu>
Amos Waterland <apw@debian.org> <apw@us.ibm.com>
Ben Peart <benpeart@microsoft.com> <Ben.Peart@microsoft.com>
Ben Peart <benpeart@microsoft.com> <peartben@gmail.com>
Ben Walton <bdwalton@gmail.com> <bwalton@artsci.utoronto.ca>
Benoit Sigoure <tsunanet@gmail.com> <tsuna@lrde.epita.fr>
Bernt Hansen <bernt@norang.ca> <bernt@alumni.uwaterloo.ca>
Brandon Casey <drafnel@gmail.com> <casey@nrlssc.navy.mil>
Brandon Williams <bwilliams.eng@gmail.com> <bmwill@google.com>
brian m. carlson <sandals@crustytoothpaste.net>
brian m. carlson <sandals@crustytoothpaste.net> <sandals@crustytoothpaste.ath.cx>
Bryan Larsen <bryan@larsen.st> <bryan.larsen@gmail.com>
@ -36,13 +32,10 @@ Bryan Larsen <bryan@larsen.st> <bryanlarsen@yahoo.com>
Cheng Renquan <crquan@gmail.com>
Chris Shoemaker <c.shoemaker@cox.net>
Chris Wright <chrisw@sous-sol.org> <chrisw@osdl.org>
Christian Ludwig <chrissicool@gmail.com> <chrissicool@googlemail.com>
Cord Seele <cowose@gmail.com> <cowose@googlemail.com>
Christian Couder <chriscool@tuxfamily.org> <christian.couder@gmail.com>
Christian Stimming <stimming@tuhh.de> <chs@ckiste.goetheallee>
Christopher Díaz Riveros <chrisadr@gentoo.org> Christopher Diaz Riveros
Clemens Buchacher <drizzd@gmx.net> <drizzd@aon.at>
Clemens Buchacher <drizzd@gmx.net> <clemens.buchacher@intel.com>
Csaba Henk <csaba@gluster.com> <csaba@lowlife.hu>
Dan Johnson <computerdruid@gmail.com>
Dana L. How <danahow@gmail.com> <how@deathvalley.cswitch.com>
@ -58,9 +51,7 @@ David Reiss <dreiss@facebook.com> <dreiss@dreiss-vmware.(none)>
David S. Miller <davem@davemloft.net>
David Turner <novalis@novalis.org> <dturner@twopensource.com>
David Turner <novalis@novalis.org> <dturner@twosigma.com>
Derrick Stolee <dstolee@microsoft.com> <stolee@gmail.com>
Deskin Miller <deskinm@umich.edu>
Đoàn Trần Công Danh <congdanhqx@gmail.com> Doan Tran Cong Danh
Dirk Süsserott <newsletter@dirk.my1.cc>
Eric Blake <eblake@redhat.com> <ebb9@byu.net>
Eric Hanchrow <eric.hanchrow@gmail.com> <offby1@blarg.net>
@ -107,7 +98,6 @@ Jens Axboe <axboe@kernel.dk> <jens.axboe@oracle.com>
Jens Lindström <jl@opera.com> Jens Lindstrom <jl@opera.com>
Jim Meyering <jim@meyering.net> <meyering@redhat.com>
Joachim Berdal Haga <cjhaga@fys.uio.no>
Joachim Jablon <joachim.jablon@people-doc.com> <ewjoachim@gmail.com>
Johannes Schindelin <Johannes.Schindelin@gmx.de> <johannes.schindelin@gmx.de>
Johannes Sixt <j6t@kdbg.org> <J.Sixt@eudaptics.com>
Johannes Sixt <j6t@kdbg.org> <j.sixt@viscovery.net>
@ -160,7 +150,6 @@ Mark Levedahl <mdl123@verizon.net> <mlevedahl@gmail.com>
Mark Rada <marada@uwaterloo.ca>
Martin Langhoff <martin@laptop.org> <martin@catalyst.net.nz>
Martin von Zweigbergk <martinvonz@gmail.com> <martin.von.zweigbergk@gmail.com>
Masaya Suzuki <masayasuzuki@google.com> <draftcode@gmail.com>
Matt Draisey <matt@draisey.ca> <mattdraisey@sympatico.ca>
Matt Kraai <kraai@ftbfs.org> <matt.kraai@amo.abbott.com>
Matt McCutchen <matt@mattmccutchen.net> <hashproduct@gmail.com>
@ -168,7 +157,6 @@ Matthias Kestenholz <matthias@spinlock.ch> <mk@spinlock.ch>
Matthias Rüster <matthias.ruester@gmail.com> Matthias Ruester
Matthias Urlichs <matthias@urlichs.de> <smurf@kiste.(none)>
Matthias Urlichs <matthias@urlichs.de> <smurf@smurf.noris.de>
Matthieu Moy <git@matthieu-moy.fr> <Matthieu.Moy@imag.fr>
Michael Coleman <tutufan@gmail.com>
Michael J Gruber <git@grubix.eu> <michaeljgruber+gmane@fastmail.fm>
Michael J Gruber <git@grubix.eu> <git@drmicha.warpmail.net>
@ -192,11 +180,7 @@ Nick Stokoe <nick@noodlefactory.co.uk> Nick Woolley <nick@noodlefactory.co.uk>
Nick Stokoe <nick@noodlefactory.co.uk> Nick Woolley <nickwoolley@yahoo.co.uk>
Nicolas Morey-Chaisemartin <devel-git@morey-chaisemartin.com> <nicolas.morey@free.fr>
Nicolas Morey-Chaisemartin <devel-git@morey-chaisemartin.com> <nmorey@kalray.eu>
Nicolas Morey-Chaisemartin <devel-git@morey-chaisemartin.com> <nicolas@morey-chaisemartin.com>
Nicolas Morey-Chaisemartin <devel-git@morey-chaisemartin.com> <NMoreyChaisemartin@suse.com>
Nicolas Morey-Chaisemartin <devel-git@morey-chaisemartin.com> <nmoreychaisemartin@suse.com>
Nicolas Sebrecht <nicolas.s.dev@gmx.fr> <ni.s@laposte.net>
Orgad Shaneh <orgads@gmail.com> <orgad.shaneh@audiocodes.com>
Paolo Bonzini <bonzini@gnu.org> <paolo.bonzini@lu.unisi.ch>
Pascal Obry <pascal@obry.net> <pascal.obry@gmail.com>
Pascal Obry <pascal@obry.net> <pascal.obry@wanadoo.fr>
@ -212,12 +196,10 @@ Petr Baudis <pasky@ucw.cz> <pasky@suse.cz>
Petr Baudis <pasky@ucw.cz> <xpasky@machine>
Phil Hord <hordp@cisco.com> <phil.hord@gmail.com>
Philip Jägenstedt <philip@foolip.org> <philip.jagenstedt@gmail.com>
Philip Oakley <philipoakley@iee.email> <philipoakley@iee.org> # secondary <philipoakley@dunelm.org.uk>
Philipp A. Hartmann <pah@qo.cx> <ph@sorgh.de>
Philippe Bruhat <book@cpan.org>
Ralf Thielow <ralf.thielow@gmail.com> <ralf.thielow@googlemail.com>
Ramsay Jones <ramsay@ramsayjones.plus.com> <ramsay@ramsay1.demon.co.uk>
Randall S. Becker <randall.becker@nexbridge.ca> <rsbecker@nexbridge.com>
René Scharfe <l.s.r@web.de> <rene.scharfe@lsrfire.ath.cx>
René Scharfe <l.s.r@web.de> Rene Scharfe
Richard Hansen <rhansen@rhansen.org> <hansenr@google.com>
@ -256,7 +238,6 @@ Steven Walter <stevenrwalter@gmail.com> <swalter@lpdev.prtdev.lexmark.com>
Sven Verdoolaege <skimo@kotnet.org> <Sven.Verdoolaege@cs.kuleuven.ac.be>
Sven Verdoolaege <skimo@kotnet.org> <skimo@liacs.nl>
SZEDER Gábor <szeder.dev@gmail.com> <szeder@ira.uka.de>
Tao Qingyun <taoqy@ls-a.me> <845767657@qq.com>
Tay Ray Chuan <rctay89@gmail.com>
Ted Percival <ted@midg3t.net> <ted.percival@quest.com>
Theodore Ts'o <tytso@mit.edu>

View File

@ -8,23 +8,37 @@ os:
- linux
- osx
osx_image: xcode10.1
compiler:
- clang
- gcc
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- language-pack-is
- git-svn
- apache2
- gcc-8
matrix:
include:
- env: jobname=GIT_TEST_GETTEXT_POISON
- env: jobname=GETTEXT_POISON
os: linux
compiler:
addons:
before_install:
- env: jobname=linux-gcc-4.8
- env: jobname=Windows
os: linux
dist: trusty
compiler:
addons:
before_install:
script:
- >
test "$TRAVIS_REPO_SLUG" != "git/git" ||
ci/run-windows-build.sh $TRAVIS_BRANCH $(git rev-parse HEAD)
after_failure:
- env: jobname=Linux32
os: linux
compiler:
@ -36,11 +50,22 @@ matrix:
- env: jobname=StaticAnalysis
os: linux
compiler:
addons:
apt:
packages:
- coccinelle
before_install:
script: ci/run-static-analysis.sh
after_failure:
- env: jobname=Documentation
os: linux
compiler:
addons:
apt:
packages:
- asciidoc
- xmlto
before_install:
script: ci/test-documentation.sh
after_failure:

View File

@ -1,93 +0,0 @@
# Git Code of Conduct
This code of conduct outlines our expectations for participants within
the Git community, as well as steps for reporting unacceptable behavior.
We are committed to providing a welcoming and inspiring community for
all and expect our code of conduct to be honored. Anyone who violates
this code of conduct may be banned from the community.
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to make participation in our project and
our community a harassment-free experience for everyone, regardless of age,
body size, disability, ethnicity, sex characteristics, gender identity and
expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity and
orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all project spaces, and it also applies
when an individual is representing the project or its community in public
spaces. Examples of representing a project or community include using an
official project e-mail address, posting via an official social media account,
or acting as an appointed representative at an online or offline event.
Representation of a project may be further defined and clarified by project
maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at git@sfconservancy.org. All
complaints will be reviewed and investigated and will result in a response
that is deemed necessary and appropriate to the circumstances. The project
team is obligated to maintain confidentiality with regard to the reporter of
an incident. Further details of specific enforcement policies may be posted
separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
The project leadership team can be contacted by email as a whole at
git@sfconservancy.org, or individually:
- Ævar Arnfjörð Bjarmason <avarab@gmail.com>
- Christian Couder <christian.couder@gmail.com>
- Jeff King <peff@peff.net>
- Junio C Hamano <gitster@pobox.com>
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View File

@ -13,5 +13,3 @@ mergetools-*.txt
manpage-base-url.xsl
SubmittingPatches.txt
tmp-doc-diff/
GIT-ASCIIDOCFLAGS
/GIT-EXCLUDED-PROGRAMS

View File

@ -75,7 +75,7 @@ For shell scripts specifically (not exhaustive):
- If you want to find out if a command is available on the user's
$PATH, you should use 'type <command>', instead of 'which <command>'.
The output of 'which' is not machine parsable and its exit code
The output of 'which' is not machine parseable and its exit code
is not reliable across platforms.
- We use POSIX compliant parameter substitutions and avoid bashisms;
@ -118,24 +118,6 @@ For shell scripts specifically (not exhaustive):
do this
fi
- If a command sequence joined with && or || or | spans multiple
lines, put each command on a separate line and put && and || and |
operators at the end of each line, rather than the start. This
means you don't need to use \ to join lines, since the above
operators imply the sequence isn't finished.
(incorrect)
grep blob verify_pack_result \
| awk -f print_1.awk \
| sort >actual &&
...
(correct)
grep blob verify_pack_result |
awk -f print_1.awk |
sort >actual &&
...
- We prefer "test" over "[ ... ]".
- We do not write the noiseword "function" in front of shell
@ -195,30 +177,10 @@ For C programs:
by e.g. "echo DEVELOPER=1 >>config.mak".
- We try to support a wide range of C compilers to compile Git with,
including old ones. You should not use features from newer C
standard, even if your compiler groks them.
including old ones. That means that you should not use C99
initializers, even if a lot of compilers grok it.
There are a few exceptions to this guideline:
. since early 2012 with e1327023ea, we have been using an enum
definition whose last element is followed by a comma. This, like
an array initializer that ends with a trailing comma, can be used
to reduce the patch noise when adding a new identifier at the end.
. since mid 2017 with cbc0f81d, we have been using designated
initializers for struct (e.g. "struct t v = { .val = 'a' };").
. since mid 2017 with 512f41cf, we have been using designated
initializers for array (e.g. "int array[10] = { [5] = 2 }").
These used to be forbidden, but we have not heard any breakage
report, and they are assumed to be safe.
- Variables have to be declared at the beginning of the block, before
the first statement (i.e. -Wdeclaration-after-statement).
- Declaring a variable in the for loop "for (int i = 0; i < 10; i++)"
is still not allowed in this codebase.
- Variables have to be declared at the beginning of the block.
- NULL pointers shall be written as NULL, not as 0.
@ -432,12 +394,6 @@ For C programs:
must be declared with "extern" in header files. However, function
declarations should not use "extern", as that is already the default.
- You can launch gdb around your program using the shorthand GIT_DEBUGGER.
Run `GIT_DEBUGGER=1 ./bin-wrappers/git foo` to simply use gdb as is, or
run `GIT_DEBUGGER="<debugger> <debugger-args>" ./bin-wrappers/git foo` to
use your own debugger and arguments. Example: `GIT_DEBUGGER="ddd --gdb"
./bin-wrappers/git log` (See `wrap-for-bin.sh`.)
For Perl programs:
- Most of the C guidelines above apply.
@ -606,14 +562,11 @@ Writing Documentation:
or commands:
Literal examples (e.g. use of command-line options, command names,
branch names, URLs, pathnames (files and directories), configuration and
environment variables) must be typeset in monospace (i.e. wrapped with
backticks):
branch names, configuration and environment variables) must be
typeset in monospace (i.e. wrapped with backticks):
`--pretty=oneline`
`git rev-list`
`remote.pushDefault`
`http://git.example.com`
`.git/config`
`GIT_DIR`
`HEAD`

View File

@ -7,14 +7,12 @@ ARTICLES =
SP_ARTICLES =
OBSOLETE_HTML =
-include GIT-EXCLUDED-PROGRAMS
MAN1_TXT += $(filter-out \
$(patsubst %,%.txt,$(EXCLUDED_PROGRAMS)) \
$(addsuffix .txt, $(ARTICLES) $(SP_ARTICLES)), \
$(wildcard git-*.txt))
MAN1_TXT += git.txt
MAN1_TXT += gitk.txt
MAN1_TXT += gitremote-helpers.txt
MAN1_TXT += gitweb.txt
MAN5_TXT += gitattributes.txt
@ -32,26 +30,20 @@ MAN7_TXT += gitdiffcore.txt
MAN7_TXT += giteveryday.txt
MAN7_TXT += gitglossary.txt
MAN7_TXT += gitnamespaces.txt
MAN7_TXT += gitremote-helpers.txt
MAN7_TXT += gitrevisions.txt
MAN7_TXT += gitsubmodules.txt
MAN7_TXT += gittutorial-2.txt
MAN7_TXT += gittutorial.txt
MAN7_TXT += gitworkflows.txt
ifdef MAN_FILTER
MAN_TXT = $(filter $(MAN_FILTER),$(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT))
else
MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)
MAN_FILTER = $(MAN_TXT)
endif
MAN_XML = $(patsubst %.txt,%.xml,$(MAN_TXT))
MAN_HTML = $(patsubst %.txt,%.html,$(MAN_TXT))
GIT_MAN_REF = master
OBSOLETE_HTML += everyday.html
OBSOLETE_HTML += git-remote-helpers.html
DOC_HTML = $(MAN_HTML) $(OBSOLETE_HTML)
ARTICLES += howto-index
ARTICLES += git-tools
@ -76,14 +68,11 @@ SP_ARTICLES += howto/maintain-git
API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt)))
SP_ARTICLES += $(API_DOCS)
TECH_DOCS += MyFirstContribution
TECH_DOCS += MyFirstObjectWalk
TECH_DOCS += SubmittingPatches
TECH_DOCS += technical/hash-function-transition
TECH_DOCS += technical/http-protocol
TECH_DOCS += technical/index-format
TECH_DOCS += technical/long-running-process-protocol
TECH_DOCS += technical/multi-pack-index
TECH_DOCS += technical/pack-format
TECH_DOCS += technical/pack-heuristics
TECH_DOCS += technical/pack-protocol
@ -99,13 +88,11 @@ TECH_DOCS += technical/trivial-merge
SP_ARTICLES += $(TECH_DOCS)
SP_ARTICLES += technical/api-index
ARTICLES_HTML += $(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES))
HTML_FILTER ?= $(ARTICLES_HTML) $(OBSOLETE_HTML)
DOC_HTML = $(MAN_HTML) $(filter $(HTML_FILTER),$(ARTICLES_HTML) $(OBSOLETE_HTML))
DOC_HTML += $(patsubst %,%.html,$(ARTICLES) $(SP_ARTICLES))
DOC_MAN1 = $(patsubst %.txt,%.1,$(filter $(MAN_FILTER),$(MAN1_TXT)))
DOC_MAN5 = $(patsubst %.txt,%.5,$(filter $(MAN_FILTER),$(MAN5_TXT)))
DOC_MAN7 = $(patsubst %.txt,%.7,$(filter $(MAN_FILTER),$(MAN7_TXT)))
DOC_MAN1 = $(patsubst %.txt,%.1,$(MAN1_TXT))
DOC_MAN5 = $(patsubst %.txt,%.5,$(MAN5_TXT))
DOC_MAN7 = $(patsubst %.txt,%.7,$(MAN7_TXT))
prefix ?= $(HOME)
bindir ?= $(prefix)/bin
@ -124,8 +111,7 @@ ASCIIDOC_HTML = xhtml11
ASCIIDOC_DOCBOOK = docbook
ASCIIDOC_CONF = -f asciidoc.conf
ASCIIDOC_COMMON = $(ASCIIDOC) $(ASCIIDOC_EXTRA) $(ASCIIDOC_CONF) \
-amanversion=$(GIT_VERSION) \
-amanmanual='Git Manual' -amansource='Git'
-agit_version=$(GIT_VERSION)
TXT_TO_HTML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_HTML)
TXT_TO_XML = $(ASCIIDOC_COMMON) -b $(ASCIIDOC_DOCBOOK)
MANPAGE_XSL = manpage-normal.xsl
@ -199,13 +185,11 @@ ifdef USE_ASCIIDOCTOR
ASCIIDOC = asciidoctor
ASCIIDOC_CONF =
ASCIIDOC_HTML = xhtml5
ASCIIDOC_DOCBOOK = docbook5
ASCIIDOC_DOCBOOK = docbook45
ASCIIDOC_EXTRA += -acompat-mode -atabsize=8
ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
ASCIIDOC_EXTRA += -alitdd='&\#x2d;&\#x2d;'
DBLATEX_COMMON =
XMLTO_EXTRA += --skip-validation
XMLTO_EXTRA += -x manpage.xsl
endif
SHELL_PATH ?= $(SHELL)
@ -301,7 +285,7 @@ docdep_prereqs = \
mergetools-list.made $(mergetools_txt) \
cmd-list.made $(cmds_txt)
doc.dep : $(docdep_prereqs) $(wildcard *.txt) $(wildcard config/*.txt) build-docdep.perl
doc.dep : $(docdep_prereqs) $(wildcard *.txt) build-docdep.perl
$(QUIET_GEN)$(RM) $@+ $@ && \
$(PERL_PATH) ./build-docdep.perl >$@+ $(QUIET_STDERR) && \
mv $@+ $@
@ -339,15 +323,6 @@ mergetools-list.made: ../git-mergetool--lib.sh $(wildcard ../mergetools/*)
show_tool_names can_merge "* " || :' >mergetools-merge.txt && \
date >$@
TRACK_ASCIIDOCFLAGS = $(subst ','\'',$(ASCIIDOC_COMMON):$(ASCIIDOC_HTML):$(ASCIIDOC_DOCBOOK))
GIT-ASCIIDOCFLAGS: FORCE
@FLAGS='$(TRACK_ASCIIDOCFLAGS)'; \
if test x"$$FLAGS" != x"`cat GIT-ASCIIDOCFLAGS 2>/dev/null`" ; then \
echo >&2 " * new asciidoc flags"; \
echo "$$FLAGS" >GIT-ASCIIDOCFLAGS; \
fi
clean:
$(RM) *.xml *.xml+ *.html *.html+ *.1 *.5 *.7
$(RM) *.texi *.texi+ *.texi++ git.info gitman.info
@ -357,14 +332,13 @@ clean:
$(RM) SubmittingPatches.txt
$(RM) $(cmds_txt) $(mergetools_txt) *.made
$(RM) manpage-base-url.xsl
$(RM) GIT-ASCIIDOCFLAGS
$(MAN_HTML): %.html : %.txt asciidoc.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
$(MAN_HTML): %.html : %.txt asciidoc.conf
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
$(TXT_TO_HTML) -d manpage -o $@+ $< && \
mv $@+ $@
$(OBSOLETE_HTML): %.html : %.txto asciidoc.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
$(OBSOLETE_HTML): %.html : %.txto asciidoc.conf
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
$(TXT_TO_HTML) -o $@+ $< && \
mv $@+ $@
@ -372,16 +346,16 @@ $(OBSOLETE_HTML): %.html : %.txto asciidoc.conf asciidoctor-extensions.rb GIT-AS
manpage-base-url.xsl: manpage-base-url.xsl.in
$(QUIET_GEN)sed "s|@@MAN_BASE_URL@@|$(MAN_BASE_URL)|" $< > $@
%.1 %.5 %.7 : %.xml manpage-base-url.xsl $(wildcard manpage*.xsl)
%.1 %.5 %.7 : %.xml manpage-base-url.xsl
$(QUIET_XMLTO)$(RM) $@ && \
$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<
%.xml : %.txt asciidoc.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
%.xml : %.txt asciidoc.conf
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
$(TXT_TO_XML) -d manpage -o $@+ $< && \
mv $@+ $@
user-manual.xml: user-manual.txt user-manual.conf asciidoctor-extensions.rb GIT-ASCIIDOCFLAGS
user-manual.xml: user-manual.txt user-manual.conf
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
$(TXT_TO_XML) -d book -o $@+ $< && \
mv $@+ $@
@ -391,8 +365,7 @@ technical/api-index.txt: technical/api-index-skel.txt \
$(QUIET_GEN)cd technical && '$(SHELL_PATH_SQ)' ./api-index.sh
technical/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
$(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.txt \
asciidoc.conf GIT-ASCIIDOCFLAGS
$(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.txt asciidoc.conf
$(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.txt
SubmittingPatches.txt: SubmittingPatches
@ -449,7 +422,7 @@ $(patsubst %,%.html,$(ARTICLES)) : %.html : %.txt
WEBDOC_DEST = /pub/software/scm/git/docs
howto/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
$(patsubst %.txt,%.html,$(wildcard howto/*.txt)): %.html : %.txt GIT-ASCIIDOCFLAGS
$(patsubst %.txt,%.html,$(wildcard howto/*.txt)): %.html : %.txt
$(QUIET_ASCIIDOC)$(RM) $@+ $@ && \
sed -e '1,/^$$/d' $< | \
$(TXT_TO_HTML) - >$@+ && \
@ -483,9 +456,4 @@ print-man1:
lint-docs::
$(QUIET_LINT)$(PERL_PATH) lint-gitlink.perl
ifeq ($(wildcard po/Makefile),po/Makefile)
doc-l10n install-l10n::
$(MAKE) -C po $@
endif
.PHONY: FORCE

File diff suppressed because it is too large Load Diff

View File

@ -1,905 +0,0 @@
= My First Object Walk
== What's an Object Walk?
The object walk is a key concept in Git - this is the process that underpins
operations like object transfer and fsck. Beginning from a given commit, the
list of objects is found by walking parent relationships between commits (commit
X based on commit W) and containment relationships between objects (tree Y is
contained within commit X, and blob Z is located within tree Y, giving our
working tree for commit X something like `y/z.txt`).
A related concept is the revision walk, which is focused on commit objects and
their parent relationships and does not delve into other object types. The
revision walk is used for operations like `git log`.
=== Related Reading
- `Documentation/user-manual.txt` under "Hacking Git" contains some coverage of
the revision walker in its various incarnations.
- `revision.h`
- https://eagain.net/articles/git-for-computer-scientists/[Git for Computer Scientists]
gives a good overview of the types of objects in Git and what your object
walk is really describing.
== Setting Up
Create a new branch from `master`.
----
git checkout -b revwalk origin/master
----
We'll put our fiddling into a new command. For fun, let's name it `git walken`.
Open up a new file `builtin/walken.c` and set up the command handler:
----
/*
* "git walken"
*
* Part of the "My First Object Walk" tutorial.
*/
#include "builtin.h"
int cmd_walken(int argc, const char **argv, const char *prefix)
{
trace_printf(_("cmd_walken incoming...\n"));
return 0;
}
----
NOTE: `trace_printf()` differs from `printf()` in that it can be turned on or
off at runtime. For the purposes of this tutorial, we will write `walken` as
though it is intended for use as a "plumbing" command: that is, a command which
is used primarily in scripts, rather than interactively by humans (a "porcelain"
command). So we will send our debug output to `trace_printf()` instead. When
running, enable trace output by setting the environment variable `GIT_TRACE`.
Add usage text and `-h` handling, like all subcommands should consistently do
(our test suite will notice and complain if you fail to do so).
----
int cmd_walken(int argc, const char **argv, const char *prefix)
{
const char * const walken_usage[] = {
N_("git walken"),
NULL,
}
struct option options[] = {
OPT_END()
};
argc = parse_options(argc, argv, prefix, options, walken_usage, 0);
...
}
----
Also add the relevant line in `builtin.h` near `cmd_whatchanged()`:
----
int cmd_walken(int argc, const char **argv, const char *prefix);
----
Include the command in `git.c` in `commands[]` near the entry for `whatchanged`,
maintaining alphabetical ordering:
----
{ "walken", cmd_walken, RUN_SETUP },
----
Add it to the `Makefile` near the line for `builtin/worktree.o`:
----
BUILTIN_OBJS += builtin/walken.o
----
Build and test out your command, without forgetting to ensure the `DEVELOPER`
flag is set, and with `GIT_TRACE` enabled so the debug output can be seen:
----
$ echo DEVELOPER=1 >>config.mak
$ make
$ GIT_TRACE=1 ./bin-wrappers/git walken
----
NOTE: For a more exhaustive overview of the new command process, take a look at
`Documentation/MyFirstContribution.txt`.
NOTE: A reference implementation can be found at
https://github.com/nasamuffin/git/tree/revwalk.
=== `struct rev_cmdline_info`
The definition of `struct rev_cmdline_info` can be found in `revision.h`.
This struct is contained within the `rev_info` struct and is used to reflect
parameters provided by the user over the CLI.
`nr` represents the number of `rev_cmdline_entry` present in the array.
`alloc` is used by the `ALLOC_GROW` macro. Check `cache.h` - this variable is
used to track the allocated size of the list.
Per entry, we find:
`item` is the object provided upon which to base the object walk. Items in Git
can be blobs, trees, commits, or tags. (See `Documentation/gittutorial-2.txt`.)
`name` is the object ID (OID) of the object - a hex string you may be familiar
with from using Git to organize your source in the past. Check the tutorial
mentioned above towards the top for a discussion of where the OID can come
from.
`whence` indicates some information about what to do with the parents of the
specified object. We'll explore this flag more later on; take a look at
`Documentation/revisions.txt` to get an idea of what could set the `whence`
value.
`flags` are used to hint the beginning of the revision walk and are the first
block under the `#include`s in `revision.h`. The most likely ones to be set in
the `rev_cmdline_info` are `UNINTERESTING` and `BOTTOM`, but these same flags
can be used during the walk, as well.
=== `struct rev_info`
This one is quite a bit longer, and many fields are only used during the walk
by `revision.c` - not configuration options. Most of the configurable flags in
`struct rev_info` have a mirror in `Documentation/rev-list-options.txt`. It's a
good idea to take some time and read through that document.
== Basic Commit Walk
First, let's see if we can replicate the output of `git log --oneline`. We'll
refer back to the implementation frequently to discover norms when performing
an object walk of our own.
To do so, we'll first find all the commits, in order, which preceded the current
commit. We'll extract the name and subject of the commit from each.
Ideally, we will also be able to find out which ones are currently at the tip of
various branches.
=== Setting Up
Preparing for your object walk has some distinct stages.
1. Perform default setup for this mode, and others which may be invoked.
2. Check configuration files for relevant settings.
3. Set up the `rev_info` struct.
4. Tweak the initialized `rev_info` to suit the current walk.
5. Prepare the `rev_info` for the walk.
6. Iterate over the objects, processing each one.
==== Default Setups
Before examining configuration files which may modify command behavior, set up
default state for switches or options your command may have. If your command
utilizes other Git components, ask them to set up their default states as well.
For instance, `git log` takes advantage of `grep` and `diff` functionality, so
its `init_log_defaults()` sets its own state (`decoration_style`) and asks
`grep` and `diff` to initialize themselves by calling each of their
initialization functions.
For our first example within `git walken`, we don't intend to use any other
components within Git, and we don't have any configuration to do. However, we
may want to add some later, so for now, we can add an empty placeholder. Create
a new function in `builtin/walken.c`:
----
static void init_walken_defaults(void)
{
/*
* We don't actually need the same components `git log` does; leave this
* empty for now.
*/
}
----
Make sure to add a line invoking it inside of `cmd_walken()`.
----
int cmd_walken(int argc, const char **argv, const char *prefix)
{
init_walken_defaults();
}
----
==== Configuring From `.gitconfig`
Next, we should have a look at any relevant configuration settings (i.e.,
settings readable and settable from `git config`). This is done by providing a
callback to `git_config()`; within that callback, you can also invoke methods
from other components you may need that need to intercept these options. Your
callback will be invoked once per each configuration value which Git knows about
(global, local, worktree, etc.).
Similarly to the default values, we don't have anything to do here yet
ourselves; however, we should call `git_default_config()` if we aren't calling
any other existing config callbacks.
Add a new function to `builtin/walken.c`:
----
static int git_walken_config(const char *var, const char *value, void *cb)
{
/*
* For now, we don't have any custom configuration, so fall back to
* the default config.
*/
return git_default_config(var, value, cb);
}
----
Make sure to invoke `git_config()` with it in your `cmd_walken()`:
----
int cmd_walken(int argc, const char **argv, const char *prefix)
{
...
git_config(git_walken_config, NULL);
...
}
----
==== Setting Up `rev_info`
Now that we've gathered external configuration and options, it's time to
initialize the `rev_info` object which we will use to perform the walk. This is
typically done by calling `repo_init_revisions()` with the repository you intend
to target, as well as the `prefix` argument of `cmd_walken` and your `rev_info`
struct.
Add the `struct rev_info` and the `repo_init_revisions()` call:
----
int cmd_walken(int argc, const char **argv, const char *prefix)
{
/* This can go wherever you like in your declarations.*/
struct rev_info rev;
...
/* This should go after the git_config() call. */
repo_init_revisions(the_repository, &rev, prefix);
...
}
----
==== Tweaking `rev_info` For the Walk
We're getting close, but we're still not quite ready to go. Now that `rev` is
initialized, we can modify it to fit our needs. This is usually done within a
helper for clarity, so let's add one:
----
static void final_rev_info_setup(struct rev_info *rev)
{
/*
* We want to mimic the appearance of `git log --oneline`, so let's
* force oneline format.
*/
get_commit_format("oneline", rev);
/* Start our object walk at HEAD. */
add_head_to_pending(rev);
}
----
[NOTE]
====
Instead of using the shorthand `add_head_to_pending()`, you could do
something like this:
----
struct setup_revision_opt opt;
memset(&opt, 0, sizeof(opt));
opt.def = "HEAD";
opt.revarg_opt = REVARG_COMMITTISH;
setup_revisions(argc, argv, rev, &opt);
----
Using a `setup_revision_opt` gives you finer control over your walk's starting
point.
====
Then let's invoke `final_rev_info_setup()` after the call to
`repo_init_revisions()`:
----
int cmd_walken(int argc, const char **argv, const char *prefix)
{
...
final_rev_info_setup(&rev);
...
}
----
Later, we may wish to add more arguments to `final_rev_info_setup()`. But for
now, this is all we need.
==== Preparing `rev_info` For the Walk
Now that `rev` is all initialized and configured, we've got one more setup step
before we get rolling. We can do this in a helper, which will both prepare the
`rev_info` for the walk, and perform the walk itself. Let's start the helper
with the call to `prepare_revision_walk()`, which can return an error without
dying on its own:
----
static void walken_commit_walk(struct rev_info *rev)
{
if (prepare_revision_walk(rev))
die(_("revision walk setup failed"));
}
----
NOTE: `die()` prints to `stderr` and exits the program. Since it will print to
`stderr` it's likely to be seen by a human, so we will localize it.
==== Performing the Walk!
Finally! We are ready to begin the walk itself. Now we can see that `rev_info`
can also be used as an iterator; we move to the next item in the walk by using
`get_revision()` repeatedly. Add the listed variable declarations at the top and
the walk loop below the `prepare_revision_walk()` call within your
`walken_commit_walk()`:
----
static void walken_commit_walk(struct rev_info *rev)
{
struct commit *commit;
struct strbuf prettybuf = STRBUF_INIT;
...
while ((commit = get_revision(rev))) {
if (!commit)
continue;
strbuf_reset(&prettybuf);
pp_commit_easy(CMIT_FMT_ONELINE, commit, &prettybuf);
puts(prettybuf.buf);
}
strbuf_release(&prettybuf);
}
----
NOTE: `puts()` prints a `char*` to `stdout`. Since this is the part of the
command we expect to be machine-parsed, we're sending it directly to stdout.
Give it a shot.
----
$ make
$ ./bin-wrappers/git walken
----
You should see all of the subject lines of all the commits in
your tree's history, in order, ending with the initial commit, "Initial revision
of "git", the information manager from hell". Congratulations! You've written
your first revision walk. You can play with printing some additional fields
from each commit if you're curious; have a look at the functions available in
`commit.h`.
=== Adding a Filter
Next, let's try to filter the commits we see based on their author. This is
equivalent to running `git log --author=<pattern>`. We can add a filter by
modifying `rev_info.grep_filter`, which is a `struct grep_opt`.
First some setup. Add `init_grep_defaults()` to `init_walken_defaults()` and add
`grep_config()` to `git_walken_config()`:
----
static void init_walken_defaults(void)
{
init_grep_defaults(the_repository);
}
...
static int git_walken_config(const char *var, const char *value, void *cb)
{
grep_config(var, value, cb);
return git_default_config(var, value, cb);
}
----
Next, we can modify the `grep_filter`. This is done with convenience functions
found in `grep.h`. For fun, we're filtering to only commits from folks using a
`gmail.com` email address - a not-very-precise guess at who may be working on
Git as a hobby. Since we're checking the author, which is a specific line in the
header, we'll use the `append_header_grep_pattern()` helper. We can use
the `enum grep_header_field` to indicate which part of the commit header we want
to search.
In `final_rev_info_setup()`, add your filter line:
----
static void final_rev_info_setup(int argc, const char **argv,
const char *prefix, struct rev_info *rev)
{
...
append_header_grep_pattern(&rev->grep_filter, GREP_HEADER_AUTHOR,
"gmail");
compile_grep_patterns(&rev->grep_filter);
...
}
----
`append_header_grep_pattern()` adds your new "gmail" pattern to `rev_info`, but
it won't work unless we compile it with `compile_grep_patterns()`.
NOTE: If you are using `setup_revisions()` (for example, if you are passing a
`setup_revision_opt` instead of using `add_head_to_pending()`), you don't need
to call `compile_grep_patterns()` because `setup_revisions()` calls it for you.
NOTE: We could add the same filter via the `append_grep_pattern()` helper if we
wanted to, but `append_header_grep_pattern()` adds the `enum grep_context` and
`enum grep_pat_token` for us.
=== Changing the Order
There are a few ways that we can change the order of the commits during a
revision walk. Firstly, we can use the `enum rev_sort_order` to choose from some
typical orderings.
`topo_order` is the same as `git log --topo-order`: we avoid showing a parent
before all of its children have been shown, and we avoid mixing commits which
are in different lines of history. (`git help log`'s section on `--topo-order`
has a very nice diagram to illustrate this.)
Let's see what happens when we run with `REV_SORT_BY_COMMIT_DATE` as opposed to
`REV_SORT_BY_AUTHOR_DATE`. Add the following:
----
static void final_rev_info_setup(int argc, const char **argv,
const char *prefix, struct rev_info *rev)
{
...
rev->topo_order = 1;
rev->sort_order = REV_SORT_BY_COMMIT_DATE;
...
}
----
Let's output this into a file so we can easily diff it with the walk sorted by
author date.
----
$ make
$ ./bin-wrappers/git walken > commit-date.txt
----
Then, let's sort by author date and run it again.
----
static void final_rev_info_setup(int argc, const char **argv,
const char *prefix, struct rev_info *rev)
{
...
rev->topo_order = 1;
rev->sort_order = REV_SORT_BY_AUTHOR_DATE;
...
}
----
----
$ make
$ ./bin-wrappers/git walken > author-date.txt
----
Finally, compare the two. This is a little less helpful without object names or
dates, but hopefully we get the idea.
----
$ diff -u commit-date.txt author-date.txt
----
This display indicates that commits can be reordered after they're written, for
example with `git rebase`.
Let's try one more reordering of commits. `rev_info` exposes a `reverse` flag.
Set that flag somewhere inside of `final_rev_info_setup()`:
----
static void final_rev_info_setup(int argc, const char **argv, const char *prefix,
struct rev_info *rev)
{
...
rev->reverse = 1;
...
}
----
Run your walk again and note the difference in order. (If you remove the grep
pattern, you should see the last commit this call gives you as your current
HEAD.)
== Basic Object Walk
So far we've been walking only commits. But Git has more types of objects than
that! Let's see if we can walk _all_ objects, and find out some information
about each one.
We can base our work on an example. `git pack-objects` prepares all kinds of
objects for packing into a bitmap or packfile. The work we are interested in
resides in `builtins/pack-objects.c:get_object_list()`; examination of that
function shows that the all-object walk is being performed by
`traverse_commit_list()` or `traverse_commit_list_filtered()`. Those two
functions reside in `list-objects.c`; examining the source shows that, despite
the name, these functions traverse all kinds of objects. Let's have a look at
the arguments to `traverse_commit_list_filtered()`, which are a superset of the
arguments to the unfiltered version.
- `struct list_objects_filter_options *filter_options`: This is a struct which
stores a filter-spec as outlined in `Documentation/rev-list-options.txt`.
- `struct rev_info *revs`: This is the `rev_info` used for the walk.
- `show_commit_fn show_commit`: A callback which will be used to handle each
individual commit object.
- `show_object_fn show_object`: A callback which will be used to handle each
non-commit object (so each blob, tree, or tag).
- `void *show_data`: A context buffer which is passed in turn to `show_commit`
and `show_object`.
- `struct oidset *omitted`: A linked-list of object IDs which the provided
filter caused to be omitted.
It looks like this `traverse_commit_list_filtered()` uses callbacks we provide
instead of needing us to call it repeatedly ourselves. Cool! Let's add the
callbacks first.
For the sake of this tutorial, we'll simply keep track of how many of each kind
of object we find. At file scope in `builtin/walken.c` add the following
tracking variables:
----
static int commit_count;
static int tag_count;
static int blob_count;
static int tree_count;
----
Commits are handled by a different callback than other objects; let's do that
one first:
----
static void walken_show_commit(struct commit *cmt, void *buf)
{
commit_count++;
}
----
The `cmt` argument is fairly self-explanatory. But it's worth mentioning that
the `buf` argument is actually the context buffer that we can provide to the
traversal calls - `show_data`, which we mentioned a moment ago.
Since we have the `struct commit` object, we can look at all the same parts that
we looked at in our earlier commit-only walk. For the sake of this tutorial,
though, we'll just increment the commit counter and move on.
The callback for non-commits is a little different, as we'll need to check
which kind of object we're dealing with:
----
static void walken_show_object(struct object *obj, const char *str, void *buf)
{
switch (obj->type) {
case OBJ_TREE:
tree_count++;
break;
case OBJ_BLOB:
blob_count++;
break;
case OBJ_TAG:
tag_count++;
break;
case OBJ_COMMIT:
BUG("unexpected commit object in walken_show_object\n");
default:
BUG("unexpected object type %s in walken_show_object\n",
type_name(obj->type));
}
}
----
Again, `obj` is fairly self-explanatory, and we can guess that `buf` is the same
context pointer that `walken_show_commit()` receives: the `show_data` argument
to `traverse_commit_list()` and `traverse_commit_list_filtered()`. Finally,
`str` contains the name of the object, which ends up being something like
`foo.txt` (blob), `bar/baz` (tree), or `v1.2.3` (tag).
To help assure us that we aren't double-counting commits, we'll include some
complaining if a commit object is routed through our non-commit callback; we'll
also complain if we see an invalid object type. Since those two cases should be
unreachable, and would only change in the event of a semantic change to the Git
codebase, we complain by using `BUG()` - which is a signal to a developer that
the change they made caused unintended consequences, and the rest of the
codebase needs to be updated to understand that change. `BUG()` is not intended
to be seen by the public, so it is not localized.
Our main object walk implementation is substantially different from our commit
walk implementation, so let's make a new function to perform the object walk. We
can perform setup which is applicable to all objects here, too, to keep separate
from setup which is applicable to commit-only walks.
We'll start by enabling all types of objects in the `struct rev_info`. We'll
also turn on `tree_blobs_in_commit_order`, which means that we will walk a
commit's tree and everything it points to immediately after we find each commit,
as opposed to waiting for the end and walking through all trees after the commit
history has been discovered. With the appropriate settings configured, we are
ready to call `prepare_revision_walk()`.
----
static void walken_object_walk(struct rev_info *rev)
{
rev->tree_objects = 1;
rev->blob_objects = 1;
rev->tag_objects = 1;
rev->tree_blobs_in_commit_order = 1;
if (prepare_revision_walk(rev))
die(_("revision walk setup failed"));
commit_count = 0;
tag_count = 0;
blob_count = 0;
tree_count = 0;
----
Let's start by calling just the unfiltered walk and reporting our counts.
Complete your implementation of `walken_object_walk()`:
----
traverse_commit_list(rev, walken_show_commit, walken_show_object, NULL);
printf("commits %d\nblobs %d\ntags %d\ntrees %d\n", commit_count,
blob_count, tag_count, tree_count);
}
----
NOTE: This output is intended to be machine-parsed. Therefore, we are not
sending it to `trace_printf()`, and we are not localizing it - we need scripts
to be able to count on the formatting to be exactly the way it is shown here.
If we were intending this output to be read by humans, we would need to localize
it with `_()`.
Finally, we'll ask `cmd_walken()` to use the object walk instead. Discussing
command line options is out of scope for this tutorial, so we'll just hardcode
a branch we can change at compile time. Where you call `final_rev_info_setup()`
and `walken_commit_walk()`, instead branch like so:
----
if (1) {
add_head_to_pending(&rev);
walken_object_walk(&rev);
} else {
final_rev_info_setup(argc, argv, prefix, &rev);
walken_commit_walk(&rev);
}
----
NOTE: For simplicity, we've avoided all the filters and sorts we applied in
`final_rev_info_setup()` and simply added `HEAD` to our pending queue. If you
want, you can certainly use the filters we added before by moving
`final_rev_info_setup()` out of the conditional and removing the call to
`add_head_to_pending()`.
Now we can try to run our command! It should take noticeably longer than the
commit walk, but an examination of the output will give you an idea why. Your
output should look similar to this example, but with different counts:
----
Object walk completed. Found 55733 commits, 100274 blobs, 0 tags, and 104210 trees.
----
This makes sense. We have more trees than commits because the Git project has
lots of subdirectories which can change, plus at least one tree per commit. We
have no tags because we started on a commit (`HEAD`) and while tags can point to
commits, commits can't point to tags.
NOTE: You will have different counts when you run this yourself! The number of
objects grows along with the Git project.
=== Adding a Filter
There are a handful of filters that we can apply to the object walk laid out in
`Documentation/rev-list-options.txt`. These filters are typically useful for
operations such as creating packfiles or performing a partial clone. They are
defined in `list-objects-filter-options.h`. For the purposes of this tutorial we
will use the "tree:1" filter, which causes the walk to omit all trees and blobs
which are not directly referenced by commits reachable from the commit in
`pending` when the walk begins. (`pending` is the list of objects which need to
be traversed during a walk; you can imagine a breadth-first tree traversal to
help understand. In our case, that means we omit trees and blobs not directly
referenced by `HEAD` or `HEAD`'s history, because we begin the walk with only
`HEAD` in the `pending` list.)
First, we'll need to `#include "list-objects-filter-options.h`" and set up the
`struct list_objects_filter_options` at the top of the function.
----
static void walken_object_walk(struct rev_info *rev)
{
struct list_objects_filter_options filter_options = {};
...
----
For now, we are not going to track the omitted objects, so we'll replace those
parameters with `NULL`. For the sake of simplicity, we'll add a simple
build-time branch to use our filter or not. Replace the line calling
`traverse_commit_list()` with the following, which will remind us which kind of
walk we've just performed:
----
if (0) {
/* Unfiltered: */
trace_printf(_("Unfiltered object walk.\n"));
traverse_commit_list(rev, walken_show_commit,
walken_show_object, NULL);
} else {
trace_printf(
_("Filtered object walk with filterspec 'tree:1'.\n"));
parse_list_objects_filter(&filter_options, "tree:1");
traverse_commit_list_filtered(&filter_options, rev,
walken_show_commit, walken_show_object, NULL, NULL);
}
----
`struct list_objects_filter_options` is usually built directly from a command
line argument, so the module provides an easy way to build one from a string.
Even though we aren't taking user input right now, we can still build one with
a hardcoded string using `parse_list_objects_filter()`.
With the filter spec "tree:1", we are expecting to see _only_ the root tree for
each commit; therefore, the tree object count should be less than or equal to
the number of commits. (For an example of why that's true: `git commit --revert`
points to the same tree object as its grandparent.)
=== Counting Omitted Objects
We also have the capability to enumerate all objects which were omitted by a
filter, like with `git log --filter=<spec> --filter-print-omitted`. Asking
`traverse_commit_list_filtered()` to populate the `omitted` list means that our
object walk does not perform any better than an unfiltered object walk; all
reachable objects are walked in order to populate the list.
First, add the `struct oidset` and related items we will use to iterate it:
----
static void walken_object_walk(
...
struct oidset omitted;
struct oidset_iter oit;
struct object_id *oid = NULL;
int omitted_count = 0;
oidset_init(&omitted, 0);
...
----
Modify the call to `traverse_commit_list_filtered()` to include your `omitted`
object:
----
...
traverse_commit_list_filtered(&filter_options, rev,
walken_show_commit, walken_show_object, NULL, &omitted);
...
----
Then, after your traversal, the `oidset` traversal is pretty straightforward.
Count all the objects within and modify the print statement:
----
/* Count the omitted objects. */
oidset_iter_init(&omitted, &oit);
while ((oid = oidset_iter_next(&oit)))
omitted_count++;
printf("commits %d\nblobs %d\ntags %d\ntrees%d\nomitted %d\n",
commit_count, blob_count, tag_count, tree_count, omitted_count);
----
By running your walk with and without the filter, you should find that the total
object count in each case is identical. You can also time each invocation of
the `walken` subcommand, with and without `omitted` being passed in, to confirm
to yourself the runtime impact of tracking all omitted objects.
=== Changing the Order
Finally, let's demonstrate that you can also reorder walks of all objects, not
just walks of commits. First, we'll make our handlers chattier - modify
`walken_show_commit()` and `walken_show_object()` to print the object as they
go:
----
static void walken_show_commit(struct commit *cmt, void *buf)
{
trace_printf("commit: %s\n", oid_to_hex(&cmt->object.oid));
commit_count++;
}
static void walken_show_object(struct object *obj, const char *str, void *buf)
{
trace_printf("%s: %s\n", type_name(obj->type), oid_to_hex(&obj->oid));
...
}
----
NOTE: Since we will be examining this output directly as humans, we'll use
`trace_printf()` here. Additionally, since this change introduces a significant
number of printed lines, using `trace_printf()` will allow us to easily silence
those lines without having to recompile.
(Leave the counter increment logic in place.)
With only that change, run again (but save yourself some scrollback):
----
$ GIT_TRACE=1 ./bin-wrappers/git walken | head -n 10
----
Take a look at the top commit with `git show` and the object ID you printed; it
should be the same as the output of `git show HEAD`.
Next, let's change a setting on our `struct rev_info` within
`walken_object_walk()`. Find where you're changing the other settings on `rev`,
such as `rev->tree_objects` and `rev->tree_blobs_in_commit_order`, and add the
`reverse` setting at the bottom:
----
...
rev->tree_objects = 1;
rev->blob_objects = 1;
rev->tag_objects = 1;
rev->tree_blobs_in_commit_order = 1;
rev->reverse = 1;
...
----
Now, run again, but this time, let's grab the last handful of objects instead
of the first handful:
----
$ make
$ GIT_TRACE=1 ./bin-wrappers git walken | tail -n 10
----
The last commit object given should have the same OID as the one we saw at the
top before, and running `git show <oid>` with that OID should give you again
the same results as `git show HEAD`. Furthermore, if you run and examine the
first ten lines again (with `head` instead of `tail` like we did before applying
the `reverse` setting), you should see that now the first commit printed is the
initial commit, `e83c5163`.
== Wrapping Up
Let's review. In this tutorial, we:
- Built a commit walk from the ground up
- Enabled a grep filter for that commit walk
- Changed the sort order of that filtered commit walk
- Built an object walk (tags, commits, trees, and blobs) from the ground up
- Learned how to add a filter-spec to an object walk
- Changed the display order of the filtered object walk

View File

@ -251,7 +251,7 @@ Updates in v1.5.0 since v1.4.4 series
the repository when that happens.
* Cruft removal
* Crufts removal
- We used to say "old commits are retrievable using reflog and
'master@{yesterday}' syntax as long as you haven't run
@ -379,7 +379,7 @@ Updates in v1.5.0 since v1.4.4 series
- The value of i18n.commitencoding in the originating
repository is recorded in the commit object on the "encoding"
header, if it is not UTF-8. git-log and friends notice this,
and re-encodes the message to the log output encoding when
and reencodes the message to the log output encoding when
displaying, if they are different. The log output encoding
is determined by "git log --encoding=<encoding>",
i18n.logoutputencoding configuration, or i18n.commitencoding

View File

@ -11,7 +11,7 @@ push running this release will issue a big warning when the
configuration variable is missing. Please refer to:
http://git.or.cz/gitwiki/GitFaq#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
http://thread.gmane.org/gmane.comp.version-control.git/107758/focus=108007
for more details on the reason why this change is needed and the
transition plan.

View File

@ -11,7 +11,7 @@ push running this release will issue a big warning when the
configuration variable is missing. Please refer to:
http://git.or.cz/gitwiki/GitFaq#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
http://thread.gmane.org/gmane.comp.version-control.git/107758/focus=108007
for more details on the reason why this change is needed and the
transition plan.

View File

@ -11,7 +11,7 @@ push running this release will issue a big warning when the
configuration variable is missing. Please refer to:
http://git.or.cz/gitwiki/GitFaq#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
http://thread.gmane.org/gmane.comp.version-control.git/107758/focus=108007
for more details on the reason why this change is needed and the
transition plan.

View File

@ -10,7 +10,7 @@ Fixes since v1.6.5.3
* "git prune-packed" gave progress output even when its standard error is
not connected to a terminal; this caused cron jobs that run it to
produce cruft.
produce crufts.
* "git pack-objects --all-progress" is an option to ask progress output
from write-object phase _if_ progress output were to be produced, and

View File

@ -22,7 +22,7 @@ push running this release will issue a big warning when the
configuration variable is missing. Please refer to:
http://git.or.cz/gitwiki/GitFaq#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
http://thread.gmane.org/gmane.comp.version-control.git/107758/focus=108007
for more details on the reason why this change is needed and the
transition plan.

View File

@ -64,7 +64,7 @@ users will fare this time.
Please refer to:
http://git.or.cz/gitwiki/GitFaq#non-bare
https://lore.kernel.org/git/7vbptlsuyv.fsf@gitster.siamese.dyndns.org/
http://thread.gmane.org/gmane.comp.version-control.git/107758/focus=108007
for more details on the reason why this change is needed and the
transition process that already took place so far.

View File

@ -34,7 +34,7 @@ Fixes since v1.7.0.1
* "git status" in 1.7.0 lacked the optimization we used to have in 1.6.X series
to speed up scanning of large working tree.
* "gitweb" did not diagnose parsing errors properly while reading its configuration
* "gitweb" did not diagnose parsing errors properly while reading tis configuration
file.
And other minor fixes and documentation updates.

View File

@ -7,7 +7,7 @@ Fixes since v1.7.10.3
* The message file for Swedish translation has been updated a bit.
* A name taken from mailmap was copied into an internal buffer
incorrectly and could overrun the buffer if it is too long.
incorrectly and could overun the buffer if it is too long.
* A malformed commit object that has a header line chomped in the
middle could kill git with a NULL pointer dereference.

View File

@ -25,7 +25,7 @@ Fixes since v1.7.12.2
its Accept-Encoding header.
* "git receive-pack" (the counterpart to "git push") did not give
progress output while processing objects it received to the user
progress output while processing objects it received to the puser
when run over the smart-http protocol.
* "git status" honored the ignore=dirty settings in .gitmodules but

View File

@ -22,7 +22,7 @@ Fixes since v1.7.5.2
* "git log --stdin path" with an input that has additional pathspec
used to corrupt memory.
* "git send-pack" (hence "git push") over smart-HTTP protocol could
* "git send-pack" (hence "git push") over smalt-HTTP protocol could
deadlock when the client side pack-object died early.
* Compressed tarball gitweb generates used to be made with the timestamp

View File

@ -233,7 +233,7 @@ to them for details).
together, misdetected branches.
* "git receive-pack" (the counterpart to "git push") did not give
progress output while processing objects it received to the user
progress output while processing objects it received to the puser
when run over the smart-http protocol.
* When you misspell the command name you give to the "exec" action in

View File

@ -15,7 +15,7 @@ Fixes since v1.8.4
in 1.8.4-rc1).
* "git rebase -i" and other scripted commands were feeding a
random, data dependent error message to 'echo' and expecting it
random, data dependant error message to 'echo' and expecting it
to come out literally.
* Setting the "submodule.<name>.path" variable to the empty

View File

@ -58,7 +58,7 @@ Foreign interfaces, subsystems and ports.
credential helper interface from Git.pm.
* Update build for Cygwin 1.[57]. Torsten Bögershausen reports that
this is fine with Cygwin 1.7 (cf. <51A606A0.5060101@web.de>) so let's try moving it
this is fine with Cygwin 1.7 ($gmane/225824) so let's try moving it
ahead.
* The credential helper to talk to keychain on OS X (in contrib/) has

View File

@ -13,7 +13,7 @@ Git v2.1.3 Release Notes
they are new enough to support the `--output` option.
* "git pack-objects" forgot to disable the codepath to generate
object reachability bitmap when it needs to split the resulting
object recheability bitmap when it needs to split the resulting
pack.
* "gitweb" used deprecated CGI::startfrom, which was removed from

View File

@ -478,7 +478,7 @@ notes for details).
* One part of "git am" had an oddball helper function that called
stuff from outside "his" as opposed to calling what we have "ours",
which was not gender-neutral and also inconsistent with the rest of
the system where outside stuff is usually called "theirs" in
the system where outside stuff is usuall called "theirs" in
contrast to "ours".
* "git blame file" allowed the lineage of lines in the uncommitted,

View File

@ -86,7 +86,7 @@ Fixes since v2.10.1
by refusing to check out a branch that is already checked out in
another worktree. However, this also prevented checking out a
branch, which is designated as the primary branch of a bare
repository, in a worktree that is connected to the bare
reopsitory, in a worktree that is connected to the bare
repository. The check has been corrected to allow it.
* "git rebase" immediately after "git clone" failed to find the fork

View File

@ -104,7 +104,7 @@ Fixes since v2.11
"git difftool --dir-diff" from a subdirectory never worked. This
has been fixed.
* "git p4" that tracks multiple p4 paths imported a single changelist
* "git p4" that tracks multile p4 paths imported a single changelist
that touches files in these multiple paths as one commit, followed
by many empty commits. This has been fixed.

View File

@ -315,7 +315,7 @@ notes for details).
"git difftool --dir-diff" from a subdirectory never worked. This
has been fixed.
* "git p4" that tracks multiple p4 paths imported a single changelist
* "git p4" that tracks multile p4 paths imported a single changelist
that touches files in these multiple paths as one commit, followed
by many empty commits. This has been fixed.

View File

@ -177,7 +177,7 @@ UI, Workflows & Features
been changed to enable "--decorate".
* The output from "git status --short" has been extended to show
various kinds of dirtiness in submodules differently; instead of to
various kinds of dirtyness in submodules differently; instead of to
"M" for modified, 'm' and '?' can be shown to signal changes only
to the working tree of the submodule but not the commit that is
checked out.

View File

@ -25,7 +25,7 @@ Fixes since v2.13.2
* The code to pick up and execute command alias definition from the
configuration used to switch to the top of the working tree and
then come back when the expanded alias was executed, which was
unnecessarily complex. Attempt to simplify the logic by using the
unnecessarilyl complex. Attempt to simplify the logic by using the
early-config mechanism that does not chdir around.
* "git add -p" were updated in 2.12 timeframe to cope with custom
@ -35,7 +35,7 @@ Fixes since v2.13.2
* Fix a recent regression to "git rebase -i" and add tests that would
have caught it and others.
* An unaligned 32-bit access in pack-bitmap code has been corrected.
* An unaligned 32-bit access in pack-bitmap code ahs been corrected.
* Tighten error checks for invalid "git apply" input.

View File

@ -141,7 +141,7 @@ Performance, Internal Implementation, Development Support etc.
* Some platforms have ulong that is smaller than time_t, and our
historical use of ulong for timestamp would mean they cannot
represent some timestamp that the platform allows. Invent a
separate and dedicated timestamp_t (so that we can distinguish
separate and dedicated timestamp_t (so that we can distingiuish
timestamps and a vanilla ulongs, which along is already a good
move), and then declare uintmax_t is the type to be used as the
timestamp_t.
@ -442,7 +442,7 @@ notes for details).
* The code to pick up and execute command alias definition from the
configuration used to switch to the top of the working tree and
then come back when the expanded alias was executed, which was
unnecessarily complex. Attempt to simplify the logic by using the
unnecessarilyl complex. Attempt to simplify the logic by using the
early-config mechanism that does not chdir around.
* Fix configuration codepath to pay proper attention to commondir

View File

@ -407,7 +407,7 @@ Fixes since v2.15
(merge eef3df5a93 bw/pathspec-match-submodule-boundary later to maint).
* Amending commits in git-gui broke the author name that is non-ascii
due to incorrect encoding conversion.
due to incorrect enconding conversion.
* Recent update to the submodule configuration code broke "diff-tree"
by accidentally stopping to read from the index upfront.

View File

@ -24,7 +24,7 @@ Fixes since v2.16.2
* The http tracing code, often used to debug connection issues,
learned to redact potentially sensitive information from its output
so that it can be more safely shareable.
so that it can be more safely sharable.
* Crash fix for a corner case where an error codepath tried to unlock
what it did not acquire lock on.

View File

@ -216,7 +216,7 @@ Fixes since v2.16
* The http tracing code, often used to debug connection issues,
learned to redact potentially sensitive information from its output
so that it can be more safely shareable.
so that it can be more safely sharable.
(merge 8ba18e6fa4 jt/http-redact-cookies later to maint).
* Crash fix for a corner case where an error codepath tried to unlock

View File

@ -0,0 +1,16 @@
Git v2.17.4 Release Notes
=========================
This release is to address the security issue: CVE-2020-5260
Fixes since v2.17.3
-------------------
* With a crafted URL that contains a newline in it, the credential
helper machinery can be fooled to give credential information for
a wrong host. The attack has been made impossible by forbidding
a newline character in any value passed via the credential
protocol.
Credit for finding the vulnerability goes to Felix Wilhelm of Google
Project Zero.

View File

@ -0,0 +1,22 @@
Git v2.17.5 Release Notes
=========================
This release is to address a security issue: CVE-2020-11008
Fixes since v2.17.4
-------------------
* With a crafted URL that contains a newline or empty host, or lacks
a scheme, the credential helper machinery can be fooled into
providing credential information that is not appropriate for the
protocol in use and host being contacted.
Unlike the vulnerability CVE-2020-5260 fixed in v2.17.4, the
credentials are not for a host of the attacker's choosing; instead,
they are for some unspecified host (based on how the configured
credential helper handles an absent "host" parameter).
The attack has been made impossible by refusing to work with
under-specified credential patterns.
Credit for finding the vulnerability goes to Carlo Arenas.

View File

@ -0,0 +1,16 @@
Git v2.17.6 Release Notes
=========================
This release addresses the security issues CVE-2021-21300.
Fixes since v2.17.5
-------------------
* CVE-2021-21300:
On case-insensitive file systems with support for symbolic links,
if Git is configured globally to apply delay-capable clean/smudge
filters (such as Git LFS), Git could be fooled into running
remote code during a clone.
Credit for finding and fixing this vulnerability goes to Matheus
Tavares, helped by Johannes Schindelin.

View File

@ -179,7 +179,7 @@ Performance, Internal Implementation, Development Support etc.
(merge 00a3da2a13 nd/remove-ignore-env-field later to maint).
* Code to find the length to uniquely abbreviate object names based
on packfile content, which is a relatively recent addition, has been
on packfile content, which is a relatively recent addtion, has been
optimized to use the same fan-out table.
* The mechanism to use parse-options API to automate the command line

View File

@ -0,0 +1,5 @@
Git v2.18.3 Release Notes
=========================
This release merges the security fix that appears in v2.17.4; see
the release notes for that version for details.

View File

@ -0,0 +1,5 @@
Git v2.18.4 Release Notes
=========================
This release merges the security fix that appears in v2.17.5; see
the release notes for that version for details.

View File

@ -0,0 +1,6 @@
Git v2.18.5 Release Notes
=========================
This release merges up the fixes that appear in v2.17.6 to address
the security issue CVE-2021-21300; see the release notes for that
version for details.

View File

@ -106,7 +106,7 @@ Performance, Internal Implementation, Development Support etc.
* The conversion to pass "the_repository" and then "a_repository"
throughout the object access API continues.
* Continuing with the idea to programmatically enumerate various
* Continuing with the idea to programatically enumerate various
pieces of data required for command line completion, teach the
codebase to report the list of configuration variables
subcommands care about to help complete them.

View File

@ -0,0 +1,5 @@
Git v2.19.4 Release Notes
=========================
This release merges the security fix that appears in v2.17.4; see
the release notes for that version for details.

View File

@ -0,0 +1,5 @@
Git v2.19.5 Release Notes
=========================
This release merges the security fix that appears in v2.17.5; see
the release notes for that version for details.

View File

@ -0,0 +1,6 @@
Git v2.19.6 Release Notes
=========================
This release merges up the fixes that appear in v2.17.6 and
v2.18.5 to address the security issue CVE-2021-21300; see the
release notes for these versions for details.

View File

@ -1,700 +0,0 @@
Git 2.20 Release Notes
======================
Backward Compatibility Notes
----------------------------
* "git branch -l <foo>" used to be a way to ask a reflog to be
created while creating a new branch, but that is no longer the
case. It is a short-hand for "git branch --list <foo>" now.
* "git push" into refs/tags/* hierarchy is rejected without getting
forced, but "git fetch" (misguidedly) used the "fast forwarding"
rule used for the refs/heads/* hierarchy; this has been corrected,
which means some fetches of tags that did not fail with older
version of Git will fail without "--force" with this version.
* "git help -a" now gives verbose output (same as "git help -av").
Those who want the old output may say "git help --no-verbose -a"..
* "git cpn --help", when "cpn" is an alias to, say, "cherry-pick -n",
reported only the alias expansion of "cpn" in earlier versions of
Git. It now runs "git cherry-pick --help" to show the manual page
of the command, while sending the alias expansion to the standard
error stream.
* "git send-email" learned to grab address-looking string on any
trailer whose name ends with "-by". This is a backward-incompatible
change. Adding "--suppress-cc=misc-by" on the command line, or
setting sendemail.suppresscc configuration variable to "misc-by",
can be used to disable this behaviour.
Updates since v2.19
-------------------
UI, Workflows & Features
* Running "git clone" against a project that contain two files with
pathnames that differ only in cases on a case insensitive
filesystem would result in one of the files lost because the
underlying filesystem is incapable of holding both at the same
time. An attempt is made to detect such a case and warn.
* "git checkout -b newbranch [HEAD]" should not have to do as much as
checking out a commit different from HEAD. An attempt is made to
optimize this special case.
* "git rev-list --stdin </dev/null" used to be an error; it now shows
no output without an error. "git rev-list --stdin --default HEAD"
still falls back to the given default when nothing is given on the
standard input.
* Lift code from GitHub to restrict delta computation so that an
object that exists in one fork is not made into a delta against
another object that does not appear in the same forked repository.
* "git format-patch" learned new "--interdiff" and "--range-diff"
options to explain the difference between this version and the
previous attempt in the cover letter (or after the three-dashes as
a comment).
* "git mailinfo" used in "git am" learned to make a best-effort
recovery of a patch corrupted by MUA that sends text/plain with
format=flawed option.
(merge 3aa4d81f88 rs/mailinfo-format-flowed later to maint).
* The rules used by "git push" and "git fetch" to determine if a ref
can or cannot be updated were inconsistent; specifically, fetching
to update existing tags were allowed even though tags are supposed
to be unmoving anchoring points. "git fetch" was taught to forbid
updates to existing tags without the "--force" option.
* "git multi-pack-index" learned to detect corruption in the .midx
file it uses, and this feature has been integrated into "git fsck".
* Generation of (experimental) commit-graph files have so far been
fairly silent, even though it takes noticeable amount of time in a
meaningfully large repository. The users will now see progress
output.
* The minimum version of Windows supported by Windows port of Git is
now set to Vista.
* The completion script (in contrib/) learned to complete a handful of
options "git stash list" command takes.
* The completion script (in contrib/) learned that "git fetch
--multiple" only takes remote names as arguments and no refspecs.
* "git status" learns to show progress bar when refreshing the index
takes a long time.
(merge ae9af12287 nd/status-refresh-progress later to maint).
* "git help -a" and "git help -av" give different pieces of
information, and generally the "verbose" version is more friendly
to the new users. "git help -a" by default now uses the more
verbose output (with "--no-verbose", you can go back to the
original). Also "git help -av" now lists aliases and external
commands, which it did not used to.
* Unlike "grep", "git grep" by default recurses to the whole tree.
The command learned "git grep --recursive" option, so that "git
grep --no-recursive" can serve as a synonym to setting the
max-depth to 0.
* When pushing into a repository that borrows its objects from an
alternate object store, "git receive-pack" that responds to the
push request on the other side lists the tips of refs in the
alternate to reduce the amount of objects transferred. This
sometimes is detrimental when the number of refs in the alternate
is absurdly large, in which case the bandwidth saved in potentially
fewer objects transferred is wasted in excessively large ref
advertisement. The alternate refs that are advertised are now
configurable with a pair of configuration variables.
* "git cmd --help" when "cmd" is aliased used to only say "cmd is
aliased to ...". Now it shows that to the standard error stream
and runs "git $cmd --help" where $cmd is the first word of the
alias expansion.
* The documentation of "git gc" has been updated to mention that it
is no longer limited to "pruning away cruft" but also updates
ancillary files like commit-graph as a part of repository
optimization.
* "git p4 unshelve" improvements.
* The logic to select the default user name and e-mail on Windows has
been improved.
(merge 501afcb8b0 js/mingw-default-ident later to maint).
* The "rev-list --filter" feature learned to exclude all trees via
"tree:0" filter.
* "git send-email" learned to grab address-looking string on any
trailer whose name ends with "-by"; --suppress-cc=misc-by on the
command line, or setting sendemail.suppresscc configuration
variable to "misc-by", can be used to disable this behaviour.
* "git mergetool" learned to take the "--[no-]gui" option, just like
"git difftool" does.
* "git rebase -i" learned a new insn, 'break', that the user can
insert in the to-do list. Upon hitting it, the command returns
control back to the user.
* New "--pretty=format:" placeholders %GF and %GP that show the GPG
key fingerprints have been invented.
* On platforms with recent cURL library, http.sslBackend configuration
variable can be used to choose a different SSL backend at runtime.
The Windows port uses this mechanism to switch between OpenSSL and
Secure Channel while talking over the HTTPS protocol.
* "git send-email" learned to disable SMTP authentication via the
"--smtp-auth=none" option, even when the smtp username is given
(which turns the authentication on by default).
* A fourth class of configuration files (in addition to the
traditional "system wide", "per user in the $HOME directory" and
"per repository in the $GIT_DIR/config") has been introduced so
that different worktrees that share the same repository (hence the
same $GIT_DIR/config file) can use different customization.
* A pattern with '**' that does not have a slash on either side used
to be an invalid one, but the code now treats such double-asterisks
the same way as two normal asterisks that happen to be adjacent to
each other.
(merge e5bbe09e88 nd/wildmatch-double-asterisk later to maint).
* The "--no-patch" option, which can be used to get a high-level
overview without the actual line-by-line patch difference shown, of
the "range-diff" command was earlier broken, which has been
corrected.
* The recently merged "rebase in C" has an escape hatch to use the
scripted version when necessary, but it hasn't been documented,
which has been corrected.
Performance, Internal Implementation, Development Support etc.
* Developer builds now use -Wunused-function compilation option.
* One of our CI tests to run with "unusual/experimental/random"
settings now also uses commit-graph and midx.
* When there are too many packfiles in a repository (which is not
recommended), looking up an object in these would require
consulting many pack .idx files; a new mechanism to have a single
file that consolidates all of these .idx files is introduced.
* "git submodule update" is getting rewritten piece-by-piece into C.
* The code for computing history reachability has been shuffled,
obtained a bunch of new tests to cover them, and then being
improved.
* The unpack_trees() API used in checking out a branch and merging
walks one or more trees along with the index. When the cache-tree
in the index tells us that we are walking a tree whose flattened
contents is known (i.e. matches a span in the index), as linearly
scanning a span in the index is much more efficient than having to
open tree objects recursively and listing their entries, the walk
can be optimized, which has been done.
* When creating a thin pack, which allows objects to be made into a
delta against another object that is not in the resulting pack but
is known to be present on the receiving end, the code learned to
take advantage of the reachability bitmap; this allows the server
to send a delta against a base beyond the "boundary" commit.
* spatch transformation to replace boolean uses of !hashcmp() to
newly introduced oideq() is added, and applied, to regain
performance lost due to support of multiple hash algorithms.
* Fix a bug in which the same path could be registered under multiple
worktree entries if the path was missing (for instance, was removed
manually). Also, as a convenience, expand the number of cases in
which --force is applicable.
* Split Documentation/config.txt for easier maintenance.
(merge 6014363f0b nd/config-split later to maint).
* Test helper binaries clean-up.
(merge c9a1f4161f nd/test-tool later to maint).
* Various tests have been updated to make it easier to swap the
hash function used for object identification.
(merge ae0c89d41b bc/hash-independent-tests later to maint).
* Update fsck.skipList implementation and documentation.
(merge 371a655074 ab/fsck-skiplist later to maint).
* An alias that expands to another alias has so far been forbidden,
but now it is allowed to create such an alias.
* Various test scripts have been updated for style and also correct
handling of exit status of various commands.
* "gc --auto" ended up calling exit(-1) upon error, which has been
corrected to use exit(1). Also the error reporting behaviour when
daemonized has been updated to exit with zero status when stopping
due to a previously discovered error (which implies there is no
point running gc to improve the situation); we used to exit with
failure in such a case.
* Various codepaths in the core-ish part learned to work on an
arbitrary in-core index structure, not necessarily the default
instance "the_index".
(merge b3c7eef9b0 nd/the-index later to maint).
* Code clean-up in the internal machinery used by "git status" and
"git commit --dry-run".
(merge 73ba5d78b4 ss/wt-status-committable later to maint).
* Some environment variables that control the runtime options of Git
used during tests are getting renamed for consistency.
(merge 4231d1ba99 bp/rename-test-env-var later to maint).
* A pair of new extensions to the index file have been introduced.
They allow the index file to be read in parallel for performance.
* The oidset API was built on top of the oidmap API which in turn is
on the hashmap API. Replace the implementation to build on top of
the khash API and gain performance.
* Over some transports, fetching objects with an exact commit object
name can be done without first seeing the ref advertisements. The
code has been optimized to exploit this.
* In a partial clone that will lazily be hydrated from the
originating repository, we generally want to avoid "does this
object exist (locally)?" on objects that we deliberately omitted
when we created the clone. The cache-tree codepath (which is used
to write a tree object out of the index) however insisted that the
object exists, even for paths that are outside of the partial
checkout area. The code has been updated to avoid such a check.
* To help developers, an EditorConfig file that attempts to follow
the project convention has been added.
(merge b548d698a0 bc/editorconfig later to maint).
* The result of coverage test can be combined with "git blame" to
check the test coverage of code introduced recently with a new
'coverage-diff' tool (in contrib/).
(merge 783faedd65 ds/coverage-diff later to maint).
* An experiment to fuzz test a few areas, hopefully we can gain more
coverage to various areas.
* More codepaths are moving away from hardcoded hash sizes.
* The way the Windows port figures out the current directory has been
improved.
* The way DLLs are loaded on the Windows port has been improved.
* Some tests have been reorganized and renamed; "ls t/" now gives a
better overview of what is tested for these scripts than before.
* "git rebase" and "git rebase -i" have been reimplemented in C.
* Windows port learned to use nano-second resolution file timestamps.
* The overly large Documentation/config.txt file have been split into
million little pieces. This potentially allows each individual piece
to be included into the manual page of the command it affects more easily.
* Replace three string-list instances used as look-up tables in "git
fetch" with hashmaps.
* Unify code to read the author-script used in "git am" and the
commands that use the sequencer machinery, e.g. "git rebase -i".
* In preparation to the day when we can deprecate and remove the
"rebase -p", make sure we can skip and later remove tests for
it.
* The history traversal used to implement the tag-following has been
optimized by introducing a new helper.
* The helper function to refresh the cached stat information in the
in-core index has learned to perform the lstat() part of the
operation in parallel on multi-core platforms.
* The code to traverse objects for reachability, used to decide what
objects are unreferenced and expendable, have been taught to also
consider per-worktree refs of other worktrees as starting points to
prevent data loss.
* "git add" needs to internally run "diff-files" equivalent, and the
codepath learned the same optimization as "diff-files" has to run
lstat(2) in parallel to find which paths have been updated in the
working tree.
* The procedure to install dependencies before testing at Travis CI
is getting revamped for both simplicity and flexibility, taking
advantage of the recent move to the vm-based environment.
* The support for format-patch (and send-email) by the command-line
completion script (in contrib/) has been simplified a bit.
* The revision walker machinery learned to take advantage of the
commit generation numbers stored in the commit-graph file.
* The codebase has been cleaned up to reduce "#ifndef NO_PTHREADS".
* The way -lcurl library gets linked has been simplified by taking
advantage of the fact that we can just ask curl-config command how.
* Various functions have been audited for "-Wunused-parameter" warnings
and bugs in them got fixed.
* A sanity check for start-up sequence has been added in the config
API codepath.
* The build procedure to link for fuzzing test has been made
customizable with a new Makefile variable.
* The way "git rebase" parses and forwards the command line options
meant for underlying "git am" has been revamped, which fixed for
options with parameters that were not passed correctly.
* Our testing framework uses a special i18n "poisoned localization"
feature to find messages that ought to stay constant but are
incorrectly marked to be translated. This feature has been made
into a runtime option (it used to be a compile-time option).
* "git push" used to check ambiguities between object-names and
refnames while processing the list of refs' old and new values,
which was unnecessary (as it knew that it is feeding raw object
names). This has been optimized out.
* The xcurl_off_t() helper function is used to cast size_t to
curl_off_t, but some compilers gave warnings against the code to
ensure the casting is done without wraparound, when size_t is
narrower than curl_off_t. This warning has been squelched.
* Code preparation to replace ulong vars with size_t vars where
appropriate continues.
* The "test installed Git" mode of our test suite has been updated to
work better.
* A coding convention around the Coccinelle semantic patches to have
two classes to ease code migration process has been proposed and
its support has been added to the Makefile.
* The "container" mode of TravisCI is going away. Our .travis.yml
file is getting prepared for the transition.
(merge 32ee384be8 ss/travis-ci-force-vm-mode later to maint).
* Our test scripts can now take the '-V' option as a synonym for the
'--verbose-log' option.
(merge a5f52c6dab sg/test-verbose-log later to maint).
Fixes since v2.19
-----------------
* "git interpret-trailers" and its underlying machinery had a buggy
code that attempted to ignore patch text after commit log message,
which triggered in various codepaths that will always get the log
message alone and never get such an input.
(merge 66e83d9b41 jk/trailer-fixes later to maint).
* Malformed or crafted data in packstream can make our code attempt
to read or write past the allocated buffer and abort, instead of
reporting an error, which has been fixed.
* "git rebase -i" did not clear the state files correctly when a run
of "squash/fixup" is aborted and then the user manually amended the
commit instead, which has been corrected.
(merge 10d2f35436 js/rebase-i-autosquash-fix later to maint).
* When fsmonitor is in use, after operation on submodules updates
.gitmodules, we lost track of the fact that we did so and relied on
stale fsmonitor data.
(merge 43f1180814 bp/mv-submodules-with-fsmonitor later to maint).
* Fix for a long-standing bug that leaves the index file corrupt when
it shrinks during a partial commit.
(merge 6c003d6ffb jk/reopen-tempfile-truncate later to maint).
* Further fix for O_APPEND emulation on Windows
(merge eeaf7ddac7 js/mingw-o-append later to maint).
* A corner case bugfix in "git rerere" code.
(merge ad2bf0d9b4 en/rerere-multi-stage-1-fix later to maint).
* "git add ':(attr:foo)'" is not supported and is supposed to be
rejected while the command line arguments are parsed, but we fail
to reject such a command line upfront.
(merge 84d938b732 nd/attr-pathspec-fix later to maint).
* Recent update broke the reachability algorithm when refs (e.g.
tags) that point at objects that are not commit were involved,
which has been fixed.
* "git rebase" etc. in Git 2.19 fails to abort when given an empty
commit log message as result of editing, which has been corrected.
(merge a3ec9eaf38 en/sequencer-empty-edit-result-aborts later to maint).
* The code to backfill objects in lazily cloned repository did not
work correctly, which has been corrected.
(merge e68302011c jt/lazy-object-fetch-fix later to maint).
* Update error messages given by "git remote" and make them consistent.
(merge 5025425dff ms/remote-error-message-update later to maint).
* "git update-ref" learned to make both "--no-deref" and "--stdin"
work at the same time.
(merge d345e9fbe7 en/update-ref-no-deref-stdin later to maint).
* Recently added "range-diff" had a corner-case bug to cause it
segfault, which has been corrected.
(merge e467a90c7a tg/range-diff-corner-case-fix later to maint).
* The recently introduced commit-graph auxiliary data is incompatible
with mechanisms such as replace & grafts that "breaks" immutable
nature of the object reference relationship. Disable optimizations
based on its use (and updating existing commit-graph) when these
incompatible features are in use in the repository.
(merge 829a321569 ds/commit-graph-with-grafts later to maint).
* The mailmap file update.
(merge 255eb03edf jn/mailmap-update later to maint).
* The code in "git status" sometimes hit an assertion failure. This
was caused by a structure that was reused without cleaning the data
used for the first run, which has been corrected.
(merge 3e73cc62c0 en/status-multiple-renames-to-the-same-target-fix later to maint).
* "git fetch $repo $object" in a partial clone did not correctly
fetch the asked-for object that is referenced by an object in
promisor packfile, which has been fixed.
* A corner-case bugfix.
(merge c5cbb27cb5 sm/show-superproject-while-conflicted later to maint).
* Various fixes to "diff --color-moved-ws".
* A partial clone that is configured to lazily fetch missing objects
will on-demand issue a "git fetch" request to the originating
repository to fill not-yet-obtained objects. The request has been
optimized for requesting a tree object (and not the leaf blob
objects contained in it) by telling the originating repository that
no blobs are needed.
(merge 4c7f9567ea jt/non-blob-lazy-fetch later to maint).
* The codepath to support the experimental split-index mode had
remaining "racily clean" issues fixed.
(merge 4c490f3d32 sg/split-index-racefix later to maint).
* "git log --graph" showing an octopus merge sometimes miscounted the
number of display columns it is consuming to show the merge and its
parent commits, which has been corrected.
(merge 04005834ed np/log-graph-octopus-fix later to maint).
* "git range-diff" did not work well when the compared ranges had
changes in submodules and the "--submodule=log" was used.
* The implementation of run_command() API on the UNIX platforms had a
bug that caused a command not on $PATH to be found in the current
directory.
(merge f67b980771 jk/run-command-notdot later to maint).
* A mutex used in "git pack-objects" were not correctly initialized
and this caused "git repack" to dump core on Windows.
(merge 34204c8166 js/pack-objects-mutex-init-fix later to maint).
* Under certain circumstances, "git diff D:/a/b/c D:/a/b/d" on
Windows would strip initial parts from the paths because they
were not recognized as absolute, which has been corrected.
(merge ffd04e92e2 js/diff-notice-has-drive-prefix later to maint).
* The receive.denyCurrentBranch=updateInstead codepath kicked in even
when the push should have been rejected due to other reasons, such
as it does not fast-forward or the update-hook rejects it, which
has been corrected.
(merge b072a25fad jc/receive-deny-current-branch-fix later to maint).
* The logic to determine the archive type "git archive" uses did not
correctly kick in for "git archive --remote", which has been
corrected.
* "git repack" in a shallow clone did not correctly update the
shallow points in the repository, leading to a repository that
does not pass fsck.
(merge 5dcfbf564c js/shallow-and-fetch-prune later to maint).
* Some codepaths failed to form a proper URL when .gitmodules record
the URL to a submodule repository as relative to the repository of
superproject, which has been corrected.
(merge e0a862fdaf sb/submodule-url-to-absolute later to maint).
* "git fetch" over protocol v2 into a shallow repository failed to
fetch full history behind a new tip of history that was diverged
before the cut-off point of the history that was previously fetched
shallowly.
* The command line completion machinery (in contrib/) has been
updated to allow the completion script to tweak the list of options
that are reported by the parse-options machinery correctly.
(merge 276b49ff34 nd/completion-negation later to maint).
* Operations on promisor objects make sense in the context of only a
small subset of the commands that internally use the revisions
machinery, but the "--exclude-promisor-objects" option were taken
and led to nonsense results by commands like "log", to which it
didn't make much sense. This has been corrected.
(merge 669b1d2aae md/exclude-promisor-objects-fix later to maint).
* A regression in Git 2.12 era made "git fsck" fall into an infinite
loop while processing truncated loose objects.
(merge 18ad13e5b2 jk/detect-truncated-zlib-input later to maint).
* "git ls-remote $there foo" was broken by recent update for the
protocol v2 and stopped showing refs that match 'foo' that are not
refs/{heads,tags}/foo, which has been fixed.
(merge 6a139cdd74 jk/proto-v2-ref-prefix-fix later to maint).
* Additional comment on a tricky piece of code to help developers.
(merge 0afbe3e806 jk/stream-pack-non-delta-clarification later to maint).
* A couple of tests used to leave the repository in a state that is
deliberately corrupt, which have been corrected.
(merge aa984dbe5e ab/pack-tests-cleanup later to maint).
* The submodule support has been updated to read from the blob at
HEAD:.gitmodules when the .gitmodules file is missing from the
working tree.
(merge 2b1257e463 ao/submodule-wo-gitmodules-checked-out later to maint).
* "git fetch" was a bit loose in parsing responses from the other side
when talking over the protocol v2.
* "git rev-parse --exclude=* --branches --branches" (i.e. first
saying "add only things that do not match '*' out of all branches"
and then adding all branches, without any exclusion this time)
worked as expected, but "--exclude=* --all --all" did not work the
same way, which has been fixed.
(merge 5221048092 ag/rev-parse-all-exclude-fix later to maint).
* "git send-email --transfer-encoding=..." in recent versions of Git
sometimes produced an empty "Content-Transfer-Encoding:" header,
which has been corrected.
(merge 3c88e46f1a al/send-email-auto-cte-fixup later to maint).
* The interface into "xdiff" library used to discover the offset and
size of a generated patch hunk by first formatting it into the
textual hunk header "@@ -n,m +k,l @@" and then parsing the numbers
out. A new interface has been introduced to allow callers a more
direct access to them.
(merge 5eade0746e jk/xdiff-interface later to maint).
* Pathspec matching against a tree object were buggy when negative
pathspec elements were involved, which has been fixed.
(merge b7845cebc0 nd/tree-walk-path-exclusion later to maint).
* "git merge" and "git pull" that merges into an unborn branch used
to completely ignore "--verify-signatures", which has been
corrected.
(merge 01a31f3bca jk/verify-sig-merge-into-void later to maint).
* "git rebase --autostash" did not correctly re-attach the HEAD at times.
* "rev-parse --exclude=<pattern> --branches=<pattern>" etc. did not
quite work, which has been corrected.
(merge 9ab9b5df0e ra/rev-parse-exclude-glob later to maint).
* When editing a patch in a "git add -i" session, a hunk could be
made to no-op. The "git apply" program used to reject a patch with
such a no-op hunk to catch user mistakes, but it is now updated to
explicitly allow a no-op hunk in an edited patch.
(merge 22cb3835b9 js/apply-recount-allow-noop later to maint).
* The URL to an MSDN page in a comment has been updated.
(merge 2ef2ae2917 js/mingw-msdn-url later to maint).
* "git ls-remote --sort=<thing>" can feed an object that is not yet
available into the comparison machinery and segfault, which has
been corrected to check such a request upfront and reject it.
* When "git bundle" aborts due to an empty commit ranges
(i.e. resulting in an empty pack), it left a file descriptor to an
lockfile open, which resulted in leftover lockfile on Windows where
you cannot remove a file with an open file descriptor. This has
been corrected.
(merge 2c8ee1f53c jk/close-duped-fd-before-unlock-for-bundle later to maint).
* "git format-patch --stat=<width>" can be used to specify the width
used by the diffstat (shown in the cover letter).
(merge 284aeb7e60 nd/format-patch-cover-letter-stat-width later to maint).
* The way .git/index and .git/sharedindex* files were initially
created gave these files different perm bits until they were
adjusted for shared repository settings. This was made consistent.
(merge c9d6c78870 cc/shared-index-permbits later to maint).
* "git rebase --stat" to transplant a piece of history onto a totally
unrelated history were not working before and silently showed wrong
result. With the recent reimplementation in C, it started to instead
die with an error message, as the original logic was not prepared
to cope with this case. This has now been fixed.
* The advice message to tell the user to migrate an existing graft
file to the replace system when a graft file was read was shown
even when "git replace --convert-graft-file" command, which is the
way the message suggests to use, was running, which made little
sense.
(merge 8821e90a09 ab/replace-graft-with-replace-advice later to maint).
* "git diff --raw" lost ellipses to adjust the output columns for
some time now, but the documentation still showed them.
* Code cleanup, docfix, build fix, etc.
(merge 96a7501aad ts/doc-build-manpage-xsl-quietly later to maint).
(merge b9b07efdb2 tg/conflict-marker-size later to maint).
(merge fa0aeea770 sg/doc-trace-appends later to maint).
(merge d64324cb60 tb/void-check-attr later to maint).
(merge c3b9bc94b9 en/double-semicolon-fix later to maint).
(merge 79336116f5 sg/t3701-tighten-trace later to maint).
(merge 801fa63a90 jk/dev-build-format-security later to maint).
(merge 0597dd62ba sb/string-list-remove-unused later to maint).
(merge db2d36fad8 bw/protocol-v2 later to maint).
(merge 456d7cd3a9 sg/split-index-test later to maint).
(merge 7b6057c852 tq/refs-internal-comment-fix later to maint).
(merge 29e8dc50ad tg/t5551-with-curl-7.61.1 later to maint).
(merge 55f6bce2c9 fe/doc-updates later to maint).
(merge 7987d2232d jk/check-everything-connected-is-long-gone later to maint).
(merge 4ba3c9be47 dz/credential-doc-url-matching-rules later to maint).
(merge 4c399442f7 ma/commit-graph-docs later to maint).
(merge fc0503b04e ma/t1400-undebug-test later to maint).
(merge e56b53553a nd/packobjectshook-doc-fix later to maint).
(merge c56170a0c4 ma/mailing-list-address-in-git-help later to maint).
(merge 6e8fc70fce rs/sequencer-oidset-insert-avoids-dups later to maint).
(merge ad0b8f9575 mw/doc-typofixes later to maint).
(merge d9f079ad1a jc/how-to-document-api later to maint).
(merge b1492bf315 ma/t7005-bash-workaround later to maint).
(merge ac1f98a0df du/rev-parse-is-plumbing later to maint).
(merge ca8ed443a5 mm/doc-no-dashed-git later to maint).
(merge ce366a8144 du/get-tar-commit-id-is-plumbing later to maint).
(merge 61018fe9e0 du/cherry-is-plumbing later to maint).
(merge c7e5fe79b9 sb/strbuf-h-update later to maint).
(merge 8d2008196b tq/branch-create-wo-branch-get later to maint).
(merge 2e3c894f4b tq/branch-style-fix later to maint).
(merge c5d844af9c sg/doc-show-branch-typofix later to maint).
(merge 081d91618b ah/doc-updates later to maint).
(merge b84c783882 jc/cocci-preincr later to maint).
(merge 5e495f8122 uk/merge-subtree-doc-update later to maint).
(merge aaaa881822 jk/uploadpack-packobjectshook-fix later to maint).
(merge 3063477445 tb/char-may-be-unsigned later to maint).
(merge 8c64bc9420 sg/test-rebase-editor-fix later to maint).
(merge 71571cd7d6 ma/sequencer-do-reset-saner-loop-termination later to maint).
(merge 9a4cb8781e cb/notes-freeing-always-null-fix later to maint).
(merge 3006f5ee16 ma/reset-doc-rendering-fix later to maint).
(merge 4c2eb06419 sg/daemon-test-signal-fix later to maint).
(merge d27525e519 ss/msvc-strcasecmp later to maint).

View File

@ -1,20 +0,0 @@
Git v2.20.1 Release Notes
=========================
This release is primarily to fix brown-paper-bag breakages in the
2.20.0 release.
Fixes since v2.20
-----------------
* A few newly added tests were not portable and caused minority
platforms to report false breakages, which have been fixed.
* Portability fix for a recent update to parse-options API.
* "git help -a" did not work well when an overly long alias is
defined, which has been corrected.
* A recent update accidentally squelched an error message when the
run_command API failed to run a missing command, which has been
corrected.

View File

@ -1,18 +0,0 @@
Git v2.20.2 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6, v2.15.4
and in v2.17.3, addressing the security issues CVE-2019-1348,
CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352,
CVE-2019-1353, CVE-2019-1354, and CVE-2019-1387; see the release notes
for those versions for details.
The change to disallow `submodule.<name>.update=!command` entries in
`.gitmodules` which was introduced v2.15.4 (and for which v2.17.3
added explicit fsck checks) fixes the vulnerability in v2.20.x where a
recursive clone followed by a submodule update could execute code
contained within the repository without the user explicitly having
asked for that (CVE-2019-19604).
Credit for finding this vulnerability goes to Joern Schneeweisz,
credit for the fixes goes to Jonathan Nieder.

View File

@ -1,451 +0,0 @@
Git 2.21 Release Notes
======================
Backward Compatibility Notes
----------------------------
* Historically, the "-m" (mainline) option can only be used for "git
cherry-pick" and "git revert" when working with a merge commit.
This version of Git no longer warns or errors out when working with
a single-parent commit, as long as the argument to the "-m" option
is 1 (i.e. it has only one parent, and the request is to pick or
revert relative to that first parent). Scripts that relied on the
behaviour may get broken with this change.
Updates since v2.20
-------------------
UI, Workflows & Features
* The "http.version" configuration variable can be used with recent
enough versions of cURL library to force the version of HTTP used
to talk when fetching and pushing.
* Small fixes and features for fast-export and fast-import, mostly on
the fast-export side has been made.
* "git push $there $src:$dst" rejects when $dst is not a fully
qualified refname and it is not clear what the end user meant. The
codepath has been taught to give a clearer error message, and also
guess where the push should go by taking the type of the pushed
object into account (e.g. a tag object would want to go under
refs/tags/).
* "git checkout [<tree-ish>] path..." learned to report the number of
paths that have been checked out of the index or the tree-ish,
which gives it the same degree of noisy-ness as the case in which
the command checks out a branch. "git checkout -m <pathspec>" to
undo conflict resolution gives a similar message.
* "git quiltimport" learned "--keep-non-patch" option.
* "git worktree remove" and "git worktree move" refused to work when
there is a submodule involved. This has been loosened to ignore
uninitialized submodules.
* "git cherry-pick -m1" was forbidden when picking a non-merge
commit, even though there _is_ parent number 1 for such a commit.
This was done to avoid mistakes back when "cherry-pick" was about
picking a single commit, but is no longer useful with "cherry-pick"
that can pick a range of commits. Now the "-m$num" option is
allowed when picking any commit, as long as $num names an existing
parent of the commit.
* Update "git multimail" from the upstream.
* "git p4" update.
* The "--format=<placeholder>" option of for-each-ref, branch and tag
learned to show a few more traits of objects that can be learned by
the object_info API.
* "git rebase -i" learned to re-execute a command given with 'exec'
to run after it failed the last time.
* "git diff --color-moved-ws" updates.
* Custom userformat "log --format" learned %S atom that stands for
the tip the traversal reached the commit from, i.e. --source.
* "git instaweb" learned to drive http.server that comes with
"batteries included" Python installation (both Python2 & 3).
* A new encoding UTF-16LE-BOM has been invented to force encoding to
UTF-16 with BOM in little endian byte order, which cannot be directly
generated by using iconv.
* A new date format "--date=human" that morphs its output depending
on how far the time is from the current time has been introduced.
"--date=auto:human" can be used to use this new format (or any
existing format) when the output is going to the pager or to the
terminal, and otherwise the default format.
Performance, Internal Implementation, Development Support etc.
* Code clean-up with optimization for the codepath that checks
(non-)existence of loose objects.
* More codepaths have become aware of working with in-core repository
instances other than the default "the_repository".
* The "strncat()" function is now among the banned functions.
* Portability updates for the HPE NonStop platform.
* Earlier we added "-Wformat-security" to developer builds, assuming
that "-Wall" (which includes "-Wformat" which in turn is required
to use "-Wformat-security") is always in effect. This is not true
when config.mak.autogen is in use, unfortunately. This has been
fixed by unconditionally adding "-Wall" to developer builds.
* The loose object cache used to optimize existence look-up has been
updated.
* Flaky tests can now be repeatedly run under load with the
"--stress" option.
* Documentation/Makefile is getting prepared for manpage
localization.
* "git fetch-pack" now can talk the version 2 protocol.
* sha-256 hash has been added and plumbed through the code to allow
building Git with the "NewHash".
* Debugging help for http transport.
* "git fetch --deepen=<more>" has been corrected to work over v2
protocol.
* The code to walk tree objects has been taught that we may be
working with object names that are not computed with SHA-1.
* The in-core repository instances are passed through more codepaths.
* Update the protocol message specification to allow only the limited
use of scaled quantities. This is to ensure potential compatibility
issues will not get out of hand.
* Micro-optimize the code that prepares commit objects to be walked
by "git rev-list" when the commit-graph is available.
* "git fetch" and "git upload-pack" learned to send all exchanges over
the sideband channel while talking the v2 protocol.
* The codepath to write out commit-graph has been optimized by
following the usual pattern of visiting objects in in-pack order.
* The codepath to show progress meter while writing out commit-graph
file has been improved.
* Cocci rules have been updated to encourage use of strbuf_addbuf().
* "git rebase --merge" has been reimplemented by reusing the internal
machinery used for "git rebase -i".
* More code in "git bisect" has been rewritten in C.
* Instead of going through "git-rebase--am" scriptlet to use the "am"
backend, the built-in version of "git rebase" learned to drive the
"am" backend directly.
* The assumption to work on the single "in-core index" instance has
been reduced from the library-ish part of the codebase.
* The test lint learned to catch non-portable "sed" options.
* "git pack-objects" learned another algorithm to compute the set of
objects to send, that trades the resulting packfile off to save
traversal cost to favor small pushes.
* The travis CI scripts have been corrected to build Git with the
compiler(s) of our choice.
* "git submodule update" learned to abort early when core.worktree
for the submodule is not set correctly to prevent spreading damage.
* Test suite has been adjusted to run on Azure Pipeline.
* Running "Documentation/doc-diff x" from anywhere other than the
top-level of the working tree did not show the usage string
correctly, which has been fixed.
* Use of the sparse tool got easier to customize from the command
line to help developers.
* A new target "coverage-prove" to run the coverage test under
"prove" has been added.
* A flakey "p4" test has been removed.
* The code and tests assume that the system supplied iconv() would
always use BOM in its output when asked to encode to UTF-16 (or
UTF-32), but apparently some implementations output big-endian
without BOM. A compile-time knob has been added to help such
systems (e.g. NonStop) to add BOM to the output to increase
portability.
Fixes since v2.20
-----------------
* Updates for corner cases in merge-recursive.
(merge cc4cb0902c en/merge-path-collision later to maint).
* "git checkout frotz" (without any double-dash) avoids ambiguity by
making sure 'frotz' cannot be interpreted as a revision and as a
path at the same time. This safety has been updated to check also
a unique remote-tracking branch 'frotz' in a remote, when dwimming
to create a local branch 'frotz' out of a remote-tracking branch
'frotz' from a remote.
(merge be4908f103 nd/checkout-dwim-fix later to maint).
* Refspecs configured with "git -c var=val clone" did not propagate
to the resulting repository, which has been corrected.
(merge 7eae4a3ac4 sg/clone-initial-fetch-configuration later to maint).
* A properly configured username/email is required under
user.useConfigOnly in order to create commits; now "git stash"
(even though it creates commit objects to represent stash entries)
command is exempt from the requirement.
(merge 3bc2111fc2 sd/stash-wo-user-name later to maint).
* The http-backend CGI process did not correctly clean up the child
processes it spawns to run upload-pack etc. when it dies itself,
which has been corrected.
(merge 02818a98d7 mk/http-backend-kill-children-before-exit later to maint).
* "git rev-list --exclude-promisor-objects" had to take an object
that does not exist locally (and is lazily available) from the
command line without barfing, but the code dereferenced NULL.
(merge 4cf67869b2 md/list-lazy-objects-fix later to maint).
* The traversal over tree objects has learned to honor
":(attr:label)" pathspec match, which has been implemented only for
enumerating paths on the filesystem.
(merge 5a0b97b34c nd/attr-pathspec-in-tree-walk later to maint).
* BSD port updates.
(merge 4e3ecbd439 cb/openbsd-allows-reading-directory later to maint).
(merge b6bdc2a0f5 cb/t5004-empty-tar-archive-fix later to maint).
(merge 82cbc8cde2 cb/test-lint-cp-a later to maint).
* Lines that begin with a certain keyword that come over the wire, as
well as lines that consist only of one of these keywords, ought to
be painted in color for easier eyeballing, but the latter was
broken ever since the feature was introduced in 2.19, which has
been corrected.
(merge 1f67290450 hn/highlight-sideband-keywords later to maint).
* "git log -G<regex>" looked for a hunk in the "git log -p" patch
output that contained a string that matches the given pattern.
Optimize this code to ignore binary files, which by default will
not show any hunk that would match any pattern (unless textconv or
the --text option is in effect, that is).
(merge e0e7cb8080 tb/log-G-binary later to maint).
* "git submodule update" ought to use a single job unless asked, but
by mistake used multiple jobs, which has been fixed.
(merge e3a9d1aca9 sb/submodule-fetchjobs-default-to-one later to maint).
* "git stripspace" should be usable outside a git repository, but
under the "-s" or "-c" mode, it didn't.
(merge 957da75802 jn/stripspace-wo-repository later to maint).
* Some of the documentation pages formatted incorrectly with
Asciidoctor, which have been fixed.
(merge b62eb1d2f4 ma/asciidoctor later to maint).
* The core.worktree setting in a submodule repository should not be
pointing at a directory when the submodule loses its working tree
(e.g. getting deinit'ed), but the code did not properly maintain
this invariant.
* With zsh, "git cmd path<TAB>" was completed to "git cmd path name"
when the completed path has a special character like SP in it,
without any attempt to keep "path name" a single filename. This
has been fixed to complete it to "git cmd path\ name" just like
Bash completion does.
* The test suite tried to see if it is run under bash, but the check
itself failed under some other implementations of shell (notably
under NetBSD). This has been corrected.
(merge 54ea72f09c sg/test-bash-version-fix later to maint).
* "git gc" and "git repack" did not close the open packfiles that
they found unneeded before removing them, which didn't work on a
platform incapable of removing an open file. This has been
corrected.
(merge 5bdece0d70 js/gc-repack-close-before-remove later to maint).
* The code to drive GIT_EXTERNAL_DIFF command relied on the string
returned from getenv() to be non-volatile, which is not true, that
has been corrected.
(merge 6776a84dae kg/external-diff-save-env later to maint).
* There were many places the code relied on the string returned from
getenv() to be non-volatile, which is not true, that have been
corrected.
(merge 0da0e9268b jk/save-getenv-result later to maint).
* The v2 upload-pack protocol implementation failed to honor
hidden-ref configuration, which has been corrected.
(merge e20b4192a3 jk/proto-v2-hidden-refs-fix later to maint).
* "git fetch --recurse-submodules" may not fetch the necessary commit
that is bound to the superproject, which is getting corrected.
(merge be76c21282 sb/submodule-recursive-fetch-gets-the-tip later to maint).
* "git rebase" internally runs "checkout" to switch between branches,
and the command used to call the post-checkout hook, but the
reimplementation stopped doing so, which is getting fixed.
* "git add -e" got confused when the change it wants to let the user
edit is smaller than the previous change that was left over in a
temporary file.
(merge fa6f225e01 js/add-e-clear-patch-before-stating later to maint).
* "git p4" failed to update a shelved change when there were moved
files, which has been corrected.
(merge 7a10946ab9 ld/git-p4-shelve-update-fix later to maint).
* The codepath to read from the commit-graph file attempted to read
past the end of it when the file's table-of-contents was corrupt.
* The compat/obstack code had casts that -Wcast-function-type
compilation option found questionable.
(merge 764473d257 sg/obstack-cast-function-type-fix later to maint).
* An obvious typo in an assertion error message has been fixed.
(merge 3c27e2e059 cc/test-ref-store-typofix later to maint).
* In Git for Windows, "git clone \\server\share\path" etc. that uses
UNC paths from command line had bad interaction with its shell
emulation.
* "git add --ignore-errors" did not work as advertised and instead
worked as an unintended synonym for "git add --renormalize", which
has been fixed.
(merge e2c2a37545 jk/add-ignore-errors-bit-assignment-fix later to maint).
* On a case-insensitive filesystem, we failed to compare the part of
the path that is above the worktree directory in an absolute
pathname, which has been corrected.
* Asking "git check-attr" about a macro (e.g. "binary") on a specific
path did not work correctly, even though "git check-attr -a" listed
such a macro correctly. This has been corrected.
(merge 7b95849be4 jk/attr-macro-fix later to maint).
* "git pack-objects" incorrectly used uninitialized mutex, which has
been corrected.
(merge edb673cf10 ph/pack-objects-mutex-fix later to maint).
* "git checkout -b <new> [HEAD]" to create a new branch from the
current commit and check it out ought to be a no-op in the index
and the working tree in normal cases, but there are corner cases
that do require updates to the index and the working tree. Running
it immediately after "git clone --no-checkout" is one of these
cases that an earlier optimization kicked in incorrectly, which has
been fixed.
(merge 8424bfd45b bp/checkout-new-branch-optim later to maint).
* "git diff --color-moved --cc --stat -p" did not work well due to
funny interaction between a bug in color-moved and the rest, which
has been fixed.
(merge dac03b5518 jk/diff-cc-stat-fixes later to maint).
* When GIT_SEQUENCE_EDITOR is set, the command was incorrectly
started when modes of "git rebase" that implicitly uses the
machinery for the interactive rebase are run, which has been
corrected.
(merge 891d4a0313 pw/no-editor-in-rebase-i-implicit later to maint).
* The commit-graph facility did not work when in-core objects that
are promoted from unknown type to commit (e.g. a commit that is
accessed via a tag that refers to it) were involved, which has been
corrected.
(merge 4468d4435c sg/object-as-type-commit-graph-fix later to maint).
* "git fetch" output cleanup.
(merge dc40b24df4 nd/fetch-compact-update later to maint).
* "git cat-file --batch" reported a dangling symbolic link by
mistake, when it wanted to report that a given name is ambiguous.
* Documentation around core.crlf has been updated.
(merge c9446f0504 jk/autocrlf-overrides-eol-doc later to maint).
* The documentation of "git commit-tree" said that the command
understands "--gpg-sign" in addition to "-S", but the command line
parser did not know about the longhand, which has been corrected.
* "git rebase -x $cmd" did not reject multi-line command, even though
the command is incapable of handling such a command. It now is
rejected upfront.
(merge c762aada1a pw/rebase-x-sanity-check later to maint).
* Output from "git help" was not correctly aligned, which has been
fixed.
(merge 6195a76da4 nd/help-align-command-desc later to maint).
* The "git submodule summary" subcommand showed shortened commit
object names by mechanically truncating them at 7-hexdigit, which
has been improved to let "rev-parse --short" scale the length of
the abbreviation with the size of the repository.
(merge 0586a438f6 sh/submodule-summary-abbrev-fix later to maint).
* The way the OSX build jobs updates its build environment used the
"--quiet" option to "brew update" command, but it wasn't all that
quiet to be useful. The use of the option has been replaced with
an explicit redirection to the /dev/null (which incidentally would
have worked around a breakage by recent updates to homebrew, which
has fixed itself already).
(merge a1ccaedd62 sg/travis-osx-brew-breakage-workaround later to maint).
* "git --work-tree=$there --git-dir=$here describe --dirty" did not
work correctly as it did not pay attention to the location of the
worktree specified by the user by mistake, which has been
corrected.
(merge c801170b0c ss/describe-dirty-in-the-right-directory later to maint).
* "git fetch" over protocol v2 that needs to make a second connection
to backfill tags did not clear a variable that holds shallow
repository information correctly, leading to an access of freed
piece of memory.
* Some errors from the other side coming over smart HTTP transport
were not noticed, which has been corrected.
* Code cleanup, docfix, build fix, etc.
(merge 89ba9a79ae hb/t0061-dot-in-path-fix later to maint).
(merge d173e799ea sb/diff-color-moved-config-option-fixup later to maint).
(merge a8f5a59067 en/directory-renames-nothanks-doc-update later to maint).
(merge ec36c42a63 nd/indentation-fix later to maint).
(merge f116ee21cd do/gitweb-strict-export-conf-doc later to maint).
(merge 112ea42663 fd/gitweb-snapshot-conf-doc-fix later to maint).
(merge 1cadad6f65 tb/use-common-win32-pathfuncs-on-cygwin later to maint).
(merge 57e9dcaa65 km/rebase-doc-typofix later to maint).
(merge b8b4cb27e6 ds/gc-doc-typofix later to maint).
(merge 3b3357626e nd/style-opening-brace later to maint).
(merge b4583d5595 es/doc-worktree-guessremote-config later to maint).
(merge cce99cd8c6 ds/commit-graph-assert-missing-parents later to maint).
(merge 0650614982 cy/completion-typofix later to maint).
(merge 6881925ef5 rs/sha1-file-close-mapped-file-on-error later to maint).
(merge bd8d6f0def en/show-ref-doc-fix later to maint).
(merge 1747125e2c cc/partial-clone-doc-typofix later to maint).
(merge e01378753d cc/fetch-error-message-fix later to maint).
(merge 54e8c11215 jk/remote-insteadof-cleanup later to maint).
(merge d609615f48 js/test-git-installed later to maint).
(merge ba170517be ja/doc-style-fix later to maint).
(merge 86fb1c4e77 km/init-doc-typofix later to maint).
(merge 5cfd4a9d10 nd/commit-doc later to maint).
(merge 9fce19a431 ab/diff-tree-doc-fix later to maint).
(merge 2e285e7803 tz/gpg-test-fix later to maint).
(merge 5427de960b kl/pretty-doc-markup-fix later to maint).
(merge 3815f64b0d js/mingw-host-cpu later to maint).
(merge 5fe81438b5 rj/sequencer-sign-off-header-static later to maint).
(merge 18a4f6be6b nd/fileno-may-be-macro later to maint).
(merge 99e9ab54ab kd/t0028-octal-del-is-377-not-777 later to maint).

View File

@ -1,12 +0,0 @@
Git v2.21.1 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6, v2.15.4,
v2.17.3 and in v2.20.2, addressing the security issues CVE-2019-1348,
CVE-2019-1349, CVE-2019-1350, CVE-2019-1351, CVE-2019-1352,
CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and CVE-2019-19604;
see the release notes for those versions for details.
Additionally, this version also includes a couple of fixes for the
Windows-specific quoting of command-line arguments when Git executes
a Unix shell on Windows.

View File

@ -1,597 +0,0 @@
Git 2.22 Release Notes
======================
Updates since v2.21
-------------------
Backward compatibility note
* The filter specification "--filter=sparse:path=<path>" used to
create a lazy/partial clone has been removed. Using a blob that is
part of the project as sparse specification is still supported with
the "--filter=sparse:oid=<blob>" option.
UI, Workflows & Features
* "git checkout --no-overlay" can be used to trigger a new mode of
checking out paths out of the tree-ish, that allows paths that
match the pathspec that are in the current index and working tree
and are not in the tree-ish.
* The %(trailers) formatter in "git log --format=..." now allows to
optionally pick trailers selectively by keyword, show only values,
etc.
* Four new configuration variables {author,committer}.{name,email}
have been introduced to override user.{name,email} in more specific
cases.
* Command-line completion (in contrib/) learned to tab-complete the
"git submodule absorbgitdirs" subcommand.
* "git branch" learned a new subcommand "--show-current".
* Output from "diff --cc" did not show the original paths when the
merge involved renames. A new option adds the paths in the
original trees to the output.
* The command line completion (in contrib/) has been taught to
complete more subcommand parameters.
* The final report from "git bisect" used to show the suspected
culprit using a raw "diff-tree", with which there is no output for
a merge commit. This has been updated to use a more modern and
human readable output that still is concise enough.
* "git rebase --rebase-merges" replaces its old "--preserve-merges"
option; the latter is now marked as deprecated.
* Error message given while cloning with --recurse-submodules has
been updated.
* The completion helper code now pays attention to repository-local
configuration (when available), which allows --list-cmds to honour
a repository specific setting of completion.commands, for example.
* "git mergetool" learned to offer Sublime Merge (smerge) as one of
its backends.
* A new hook "post-index-change" is called when the on-disk index
file changes, which can help e.g. a virtualized working tree
implementation.
* "git difftool" can now run outside a repository.
* "git checkout -m <other>" was about carrying the differences
between HEAD and the working-tree files forward while checking out
another branch, and ignored the differences between HEAD and the
index. The command has been taught to abort when the index and the
HEAD are different.
* A progress indicator has been added to the "index-pack" step, which
often makes users wait for completion during "git clone".
* "git submodule" learns "set-branch" subcommand that allows the
submodule.*.branch settings to be modified.
* "git merge-recursive" backend recently learned a new heuristics to
infer file movement based on how other files in the same directory
moved. As this is inherently less robust heuristics than the one
based on the content similarity of the file itself (rather than
based on what its neighbours are doing), it sometimes gives an
outcome unexpected by the end users. This has been toned down to
leave the renamed paths in higher/conflicted stages in the index so
that the user can examine and confirm the result.
* "git tag" learned to give an advice suggesting it might be a
mistake when creating an annotated or signed tag that points at
another tag.
* The "git pack-objects" command learned to report the number of
objects it packed via the trace2 mechanism.
* The list of conflicted paths shown in the editor while concluding a
conflicted merge was shown above the scissors line when the
clean-up mode is set to "scissors", even though it was commented
out just like the list of updated paths and other information to
help the user explain the merge better.
* The trace2 tracing facility learned to auto-generate a filename
when told to log to a directory.
* "git clone" learned a new --server-option option when talking over
the protocol version 2.
* The connectivity bitmaps are created by default in bare
repositories now; also the pathname hash-cache is created by
default to avoid making crappy deltas when repacking.
* "git branch new A...B" and "git checkout -b new A...B" have been
taught that in their contexts, the notation A...B means "the merge
base between these two commits", just like "git checkout A...B"
detaches HEAD at that commit.
* Update "git difftool" and "git mergetool" so that the combinations
of {diff,merge}.{tool,guitool} configuration variables serve as
fallback settings of each other in a sensible order.
* The "--dir-diff" mode of "git difftool" is not useful in "--no-index"
mode; they are now explicitly marked as mutually incompatible.
Performance, Internal Implementation, Development Support etc.
* The diff machinery, one of the oldest parts of the system, which
long predates the parse-options API, uses fairly long and complex
handcrafted option parser. This is being rewritten to use the
parse-options API.
* The implementation of pack-redundant has been updated for
performance in a repository with many packfiles.
* A more structured way to obtain execution trace has been added.
* "git prune" has been taught to take advantage of reachability
bitmap when able.
* The command line parser of "git commit-tree" has been rewritten to
use the parse-options API.
* Suggest GitGitGadget instead of submitGit as a way to submit
patches based on GitHub PR to us.
* The test framework has been updated to help developers by making it
easier to run most of the tests under different versions of
over-the-wire protocols.
* Dev support update to make it easier to compare two formatted
results from our documentation.
* The scripted "git rebase" implementation has been retired.
* "git multi-pack-index verify" did not scale well with the number of
packfiles, which is being improved.
* "git stash" has been rewritten in C.
* The "check-docs" Makefile target to support developers has been
updated.
* The tests have been updated not to rely on the abbreviated option
names the parse-options API offers, to protect us from an
abbreviated form of an option that used to be unique within the
command getting non-unique when a new option that share the same
prefix is added.
* The scripted version of "git rebase -i" wrote and rewrote the todo
list many times during a single step of its operation, and the
recent C-rewrite made a faithful conversion of the logic to C. The
implementation has been updated to carry necessary information
around in-core to avoid rewriting the same file over and over
unnecessarily.
* Test framework update to more robustly clean up leftover files and
processes after tests are done.
* Conversion from unsigned char[20] to struct object_id continues.
* While running "git diff" in a lazy clone, we can upfront know which
missing blobs we will need, instead of waiting for the on-demand
machinery to discover them one by one. The code learned to aim to
achieve better performance by batching the request for these
promised blobs.
* During an initial "git clone --depth=..." partial clone, it is
pointless to spend cycles for a large portion of the connectivity
check that enumerates and skips promisor objects (which by
definition is all objects fetched from the other side). This has
been optimized out.
* Mechanically and systematically drop "extern" from function
declaration.
* The script to aggregate perf result unconditionally depended on
libjson-perl even though it did not have to, which has been
corrected.
* The internal implementation of "git rebase -i" has been updated to
avoid forking a separate "rebase--interactive" process.
* Allow DEP and ASLR for Windows build to for security hardening.
* Performance test framework has been broken and measured the version
of Git that happens to be on $PATH, not the specified one to
measure, for a while, which has been corrected.
* Optionally "make coccicheck" can feed multiple source files to
spatch, gaining performance while spending more memory.
* Attempt to use an abbreviated option in "git clone --recurs" is
responded by a request to disambiguate between --recursive and
--recurse-submodules, which is bad because these two are synonyms.
The parse-options API has been extended to define such synonyms
more easily and not produce an unnecessary failure.
* A pair of private functions in http.c that had names similar to
fread/fwrite did not return the number of elements, which was found
to be confusing.
* Update collision-detecting SHA-1 code to build properly on HP-UX.
Fixes since v2.21
-----------------
* "git prune-packed" did not notice and complain against excess
arguments given from the command line, which now it does.
(merge 9b0bd87ed2 rj/prune-packed-excess-args later to maint).
* Split-index fix.
(merge 6e37c8ed3c nd/split-index-null-base-fix later to maint).
* "git diff --no-index" may still want to access Git goodies like
--ext-diff and --textconv, but so far these have been ignored,
which has been corrected.
(merge 287ab28bfa jk/diff-no-index-initialize later to maint).
* Unify RPC code for smart http in protocol v0/v1 and v2, which fixes
a bug in the latter (lack of authentication retry) and generally
improves the code base.
(merge a97d00799a jt/http-auth-proto-v2-fix later to maint).
* The include file compat/bswap.h has been updated so that it is safe
to (accidentally) include it more than once.
(merge 33aa579a55 jk/guard-bswap-header later to maint).
* The set of header files used by "make hdr-check" unconditionally
included sha256/gcrypt.h, even when it is not used, causing the
make target to fail. We now skip it when GCRYPT_SHA256 is not in
use.
(merge f23aa18e7f rj/hdr-check-gcrypt-fix later to maint).
* The Makefile uses 'find' utility to enumerate all the *.h header
files, which is expensive on platforms with slow filesystems; it
now optionally uses "ls-files" if working within a repository,
which is a trick similar to how all sources are enumerated to run
ETAGS on.
(merge 92b88eba9f js/find-lib-h-with-ls-files-when-possible later to maint).
* "git rebase" that was reimplemented in C did not set ORIG_HEAD
correctly, which has been corrected.
(merge cbd29ead92 js/rebase-orig-head-fix later to maint).
* Dev support.
(merge f545737144 js/stress-test-ui-tweak later to maint).
* CFLAGS now can be tweaked when invoking Make while using
DEVELOPER=YesPlease; this did not work well before.
(merge 6d5d4b4e93 ab/makefile-help-devs-more later to maint).
* "git fsck --connectivity-only" omits computation necessary to sift
the objects that are not reachable from any of the refs into
unreachable and dangling. This is now enabled when dangling
objects are requested (which is done by default, but can be
overridden with the "--no-dangling" option).
(merge 8d8c2a5aef jk/fsck-doc later to maint).
* On platforms where "git fetch" is killed with SIGPIPE (e.g. OSX),
the upload-pack that runs on the other end that hangs up after
detecting an error could cause "git fetch" to die with a signal,
which led to a flaky test. "git fetch" now ignores SIGPIPE during
the network portion of its operation (this is not a problem as we
check the return status from our write(2)s).
(merge 143588949c jk/no-sigpipe-during-network-transport later to maint).
* A recent update broke "is this object available to us?" check for
well-known objects like an empty tree (which should yield "yes",
even when there is no on-disk object for an empty tree), which has
been corrected.
(merge f06ab027ef jk/virtual-objects-do-exist later to maint).
* The setup code has been cleaned up to avoid leaks around the
repository_format structure.
(merge e8805af1c3 ma/clear-repository-format later to maint).
* "git config --type=color ..." is meant to replace "git config --get-color"
but there is a slight difference that wasn't documented, which is
now fixed.
(merge cd8e7593b9 jk/config-type-color-ends-with-lf later to maint).
* When the "clean" filter can reduce the size of a huge file in the
working tree down to a small "token" (a la Git LFS), there is no
point in allocating a huge scratch area upfront, but the buffer is
sized based on the original file size. The convert mechanism now
allocates very minimum and reallocates as it receives the output
from the clean filter process.
(merge 02156ab031 jh/resize-convert-scratch-buffer later to maint).
* "git rebase" uses the refs/rewritten/ hierarchy to store its
intermediate states, which inherently makes the hierarchy per
worktree, but it didn't quite work well.
(merge b9317d55a3 nd/rewritten-ref-is-per-worktree later to maint).
* "git log -L<from>,<to>:<path>" with "-s" did not suppress the patch
output as it should. This has been corrected.
(merge 05314efaea jk/line-log-with-patch later to maint).
* "git worktree add" used to do a "find an available name with stat
and then mkdir", which is race-prone. This has been fixed by using
mkdir and reacting to EEXIST in a loop.
(merge 7af01f2367 ms/worktree-add-atomic-mkdir later to maint).
* Build update for SHA-1 with collision detection.
(merge 07a20f569b jk/sha1dc later to maint).
* Build procedure has been fixed around use of asciidoctor instead of
asciidoc.
(merge 185f9a0ea0 ma/asciidoctor-fixes later to maint).
* remote-http transport did not anonymize URLs reported in its error
messages at places.
(merge c1284b21f2 js/anonymize-remote-curl-diag later to maint).
* Error messages given from the http transport have been updated so
that they can be localized.
(merge ed8b4132c8 js/remote-curl-i18n later to maint).
* "git init" forgot to read platform-specific repository
configuration, which made Windows port to ignore settings of
core.hidedotfiles, for example.
* A corner-case object name ambiguity while the sequencer machinery
is working (e.g. "rebase -i -x") has been fixed.
* "git format-patch" did not diagnose an error while opening the
output file for the cover-letter, which has been corrected.
(merge 2fe95f494c jc/format-patch-error-check later to maint).
* "git checkout -f <branch>" while the index has an unmerged path
incorrectly left some paths in an unmerged state, which has been
corrected.
* A corner case bug in the refs API has been corrected.
(merge d3322eb28b jk/refs-double-abort later to maint).
* Unicode update.
(merge 584b62c37b bb/unicode-12 later to maint).
* dumb-http walker has been updated to share more error recovery
strategy with the normal codepath.
* A buglet in configuration parser has been fixed.
(merge 19e7fdaa58 nd/include-if-wildmatch later to maint).
* The documentation for "git read-tree --reset -u" has been updated.
(merge b5a0bd694c nd/read-tree-reset-doc later to maint).
* Code clean-up around a much-less-important-than-it-used-to-be
update_server_info() function.
(merge b3223761c8 jk/server-info-rabbit-hole later to maint).
* The message given when "git commit -a <paths>" errors out has been
updated.
(merge 5a1dbd48bc nd/commit-a-with-paths-msg-update later to maint).
* "git cherry-pick --options A..B", after giving control back to the
user to ask help resolving a conflicted step, did not honor the
options it originally received, which has been corrected.
* Various glitches in "git gc" around reflog handling have been fixed.
* The code to read from commit-graph file has been cleanup with more
careful error checking before using data read from it.
* Performance fix around "git fetch" that grabs many refs.
(merge b764300912 jt/fetch-pack-wanted-refs-optim later to maint).
* Protocol v2 support in "git fetch-pack" of shallow clones has been
corrected.
* Performance fix around "git blame", especially in a linear history
(which is the norm we should optimize for).
(merge f892014943 dk/blame-keep-origin-blob later to maint).
* Performance fix for "rev-list --parents -- pathspec".
(merge 8320b1dbe7 jk/revision-rewritten-parents-in-prio-queue later to maint).
* Updating the display with progress message has been cleaned up to
deal better with overlong messages.
(merge 545dc345eb sg/overlong-progress-fix later to maint).
* "git blame -- path" in a non-bare repository starts blaming from
the working tree, and the same command in a bare repository errors
out because there is no working tree by definition. The command
has been taught to instead start blaming from the commit at HEAD,
which is more useful.
(merge a544fb08f8 sg/blame-in-bare-start-at-head later to maint).
* An underallocation in the code to read the untracked cache
extension has been corrected.
(merge 3a7b45a623 js/untracked-cache-allocfix later to maint).
* The code is updated to check the result of memory allocation before
it is used in more places, by using xmalloc and/or xcalloc calls.
(merge 999b951b28 jk/xmalloc later to maint).
* The GETTEXT_POISON test option has been quite broken ever since it
was made runtime-tunable, which has been fixed.
(merge f88b9cb603 jc/gettext-test-fix later to maint).
* Test fix on APFS that is incapable of store paths in Latin-1.
(merge 3889149619 js/iso8895-test-on-apfs later to maint).
* "git submodule foreach <command> --quiet" did not pass the option
down correctly, which has been corrected.
(merge a282f5a906 nd/submodule-foreach-quiet later to maint).
* "git send-email" has been taught to use quoted-printable when the
payload contains carriage-return. The use of the mechanism is in
line with the design originally added the codepath that chooses QP
when the payload has overly long lines.
(merge 74d76a1701 bc/send-email-qp-cr later to maint).
* The recently added feature to add addresses that are on
anything-by: trailers in 'git send-email' was found to be way too
eager and considered nonsense strings as if they can be legitimate
beginning of *-by: trailer. This has been tightened.
* Builds with gettext broke on recent macOS w/ Homebrew, which
seems to have stopped including from /usr/local/include; this
has been corrected.
(merge 92a1377a2a js/macos-gettext-build later to maint).
* Running "git add" on a repository created inside the current
repository is an explicit indication that the user wants to add it
as a submodule, but when the HEAD of the inner repository is on an
unborn branch, it cannot be added as a submodule. Worse, the files
in its working tree can be added as if they are a part of the outer
repository, which is not what the user wants. These problems are
being addressed.
(merge f937bc2f86 km/empty-repo-is-still-a-repo later to maint).
* "git cherry-pick" run with the "-x" or the "--signoff" option used
to (and more importantly, ought to) clean up the commit log message
with the --cleanup=space option by default, but this has been
broken since late 2017. This has been fixed.
* When given a tag that points at a commit-ish, "git replace --graft"
failed to peel the tag before writing a replace ref, which did not
make sense because the old graft mechanism the feature wants to
mimic only allowed to replace one commit object with another.
This has been fixed.
(merge ee521ec4cb cc/replace-graft-peel-tags later to maint).
* Code tightening against a "wrong" object appearing where an object
of a different type is expected, instead of blindly assuming that
the connection between objects are correctly made.
(merge 97dd512af7 tb/unexpected later to maint).
* An earlier update for MinGW and Cygwin accidentally broke MSVC build,
which has been fixed.
(merge 22c3634c0f ss/msvc-path-utils-fix later to maint).
* %(push:track) token used in the --format option to "git
for-each-ref" and friends was not showing the right branch, which
has been fixed.
(merge c646d0934e dr/ref-filter-push-track-fix later to maint).
* "make check-docs", "git help -a", etc. did not account for cases
where a particular build may deliberately omit some subcommands,
which has been corrected.
* The logic to tell if a Git repository has a working tree protects
"git branch -D" from removing the branch that is currently checked
out by mistake. The implementation of this logic was broken for
repositories with unusual name, which unfortunately is the norm for
submodules these days. This has been fixed.
(merge f3534c98e4 jt/submodule-repo-is-with-worktree later to maint).
* AIX shared the same build issues with other BSDs around fileno(fp),
which has been corrected.
(merge ee662bf5c6 cc/aix-has-fileno-as-a-macro later to maint).
* The autoconf generated configure script failed to use the right
gettext() implementations from -libintl by ignoring useless stub
implementations shipped in some C library, which has been
corrected.
(merge b71e56a683 vk/autoconf-gettext later to maint).
* Fix index-pack perf test so that the repeated invocations always
run in an empty repository, which emulates the initial clone
situation better.
(merge 775c71e16d jk/p5302-avoid-collision-check-cost later to maint).
* A "ls-files" that emulates "find" to enumerate files in the working
tree resulted in duplicated Makefile rules that caused the build to
issue an unnecessary warning during a trial build after merge
conflicts are resolved in working tree *.h files but before the
resolved results are added to the index. This has been corrected.
* "git cherry-pick" (and "revert" that shares the same runtime engine)
that deals with multiple commits got confused when the final step
gets stopped with a conflict and the user concluded the sequence
with "git commit". Attempt to fix it by cleaning up the state
files used by these commands in such a situation.
(merge 4a72486de9 pw/clean-sequencer-state-upon-final-commit later to maint).
* On a filesystem like HFS+, the names of the refs stored as filesystem
entities may become different from what the end-user expects, just
like files in the working tree get "renamed". Work around the
mismatch by paying attention to the core.precomposeUnicode
configuration.
(merge 8e712ef6fc en/unicode-in-refnames later to maint).
* The code to generate the multi-pack idx file was not prepared to
see too many packfiles and ran out of open file descriptor, which
has been corrected.
* To run tests for Git SVN, our scripts for CI used to install the
git-svn package (in the hope that it would bring in the right
dependencies). This has been updated to install the more direct
dependency, namely, libsvn-perl.
(merge db864306cf sg/ci-libsvn-perl later to maint).
* "git cvsexportcommit" running on msys did not expect cvsnt showed
"cvs status" output with CRLF line endings.
* The fsmonitor interface got out of sync after the in-core index
file gets discarded, which has been corrected.
(merge 398a3b0899 js/fsmonitor-refresh-after-discarding-index later to maint).
* "git status" did not know that the "label" instruction in the
todo-list "rebase -i -r" uses should not be shown as a hex object
name.
* A prerequisite check in the test suite to see if a working jgit is
available was made more robust.
(merge abd0f28983 tz/test-lib-check-working-jgit later to maint).
* The codepath to parse :<path> that obtains the object name for an
indexed object has been made more robust.
* Code cleanup, docfix, build fix, etc.
(merge 11f470aee7 jc/test-yes-doc later to maint).
(merge 90503a240b js/doc-symref-in-proto-v1 later to maint).
(merge 5c326d1252 jk/unused-params later to maint).
(merge 68cabbfda3 dl/doc-submodule-wo-subcommand later to maint).
(merge 9903623761 ab/receive-pack-use-after-free-fix later to maint).
(merge 1ede45e44b en/merge-options-doc later to maint).
(merge 3e14dd2c8e rd/doc-hook-used-in-sample later to maint).
(merge c271dc28fd nd/no-more-check-racy later to maint).
(merge e6e15194a8 yb/utf-16le-bom-spellfix later to maint).
(merge bb101aaf0c rd/attr.c-comment-typofix later to maint).
(merge 716a5af812 rd/gc-prune-doc-fix later to maint).
(merge 50b206371d js/untravis-windows later to maint).
(merge dbf47215e3 js/rebase-recreate-merge later to maint).
(merge 56cb2d30f8 dl/reset-doc-no-wrt-abbrev later to maint).
(merge 64eca306a2 ja/dir-rename-doc-markup-fix later to maint).
(merge af91b0230c dl/ignore-docs later to maint).
(merge 59a06e947b ra/t3600-test-path-funcs later to maint).
(merge e041d0781b ar/t4150-remove-cruft later to maint).
(merge 8d75a1d183 ma/asciidoctor-fixes-more later to maint).
(merge 74cc547b0f mh/pack-protocol-doc-fix later to maint).
(merge ed31851fa6 ab/doc-misc-typofixes later to maint).
(merge a7256debd4 nd/checkout-m-doc-update later to maint).
(merge 3a9e1ad78d jt/t5551-protocol-v2-does-not-have-half-auth later to maint).
(merge 0b918b75af sg/t5318-cleanup later to maint).
(merge 68ed71b53c cb/doco-mono later to maint).
(merge a34dca2451 nd/interpret-trailers-docfix later to maint).
(merge cf7b857a77 en/fast-import-parsing-fix later to maint).
(merge fe61ccbc35 po/rerere-doc-fmt later to maint).
(merge ffea0248bf po/describe-not-necessarily-7 later to maint).
(merge 7cb7283adb tg/ls-files-debug-format-fix later to maint).
(merge f64a21bd82 tz/doc-apostrophe-no-longer-needed later to maint).
(merge dbe7b41019 js/t3301-unbreak-notes-test later to maint).
(merge d8083e4180 km/t3000-retitle later to maint).
(merge 9e4cbccbd7 tz/git-svn-doc-markup-fix later to maint).
(merge da9ca955a7 jk/ls-files-doc-markup-fix later to maint).
(merge 6804ba3a58 cw/diff-highlight later to maint).
(merge 1a8787144d nd/submodule-helper-incomplete-line-fix later to maint).
(merge d9ef573837 jk/apache-lsan later to maint).
(merge c871fbee2b js/t6500-use-windows-pid-on-mingw later to maint).
(merge ce4c7bfc90 bl/t4253-exit-code-from-format-patch later to maint).
(merge 397a46db78 js/t5580-unc-alternate-test later to maint).
(merge d4907720a2 cm/notes-comment-fix later to maint).
(merge 9dde06de13 cb/http-push-null-in-message-fix later to maint).
(merge 4c785c0edc js/rebase-config-bitfix later to maint).
(merge 8e9fe16c87 es/doc-gitsubmodules-markup later to maint).

View File

@ -1,150 +0,0 @@
Git 2.22.1 Release Notes
========================
Fixes since v2.22
-----------------
* A relative pathname given to "git init --template=<path> <repo>"
ought to be relative to the directory "git init" gets invoked in,
but it instead was made relative to the repository, which has been
corrected.
* "git worktree add" used to fail when another worktree connected to
the same repository was corrupt, which has been corrected.
* The ownership rule for the file descriptor to fast-import remote
backend was mixed up, leading to unrelated file descriptor getting
closed, which has been fixed.
* "git update-server-info" used to leave stale packfiles in its
output, which has been corrected.
* The server side support for "git fetch" used to show incorrect
value for the HEAD symbolic ref when the namespace feature is in
use, which has been corrected.
* "git am -i --resolved" segfaulted after trying to see a commit as
if it were a tree, which has been corrected.
* "git bundle verify" needs to see if prerequisite objects exist in
the receiving repository, but the command did not check if we are
in a repository upfront, which has been corrected.
* "git merge --squash" is designed to update the working tree and the
index without creating the commit, and this cannot be countermanded
by adding the "--commit" option; the command now refuses to work
when both options are given.
* The data collected by fsmonitor was not properly written back to
the on-disk index file, breaking t7519 tests occasionally, which
has been corrected.
* Update to Unicode 12.1 width table.
* The command line to invoke a "git cat-file" command from inside
"git p4" was not properly quoted to protect a caret and running a
broken command on Windows, which has been corrected.
* "git request-pull" learned to warn when the ref we ask them to pull
from in the local repository and in the published repository are
different.
* When creating a partial clone, the object filtering criteria is
recorded for the origin of the clone, but this incorrectly used a
hardcoded name "origin" to name that remote; it has been corrected
to honor the "--origin <name>" option.
* "git fetch" into a lazy clone forgot to fetch base objects that are
necessary to complete delta in a thin packfile, which has been
corrected.
* The filter_data used in the list-objects-filter (which manages a
lazily sparse clone repository) did not use the dynamic array API
correctly---'nr' is supposed to point at one past the last element
of the array in use. This has been corrected.
* The description about slashes in gitignore patterns (used to
indicate things like "anchored to this level only" and "only
matches directories") has been revamped.
* The URL decoding code has been updated to avoid going past the end
of the string while parsing %-<hex>-<hex> sequence.
* The list of for-each like macros used by clang-format has been
updated.
* "git push --atomic" that goes over the transport-helper (namely,
the smart http transport) failed to prevent refs to be pushed when
it can locally tell that one of the ref update will fail without
having to consult the other end, which has been corrected.
* "git clean" silently skipped a path when it cannot lstat() it; now
it gives a warning.
* A codepath that reads from GPG for signed object verification read
past the end of allocated buffer, which has been fixed.
* "git rm" to resolve a conflicted path leaked an internal message
"needs merge" before actually removing the path, which was
confusing. This has been corrected.
* The "git clone" documentation refers to command line options in its
description in the short form; they have been replaced with long
forms to make them more recognisable.
* The configuration variable rebase.rescheduleFailedExec should be
effective only while running an interactive rebase and should not
affect anything when running a non-interactive one, which was not
the case. This has been corrected.
* "git submodule foreach" did not protect command line options passed
to the command to be run in each submodule correctly, when the
"--recursive" option was in use.
* Use "Erase in Line" CSI sequence that is already used in the editor
support to clear cruft in the progress output.
* The codepath to compute delta islands used to spew progress output
without giving the callers any way to squelch it, which has been
fixed.
* The code to parse scaled numbers out of configuration files has
been made more robust and also easier to follow.
* An incorrect list of options was cached after command line
completion failed (e.g. trying to complete a command that requires
a repository outside one), which has been corrected.
* "git rebase --abort" used to leave refs/rewritten/ when concluding
"git rebase -r", which has been corrected.
* "git stash show 23" used to work, but no more after getting
rewritten in C; this regression has been corrected.
* "git interpret-trailers" always treated '#' as the comment
character, regardless of core.commentChar setting, which has been
corrected.
* Code clean-up to avoid signed integer overlaps during binary search.
* "git checkout -p" needs to selectively apply a patch in reverse,
which did not work well.
* The commit-graph file is now part of the "files that the runtime
may keep open file descriptors on, all of which would need to be
closed when done with the object store", and the file descriptor to
an existing commit-graph file now is closed before "gc" finalizes a
new instance to replace it.
* Code restructuring during 2.20 period broke fetching tags via
"import" based transports.
* We have been trying out a few language features outside c89; the
coding guidelines document did not talk about them and instead had
a blanket ban against them.
* The internal diff machinery can be made to read out of bounds while
looking for --funcion-context line in a corner case, which has been
corrected.
Also contains various documentation updates, code clean-ups and minor fixups.

View File

@ -1,8 +0,0 @@
Git v2.22.2 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6, v2.15.4,
v2.17.3, v2.20.2 and in v2.21.1, addressing the security issues
CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351,
CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and
CVE-2019-19604; see the release notes for those versions for details.

View File

@ -1,348 +0,0 @@
Git 2.23 Release Notes
======================
Updates since v2.22
-------------------
Backward compatibility note
* The "--base" option of "format-patch" computed the patch-ids for
prerequisite patches in an unstable way, which has been updated to
compute in a way that is compatible with "git patch-id --stable".
* The "git log" command by default behaves as if the --mailmap option
was given.
UI, Workflows & Features
* The "git fast-export/import" pair has been taught to handle commits
with log messages in encoding other than UTF-8 better.
* In recent versions of Git, per-worktree refs are exposed in
refs/worktrees/<wtname>/ hierarchy, which means that worktree names
must be a valid refname component. The code now sanitizes the names
given to worktrees, to make sure these refs are well-formed.
* "git merge" learned "--quit" option that cleans up the in-progress
merge while leaving the working tree and the index still in a mess.
* "git format-patch" learns a configuration to set the default for
its --notes=<ref> option.
* The code to show args with potential typo that cannot be
interpreted as a commit-ish has been improved.
* "git clone --recurse-submodules" learned to set up the submodules
to ignore commit object names recorded in the superproject gitlink
and instead use the commits that happen to be at the tip of the
remote-tracking branches from the get-go, by passing the new
"--remote-submodules" option.
* The pattern "git diff/grep" use to extract funcname and words
boundary for Matlab has been extend to cover Octave, which is more
or less equivalent.
* "git help git" was hard to discover (well, at least for some
people).
* The pattern "git diff/grep" use to extract funcname and words
boundary for Rust has been added.
* "git status" can be told a non-standard default value for the
"--[no-]ahead-behind" option with a new configuration variable
status.aheadBehind.
* "git fetch" and "git pull" reports when a fetch results in
non-fast-forward updates to let the user notice unusual situation.
The commands learned "--no-show-forced-updates" option to disable
this safety feature.
* Two new commands "git switch" and "git restore" are introduced to
split "checking out a branch to work on advancing its history" and
"checking out paths out of the index and/or a tree-ish to work on
advancing the current history" out of the single "git checkout"
command.
* "git branch --list" learned to always output the detached HEAD as
the first item (when the HEAD is detached, of course), regardless
of the locale.
* The conditional inclusion mechanism learned to base the choice on
the branch the HEAD currently is on.
* "git rev-list --objects" learned the "--no-object-names" option to
squelch the path to the object that is used as a grouping hint for
pack-objects.
* A new tag.gpgSign configuration variable turns "git tag -a" into
"git tag -s".
* "git multi-pack-index" learned expire and repack subcommands.
* "git blame" learned to "ignore" commits in the history, whose
effects (as well as their presence) get ignored.
* "git cherry-pick/revert" learned a new "--skip" action.
* The tips of refs from the alternate object store can be used as
starting point for reachability computation now.
* Extra blank lines in "git status" output have been reduced.
* The commits in a repository can be described by multiple
commit-graph files now, which allows the commit-graph files to be
updated incrementally.
* "git range-diff" output has been tweaked for easier identification
of which part of what file the patch shown is about.
Performance, Internal Implementation, Development Support etc.
* Update supporting parts of "git rebase" to remove code that should
no longer be used.
* Developer support to emulate unsatisfied prerequisites in tests to
ensure that the remainder of the tests still succeeds when tests
with prerequisites are skipped.
* "git update-server-info" learned not to rewrite the file with the
same contents.
* The way of specifying the path to find dynamic libraries at runtime
has been simplified. The old default to pass -R/path/to/dir has been
replaced with the new default to pass -Wl,-rpath,/path/to/dir,
which is the more recent GCC uses. Those who need to build with an
old GCC can still use "CC_LD_DYNPATH=-R"
* Prepare use of reachability index in topological walker that works
on a range (A..B).
* A new tutorial targeting specifically aspiring git-core
developers has been added.
* Auto-detect how to tell HP-UX aCC where to use dynamically linked
libraries from at runtime.
* "git mergetool" and its tests now spawn fewer subprocesses.
* Dev support update to help tracing out tests.
* Support to build with MSVC has been updated.
* "git fetch" that grabs from a group of remotes learned to run the
auto-gc only once at the very end.
* A handful of Windows build patches have been upstreamed.
* The code to read state files used by the sequencer machinery for
"git status" has been made more robust against a corrupt or stale
state files.
* "git for-each-ref" with multiple patterns have been optimized.
* The tree-walk API learned to pass an in-core repository
instance throughout more codepaths.
* When one step in multi step cherry-pick or revert is reset or
committed, the command line prompt script failed to notice the
current status, which has been improved.
* Many GIT_TEST_* environment variables control various aspects of
how our tests are run, but a few followed "non-empty is true, empty
or unset is false" while others followed the usual "there are a few
ways to spell true, like yes, on, etc., and also ways to spell
false, like no, off, etc." convention.
* Adjust the dir-iterator API and apply it to the local clone
optimization codepath.
* We have been trying out a few language features outside c89; the
coding guidelines document did not talk about them and instead had
a blanket ban against them.
* A test helper has been introduced to optimize preparation of test
repositories with many simple commits, and a handful of test
scripts have been updated to use it.
Fixes since v2.22
-----------------
* A relative pathname given to "git init --template=<path> <repo>"
ought to be relative to the directory "git init" gets invoked in,
but it instead was made relative to the repository, which has been
corrected.
* "git worktree add" used to fail when another worktree connected to
the same repository was corrupt, which has been corrected.
* The ownership rule for the file descriptor to fast-import remote
backend was mixed up, leading to an unrelated file descriptor getting
closed, which has been fixed.
* A "merge -c" instruction during "git rebase --rebase-merges" should
give the user a chance to edit the log message, even when there is
otherwise no need to create a new merge and replace the existing
one (i.e. fast-forward instead), but did not. Which has been
corrected.
* Code cleanup and futureproof.
* More parameter validation.
* "git update-server-info" used to leave stale packfiles in its
output, which has been corrected.
* The server side support for "git fetch" used to show incorrect
value for the HEAD symbolic ref when the namespace feature is in
use, which has been corrected.
* "git am -i --resolved" segfaulted after trying to see a commit as
if it were a tree, which has been corrected.
* "git bundle verify" needs to see if prerequisite objects exist in
the receiving repository, but the command did not check if we are
in a repository upfront, which has been corrected.
* "git merge --squash" is designed to update the working tree and the
index without creating the commit, and this cannot be countermanded
by adding the "--commit" option; the command now refuses to work
when both options are given.
* The data collected by fsmonitor was not properly written back to
the on-disk index file, breaking t7519 tests occasionally, which
has been corrected.
* Update to Unicode 12.1 width table.
* The command line to invoke a "git cat-file" command from inside
"git p4" was not properly quoted to protect a caret and running a
broken command on Windows, which has been corrected.
* "git request-pull" learned to warn when the ref we ask them to pull
from in the local repository and in the published repository are
different.
* When creating a partial clone, the object filtering criteria is
recorded for the origin of the clone, but this incorrectly used a
hardcoded name "origin" to name that remote; it has been corrected
to honor the "--origin <name>" option.
* "git fetch" into a lazy clone forgot to fetch base objects that are
necessary to complete delta in a thin packfile, which has been
corrected.
* The filter_data used in the list-objects-filter (which manages a
lazily sparse clone repository) did not use the dynamic array API
correctly---'nr' is supposed to point at one past the last element
of the array in use. This has been corrected.
* The description about slashes in gitignore patterns (used to
indicate things like "anchored to this level only" and "only
matches directories") has been revamped.
* The URL decoding code has been updated to avoid going past the end
of the string while parsing %-<hex>-<hex> sequence.
* The list of for-each like macros used by clang-format has been
updated.
* "git branch --list" learned to show branches that are checked out
in other worktrees connected to the same repository prefixed with
'+', similar to the way the currently checked out branch is shown
with '*' in front.
(merge 6e9381469e nb/branch-show-other-worktrees-head later to maint).
* Code restructuring during 2.20 period broke fetching tags via
"import" based transports.
* The commit-graph file is now part of the "files that the runtime
may keep open file descriptors on, all of which would need to be
closed when done with the object store", and the file descriptor to
an existing commit-graph file now is closed before "gc" finalizes a
new instance to replace it.
* "git checkout -p" needs to selectively apply a patch in reverse,
which did not work well.
* Code clean-up to avoid signed integer wraparounds during binary search.
* "git interpret-trailers" always treated '#' as the comment
character, regardless of core.commentChar setting, which has been
corrected.
* "git stash show 23" used to work, but no more after getting
rewritten in C; this regression has been corrected.
* "git rebase --abort" used to leave refs/rewritten/ when concluding
"git rebase -r", which has been corrected.
* An incorrect list of options was cached after command line
completion failed (e.g. trying to complete a command that requires
a repository outside one), which has been corrected.
* The code to parse scaled numbers out of configuration files has
been made more robust and also easier to follow.
* The codepath to compute delta islands used to spew progress output
without giving the callers any way to squelch it, which has been
fixed.
* Protocol capabilities that go over wire should never be translated,
but it was incorrectly marked for translation, which has been
corrected. The output of protocol capabilities for debugging has
been tweaked a bit.
* Use "Erase in Line" CSI sequence that is already used in the editor
support to clear cruft in the progress output.
* "git submodule foreach" did not protect command line options passed
to the command to be run in each submodule correctly, when the
"--recursive" option was in use.
* The configuration variable rebase.rescheduleFailedExec should be
effective only while running an interactive rebase and should not
affect anything when running a non-interactive one, which was not
the case. This has been corrected.
* The "git clone" documentation refers to command line options in its
description in the short form; they have been replaced with long
forms to make them more recognisable.
* Generation of pack bitmaps are now disabled when .keep files exist,
as these are mutually exclusive features.
(merge 7328482253 ew/repack-with-bitmaps-by-default later to maint).
* "git rm" to resolve a conflicted path leaked an internal message
"needs merge" before actually removing the path, which was
confusing. This has been corrected.
* "git stash --keep-index" did not work correctly on paths that have
been removed, which has been fixed.
(merge b932f6a5e8 tg/stash-keep-index-with-removed-paths later to maint).
* Window 7 update ;-)
* A codepath that reads from GPG for signed object verification read
past the end of allocated buffer, which has been fixed.
* "git clean" silently skipped a path when it cannot lstat() it; now
it gives a warning.
* "git push --atomic" that goes over the transport-helper (namely,
the smart http transport) failed to prevent refs to be pushed when
it can locally tell that one of the ref update will fail without
having to consult the other end, which has been corrected.
* The internal diff machinery can be made to read out of bounds while
looking for --function-context line in a corner case, which has been
corrected.
(merge b777f3fd61 jk/xdiff-clamp-funcname-context-index later to maint).
* Other code cleanup, docfix, build fix, etc.
(merge fbec05c210 cc/test-oidmap later to maint).
(merge 7a06fb038c jk/no-system-includes-in-dot-c later to maint).
(merge 81ed2b405c cb/xdiff-no-system-includes-in-dot-c later to maint).
(merge d61e6ce1dd sg/fsck-config-in-doc later to maint).

View File

@ -1,8 +0,0 @@
Git v2.23.1 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6, v2.15.4,
v2.17.3, v2.20.2 and in v2.21.1, addressing the security issues
CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351,
CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and
CVE-2019-19604; see the release notes for those versions for details.

View File

@ -1,398 +0,0 @@
Git 2.24 Release Notes
======================
Updates since v2.23
-------------------
Backward compatibility note
* "filter-branch" is showing its age and alternatives are available.
From this release, we started to discourage its use and hint
people about filter-repo.
UI, Workflows & Features
* We now have an active interim maintainer for the Git-Gui part of
the system. Praise and thank Pratyush Yadav for volunteering.
* The command line parser learned "--end-of-options" notation; the
standard convention for scripters to have hardcoded set of options
first on the command line, and force the command to treat end-user
input as non-options, has been to use "--" as the delimiter, but
that would not work for commands that use "--" as a delimiter
between revs and pathspec.
* A mechanism to affect the default setting for a (related) group of
configuration variables is introduced.
* "git fetch" learned "--set-upstream" option to help those who first
clone from their private fork they intend to push to, add the true
upstream via "git remote add" and then "git fetch" from it.
* Device-tree files learned their own userdiff patterns.
(merge 3c81760bc6 sb/userdiff-dts later to maint).
* "git rebase --rebase-merges" learned to drive different merge
strategies and pass strategy specific options to them.
* A new "pre-merge-commit" hook has been introduced.
* Command line completion updates for "git -c var.name=val" have been
added.
* The lazy clone machinery has been taught that there can be more
than one promisor remote and consult them in order when downloading
missing objects on demand.
* The list-objects-filter API (used to create a sparse/lazy clone)
learned to take a combined filter specification.
* The documentation and tests for "git format-patch" have been
cleaned up.
* On Windows, the root level of UNC share is now allowed to be used
just like any other directory.
* The command line completion support (in contrib/) learned about the
"--skip" option of "git revert" and "git cherry-pick".
* "git rebase --keep-base <upstream>" tries to find the original base
of the topic being rebased and rebase on top of that same base,
which is useful when running the "git rebase -i" (and its limited
variant "git rebase -x").
The command also has learned to fast-forward in more cases where it
can instead of replaying to recreate identical commits.
* A configuration variable tells "git fetch" to write the commit
graph after finishing.
* "git add -i" has been taught to show the total number of hunks and
the hunks that has been processed so far when showing prompts.
* "git fetch --jobs=<n>" allowed <n> parallel jobs when fetching
submodules, but this did not apply to "git fetch --multiple" that
fetches from multiple remote repositories. It now does.
* The installation instruction for zsh completion script (in
contrib/) has been a bit improved.
Performance, Internal Implementation, Development Support etc.
* The code to write commit-graph over given commit object names has
been made a bit more robust.
* The first line of verbose output from each test piece now carries
the test name and number to help scanning with eyeballs.
* Further clean-up of the initialization code.
* xmalloc() used to have a mechanism to ditch memory and address
space resources as the last resort upon seeing an allocation
failure from the underlying malloc(), which made the code complex
and thread-unsafe with dubious benefit, as major memory resource
users already do limit their uses with various other mechanisms.
It has been simplified away.
* Unnecessary full-tree diff in "git log -L" machinery has been
optimized away.
* The http transport lacked some optimization the native transports
learned to avoid unnecessary ref advertisement, which has been
corrected.
* Preparation for SHA-256 upgrade continues in the test department.
(merge 0c37c41d13 bc/hash-independent-tests-part-5 later to maint).
* The memory ownership model of the "git fast-import" got
straightened out.
* Output from trace2 subsystem is formatted more prettily now.
* The internal code originally invented for ".gitignore" processing
got reshuffled and renamed to make it less tied to "excluding" and
stress more that it is about "matching", as it has been reused for
things like sparse checkout specification that want to check if a
path is "included".
* "git stash" learned to write refreshed index back to disk.
* Coccinelle checks are done on more source files than before now.
* The cache-tree code has been taught to be less aggressive in
attempting to see if a tree object it computed already exists in
the repository.
* The code to parse and use the commit-graph file has been made more
robust against corrupted input.
* The hg-to-git script (in contrib/) has been updated to work with
Python 3.
* Update the way build artifacts in t/helper/ directory are ignored.
* Preparation for SHA-256 upgrade continues.
* "git log --graph" for an octopus merge is sometimes colored
incorrectly, which is demonstrated and documented but not yet
fixed.
* The trace2 output, when sending them to files in a designated
directory, can populate the directory with too many files; a
mechanism is introduced to set the maximum number of files and
discard further logs when the maximum is reached.
* We have adopted a Code-of-conduct document.
(merge 3f9ef874a7 jk/coc later to maint).
Fixes since v2.23
-----------------
* "git grep --recurse-submodules" that looks at the working tree
files looked at the contents in the index in submodules, instead of
files in the working tree.
(merge 6a289d45c0 mt/grep-submodules-working-tree later to maint).
* Codepaths to walk tree objects have been audited for integer
overflows and hardened.
(merge 5aa02f9868 jk/tree-walk-overflow later to maint).
* "git pack-refs" can lose refs that are created while running, which
is getting corrected.
(merge a613d4f817 sc/pack-refs-deletion-racefix later to maint).
* "git checkout" and "git restore" to re-populate the index from a
tree-ish (typically HEAD) did not work correctly for a path that
was removed and then added again with the intent-to-add bit, when
the corresponding working tree file was empty. This has been
corrected.
* Compilation fix.
(merge 70597e8386 rs/nedalloc-fixlets later to maint).
* "git gui" learned to call the clean-up procedure before exiting.
(merge 0d88f3d2c5 py/git-gui-do-quit later to maint).
* We promoted the "indent heuristics" that decides where to split
diff hunks from experimental to the default a few years ago, but
some stale documentation still marked it as experimental, which has
been corrected.
(merge 64e5e1fba1 sg/diff-indent-heuristic-non-experimental later to maint).
* Fix a mismerge that happened in 2.22 timeframe.
(merge acb7da05ac en/checkout-mismerge-fix later to maint).
* "git archive" recorded incorrect length in extended pax header in
some corner cases, which has been corrected.
(merge 71d41ff651 rs/pax-extended-header-length-fix later to maint).
* On-demand object fetching in lazy clone incorrectly tried to fetch
commits from submodule projects, while still working in the
superproject, which has been corrected.
(merge a63694f523 jt/diff-lazy-fetch-submodule-fix later to maint).
* Prepare get_short_oid() codepath to be thread-safe.
(merge 7cfcb16b0e rs/sort-oid-array-thread-safe later to maint).
* "for-each-ref" and friends that show refs did not protect themselves
against ancient tags that did not record tagger names when asked to
show "%(taggername)", which have been corrected.
(merge 8b3f33ef11 mp/for-each-ref-missing-name-or-email later to maint).
* The "git am" based backend of "git rebase" ignored the result of
updating ".gitattributes" done in one step when replaying
subsequent steps.
(merge 2c65d90f75 bc/reread-attributes-during-rebase later to maint).
* Tell cURL library to use the same malloc() implementation, with the
xmalloc() wrapper, as the rest of the system, for consistency.
(merge 93b980e58f cb/curl-use-xmalloc later to maint).
* Build fix to adjust .gitignore to unignore a path that we started to track.
(merge aac6ff7b5b js/visual-studio later to maint).
* A few implementation fixes in the notes API.
(merge 60fe477a0b mh/notes-duplicate-entries later to maint).
* Fix an earlier regression to "git push --all" which should have
been forbidden when the target remote repository is set to be a
mirror.
(merge 8e4c8af058 tg/push-all-in-mirror-forbidden later to maint).
* Fix an earlier regression in the test suite, which mistakenly
stopped running HTTPD tests.
(merge 3960290675 sg/git-test-boolean later to maint).
* "git rebase --autostash <upstream> <branch>", when <branch> is
different from the current branch, incorrectly moved the tip of the
current branch, which has been corrected.
(merge bf1e28e0ad bw/rebase-autostash-keep-current-branch later to maint).
* Update support for Asciidoctor documentation toolchain.
(merge 83b0b8953e ma/asciidoctor-refmiscinfo later to maint).
* Start using DocBook 5 (instead of DocBook 4.5) as Asciidoctor 2.0
no longer works with the older one.
(merge f6461b82b9 bc/doc-use-docbook-5 later to maint).
* The markup used in user-manual has been updated to work better with
asciidoctor.
(merge c4d2f6143a ma/user-manual-markup-update later to maint).
* Make sure the grep machinery does not abort when seeing a payload
that is not UTF-8 even when JIT is not in use with PCRE1.
(merge ad7c543e3b cb/skip-utf8-check-with-pcre1 later to maint).
* The name of the blob object that stores the filter specification
for sparse cloning/fetching was interpreted in a wrong place in the
code, causing Git to abort.
* "git log --decorate-refs-exclude=<pattern>" was incorrectly
overruled when the "--simplify-by-decoration" option is used, which
has been corrected.
(merge 0cc7380d88 rs/simplify-by-deco-with-deco-refs-exclude later to maint).
* The "upload-pack" (the counterpart of "git fetch") needs to disable
commit-graph when responding to a shallow clone/fetch request, but
the way this was done made Git panic, which has been corrected.
* The object traversal machinery has been optimized not to load tree
objects when we are only interested in commit history.
(merge 72ed80c784 jk/list-objects-optim-wo-trees later to maint).
* The object name parser for "Nth parent" syntax has been made more
robust against integer overflows.
(merge 59fa5f5a25 rs/nth-parent-parse later to maint).
* The code used in following tags in "git fetch" has been optimized.
(merge b7e2d8bca5 ms/fetch-follow-tag-optim later to maint).
* Regression fix for progress output.
(merge 2bb74b53a4 sg/progress-fix later to maint).
* A bug in merge-recursive code that triggers when a branch with a
symbolic link is merged with a branch that replaces it with a
directory has been fixed.
(merge 83e3ad3b12 jt/merge-recursive-symlink-is-not-a-dir-in-way later to maint).
* The rename detection logic sorts a list of rename source candidates
by similarity to pick the best candidate, which means that a tie
between sources with the same similarity is broken by the original
location in the original candidate list (which is sorted by path).
Force the sorting by similarity done with a stable sort, which is
not promised by system supplied qsort(3), to ensure consistent
results across platforms.
(merge 2049b8dc65 js/diff-rename-force-stable-sort later to maint).
* The code to skip "UTF" and "UTF-" prefix, when computing an advice
message, did not work correctly when the prefix was "UTF", which
has been fixed.
(merge b181676ce9 rs/convert-fix-utf-without-dash later to maint).
* The author names taken from SVN repositories may have extra leading
or trailing whitespaces, which are now munged away.
(merge 4ddd4bddb1 tk/git-svn-trim-author-name later to maint).
* "git rebase -i" showed a wrong HEAD while "reword" open the editor.
(merge b0a3186140 pw/rebase-i-show-HEAD-to-reword later to maint).
* A few simplification and bugfixes to PCRE interface.
(merge c581e4a749 ab/pcre-jit-fixes later to maint).
* PCRE fixes.
(merge ff61681b46 cb/pcre1-cleanup later to maint).
* "git range-diff" segfaulted when diff.noprefix configuration was
used, as it blindly expected the patch it internally generates to
have the standard a/ and b/ prefixes. The command now forces the
internal patch to be built without any prefix, not to be affected
by any end-user configuration.
(merge 937b76ed49 js/range-diff-noprefix later to maint).
* "git stash apply" in a subdirectory of a secondary worktree failed
to access the worktree correctly, which has been corrected.
(merge dfd557c978 js/stash-apply-in-secondary-worktree later to maint).
* The merge-recursive machinery is one of the most complex parts of
the system that accumulated cruft over time. This large series
cleans up the implementation quite a bit.
(merge b657047719 en/merge-recursive-cleanup later to maint).
* Pretty-printed command line formatter (used in e.g. reporting the
command being run by the tracing API) had a bug that lost an
argument that is an empty string, which has been corrected.
(merge ce2d7ed2fd gs/sq-quote-buf-pretty later to maint).
* "git range-diff" failed to handle mode-only change, which has been
corrected.
(merge 2b6a9b13ca tg/range-diff-output-update later to maint).
* Dev support update.
(merge 4f3c1dc5d6 dl/allow-running-cocci-verbosely later to maint).
* "git format-patch -o <outdir>" did an equivalent of "mkdir <outdir>"
not "mkdir -p <outdir>", which was corrected.
* "git stash save" lost local changes to submodules, which has been
corrected.
(merge 556895d0c8 jj/stash-reset-only-toplevel later to maint).
* The atomic push over smart HTTP transport did not work, which has
been corrected.
(merge 6f1194246a bc/smart-http-atomic-push later to maint).
* Other code cleanup, docfix, build fix, etc.
(merge d1387d3895 en/fast-import-merge-doc later to maint).
(merge 1c24a54ea4 bm/repository-layout-typofix later to maint).
(merge 415b770b88 ds/midx-expire-repack later to maint).
(merge 19800bdc3f nd/diff-parseopt later to maint).
(merge 58166c2e9d tg/t0021-racefix later to maint).
(merge 7027f508c7 dl/compat-cleanup later to maint).
(merge e770fbfeff jc/test-cleanup later to maint).
(merge 1fd881d404 rs/trace2-dst-warning later to maint).
(merge 7e92756751 mh/http-urlmatch-cleanup later to maint).
(merge 9784f97321 mh/release-commit-memory-fix later to maint).
(merge 60d198d022 tb/banned-vsprintf-namefix later to maint).
(merge 80e3658647 rs/help-unknown-ref-does-not-return later to maint).
(merge 0a8bc7068f dt/remote-helper-doc-re-lock-option later to maint).
(merge 27fd1e4ea7 en/merge-options-ff-and-friends later to maint).
(merge 502c386ff9 sg/clean-nested-repo-with-ignored later to maint).
(merge 26e3d1cbea am/mailmap-andrey-mazo later to maint).
(merge 47b27c96fa ss/get-time-cleanup later to maint).
(merge dd2e50a84e jk/commit-graph-cleanup later to maint).
(merge 4fd39c76e6 cs/pretty-formats-doc-typofix later to maint).
(merge 40e747e89d dl/submodule-set-branch later to maint).
(merge 689a146c91 rs/commit-graph-use-list-count later to maint).
(merge 0eb7c37a8a js/doc-patch-text later to maint).
(merge 4b3aa170d1 rs/nth-switch-code-simplification later to maint).
(merge 0d4304c124 ah/doc-submodule-ignore-submodules later to maint).
(merge af78249463 cc/svn-fe-py-shebang later to maint).
(merge 7bd97d6dff rs/alias-use-copy-array later to maint).
(merge c46ebc2496 sg/travis-help-debug later to maint).
(merge 24c681794f ps/my-first-contribution-alphasort later to maint).
(merge 75b2c15435 cb/do-not-use-test-cmp-with-a later to maint).
(merge cda0d497e3 bw/submodule-helper-usage-fix later to maint).
(merge fe0ed5d5e9 am/visual-studio-config-fix later to maint).
(merge 2e09c01232 sg/name-rev-cutoff-underflow-fix later to maint).
(merge ddb3c856f3 as/shallow-slab-use-fix later to maint).
(merge 71f4960b91 js/mingw-spawn-with-spaces-in-path later to maint).
(merge 53d687bf5f ah/cleanups later to maint).
(merge f537485fa5 rs/test-remove-useless-debugging-cat later to maint).
(merge 11a3d3aadd dl/rev-list-doc-cleanup later to maint).
(merge d928a8388a am/t0028-utf16-tests later to maint).
(merge b05b40930e dl/t0000-skip-test-test later to maint).
(merge 03d3b1297c js/xdiffi-comment-updates later to maint).
(merge 57d8f4b4c7 js/doc-stash-save later to maint).
(merge 8c1cfd58e3 ta/t1308-typofix later to maint).
(merge fa364ad790 bb/utf8-wcwidth-cleanup later to maint).
(merge 68b69211b2 bb/compat-util-comment-fix later to maint).
(merge 5cc6a4be11 rs/http-push-simplify later to maint).
(merge a81e42d235 rs/column-use-utf8-strnwidth later to maint).
(merge 062a309d36 rs/remote-curl-use-argv-array later to maint).
(merge 3b3c79f6c9 nr/diff-highlight-indent-fix later to maint).
(merge 3444ec2eb2 wb/fsmonitor-bitmap-fix later to maint).
(merge 10da030ab7 cb/pcre2-chartables-leakfix later to maint).
(merge 60e6569a12 js/mingw-needs-hiding-fix later to maint).
(merge 52bd3e4657 rl/gitweb-blame-prev-fix later to maint).

View File

@ -1,8 +0,0 @@
Git v2.24.1 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6, v2.15.4,
v2.17.3, v2.20.2 and in v2.21.1, addressing the security issues
CVE-2019-1348, CVE-2019-1349, CVE-2019-1350, CVE-2019-1351,
CVE-2019-1352, CVE-2019-1353, CVE-2019-1354, CVE-2019-1387, and
CVE-2019-19604; see the release notes for those versions for details.

View File

@ -1,353 +0,0 @@
Git 2.25 Release Notes
======================
Updates since v2.24
-------------------
Backward compatibility notes
UI, Workflows & Features
* A tutorial on object enumeration has been added.
* The branch description ("git branch --edit-description") has been
used to fill the body of the cover letters by the format-patch
command; this has been enhanced so that the subject can also be
filled.
* "git rebase --preserve-merges" has been marked as deprecated; this
release stops advertising it in the "git rebase -h" output.
* The code to generate multi-pack index learned to show (or not to
show) progress indicators.
* "git apply --3way" learned to honor merge.conflictStyle
configuration variable, like merges would.
* The custom format for "git log --format=<format>" learned the l/L
placeholder that is similar to e/E that fills in the e-mail
address, but only the local part on the left side of '@'.
* Documentation pages for "git shortlog" now list commit limiting
options explicitly.
* The patterns to detect function boundary for Elixir language has
been added.
* The completion script (in contrib/) learned that the "--onto"
option of "git rebase" can take its argument as the value of the
option.
* The userdiff machinery has been taught that "async def" is another
way to begin a "function" in Python.
* "git range-diff" learned to take the "--notes=<ref>" and the
"--no-notes" options to control the commit notes included in the
log message that gets compared.
* "git rev-parse --show-toplevel" run outside of any working tree did
not error out, which has been corrected.
* A few commands learned to take the pathspec from the standard input
or a named file, instead of taking it as the command line
arguments, with the "--pathspec-from-file" option.
* "git rebase -i" learned a few options that are known by "git
rebase" proper.
* "git submodule" learned a subcommand "set-url".
* "git log" family learned "--pretty=reference" that gives the name
of a commit in the format that is often used to refer to it in log
messages.
* The interaction between "git clone --recurse-submodules" and
alternate object store was ill-designed. The documentation and
code have been taught to make more clear recommendations when the
users see failures.
* Management of sparsely checked-out working tree has gained a
dedicated "sparse-checkout" command.
* Miscellaneous small UX improvements on "git-p4".
Performance, Internal Implementation, Development Support etc.
* Debugging support for lazy cloning has been a bit improved.
* Move the definition of a set of bitmask constants from 0ctal
literal to (1U<<count) notation.
* Test updates to prepare for SHA-2 transition continues.
* Crufty code and logic accumulated over time around the object
parsing and low-level object access used in "git fsck" have been
cleaned up.
* The implementation of "git log --graph" got refactored and then its
output got simplified.
* Follow recent push to move API docs from Documentation/ to header
files and update config.h
* "git bundle" has been taught to use the parse options API. "git
bundle verify" learned "--quiet" and "git bundle create" learned
options to control the progress output.
* Handling of commit objects that use non UTF-8 encoding during
"rebase -i" has been improved.
* The beginning of rewriting "git add -i" in C.
* A label used in the todo list that are generated by "git rebase
--rebase-merges" is used as a part of a refname; the logic to come
up with the label has been tightened to avoid names that cannot be
used as such.
* The logic to avoid duplicate label names generated by "git rebase
--rebase-merges" forgot that the machinery itself uses "onto" as a
label name, which must be avoided by auto-generated labels, which
has been corrected.
* We have had compatibility fallback macro definitions for "PRIuMAX",
"PRIu32", etc. but did not for "PRIdMAX", while the code used the
last one apparently without any hiccup reported recently. The
fallback macro definitions for these <inttypes.h> macros that must
appear in C99 systems have been removed.
* Recently we have declared that GIT_TEST_* variables take the
usual boolean values (it used to be that some used "non-empty
means true" and taking GIT_TEST_VAR=YesPlease as true); make
sure we notice and fail when non-bool strings are given to
these variables.
* Users of oneway_merge() (like "reset --hard") learned to take
advantage of fsmonitor to avoid unnecessary lstat(2) calls.
* Performance tweak on "git push" into a repository with many refs
that point at objects we have never heard of.
* PerfTest fix to avoid stale result mixed up with the latest round
of test results.
* Hide lower-level verify_signed-buffer() API as a pure helper to
implement the public check_signature() function, in order to
encourage new callers to use the correct and more strict
validation.
* Unnecessary reading of state variables back from the disk during
sequencer operation has been reduced.
* The code has been made to avoid gmtime() and localtime() and prefer
their reentrant counterparts.
* The effort to reimplement "git add -i" in C continues.
* In a repository with many packfiles, the cost of the procedure that
avoids registering the same packfile twice was unnecessarily high
by using an inefficient search algorithm, which has been corrected.
* Redo "git name-rev" to avoid recursive calls.
* FreeBSD CI support via Cirrus-CI has been added.
Fixes since v2.24
-----------------
* "rebase -i" ceased to run post-commit hook by mistake in an earlier
update, which has been corrected.
* "git notes copy $original" ought to copy the notes attached to the
original object to HEAD, but a mistaken tightening to command line
parameter validation made earlier disabled that feature by mistake.
* When all files from some subdirectory were renamed to the root
directory, the directory rename heuristics would fail to detect that
as a rename/merge of the subdirectory to the root directory, which has
been corrected.
* Code clean-up and a bugfix in the logic used to tell worktree local
and repository global refs apart.
(merge f45f88b2e4 sg/dir-trie-fixes later to maint).
* "git stash save" in a working tree that is sparsely checked out
mistakenly removed paths that are outside the area of interest.
(merge 4a58c3d7f7 js/update-index-ignore-removal-for-skip-worktree later to maint).
* "git rev-parse --git-path HEAD.lock" did not give the right path
when run in a secondary worktree.
(merge 76a53d640f js/git-path-head-dot-lock-fix later to maint).
* "git merge --no-commit" needs "--no-ff" if you do not want to move
HEAD, which has been corrected in the manual page for "git bisect".
(merge 8dd327b246 ma/bisect-doc-sample-update later to maint).
* "git worktree add" internally calls "reset --hard" that should not
descend into submodules, even when submodule.recurse configuration
is set, but it was affected. This has been corrected.
(merge 4782cf2ab6 pb/no-recursive-reset-hard-in-worktree-add later to maint).
* Messages from die() etc. can be mixed up from multiple processes
without even line buffering on Windows, which has been worked
around.
(merge 116d1fa6c6 js/vreportf-wo-buffering later to maint).
* HTTP transport had possible allocator/deallocator mismatch, which
has been corrected.
* The watchman integration for fsmonitor was racy, which has been
corrected to be more conservative.
(merge dd0b61f577 kw/fsmonitor-watchman-fix later to maint).
* Fetching from multiple remotes into the same repository in parallel
had a bad interaction with the recent change to (optionally) update
the commit-graph after a fetch job finishes, as these parallel
fetches compete with each other. Which has been corrected.
* Recent update to "git stash pop" made the command empty the index
when run with the "--quiet" option, which has been corrected.
* "git fetch" codepath had a big "do not lazily fetch missing objects
when I ask if something exists" switch. This has been corrected by
marking the "does this thing exist?" calls with "if not please do not
lazily fetch it" flag.
* Test update to avoid wasted cycles.
(merge e0316695ec sg/skip-skipped-prereq later to maint).
* Error handling after "git push" finishes sending the packdata and
waits for the response to the remote side has been improved.
(merge ad7a403268 jk/send-pack-remote-failure later to maint).
* Some codepaths in "gitweb" that forgot to escape URLs generated
based on end-user input have been corrected.
(merge a376e37b2c jk/gitweb-anti-xss later to maint).
* CI jobs for macOS has been made less chatty when updating perforce
package used during testing.
(merge 0dbc4a0edf jc/azure-ci-osx-fix-fix later to maint).
* "git unpack-objects" used to show progress based only on the number
of received and unpacked objects, which stalled when it has to
handle an unusually large object. It now shows the throughput as
well.
(merge bae60ba7e9 sg/unpack-progress-throughput later to maint).
* The sequencer machinery compared the HEAD and the state it is
attempting to commit to decide if the result would be a no-op
commit, even when amending a commit, which was incorrect, and
has been corrected.
* The code to parse GPG output used to assume incorrectly that the
finterprint for the primary key would always be present for a valid
signature, which has been corrected.
(merge 67a6ea6300 hi/gpg-optional-pkfp-fix later to maint).
* "git submodule status" and "git submodule status --cached" show
different things, but the documentation did not cover them
correctly, which has been corrected.
(merge 8d483c8408 mg/doc-submodule-status-cached later to maint).
* "git reset --patch $object" without any pathspec should allow a
tree object to be given, but incorrectly required a committish,
which has been corrected.
* "git submodule status" that is run from a subdirectory of the
superproject did not work well, which has been corrected.
(merge 1f3aea22c7 mg/submodule-status-from-a-subdirectory later to maint).
* The revision walking machinery uses resources like per-object flag
bits that need to be reset before a new iteration of walking
begins, but the resources related to topological walk were not
cleared correctly, which has been corrected.
(merge 0aa0c2b2ec mh/clear-topo-walk-upon-reset later to maint).
* TravisCI update.
(merge 176441bfb5 sg/osx-force-gcc-9 later to maint).
* While running "revert" or "cherry-pick --edit" for multiple
commits, a recent regression incorrectly detected "nothing to
commit, working tree clean", instead of replaying the commits,
which has been corrected.
(merge befd4f6a81 sg/assume-no-todo-update-in-cherry-pick later to maint).
* Work around a issue where a FD that is left open when spawning a
child process and is kept open in the child can interfere with the
operation in the parent process on Windows.
* One kind of progress messages were always given during commit-graph
generation, instead of following the "if it takes more than two
seconds, show progress" pattern, which has been corrected.
* "git rebase" did not work well when format.useAutoBase
configuration variable is set, which has been corrected.
* The "diff" machinery learned not to lose added/removed blank lines
in the context when --ignore-blank-lines and --function-context are
used at the same time.
(merge 0bb313a552 rs/xdiff-ignore-ws-w-func-context later to maint).
* The test on "fast-import" used to get stuck when "fast-import" died
in the middle.
(merge 0d9b0d7885 sg/t9300-robustify later to maint).
* "git format-patch" can take a set of configured format.notes values
to specify which notes refs to use in the log message part of the
output. The behaviour of this was not consistent with multiple
--notes command line options, which has been corrected.
(merge e0f9095aaa dl/format-patch-notes-config-fixup later to maint).
* "git p4" used to ignore lfs.storage configuration variable, which
has been corrected.
(merge ea94b16fb8 rb/p4-lfs later to maint).
* Assorted fixes to the directory traversal API.
(merge 6836d2fe06 en/fill-directory-fixes later to maint).
* Forbid pathnames that the platform's filesystem cannot represent on
MinGW.
(merge 4dc42c6c18 js/mingw-reserved-filenames later to maint).
* "git rebase --signoff" stopped working when the command was written
in C, which has been corrected.
(merge 4fe7e43c53 en/rebase-signoff-fix later to maint).
* Other code cleanup, docfix, build fix, etc.
(merge 80736d7c5e jc/am-show-current-patch-docfix later to maint).
(merge 8b656572ca sg/commit-graph-usage-fix later to maint).
(merge 6c02042139 mr/clone-dir-exists-to-path-exists later to maint).
(merge 44ae131e38 sg/blame-indent-heuristics-is-now-the-default later to maint).
(merge 0115e5d929 dl/doc-diff-no-index-implies-exit-code later to maint).
(merge 270de6acbe en/t6024-style later to maint).
(merge 14c4776d75 ns/test-desc-typofix later to maint).
(merge 68d40f30c4 dj/typofix-merge-strat later to maint).
(merge f66e0401ab jk/optim-in-pack-idx-conversion later to maint).
(merge 169bed7421 rs/parse-options-dup-null-fix later to maint).
(merge 51bd6be32d rs/use-copy-array-in-mingw-shell-command-preparation later to maint).
(merge b018719927 ma/t7004 later to maint).
(merge 932757b0cc ar/install-doc-update-cmds-needing-the-shell later to maint).
(merge 46efd28be1 ep/guard-kset-tar-headers later to maint).
(merge 9e5afdf997 ec/fetch-mark-common-refs-trace2 later to maint).
(merge f0e58b3fe8 pb/submodule-update-fetches later to maint).
(merge 2a02262078 dl/t5520-cleanup later to maint).
(merge a4fb016ba1 js/pkt-line-h-typofix later to maint).
(merge 54a7a64613 rs/simplify-prepare-cmd later to maint).
(merge 3eae30e464 jk/lore-is-the-archive later to maint).
(merge 14b7664df8 dl/lore-is-the-archive later to maint).
(merge 0e40a73a4c po/bundle-doc-clonable later to maint).
(merge e714b898c6 as/t7812-missing-redirects-fix later to maint).
(merge 528d9e6d01 jk/perf-wo-git-dot-pm later to maint).
(merge fc42f20e24 sg/test-squelch-noise-in-commit-bulk later to maint).
(merge c64368e3a2 bc/t9001-zsh-in-posix-emulation-mode later to maint).
(merge 11de8dd7ef dr/branch-usage-casefix later to maint).
(merge e05e8cf074 rs/archive-zip-code-cleanup later to maint).
(merge 147ee35558 rs/commit-export-env-simplify later to maint).
(merge 4507ecc771 rs/patch-id-use-oid-to-hex later to maint).
(merge 51a0a4ed95 mr/bisect-use-after-free later to maint).
(merge cc2bd5c45d pb/submodule-doc-xref later to maint).
(merge df5be01669 ja/doc-markup-cleanup later to maint).
(merge 7c5cea7242 mr/bisect-save-pointer-to-const-string later to maint).
(merge 20a67e8ce9 js/use-test-tool-on-path later to maint).

View File

@ -12,7 +12,7 @@ Fixes since v2.3.2
* Description given by "grep -h" for its --exclude-standard option
was phrased poorly.
* Documentation for "git remote add" mentioned "--tags" and
* Documentaton for "git remote add" mentioned "--tags" and
"--no-tags" and it was not clear that fetch from the remote in
the future will use the default behaviour when neither is given
to override it.

View File

@ -4,7 +4,7 @@ Git v2.3.7 Release Notes
Fixes since v2.3.6
------------------
* An earlier update to the parser that dissects a URL broke an
* An earlier update to the parser that disects a URL broke an
address, followed by a colon, followed by an empty string (instead
of the port number), e.g. ssh://example.com:/path/to/repo.

View File

@ -66,7 +66,7 @@ Fixes since v2.4.3
* Some time ago, "git blame" (incorrectly) lost the convert_to_git()
call when synthesizing a fake "tip" commit that represents the
state in the working tree, which broke folks who record the history
with LF line ending to make their project portable across
with LF line ending to make their project portabile across
platforms while terminating lines in their working tree files with
CRLF for their platform.

View File

@ -172,8 +172,7 @@ Performance, Internal Implementation, Development Support etc.
incorrect patch text to "git apply". Add tests to demonstrate
this.
I have a slight suspicion that this may be
cf. <7vtzf77wjp.fsf@gitster.siamese.dyndns.org> coming back
I have a slight suspicion that this may be $gmane/87202 coming back
and biting us (I seem to have said "let's run with this and see
what happens" back then).

View File

@ -40,7 +40,7 @@ UI, Workflows & Features
* "git interpret-trailers" can now run outside of a Git repository.
* "git p4" learned to re-encode the pathname it uses to communicate
* "git p4" learned to reencode the pathname it uses to communicate
with the p4 depot with a new option.
* Give progress meter to "git filter-branch".

View File

@ -10,7 +10,7 @@ Fixes since v2.7
setting GIT_WORK_TREE environment themselves.
* The "exclude_list" structure has the usual "alloc, nr" pair of
fields to be used by ALLOC_GROW(), but clear_pattern_list() forgot
fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
array.

View File

@ -20,7 +20,7 @@ Fixes since v2.7.2
tests.
* "git show 'HEAD:Foo[BAR]Baz'" did not interpret the argument as a
rev, i.e. the object named by the pathname with wildcard
rev, i.e. the object named by the the pathname with wildcard
characters in a tree object.
* "git rev-parse --git-common-dir" used in the worktree feature

View File

@ -189,7 +189,7 @@ Performance, Internal Implementation, Development Support etc.
* Some calls to strcpy(3) triggers a false warning from static
analyzers that are less intelligent than humans, and reducing the
number of these false hits helps us notice real issues. A few
calls to strcpy(3) in a couple of programs that are already safe
calls to strcpy(3) in a couple of protrams that are already safe
has been rewritten to avoid false warnings.
* The "name_path" API was an attempt to reduce the need to construct
@ -270,7 +270,7 @@ notes for details).
setting GIT_WORK_TREE environment themselves.
* The "exclude_list" structure has the usual "alloc, nr" pair of
fields to be used by ALLOC_GROW(), but clear_pattern_list() forgot
fields to be used by ALLOC_GROW(), but clear_exclude_list() forgot
to reset 'alloc' to 0 when it cleared 'nr' to discard the managed
array.

View File

@ -55,8 +55,8 @@ Fixes since v2.8.2
This is necessary to use Git on Windows shared directories, and is
already enabled for the MinGW and plain Windows builds. It also
has been used in Cygwin packaged versions of Git for quite a while.
See https://lore.kernel.org/git/20160419091055.GF2345@dinwoodie.org/
and https://lore.kernel.org/git/20150811100527.GW14466@dinwoodie.org/.
See http://thread.gmane.org/gmane.comp.version-control.git/291853
and http://thread.gmane.org/gmane.comp.version-control.git/275680.
* "git replace -e" did not honour "core.editor" configuration.

View File

@ -368,7 +368,7 @@ notes for details).
This is necessary to use Git on Windows shared directories, and is
already enabled for the MinGW and plain Windows builds. It also
has been used in Cygwin packaged versions of Git for quite a while.
See https://lore.kernel.org/git/20160419091055.GF2345@dinwoodie.org/
See http://thread.gmane.org/gmane.comp.version-control.git/291853
* "merge-octopus" strategy did not ensure that the index is clean
when merge begins.

View File

@ -36,7 +36,7 @@ Fixes since v2.9.2
* One part of "git am" had an oddball helper function that called
stuff from outside "his" as opposed to calling what we have "ours",
which was not gender-neutral and also inconsistent with the rest of
the system where outside stuff is usually called "theirs" in
the system where outside stuff is usuall called "theirs" in
contrast to "ours".
* The test framework learned a new helper test_match_signal to

View File

@ -80,9 +80,7 @@ GitHub-Travis CI hints section for details.
Do not forget to update the documentation to describe the updated
behavior and make sure that the resulting documentation set formats
well (try the Documentation/doc-diff script).
We currently have a liberal mixture of US and UK English norms for
well. It is currently a liberal mixture of US and UK English norms for
spelling and grammar, which is somewhat unfortunate. A huge patch that
touches the files all over the place only to correct the inconsistency
is not welcome, though. Potential clashes with other changes that can
@ -142,25 +140,19 @@ archive, summarize the relevant points of the discussion.
[[commit-reference]]
If you want to reference a previous commit in the history of a stable
branch, use the format "abbreviated hash (subject, date)", like this:
branch, use the format "abbreviated sha1 (subject, date)",
with the subject enclosed in a pair of double-quotes, like this:
....
Commit f86a374 (pack-bitmap.c: fix a memleak, 2015-03-30)
Commit f86a374 ("pack-bitmap.c: fix a memleak", 2015-03-30)
noticed that ...
....
The "Copy commit summary" command of gitk can be used to obtain this
format (with the subject enclosed in a pair of double-quotes), or this
invocation of `git show`:
format, or this invocation of `git show`:
....
git show -s --pretty=reference <commit>
....
or, on an older version of Git without support for --pretty=reference:
....
git show -s --date=short --pretty='format:%h (%s, %ad)' <commit>
git show -s --date=short --pretty='format:%h ("%s", %ad)' <commit>
....
[[git-tools]]
@ -378,15 +370,15 @@ such as "Thanks-to:", "Based-on-patch-by:", or "Mentored-by:".
Some parts of the system have dedicated maintainers with their own
repositories.
- `git-gui/` comes from git-gui project, maintained by Pratyush Yadav:
- 'git-gui/' comes from git-gui project, maintained by Pat Thoyts:
https://github.com/prati0100/git-gui.git
git://repo.or.cz/git-gui.git
- `gitk-git/` comes from Paul Mackerras's gitk project:
- 'gitk-git/' comes from Paul Mackerras's gitk project:
git://ozlabs.org/~paulus/gitk
- `po/` comes from the localization coordinator, Jiang Xin:
- 'po/' comes from the localization coordinator, Jiang Xin:
https://github.com/git-l10n/git-po/

View File

@ -78,9 +78,9 @@ template::[header-declarations]
<refmeta>
<refentrytitle>{mantitle}</refentrytitle>
<manvolnum>{manvolnum}</manvolnum>
<refmiscinfo class="source">{mansource}</refmiscinfo>
<refmiscinfo class="version">{manversion}</refmiscinfo>
<refmiscinfo class="manual">{manmanual}</refmiscinfo>
<refmiscinfo class="source">Git</refmiscinfo>
<refmiscinfo class="version">{git_version}</refmiscinfo>
<refmiscinfo class="manual">Git Manual</refmiscinfo>
</refmeta>
<refnamediv>
<refname>{manname}</refname>

View File

@ -9,40 +9,20 @@ module Git
named :chrome
def process(parent, target, attrs)
prefix = parent.document.attr('git-relative-html-prefix')
if parent.document.doctype == 'book'
"<ulink url=\"#{prefix}#{target}.html\">" \
"#{target}(#{attrs[1]})</ulink>"
elsif parent.document.basebackend? 'html'
%(<a href="#{prefix}#{target}.html">#{target}(#{attrs[1]})</a>)
if parent.document.basebackend? 'html'
prefix = parent.document.attr('git-relative-html-prefix')
%(<a href="#{prefix}#{target}.html">#{target}(#{attrs[1]})</a>\n)
elsif parent.document.basebackend? 'docbook'
"<citerefentry>\n" \
"<refentrytitle>#{target}</refentrytitle>" \
"<manvolnum>#{attrs[1]}</manvolnum>\n" \
"</citerefentry>"
"</citerefentry>\n"
end
end
end
class DocumentPostProcessor < Asciidoctor::Extensions::Postprocessor
def process document, output
if document.basebackend? 'docbook'
mansource = document.attributes['mansource']
manversion = document.attributes['manversion']
manmanual = document.attributes['manmanual']
new_tags = "" \
"<refmiscinfo class=\"source\">#{mansource}</refmiscinfo>\n" \
"<refmiscinfo class=\"version\">#{manversion}</refmiscinfo>\n" \
"<refmiscinfo class=\"manual\">#{manmanual}</refmiscinfo>\n"
output = output.sub(/<\/refmeta>/, new_tags + "</refmeta>")
end
output
end
end
end
end
Asciidoctor::Extensions.register do
inline_macro Git::Documentation::LinkGitProcessor, :linkgit
postprocessor Git::Documentation::DocumentPostProcessor
end

View File

@ -110,24 +110,5 @@ commit. And the default value is 40. If there are more than one
`-C` options given, the <num> argument of the last `-C` will
take effect.
--ignore-rev <rev>::
Ignore changes made by the revision when assigning blame, as if the
change never happened. Lines that were changed or added by an ignored
commit will be blamed on the previous commit that changed that line or
nearby lines. This option may be specified multiple times to ignore
more than one revision. If the `blame.markIgnoredLines` config option
is set, then lines that were changed by an ignored commit and attributed to
another commit will be marked with a `?` in the blame output. If the
`blame.markUnblamableLines` config option is set, then those lines touched
by an ignored commit that we could not attribute to another revision are
marked with a '*'.
--ignore-revs-file <file>::
Ignore revisions listed in `file`, which must be in the same format as an
`fsck.skipList`. This option may be repeated, and these files will be
processed after any files specified with the `blame.ignoreRevsFile` config
option. An empty file name, `""`, will clear the list of revs from
previously processed files.
-h::
Show help message.

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +0,0 @@
add.ignoreErrors::
add.ignore-errors (deprecated)::
Tells 'git add' to continue adding files when some files cannot be
added due to indexing errors. Equivalent to the `--ignore-errors`
option of linkgit:git-add[1]. `add.ignore-errors` is deprecated,
as it does not follow the usual naming convention for configuration
variables.
add.interactive.useBuiltin::
[EXPERIMENTAL] Set to `true` to use the experimental built-in
implementation of the interactive version of linkgit:git-add[1]
instead of the Perl script version. Is `false` by default.

View File

@ -1,113 +0,0 @@
advice.*::
These variables control various optional help messages designed to
aid new users. All 'advice.*' variables default to 'true', and you
can tell Git that you do not need help by setting these to 'false':
+
--
fetchShowForcedUpdates::
Advice shown when linkgit:git-fetch[1] takes a long time
to calculate forced updates after ref updates, or to warn
that the check is disabled.
pushUpdateRejected::
Set this variable to 'false' if you want to disable
'pushNonFFCurrent',
'pushNonFFMatching', 'pushAlreadyExists',
'pushFetchFirst', and 'pushNeedsForce'
simultaneously.
pushNonFFCurrent::
Advice shown when linkgit:git-push[1] fails due to a
non-fast-forward update to the current branch.
pushNonFFMatching::
Advice shown when you ran linkgit:git-push[1] and pushed
'matching refs' explicitly (i.e. you used ':', or
specified a refspec that isn't your current branch) and
it resulted in a non-fast-forward error.
pushAlreadyExists::
Shown when linkgit:git-push[1] rejects an update that
does not qualify for fast-forwarding (e.g., a tag.)
pushFetchFirst::
Shown when linkgit:git-push[1] rejects an update that
tries to overwrite a remote ref that points at an
object we do not have.
pushNeedsForce::
Shown when linkgit:git-push[1] rejects an update that
tries to overwrite a remote ref that points at an
object that is not a commit-ish, or make the remote
ref point at an object that is not a commit-ish.
pushUnqualifiedRefname::
Shown when linkgit:git-push[1] gives up trying to
guess based on the source and destination refs what
remote ref namespace the source belongs in, but where
we can still suggest that the user push to either
refs/heads/* or refs/tags/* based on the type of the
source object.
statusAheadBehind::
Shown when linkgit:git-status[1] computes the ahead/behind
counts for a local ref compared to its remote tracking ref,
and that calculation takes longer than expected. Will not
appear if `status.aheadBehind` is false or the option
`--no-ahead-behind` is given.
statusHints::
Show directions on how to proceed from the current
state in the output of linkgit:git-status[1], in
the template shown when writing commit messages in
linkgit:git-commit[1], and in the help message shown
by linkgit:git-switch[1] or
linkgit:git-checkout[1] when switching branch.
statusUoption::
Advise to consider using the `-u` option to linkgit:git-status[1]
when the command takes more than 2 seconds to enumerate untracked
files.
commitBeforeMerge::
Advice shown when linkgit:git-merge[1] refuses to
merge to avoid overwriting local changes.
resetQuiet::
Advice to consider using the `--quiet` option to linkgit:git-reset[1]
when the command takes more than 2 seconds to enumerate unstaged
changes after reset.
resolveConflict::
Advice shown by various commands when conflicts
prevent the operation from being performed.
sequencerInUse::
Advice shown when a sequencer command is already in progress.
implicitIdentity::
Advice on how to set your identity configuration when
your information is guessed from the system username and
domain name.
detachedHead::
Advice shown when you used
linkgit:git-switch[1] or linkgit:git-checkout[1]
to move to the detach HEAD state, to instruct how to
create a local branch after the fact.
checkoutAmbiguousRemoteBranchName::
Advice shown when the argument to
linkgit:git-checkout[1] and linkgit:git-switch[1]
ambiguously resolves to a
remote tracking branch on more than one remote in
situations where an unambiguous argument would have
otherwise caused a remote-tracking branch to be
checked out. See the `checkout.defaultRemote`
configuration variable for how to set a given remote
to used by default in some situations where this
advice would be printed.
amWorkDir::
Advice that shows the location of the patch file when
linkgit:git-am[1] fails to apply it.
rmHints::
In case of failure in the output of linkgit:git-rm[1],
show directions on how to proceed from the current state.
addEmbeddedRepo::
Advice on what to do when you've accidentally added one
git repo inside of another.
ignoredHook::
Advice shown if a hook is ignored because the hook is not
set as executable.
waitingForEditor::
Print a message to the terminal whenever Git is waiting for
editor input from the user.
nestedTag::
Advice shown if a user attempts to recursively tag a tag object.
submoduleAlternateErrorStrategyDie:
Advice shown when a submodule.alternateErrorStrategy option
configured to "die" causes a fatal error.
--

View File

@ -1,28 +0,0 @@
alias.*::
Command aliases for the linkgit:git[1] command wrapper - e.g.
after defining `alias.last = cat-file commit HEAD`, the invocation
`git last` is equivalent to `git cat-file commit HEAD`. To avoid
confusion and troubles with script usage, aliases that
hide existing Git commands are ignored. Arguments are split by
spaces, the usual shell quoting and escaping is supported.
A quote pair or a backslash can be used to quote them.
+
Note that the first word of an alias does not necessarily have to be a
command. It can be a command-line option that will be passed into the
invocation of `git`. In particular, this is useful when used with `-c`
to pass in one-time configurations or `-p` to force pagination. For example,
`loud-rebase = -c commit.verbose=true rebase` can be defined such that
running `git loud-rebase` would be equivalent to
`git -c commit.verbose=true rebase`. Also, `ps = -p status` would be a
helpful alias since `git ps` would paginate the output of `git status`
where the original command does not.
+
If the alias expansion is prefixed with an exclamation point,
it will be treated as a shell command. For example, defining
`alias.new = !gitk --all --not ORIG_HEAD`, the invocation
`git new` is equivalent to running the shell command
`gitk --all --not ORIG_HEAD`. Note that shell commands will be
executed from the top-level directory of a repository, which may
not necessarily be the current directory.
`GIT_PREFIX` is set as returned by running `git rev-parse --show-prefix`
from the original current directory. See linkgit:git-rev-parse[1].

View File

@ -1,14 +0,0 @@
am.keepcr::
If true, git-am will call git-mailsplit for patches in mbox format
with parameter `--keep-cr`. In this case git-mailsplit will
not remove `\r` from lines ending with `\r\n`. Can be overridden
by giving `--no-keep-cr` from the command line.
See linkgit:git-am[1], linkgit:git-mailsplit[1].
am.threeWay::
By default, `git am` will fail if the patch does not apply cleanly. When
set to true, this setting tells `git am` to fall back on 3-way merge if
the patch records the identity of blobs it is supposed to apply to and
we have those blobs available locally (equivalent to giving the `--3way`
option from the command line). Defaults to `false`.
See linkgit:git-am[1].

View File

@ -1,11 +0,0 @@
apply.ignoreWhitespace::
When set to 'change', tells 'git apply' to ignore changes in
whitespace, in the same way as the `--ignore-space-change`
option.
When set to one of: no, none, never, false tells 'git apply' to
respect all whitespace differences.
See linkgit:git-apply[1].
apply.whitespace::
Tells 'git apply' how to handle whitespaces, in the same way
as the `--whitespace` option. See linkgit:git-apply[1].

View File

@ -1,37 +0,0 @@
blame.blankBoundary::
Show blank commit object name for boundary commits in
linkgit:git-blame[1]. This option defaults to false.
blame.coloring::
This determines the coloring scheme to be applied to blame
output. It can be 'repeatedLines', 'highlightRecent',
or 'none' which is the default.
blame.date::
Specifies the format used to output dates in linkgit:git-blame[1].
If unset the iso format is used. For supported values,
see the discussion of the `--date` option at linkgit:git-log[1].
blame.showEmail::
Show the author email instead of author name in linkgit:git-blame[1].
This option defaults to false.
blame.showRoot::
Do not treat root commits as boundaries in linkgit:git-blame[1].
This option defaults to false.
blame.ignoreRevsFile::
Ignore revisions listed in the file, one unabbreviated object name per
line, in linkgit:git-blame[1]. Whitespace and comments beginning with
`#` are ignored. This option may be repeated multiple times. Empty
file names will reset the list of ignored revisions. This option will
be handled before the command line option `--ignore-revs-file`.
blame.markUnblamables::
Mark lines that were changed by an ignored revision that we could not
attribute to another commit with a '*' in the output of
linkgit:git-blame[1].
blame.markIgnoredLines::
Mark lines that were changed by an ignored revision that we attributed to
another commit with a '?' in the output of linkgit:git-blame[1].

View File

@ -1,102 +0,0 @@
branch.autoSetupMerge::
Tells 'git branch', 'git switch' and 'git checkout' to set up new branches
so that linkgit:git-pull[1] will appropriately merge from the
starting point branch. Note that even if this option is not set,
this behavior can be chosen per-branch using the `--track`
and `--no-track` options. The valid settings are: `false` -- no
automatic setup is done; `true` -- automatic setup is done when the
starting point is a remote-tracking branch; `always` --
automatic setup is done when the starting point is either a
local branch or remote-tracking
branch. This option defaults to true.
branch.autoSetupRebase::
When a new branch is created with 'git branch', 'git switch' or 'git checkout'
that tracks another branch, this variable tells Git to set
up pull to rebase instead of merge (see "branch.<name>.rebase").
When `never`, rebase is never automatically set to true.
When `local`, rebase is set to true for tracked branches of
other local branches.
When `remote`, rebase is set to true for tracked branches of
remote-tracking branches.
When `always`, rebase will be set to true for all tracking
branches.
See "branch.autoSetupMerge" for details on how to set up a
branch to track another branch.
This option defaults to never.
branch.sort::
This variable controls the sort ordering of branches when displayed by
linkgit:git-branch[1]. Without the "--sort=<value>" option provided, the
value of this variable will be used as the default.
See linkgit:git-for-each-ref[1] field names for valid values.
branch.<name>.remote::
When on branch <name>, it tells 'git fetch' and 'git push'
which remote to fetch from/push to. The remote to push to
may be overridden with `remote.pushDefault` (for all branches).
The remote to push to, for the current branch, may be further
overridden by `branch.<name>.pushRemote`. If no remote is
configured, or if you are not on any branch, it defaults to
`origin` for fetching and `remote.pushDefault` for pushing.
Additionally, `.` (a period) is the current local repository
(a dot-repository), see `branch.<name>.merge`'s final note below.
branch.<name>.pushRemote::
When on branch <name>, it overrides `branch.<name>.remote` for
pushing. It also overrides `remote.pushDefault` for pushing
from branch <name>. When you pull from one place (e.g. your
upstream) and push to another place (e.g. your own publishing
repository), you would want to set `remote.pushDefault` to
specify the remote to push to for all branches, and use this
option to override it for a specific branch.
branch.<name>.merge::
Defines, together with branch.<name>.remote, the upstream branch
for the given branch. It tells 'git fetch'/'git pull'/'git rebase' which
branch to merge and can also affect 'git push' (see push.default).
When in branch <name>, it tells 'git fetch' the default
refspec to be marked for merging in FETCH_HEAD. The value is
handled like the remote part of a refspec, and must match a
ref which is fetched from the remote given by
"branch.<name>.remote".
The merge information is used by 'git pull' (which at first calls
'git fetch') to lookup the default branch for merging. Without
this option, 'git pull' defaults to merge the first refspec fetched.
Specify multiple values to get an octopus merge.
If you wish to setup 'git pull' so that it merges into <name> from
another branch in the local repository, you can point
branch.<name>.merge to the desired branch, and use the relative path
setting `.` (a period) for branch.<name>.remote.
branch.<name>.mergeOptions::
Sets default options for merging into branch <name>. The syntax and
supported options are the same as those of linkgit:git-merge[1], but
option values containing whitespace characters are currently not
supported.
branch.<name>.rebase::
When true, rebase the branch <name> on top of the fetched branch,
instead of merging the default branch from the default remote when
"git pull" is run. See "pull.rebase" for doing this in a non
branch-specific manner.
+
When `merges`, pass the `--rebase-merges` option to 'git rebase'
so that the local merge commits are included in the rebase (see
linkgit:git-rebase[1] for details).
+
When `preserve` (deprecated in favor of `merges`), also pass
`--preserve-merges` along to 'git rebase' so that locally committed merge
commits will not be flattened by running 'git pull'.
+
When the value is `interactive`, the rebase is run in interactive mode.
+
*NOTE*: this is a possibly dangerous operation; do *not* use
it unless you understand the implications (see linkgit:git-rebase[1]
for details).
branch.<name>.description::
Branch description, can be edited with
`git branch --edit-description`. Branch description is
automatically added in the format-patch cover letter or
request-pull summary.

View File

@ -1,9 +0,0 @@
browser.<tool>.cmd::
Specify the command to invoke the specified browser. The
specified command is evaluated in shell with the URLs passed
as arguments. (See linkgit:git-web{litdd}browse[1].)
browser.<tool>.path::
Override the path for the given tool that may be used to
browse HTML help (see `-w` option in linkgit:git-help[1]) or a
working repository in gitweb (see linkgit:git-instaweb[1]).

View File

@ -1,18 +0,0 @@
checkout.defaultRemote::
When you run 'git checkout <something>'
or 'git switch <something>' and only have one
remote, it may implicitly fall back on checking out and
tracking e.g. 'origin/<something>'. This stops working as soon
as you have more than one remote with a '<something>'
reference. This setting allows for setting the name of a
preferred remote that should always win when it comes to
disambiguation. The typical use-case is to set this to
`origin`.
+
Currently this is used by linkgit:git-switch[1] and
linkgit:git-checkout[1] when 'git checkout <something>'
or 'git switch <something>'
will checkout the '<something>' branch on another remote,
and by linkgit:git-worktree[1] when 'git worktree add' refers to a
remote branch. This setting might be used for other checkout-like
commands or functionality in the future.

View File

@ -1,3 +0,0 @@
clean.requireForce::
A boolean to make git-clean do nothing unless given -f,
-i or -n. Defaults to true.

View File

@ -1,201 +0,0 @@
color.advice::
A boolean to enable/disable color in hints (e.g. when a push
failed, see `advice.*` for a list). May be set to `always`,
`false` (or `never`) or `auto` (or `true`), in which case colors
are used only when the error output goes to a terminal. If
unset, then the value of `color.ui` is used (`auto` by default).
color.advice.hint::
Use customized color for hints.
color.blame.highlightRecent::
This can be used to color the metadata of a blame line depending
on age of the line.
+
This setting should be set to a comma-separated list of color and date settings,
starting and ending with a color, the dates should be set from oldest to newest.
The metadata will be colored given the colors if the line was introduced
before the given timestamp, overwriting older timestamped colors.
+
Instead of an absolute timestamp relative timestamps work as well, e.g.
2.weeks.ago is valid to address anything older than 2 weeks.
+
It defaults to 'blue,12 month ago,white,1 month ago,red', which colors
everything older than one year blue, recent changes between one month and
one year old are kept white, and lines introduced within the last month are
colored red.
color.blame.repeatedLines::
Use the customized color for the part of git-blame output that
is repeated meta information per line (such as commit id,
author name, date and timezone). Defaults to cyan.
color.branch::
A boolean to enable/disable color in the output of
linkgit:git-branch[1]. May be set to `always`,
`false` (or `never`) or `auto` (or `true`), in which case colors are used
only when the output is to a terminal. If unset, then the
value of `color.ui` is used (`auto` by default).
color.branch.<slot>::
Use customized color for branch coloration. `<slot>` is one of
`current` (the current branch), `local` (a local branch),
`remote` (a remote-tracking branch in refs/remotes/),
`upstream` (upstream tracking branch), `plain` (other
refs).
color.diff::
Whether to use ANSI escape sequences to add color to patches.
If this is set to `always`, linkgit:git-diff[1],
linkgit:git-log[1], and linkgit:git-show[1] will use color
for all patches. If it is set to `true` or `auto`, those
commands will only use color when output is to the terminal.
If unset, then the value of `color.ui` is used (`auto` by
default).
+
This does not affect linkgit:git-format-patch[1] or the
'git-diff-{asterisk}' plumbing commands. Can be overridden on the
command line with the `--color[=<when>]` option.
color.diff.<slot>::
Use customized color for diff colorization. `<slot>` specifies
which part of the patch to use the specified color, and is one
of `context` (context text - `plain` is a historical synonym),
`meta` (metainformation), `frag`
(hunk header), 'func' (function in hunk header), `old` (removed lines),
`new` (added lines), `commit` (commit headers), `whitespace`
(highlighting whitespace errors), `oldMoved` (deleted lines),
`newMoved` (added lines), `oldMovedDimmed`, `oldMovedAlternative`,
`oldMovedAlternativeDimmed`, `newMovedDimmed`, `newMovedAlternative`
`newMovedAlternativeDimmed` (See the '<mode>'
setting of '--color-moved' in linkgit:git-diff[1] for details),
`contextDimmed`, `oldDimmed`, `newDimmed`, `contextBold`,
`oldBold`, and `newBold` (see linkgit:git-range-diff[1] for details).
color.decorate.<slot>::
Use customized color for 'git log --decorate' output. `<slot>` is one
of `branch`, `remoteBranch`, `tag`, `stash` or `HEAD` for local
branches, remote-tracking branches, tags, stash and HEAD, respectively
and `grafted` for grafted commits.
color.grep::
When set to `always`, always highlight matches. When `false` (or
`never`), never. When set to `true` or `auto`, use color only
when the output is written to the terminal. If unset, then the
value of `color.ui` is used (`auto` by default).
color.grep.<slot>::
Use customized color for grep colorization. `<slot>` specifies which
part of the line to use the specified color, and is one of
+
--
`context`;;
non-matching text in context lines (when using `-A`, `-B`, or `-C`)
`filename`;;
filename prefix (when not using `-h`)
`function`;;
function name lines (when using `-p`)
`lineNumber`;;
line number prefix (when using `-n`)
`column`;;
column number prefix (when using `--column`)
`match`;;
matching text (same as setting `matchContext` and `matchSelected`)
`matchContext`;;
matching text in context lines
`matchSelected`;;
matching text in selected lines
`selected`;;
non-matching text in selected lines
`separator`;;
separators between fields on a line (`:`, `-`, and `=`)
and between hunks (`--`)
--
color.interactive::
When set to `always`, always use colors for interactive prompts
and displays (such as those used by "git-add --interactive" and
"git-clean --interactive"). When false (or `never`), never.
When set to `true` or `auto`, use colors only when the output is
to the terminal. If unset, then the value of `color.ui` is
used (`auto` by default).
color.interactive.<slot>::
Use customized color for 'git add --interactive' and 'git clean
--interactive' output. `<slot>` may be `prompt`, `header`, `help`
or `error`, for four distinct types of normal output from
interactive commands.
color.pager::
A boolean to enable/disable colored output when the pager is in
use (default is true).
color.push::
A boolean to enable/disable color in push errors. May be set to
`always`, `false` (or `never`) or `auto` (or `true`), in which
case colors are used only when the error output goes to a terminal.
If unset, then the value of `color.ui` is used (`auto` by default).
color.push.error::
Use customized color for push errors.
color.remote::
If set, keywords at the start of the line are highlighted. The
keywords are "error", "warning", "hint" and "success", and are
matched case-insensitively. May be set to `always`, `false` (or
`never`) or `auto` (or `true`). If unset, then the value of
`color.ui` is used (`auto` by default).
color.remote.<slot>::
Use customized color for each remote keyword. `<slot>` may be
`hint`, `warning`, `success` or `error` which match the
corresponding keyword.
color.showBranch::
A boolean to enable/disable color in the output of
linkgit:git-show-branch[1]. May be set to `always`,
`false` (or `never`) or `auto` (or `true`), in which case colors are used
only when the output is to a terminal. If unset, then the
value of `color.ui` is used (`auto` by default).
color.status::
A boolean to enable/disable color in the output of
linkgit:git-status[1]. May be set to `always`,
`false` (or `never`) or `auto` (or `true`), in which case colors are used
only when the output is to a terminal. If unset, then the
value of `color.ui` is used (`auto` by default).
color.status.<slot>::
Use customized color for status colorization. `<slot>` is
one of `header` (the header text of the status message),
`added` or `updated` (files which are added but not committed),
`changed` (files which are changed but not added in the index),
`untracked` (files which are not tracked by Git),
`branch` (the current branch),
`nobranch` (the color the 'no branch' warning is shown in, defaulting
to red),
`localBranch` or `remoteBranch` (the local and remote branch names,
respectively, when branch and tracking information is displayed in the
status short-format), or
`unmerged` (files which have unmerged changes).
color.transport::
A boolean to enable/disable color when pushes are rejected. May be
set to `always`, `false` (or `never`) or `auto` (or `true`), in which
case colors are used only when the error output goes to a terminal.
If unset, then the value of `color.ui` is used (`auto` by default).
color.transport.rejected::
Use customized color when a push was rejected.
color.ui::
This variable determines the default value for variables such
as `color.diff` and `color.grep` that control the use of color
per command family. Its scope will expand as more commands learn
configuration to set a default for the `--color` option. Set it
to `false` or `never` if you prefer Git commands not to use
color unless enabled explicitly with some other configuration
or the `--color` option. Set it to `always` if you want all
output not intended for machine consumption to use color, to
`true` or `auto` (this is the default since Git 1.8.4) if you
want such output to use color when written to the terminal.

View File

@ -1,55 +0,0 @@
column.ui::
Specify whether supported commands should output in columns.
This variable consists of a list of tokens separated by spaces
or commas:
+
These options control when the feature should be enabled
(defaults to 'never'):
+
--
`always`;;
always show in columns
`never`;;
never show in columns
`auto`;;
show in columns if the output is to the terminal
--
+
These options control layout (defaults to 'column'). Setting any
of these implies 'always' if none of 'always', 'never', or 'auto' are
specified.
+
--
`column`;;
fill columns before rows
`row`;;
fill rows before columns
`plain`;;
show in one column
--
+
Finally, these options can be combined with a layout option (defaults
to 'nodense'):
+
--
`dense`;;
make unequal size columns to utilize more space
`nodense`;;
make equal size columns
--
column.branch::
Specify whether to output branch listing in `git branch` in columns.
See `column.ui` for details.
column.clean::
Specify the layout when list items in `git clean -i`, which always
shows files and directories in columns. See `column.ui` for details.
column.status::
Specify whether to output untracked files in `git status` in columns.
See `column.ui` for details.
column.tag::
Specify whether to output tag listing in `git tag` in columns.
See `column.ui` for details.

View File

@ -1,29 +0,0 @@
commit.cleanup::
This setting overrides the default of the `--cleanup` option in
`git commit`. See linkgit:git-commit[1] for details. Changing the
default can be useful when you always want to keep lines that begin
with comment character `#` in your log message, in which case you
would do `git config commit.cleanup whitespace` (note that you will
have to remove the help lines that begin with `#` in the commit log
template yourself, if you do this).
commit.gpgSign::
A boolean to specify whether all commits should be GPG signed.
Use of this option when doing operations such as rebase can
result in a large number of commits being signed. It may be
convenient to use an agent to avoid typing your GPG passphrase
several times.
commit.status::
A boolean to enable/disable inclusion of status information in the
commit message template when using an editor to prepare the commit
message. Defaults to true.
commit.template::
Specify the pathname of a file to use as the template for
new commit messages.
commit.verbose::
A boolean or int to specify the level of verbose with `git commit`.
See linkgit:git-commit[1].

View File

@ -1,7 +0,0 @@
completion.commands::
This is only used by git-completion.bash to add or remove
commands from the list of completed commands. Normally only
porcelain commands and a few select others are completed. You
can add more commands, separated by space, in this
variable. Prefixing the command with '-' will remove it from
the existing list.

View File

@ -1,617 +0,0 @@
core.fileMode::
Tells Git if the executable bit of files in the working tree
is to be honored.
+
Some filesystems lose the executable bit when a file that is
marked as executable is checked out, or checks out a
non-executable file with executable bit on.
linkgit:git-clone[1] or linkgit:git-init[1] probe the filesystem
to see if it handles the executable bit correctly
and this variable is automatically set as necessary.
+
A repository, however, may be on a filesystem that handles
the filemode correctly, and this variable is set to 'true'
when created, but later may be made accessible from another
environment that loses the filemode (e.g. exporting ext4 via
CIFS mount, visiting a Cygwin created repository with
Git for Windows or Eclipse).
In such a case it may be necessary to set this variable to 'false'.
See linkgit:git-update-index[1].
+
The default is true (when core.filemode is not specified in the config file).
core.hideDotFiles::
(Windows-only) If true, mark newly-created directories and files whose
name starts with a dot as hidden. If 'dotGitOnly', only the `.git/`
directory is hidden, but no other files starting with a dot. The
default mode is 'dotGitOnly'.
core.ignoreCase::
Internal variable which enables various workarounds to enable
Git to work better on filesystems that are not case sensitive,
like APFS, HFS+, FAT, NTFS, etc. For example, if a directory listing
finds "makefile" when Git expects "Makefile", Git will assume
it is really the same file, and continue to remember it as
"Makefile".
+
The default is false, except linkgit:git-clone[1] or linkgit:git-init[1]
will probe and set core.ignoreCase true if appropriate when the repository
is created.
+
Git relies on the proper configuration of this variable for your operating
and file system. Modifying this value may result in unexpected behavior.
core.precomposeUnicode::
This option is only used by Mac OS implementation of Git.
When core.precomposeUnicode=true, Git reverts the unicode decomposition
of filenames done by Mac OS. This is useful when sharing a repository
between Mac OS and Linux or Windows.
(Git for Windows 1.7.10 or higher is needed, or Git under cygwin 1.7).
When false, file names are handled fully transparent by Git,
which is backward compatible with older versions of Git.
core.protectHFS::
If set to true, do not allow checkout of paths that would
be considered equivalent to `.git` on an HFS+ filesystem.
Defaults to `true` on Mac OS, and `false` elsewhere.
core.protectNTFS::
If set to true, do not allow checkout of paths that would
cause problems with the NTFS filesystem, e.g. conflict with
8.3 "short" names.
Defaults to `true` on Windows, and `false` elsewhere.
core.fsmonitor::
If set, the value of this variable is used as a command which
will identify all files that may have changed since the
requested date/time. This information is used to speed up git by
avoiding unnecessary processing of files that have not changed.
See the "fsmonitor-watchman" section of linkgit:githooks[5].
core.trustctime::
If false, the ctime differences between the index and the
working tree are ignored; useful when the inode change time
is regularly modified by something outside Git (file system
crawlers and some backup systems).
See linkgit:git-update-index[1]. True by default.
core.splitIndex::
If true, the split-index feature of the index will be used.
See linkgit:git-update-index[1]. False by default.
core.untrackedCache::
Determines what to do about the untracked cache feature of the
index. It will be kept, if this variable is unset or set to
`keep`. It will automatically be added if set to `true`. And
it will automatically be removed, if set to `false`. Before
setting it to `true`, you should check that mtime is working
properly on your system.
See linkgit:git-update-index[1]. `keep` by default, unless
`feature.manyFiles` is enabled which sets this setting to
`true` by default.
core.checkStat::
When missing or is set to `default`, many fields in the stat
structure are checked to detect if a file has been modified
since Git looked at it. When this configuration variable is
set to `minimal`, sub-second part of mtime and ctime, the
uid and gid of the owner of the file, the inode number (and
the device number, if Git was compiled to use it), are
excluded from the check among these fields, leaving only the
whole-second part of mtime (and ctime, if `core.trustCtime`
is set) and the filesize to be checked.
+
There are implementations of Git that do not leave usable values in
some fields (e.g. JGit); by excluding these fields from the
comparison, the `minimal` mode may help interoperability when the
same repository is used by these other systems at the same time.
core.quotePath::
Commands that output paths (e.g. 'ls-files', 'diff'), will
quote "unusual" characters in the pathname by enclosing the
pathname in double-quotes and escaping those characters with
backslashes in the same way C escapes control characters (e.g.
`\t` for TAB, `\n` for LF, `\\` for backslash) or bytes with
values larger than 0x80 (e.g. octal `\302\265` for "micro" in
UTF-8). If this variable is set to false, bytes higher than
0x80 are not considered "unusual" any more. Double-quotes,
backslash and control characters are always escaped regardless
of the setting of this variable. A simple space character is
not considered "unusual". Many commands can output pathnames
completely verbatim using the `-z` option. The default value
is true.
core.eol::
Sets the line ending type to use in the working directory for
files that are marked as text (either by having the `text`
attribute set, or by having `text=auto` and Git auto-detecting
the contents as text).
Alternatives are 'lf', 'crlf' and 'native', which uses the platform's
native line ending. The default value is `native`. See
linkgit:gitattributes[5] for more information on end-of-line
conversion. Note that this value is ignored if `core.autocrlf`
is set to `true` or `input`.
core.safecrlf::
If true, makes Git check if converting `CRLF` is reversible when
end-of-line conversion is active. Git will verify if a command
modifies a file in the work tree either directly or indirectly.
For example, committing a file followed by checking out the
same file should yield the original file in the work tree. If
this is not the case for the current setting of
`core.autocrlf`, Git will reject the file. The variable can
be set to "warn", in which case Git will only warn about an
irreversible conversion but continue the operation.
+
CRLF conversion bears a slight chance of corrupting data.
When it is enabled, Git will convert CRLF to LF during commit and LF to
CRLF during checkout. A file that contains a mixture of LF and
CRLF before the commit cannot be recreated by Git. For text
files this is the right thing to do: it corrects line endings
such that we have only LF line endings in the repository.
But for binary files that are accidentally classified as text the
conversion can corrupt data.
+
If you recognize such corruption early you can easily fix it by
setting the conversion type explicitly in .gitattributes. Right
after committing you still have the original file in your work
tree and this file is not yet corrupted. You can explicitly tell
Git that this file is binary and Git will handle the file
appropriately.
+
Unfortunately, the desired effect of cleaning up text files with
mixed line endings and the undesired effect of corrupting binary
files cannot be distinguished. In both cases CRLFs are removed
in an irreversible way. For text files this is the right thing
to do because CRLFs are line endings, while for binary files
converting CRLFs corrupts data.
+
Note, this safety check does not mean that a checkout will generate a
file identical to the original file for a different setting of
`core.eol` and `core.autocrlf`, but only for the current one. For
example, a text file with `LF` would be accepted with `core.eol=lf`
and could later be checked out with `core.eol=crlf`, in which case the
resulting file would contain `CRLF`, although the original file
contained `LF`. However, in both work trees the line endings would be
consistent, that is either all `LF` or all `CRLF`, but never mixed. A
file with mixed line endings would be reported by the `core.safecrlf`
mechanism.
core.autocrlf::
Setting this variable to "true" is the same as setting
the `text` attribute to "auto" on all files and core.eol to "crlf".
Set to true if you want to have `CRLF` line endings in your
working directory and the repository has LF line endings.
This variable can be set to 'input',
in which case no output conversion is performed.
core.checkRoundtripEncoding::
A comma and/or whitespace separated list of encodings that Git
performs UTF-8 round trip checks on if they are used in an
`working-tree-encoding` attribute (see linkgit:gitattributes[5]).
The default value is `SHIFT-JIS`.
core.symlinks::
If false, symbolic links are checked out as small plain files that
contain the link text. linkgit:git-update-index[1] and
linkgit:git-add[1] will not change the recorded type to regular
file. Useful on filesystems like FAT that do not support
symbolic links.
+
The default is true, except linkgit:git-clone[1] or linkgit:git-init[1]
will probe and set core.symlinks false if appropriate when the repository
is created.
core.gitProxy::
A "proxy command" to execute (as 'command host port') instead
of establishing direct connection to the remote server when
using the Git protocol for fetching. If the variable value is
in the "COMMAND for DOMAIN" format, the command is applied only
on hostnames ending with the specified domain string. This variable
may be set multiple times and is matched in the given order;
the first match wins.
+
Can be overridden by the `GIT_PROXY_COMMAND` environment variable
(which always applies universally, without the special "for"
handling).
+
The special string `none` can be used as the proxy command to
specify that no proxy be used for a given domain pattern.
This is useful for excluding servers inside a firewall from
proxy use, while defaulting to a common proxy for external domains.
core.sshCommand::
If this variable is set, `git fetch` and `git push` will
use the specified command instead of `ssh` when they need to
connect to a remote system. The command is in the same form as
the `GIT_SSH_COMMAND` environment variable and is overridden
when the environment variable is set.
core.ignoreStat::
If true, Git will avoid using lstat() calls to detect if files have
changed by setting the "assume-unchanged" bit for those tracked files
which it has updated identically in both the index and working tree.
+
When files are modified outside of Git, the user will need to stage
the modified files explicitly (e.g. see 'Examples' section in
linkgit:git-update-index[1]).
Git will not normally detect changes to those files.
+
This is useful on systems where lstat() calls are very slow, such as
CIFS/Microsoft Windows.
+
False by default.
core.preferSymlinkRefs::
Instead of the default "symref" format for HEAD
and other symbolic reference files, use symbolic links.
This is sometimes needed to work with old scripts that
expect HEAD to be a symbolic link.
core.alternateRefsCommand::
When advertising tips of available history from an alternate, use the shell to
execute the specified command instead of linkgit:git-for-each-ref[1]. The
first argument is the absolute path of the alternate. Output must contain one
hex object id per line (i.e., the same as produced by `git for-each-ref
--format='%(objectname)'`).
+
Note that you cannot generally put `git for-each-ref` directly into the config
value, as it does not take a repository path as an argument (but you can wrap
the command above in a shell script).
core.alternateRefsPrefixes::
When listing references from an alternate, list only references that begin
with the given prefix. Prefixes match as if they were given as arguments to
linkgit:git-for-each-ref[1]. To list multiple prefixes, separate them with
whitespace. If `core.alternateRefsCommand` is set, setting
`core.alternateRefsPrefixes` has no effect.
core.bare::
If true this repository is assumed to be 'bare' and has no
working directory associated with it. If this is the case a
number of commands that require a working directory will be
disabled, such as linkgit:git-add[1] or linkgit:git-merge[1].
+
This setting is automatically guessed by linkgit:git-clone[1] or
linkgit:git-init[1] when the repository was created. By default a
repository that ends in "/.git" is assumed to be not bare (bare =
false), while all other repositories are assumed to be bare (bare
= true).
core.worktree::
Set the path to the root of the working tree.
If `GIT_COMMON_DIR` environment variable is set, core.worktree
is ignored and not used for determining the root of working tree.
This can be overridden by the `GIT_WORK_TREE` environment
variable and the `--work-tree` command-line option.
The value can be an absolute path or relative to the path to
the .git directory, which is either specified by --git-dir
or GIT_DIR, or automatically discovered.
If --git-dir or GIT_DIR is specified but none of
--work-tree, GIT_WORK_TREE and core.worktree is specified,
the current working directory is regarded as the top level
of your working tree.
+
Note that this variable is honored even when set in a configuration
file in a ".git" subdirectory of a directory and its value differs
from the latter directory (e.g. "/path/to/.git/config" has
core.worktree set to "/different/path"), which is most likely a
misconfiguration. Running Git commands in the "/path/to" directory will
still use "/different/path" as the root of the work tree and can cause
confusion unless you know what you are doing (e.g. you are creating a
read-only snapshot of the same index to a location different from the
repository's usual working tree).
core.logAllRefUpdates::
Enable the reflog. Updates to a ref <ref> is logged to the file
"`$GIT_DIR/logs/<ref>`", by appending the new and old
SHA-1, the date/time and the reason of the update, but
only when the file exists. If this configuration
variable is set to `true`, missing "`$GIT_DIR/logs/<ref>`"
file is automatically created for branch heads (i.e. under
`refs/heads/`), remote refs (i.e. under `refs/remotes/`),
note refs (i.e. under `refs/notes/`), and the symbolic ref `HEAD`.
If it is set to `always`, then a missing reflog is automatically
created for any ref under `refs/`.
+
This information can be used to determine what commit
was the tip of a branch "2 days ago".
+
This value is true by default in a repository that has
a working directory associated with it, and false by
default in a bare repository.
core.repositoryFormatVersion::
Internal variable identifying the repository format and layout
version.
core.sharedRepository::
When 'group' (or 'true'), the repository is made shareable between
several users in a group (making sure all the files and objects are
group-writable). When 'all' (or 'world' or 'everybody'), the
repository will be readable by all users, additionally to being
group-shareable. When 'umask' (or 'false'), Git will use permissions
reported by umask(2). When '0xxx', where '0xxx' is an octal number,
files in the repository will have this mode value. '0xxx' will override
user's umask value (whereas the other options will only override
requested parts of the user's umask value). Examples: '0660' will make
the repo read/write-able for the owner and group, but inaccessible to
others (equivalent to 'group' unless umask is e.g. '0022'). '0640' is a
repository that is group-readable but not group-writable.
See linkgit:git-init[1]. False by default.
core.warnAmbiguousRefs::
If true, Git will warn you if the ref name you passed it is ambiguous
and might match multiple refs in the repository. True by default.
core.compression::
An integer -1..9, indicating a default compression level.
-1 is the zlib default. 0 means no compression,
and 1..9 are various speed/size tradeoffs, 9 being slowest.
If set, this provides a default to other compression variables,
such as `core.looseCompression` and `pack.compression`.
core.looseCompression::
An integer -1..9, indicating the compression level for objects that
are not in a pack file. -1 is the zlib default. 0 means no
compression, and 1..9 are various speed/size tradeoffs, 9 being
slowest. If not set, defaults to core.compression. If that is
not set, defaults to 1 (best speed).
core.packedGitWindowSize::
Number of bytes of a pack file to map into memory in a
single mapping operation. Larger window sizes may allow
your system to process a smaller number of large pack files
more quickly. Smaller window sizes will negatively affect
performance due to increased calls to the operating system's
memory manager, but may improve performance when accessing
a large number of large pack files.
+
Default is 1 MiB if NO_MMAP was set at compile time, otherwise 32
MiB on 32 bit platforms and 1 GiB on 64 bit platforms. This should
be reasonable for all users/operating systems. You probably do
not need to adjust this value.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
core.packedGitLimit::
Maximum number of bytes to map simultaneously into memory
from pack files. If Git needs to access more than this many
bytes at once to complete an operation it will unmap existing
regions to reclaim virtual address space within the process.
+
Default is 256 MiB on 32 bit platforms and 32 TiB (effectively
unlimited) on 64 bit platforms.
This should be reasonable for all users/operating systems, except on
the largest projects. You probably do not need to adjust this value.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
core.deltaBaseCacheLimit::
Maximum number of bytes to reserve for caching base objects
that may be referenced by multiple deltified objects. By storing the
entire decompressed base objects in a cache Git is able
to avoid unpacking and decompressing frequently used base
objects multiple times.
+
Default is 96 MiB on all platforms. This should be reasonable
for all users/operating systems, except on the largest projects.
You probably do not need to adjust this value.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
core.bigFileThreshold::
Files larger than this size are stored deflated, without
attempting delta compression. Storing large files without
delta compression avoids excessive memory usage, at the
slight expense of increased disk usage. Additionally files
larger than this size are always treated as binary.
+
Default is 512 MiB on all platforms. This should be reasonable
for most projects as source code and other text files can still
be delta compressed, but larger binary media files won't be.
+
Common unit suffixes of 'k', 'm', or 'g' are supported.
core.excludesFile::
Specifies the pathname to the file that contains patterns to
describe paths that are not meant to be tracked, in addition
to `.gitignore` (per-directory) and `.git/info/exclude`.
Defaults to `$XDG_CONFIG_HOME/git/ignore`.
If `$XDG_CONFIG_HOME` is either not set or empty, `$HOME/.config/git/ignore`
is used instead. See linkgit:gitignore[5].
core.askPass::
Some commands (e.g. svn and http interfaces) that interactively
ask for a password can be told to use an external program given
via the value of this variable. Can be overridden by the `GIT_ASKPASS`
environment variable. If not set, fall back to the value of the
`SSH_ASKPASS` environment variable or, failing that, a simple password
prompt. The external program shall be given a suitable prompt as
command-line argument and write the password on its STDOUT.
core.attributesFile::
In addition to `.gitattributes` (per-directory) and
`.git/info/attributes`, Git looks into this file for attributes
(see linkgit:gitattributes[5]). Path expansions are made the same
way as for `core.excludesFile`. Its default value is
`$XDG_CONFIG_HOME/git/attributes`. If `$XDG_CONFIG_HOME` is either not
set or empty, `$HOME/.config/git/attributes` is used instead.
core.hooksPath::
By default Git will look for your hooks in the
`$GIT_DIR/hooks` directory. Set this to different path,
e.g. `/etc/git/hooks`, and Git will try to find your hooks in
that directory, e.g. `/etc/git/hooks/pre-receive` instead of
in `$GIT_DIR/hooks/pre-receive`.
+
The path can be either absolute or relative. A relative path is
taken as relative to the directory where the hooks are run (see
the "DESCRIPTION" section of linkgit:githooks[5]).
+
This configuration variable is useful in cases where you'd like to
centrally configure your Git hooks instead of configuring them on a
per-repository basis, or as a more flexible and centralized
alternative to having an `init.templateDir` where you've changed
default hooks.
core.editor::
Commands such as `commit` and `tag` that let you edit
messages by launching an editor use the value of this
variable when it is set, and the environment variable
`GIT_EDITOR` is not set. See linkgit:git-var[1].
core.commentChar::
Commands such as `commit` and `tag` that let you edit
messages consider a line that begins with this character
commented, and removes them after the editor returns
(default '#').
+
If set to "auto", `git-commit` would select a character that is not
the beginning character of any line in existing commit messages.
core.filesRefLockTimeout::
The length of time, in milliseconds, to retry when trying to
lock an individual reference. Value 0 means not to retry at
all; -1 means to try indefinitely. Default is 100 (i.e.,
retry for 100ms).
core.packedRefsTimeout::
The length of time, in milliseconds, to retry when trying to
lock the `packed-refs` file. Value 0 means not to retry at
all; -1 means to try indefinitely. Default is 1000 (i.e.,
retry for 1 second).
core.pager::
Text viewer for use by Git commands (e.g., 'less'). The value
is meant to be interpreted by the shell. The order of preference
is the `$GIT_PAGER` environment variable, then `core.pager`
configuration, then `$PAGER`, and then the default chosen at
compile time (usually 'less').
+
When the `LESS` environment variable is unset, Git sets it to `FRX`
(if `LESS` environment variable is set, Git does not change it at
all). If you want to selectively override Git's default setting
for `LESS`, you can set `core.pager` to e.g. `less -S`. This will
be passed to the shell by Git, which will translate the final
command to `LESS=FRX less -S`. The environment does not set the
`S` option but the command line does, instructing less to truncate
long lines. Similarly, setting `core.pager` to `less -+F` will
deactivate the `F` option specified by the environment from the
command-line, deactivating the "quit if one screen" behavior of
`less`. One can specifically activate some flags for particular
commands: for example, setting `pager.blame` to `less -S` enables
line truncation only for `git blame`.
+
Likewise, when the `LV` environment variable is unset, Git sets it
to `-c`. You can override this setting by exporting `LV` with
another value or setting `core.pager` to `lv +c`.
core.whitespace::
A comma separated list of common whitespace problems to
notice. 'git diff' will use `color.diff.whitespace` to
highlight them, and 'git apply --whitespace=error' will
consider them as errors. You can prefix `-` to disable
any of them (e.g. `-trailing-space`):
+
* `blank-at-eol` treats trailing whitespaces at the end of the line
as an error (enabled by default).
* `space-before-tab` treats a space character that appears immediately
before a tab character in the initial indent part of the line as an
error (enabled by default).
* `indent-with-non-tab` treats a line that is indented with space
characters instead of the equivalent tabs as an error (not enabled by
default).
* `tab-in-indent` treats a tab character in the initial indent part of
the line as an error (not enabled by default).
* `blank-at-eof` treats blank lines added at the end of file as an error
(enabled by default).
* `trailing-space` is a short-hand to cover both `blank-at-eol` and
`blank-at-eof`.
* `cr-at-eol` treats a carriage-return at the end of line as
part of the line terminator, i.e. with it, `trailing-space`
does not trigger if the character before such a carriage-return
is not a whitespace (not enabled by default).
* `tabwidth=<n>` tells how many character positions a tab occupies; this
is relevant for `indent-with-non-tab` and when Git fixes `tab-in-indent`
errors. The default tab width is 8. Allowed values are 1 to 63.
core.fsyncObjectFiles::
This boolean will enable 'fsync()' when writing object files.
+
This is a total waste of time and effort on a filesystem that orders
data writes properly, but can be useful for filesystems that do not use
journalling (traditional UNIX filesystems) or that only journal metadata
and not file contents (OS X's HFS+, or Linux ext3 with "data=writeback").
core.preloadIndex::
Enable parallel index preload for operations like 'git diff'
+
This can speed up operations like 'git diff' and 'git status' especially
on filesystems like NFS that have weak caching semantics and thus
relatively high IO latencies. When enabled, Git will do the
index comparison to the filesystem data in parallel, allowing
overlapping IO's. Defaults to true.
core.unsetenvvars::
Windows-only: comma-separated list of environment variables'
names that need to be unset before spawning any other process.
Defaults to `PERL5LIB` to account for the fact that Git for
Windows insists on using its own Perl interpreter.
core.restrictinheritedhandles::
Windows-only: override whether spawned processes inherit only standard
file handles (`stdin`, `stdout` and `stderr`) or all handles. Can be
`auto`, `true` or `false`. Defaults to `auto`, which means `true` on
Windows 7 and later, and `false` on older Windows versions.
core.createObject::
You can set this to 'link', in which case a hardlink followed by
a delete of the source are used to make sure that object creation
will not overwrite existing objects.
+
On some file system/operating system combinations, this is unreliable.
Set this config setting to 'rename' there; However, This will remove the
check that makes sure that existing object files will not get overwritten.
core.notesRef::
When showing commit messages, also show notes which are stored in
the given ref. The ref must be fully qualified. If the given
ref does not exist, it is not an error but means that no
notes should be printed.
+
This setting defaults to "refs/notes/commits", and it can be overridden by
the `GIT_NOTES_REF` environment variable. See linkgit:git-notes[1].
core.commitGraph::
If true, then git will read the commit-graph file (if it exists)
to parse the graph structure of commits. Defaults to true. See
linkgit:git-commit-graph[1] for more information.
core.useReplaceRefs::
If set to `false`, behave as if the `--no-replace-objects`
option was given on the command line. See linkgit:git[1] and
linkgit:git-replace[1] for more information.
core.multiPackIndex::
Use the multi-pack-index file to track multiple packfiles using a
single index. See link:technical/multi-pack-index.html[the
multi-pack-index design document].
core.sparseCheckout::
Enable "sparse checkout" feature. See linkgit:git-sparse-checkout[1]
for more information.
core.sparseCheckoutCone::
Enables the "cone mode" of the sparse checkout feature. When the
sparse-checkout file contains a limited set of patterns, then this
mode provides significant performance advantages. See
linkgit:git-sparse-checkout[1] for more information.
core.abbrev::
Set the length object names are abbreviated to. If
unspecified or set to "auto", an appropriate value is
computed based on the approximate number of packed objects
in your repository, which hopefully is enough for
abbreviated object names to stay unique for some time.
The minimum length is 4.

View File

@ -1,26 +0,0 @@
credential.helper::
Specify an external helper to be called when a username or
password credential is needed; the helper may consult external
storage to avoid prompting the user for the credentials. Note
that multiple helpers may be defined. See linkgit:gitcredentials[7]
for details.
credential.useHttpPath::
When acquiring credentials, consider the "path" component of an http
or https URL to be important. Defaults to false. See
linkgit:gitcredentials[7] for more information.
credential.username::
If no username is set for a network authentication, use this username
by default. See credential.<context>.* below, and
linkgit:gitcredentials[7].
credential.<url>.*::
Any of the credential.* options above can be applied selectively to
some credentials. For example "credential.https://example.com.username"
would set the default username only for https connections to
example.com. See linkgit:gitcredentials[7] for details on how URLs are
matched.
credentialCache.ignoreSIGHUP::
Tell git-credential-cache--daemon to ignore SIGHUP, instead of quitting.

View File

@ -1,14 +0,0 @@
difftool.<tool>.path::
Override the path for the given tool. This is useful in case
your tool is not in the PATH.
difftool.<tool>.cmd::
Specify the command to invoke the specified diff tool.
The specified command is evaluated in shell with the following
variables available: 'LOCAL' is set to the name of the temporary
file containing the contents of the diff pre-image and 'REMOTE'
is set to the name of the temporary file containing the contents
of the diff post-image.
difftool.prompt::
Prompt before each invocation of the diff tool.

View File

@ -1,8 +0,0 @@
fastimport.unpackLimit::
If the number of objects imported by linkgit:git-fast-import[1]
is below this limit, then the objects will be unpacked into
loose object files. However if the number of imported objects
equals or exceeds this limit then the pack will be stored as a
pack. Storing the pack from a fast-import can make the import
operation complete faster, especially on slow filesystems. If
not set, the value of `transfer.unpackLimit` is used instead.

View File

@ -1,37 +0,0 @@
feature.*::
The config settings that start with `feature.` modify the defaults of
a group of other config settings. These groups are created by the Git
developer community as recommended defaults and are subject to change.
In particular, new config options may be added with different defaults.
feature.experimental::
Enable config options that are new to Git, and are being considered for
future defaults. Config settings included here may be added or removed
with each release, including minor version updates. These settings may
have unintended interactions since they are so new. Please enable this
setting if you are interested in providing feedback on experimental
features. The new default values are:
+
* `pack.useSparse=true` uses a new algorithm when constructing a pack-file
which can improve `git push` performance in repos with many files.
+
* `fetch.negotiationAlgorithm=skipping` may improve fetch negotiation times by
skipping more commits at a time, reducing the number of round trips.
+
* `fetch.writeCommitGraph=true` writes a commit-graph after every `git fetch`
command that downloads a pack-file from a remote. Using the `--split` option,
most executions will create a very small commit-graph file on top of the
existing commit-graph file(s). Occasionally, these files will merge and the
write may take longer. Having an updated commit-graph file helps performance
of many Git commands, including `git merge-base`, `git push -f`, and
`git log --graph`.
feature.manyFiles::
Enable config options that optimize for repos with many files in the
working directory. With many files, commands such as `git status` and
`git checkout` may be slow and these new defaults improve performance:
+
* `index.version=4` enables path-prefix compression in the index.
+
* `core.untrackedCache=true` enables the untracked cache. This setting assumes
that mtime is working on your machine.

View File

@ -1,91 +0,0 @@
fetch.recurseSubmodules::
This option can be either set to a boolean value or to 'on-demand'.
Setting it to a boolean changes the behavior of fetch and pull to
unconditionally recurse into submodules when set to true or to not
recurse at all when set to false. When set to 'on-demand' (the default
value), fetch and pull will only recurse into a populated submodule
when its superproject retrieves a commit that updates the submodule's
reference.
fetch.fsckObjects::
If it is set to true, git-fetch-pack will check all fetched
objects. See `transfer.fsckObjects` for what's
checked. Defaults to false. If not set, the value of
`transfer.fsckObjects` is used instead.
fetch.fsck.<msg-id>::
Acts like `fsck.<msg-id>`, but is used by
linkgit:git-fetch-pack[1] instead of linkgit:git-fsck[1]. See
the `fsck.<msg-id>` documentation for details.
fetch.fsck.skipList::
Acts like `fsck.skipList`, but is used by
linkgit:git-fetch-pack[1] instead of linkgit:git-fsck[1]. See
the `fsck.skipList` documentation for details.
fetch.unpackLimit::
If the number of objects fetched over the Git native
transfer is below this
limit, then the objects will be unpacked into loose object
files. However if the number of received objects equals or
exceeds this limit then the received pack will be stored as
a pack, after adding any missing delta bases. Storing the
pack from a push can make the push operation complete faster,
especially on slow filesystems. If not set, the value of
`transfer.unpackLimit` is used instead.
fetch.prune::
If true, fetch will automatically behave as if the `--prune`
option was given on the command line. See also `remote.<name>.prune`
and the PRUNING section of linkgit:git-fetch[1].
fetch.pruneTags::
If true, fetch will automatically behave as if the
`refs/tags/*:refs/tags/*` refspec was provided when pruning,
if not set already. This allows for setting both this option
and `fetch.prune` to maintain a 1=1 mapping to upstream
refs. See also `remote.<name>.pruneTags` and the PRUNING
section of linkgit:git-fetch[1].
fetch.output::
Control how ref update status is printed. Valid values are
`full` and `compact`. Default value is `full`. See section
OUTPUT in linkgit:git-fetch[1] for detail.
fetch.negotiationAlgorithm::
Control how information about the commits in the local repository is
sent when negotiating the contents of the packfile to be sent by the
server. Set to "skipping" to use an algorithm that skips commits in an
effort to converge faster, but may result in a larger-than-necessary
packfile; The default is "default" which instructs Git to use the default algorithm
that never skips commits (unless the server has acknowledged it or one
of its descendants). If `feature.experimental` is enabled, then this
setting defaults to "skipping".
Unknown values will cause 'git fetch' to error out.
+
See also the `--negotiation-tip` option for linkgit:git-fetch[1].
fetch.showForcedUpdates::
Set to false to enable `--no-show-forced-updates` in
linkgit:git-fetch[1] and linkgit:git-pull[1] commands.
Defaults to true.
fetch.parallel::
Specifies the maximal number of fetch operations to be run in parallel
at a time (submodules, or remotes when the `--multiple` option of
linkgit:git-fetch[1] is in effect).
+
A value of 0 will give some reasonable default. If unset, it defaults to 1.
+
For submodules, this setting can be overridden using the `submodule.fetchJobs`
config setting.
fetch.writeCommitGraph::
Set to true to write a commit-graph after every `git fetch` command
that downloads a pack-file from a remote. Using the `--split` option,
most executions will create a very small commit-graph file on top of
the existing commit-graph file(s). Occasionally, these files will
merge and the write may take longer. Having an updated commit-graph
file helps performance of many Git commands, including `git merge-base`,
`git push -f`, and `git log --graph`. Defaults to false, unless
`feature.experimental` is true.

Some files were not shown because too many files have changed in this diff Show More