Compare commits

..

61 Commits

Author SHA1 Message Date
d1259ce117 Git 2.20.3
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-03-17 13:46:10 -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
4cd1cf31ef Git 2.20.2
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:30:51 +01:00
c154745074 submodule: defend against submodule.update = !command in .gitmodules
In v2.15.4, we started to reject `submodule.update` settings in
`.gitmodules`. Let's raise a BUG if it somehow still made it through
from anywhere but the Git config.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
2019-12-06 16:30:50 +01:00
4cfc47de25 t7415: adjust test for dubiously-nested submodule gitdirs for v2.20.x
In v2.20.x, Git clones submodules recursively by first creating the
submodules' gitdirs and _then_ "updating" the submodules. This can lead
to the situation where the clone path is taken because the directory
(while it exists already) is not a git directory, but then the clone
fails because that gitdir is unexpectedly already a directory.

This _also_ works around the vulnerability that was fixed in "Disallow
dubiously-nested submodule git directories", but it produces a different
error message than the one expected by the test case, therefore we
adjust the test case accordingly.

Note: as the two submodules "race each other", there are actually two
possible error messages, therefore we have to teach the test case to
expect _two_ possible (and good) outcomes in addition to the one it
expected before.

Note: this workaround is only necessary for the v2.20.x release train;
The behavior changed again in v2.21.x so that the original test case's
expectations are met again.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:30:50 +01:00
d851d94151 Sync with 2.19.3
* maint-2.19: (34 commits)
  Git 2.19.3
  Git 2.18.2
  Git 2.17.3
  Git 2.16.6
  test-drop-caches: use `has_dos_drive_prefix()`
  Git 2.15.4
  Git 2.14.6
  mingw: handle `subst`-ed "DOS drives"
  mingw: refuse to access paths with trailing spaces or periods
  mingw: refuse to access paths with illegal characters
  unpack-trees: let merged_entry() pass through do_add_entry()'s errors
  quote-stress-test: offer to test quoting arguments for MSYS2 sh
  t6130/t9350: prepare for stringent Win32 path validation
  quote-stress-test: allow skipping some trials
  quote-stress-test: accept arguments to test via the command-line
  tests: add a helper to stress test argument quoting
  mingw: fix quoting of arguments
  Disallow dubiously-nested submodule git directories
  protect_ntfs: turn on NTFS protection by default
  path: also guard `.gitmodules` against NTFS Alternate Data Streams
  ...
2019-12-06 16:30:49 +01:00
caccc527ca Git 2.19.3
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:30:40 +01:00
7c9fbda6e2 Sync with 2.18.2
* maint-2.18: (33 commits)
  Git 2.18.2
  Git 2.17.3
  Git 2.16.6
  test-drop-caches: use `has_dos_drive_prefix()`
  Git 2.15.4
  Git 2.14.6
  mingw: handle `subst`-ed "DOS drives"
  mingw: refuse to access paths with trailing spaces or periods
  mingw: refuse to access paths with illegal characters
  unpack-trees: let merged_entry() pass through do_add_entry()'s errors
  quote-stress-test: offer to test quoting arguments for MSYS2 sh
  t6130/t9350: prepare for stringent Win32 path validation
  quote-stress-test: allow skipping some trials
  quote-stress-test: accept arguments to test via the command-line
  tests: add a helper to stress test argument quoting
  mingw: fix quoting of arguments
  Disallow dubiously-nested submodule git directories
  protect_ntfs: turn on NTFS protection by default
  path: also guard `.gitmodules` against NTFS Alternate Data Streams
  is_ntfs_dotgit(): speed it up
  ...
2019-12-06 16:30:38 +01:00
9877106b01 Git 2.18.2
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:29:17 +01:00
14af7ed5a9 Sync with 2.17.3
* maint-2.17: (32 commits)
  Git 2.17.3
  Git 2.16.6
  test-drop-caches: use `has_dos_drive_prefix()`
  Git 2.15.4
  Git 2.14.6
  mingw: handle `subst`-ed "DOS drives"
  mingw: refuse to access paths with trailing spaces or periods
  mingw: refuse to access paths with illegal characters
  unpack-trees: let merged_entry() pass through do_add_entry()'s errors
  quote-stress-test: offer to test quoting arguments for MSYS2 sh
  t6130/t9350: prepare for stringent Win32 path validation
  quote-stress-test: allow skipping some trials
  quote-stress-test: accept arguments to test via the command-line
  tests: add a helper to stress test argument quoting
  mingw: fix quoting of arguments
  Disallow dubiously-nested submodule git directories
  protect_ntfs: turn on NTFS protection by default
  path: also guard `.gitmodules` against NTFS Alternate Data Streams
  is_ntfs_dotgit(): speed it up
  mingw: disallow backslash characters in tree objects' file names
  ...
2019-12-06 16:29:15 +01:00
a5ab8d0317 Git 2.17.3
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:27:38 +01:00
bb92255ebe fsck: reject submodule.update = !command in .gitmodules
This allows hosting providers to detect whether they are being used
to attack users using malicious 'update = !command' settings in
.gitmodules.

Since ac1fbbda20 (submodule: do not copy unknown update mode from
.gitmodules, 2013-12-02), in normal cases such settings have been
treated as 'update = none', so forbidding them should not produce any
collateral damage to legitimate uses.  A quick search does not reveal
any repositories making use of this construct, either.

Reported-by: Joern Schneeweisz <jschneeweisz@gitlab.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:27:38 +01:00
bdfef0492c Sync with 2.16.6
* maint-2.16: (31 commits)
  Git 2.16.6
  test-drop-caches: use `has_dos_drive_prefix()`
  Git 2.15.4
  Git 2.14.6
  mingw: handle `subst`-ed "DOS drives"
  mingw: refuse to access paths with trailing spaces or periods
  mingw: refuse to access paths with illegal characters
  unpack-trees: let merged_entry() pass through do_add_entry()'s errors
  quote-stress-test: offer to test quoting arguments for MSYS2 sh
  t6130/t9350: prepare for stringent Win32 path validation
  quote-stress-test: allow skipping some trials
  quote-stress-test: accept arguments to test via the command-line
  tests: add a helper to stress test argument quoting
  mingw: fix quoting of arguments
  Disallow dubiously-nested submodule git directories
  protect_ntfs: turn on NTFS protection by default
  path: also guard `.gitmodules` against NTFS Alternate Data Streams
  is_ntfs_dotgit(): speed it up
  mingw: disallow backslash characters in tree objects' file names
  path: safeguard `.git` against NTFS Alternate Streams Accesses
  ...
2019-12-06 16:27:36 +01:00
eb288bc455 Git 2.16.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:27:20 +01:00
68440496c7 test-drop-caches: use has_dos_drive_prefix()
This is a companion patch to 'mingw: handle `subst`-ed "DOS drives"':
use the DOS drive prefix handling that is already provided by
`compat/mingw.c` (and which just learned to handle non-alphabetical
"drive letters").

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:27:20 +01:00
9ac92fed5b Sync with 2.15.4
* maint-2.15: (29 commits)
  Git 2.15.4
  Git 2.14.6
  mingw: handle `subst`-ed "DOS drives"
  mingw: refuse to access paths with trailing spaces or periods
  mingw: refuse to access paths with illegal characters
  unpack-trees: let merged_entry() pass through do_add_entry()'s errors
  quote-stress-test: offer to test quoting arguments for MSYS2 sh
  t6130/t9350: prepare for stringent Win32 path validation
  quote-stress-test: allow skipping some trials
  quote-stress-test: accept arguments to test via the command-line
  tests: add a helper to stress test argument quoting
  mingw: fix quoting of arguments
  Disallow dubiously-nested submodule git directories
  protect_ntfs: turn on NTFS protection by default
  path: also guard `.gitmodules` against NTFS Alternate Data Streams
  is_ntfs_dotgit(): speed it up
  mingw: disallow backslash characters in tree objects' file names
  path: safeguard `.git` against NTFS Alternate Streams Accesses
  clone --recurse-submodules: prevent name squatting on Windows
  is_ntfs_dotgit(): only verify the leading segment
  ...
2019-12-06 16:27:18 +01:00
7cdafcaacf Git 2.15.4
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:26:58 +01:00
e904deb89d submodule: reject submodule.update = !command in .gitmodules
Since ac1fbbda20 (submodule: do not copy unknown update mode from
.gitmodules, 2013-12-02), Git has been careful to avoid copying

	[submodule "foo"]
		update = !run an arbitrary scary command

from .gitmodules to a repository's local config, copying in the
setting 'update = none' instead.  The gitmodules(5) manpage documents
the intention:

	The !command form is intentionally ignored here for security
	reasons

Unfortunately, starting with v2.20.0-rc0 (which integrated ee69b2a9
(submodule--helper: introduce new update-module-mode helper,
2018-08-13, first released in v2.20.0-rc0)), there are scenarios where
we *don't* ignore it: if the config store contains no
submodule.foo.update setting, the submodule-config API falls back to
reading .gitmodules and the repository-supplied !command gets run
after all.

This was part of a general change over time in submodule support to
read more directly from .gitmodules, since unlike .git/config it
allows a project to change values between branches and over time
(while still allowing .git/config to override things).  But it was
never intended to apply to this kind of dangerous configuration.

The behavior change was not advertised in ee69b2a9's commit message
and was missed in review.

Let's take the opportunity to make the protection more robust, even in
Git versions that are technically not affected: instead of quietly
converting 'update = !command' to 'update = none', noisily treat it as
an error.  Allowing the setting but treating it as meaning something
else was just confusing; users are better served by seeing the error
sooner.  Forbidding the construct makes the semantics simpler and
means we can check for it in fsck (in a separate patch).

As a result, the submodule-config API cannot read this value from
.gitmodules under any circumstance, and we can declare with confidence

	For security reasons, the '!command' form is not accepted
	here.

Reported-by: Joern Schneeweisz <jschneeweisz@gitlab.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
2019-12-06 16:26:58 +01:00
d3ac8c3f27 Sync with 2.14.6
* maint-2.14: (28 commits)
  Git 2.14.6
  mingw: handle `subst`-ed "DOS drives"
  mingw: refuse to access paths with trailing spaces or periods
  mingw: refuse to access paths with illegal characters
  unpack-trees: let merged_entry() pass through do_add_entry()'s errors
  quote-stress-test: offer to test quoting arguments for MSYS2 sh
  t6130/t9350: prepare for stringent Win32 path validation
  quote-stress-test: allow skipping some trials
  quote-stress-test: accept arguments to test via the command-line
  tests: add a helper to stress test argument quoting
  mingw: fix quoting of arguments
  Disallow dubiously-nested submodule git directories
  protect_ntfs: turn on NTFS protection by default
  path: also guard `.gitmodules` against NTFS Alternate Data Streams
  is_ntfs_dotgit(): speed it up
  mingw: disallow backslash characters in tree objects' file names
  path: safeguard `.git` against NTFS Alternate Streams Accesses
  clone --recurse-submodules: prevent name squatting on Windows
  is_ntfs_dotgit(): only verify the leading segment
  test-path-utils: offer to run a protectNTFS/protectHFS benchmark
  ...
2019-12-06 16:26:55 +01:00
66d2a6159f Git 2.14.6
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-06 16:26:15 +01:00
2ddcccf97a Merge branch 'win32-accommodate-funny-drive-names'
While the only permitted drive letters for physical drives on Windows
are letters of the US-English alphabet, this restriction does not apply
to virtual drives assigned via `subst <letter>: <path>`.

To prevent targeted attacks against systems where "funny" drive letters
such as `1` or `!` are assigned, let's handle them as regular drive
letters on Windows.

This fixes CVE-2019-1351.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:09 +01:00
65d30a19de Merge branch 'win32-filenames-cannot-have-trailing-spaces-or-periods'
On Windows, filenames cannot have trailing spaces or periods, when
opening such paths, they are stripped automatically. Read: you can open
the file `README` via the file name `README . . .`. This ambiguity can
be used in combination with other security bugs to cause e.g. remote
code execution during recursive clones. This patch series fixes that.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:09 +01:00
5532ebdeb7 Merge branch 'fix-mingw-quoting-bug'
This patch fixes a vulnerability in the Windows-specific code where a
submodule names ending in a backslash were quoted incorrectly, and that
bug could be abused to insert command-line parameters e.g. to `ssh` in a
recursive clone.

Note: this bug is Windows-only, as we have to construct a command line
for the process-to-spawn, unlike Linux/macOS, where `execv()` accepts an
already-split command line.

While at it, other quoting issues are fixed as well.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:08 +01:00
76a681ce9c Merge branch 'dubiously-nested-submodules'
Recursive clones are currently affected by a vulnerability that is
caused by too-lax validation of submodule names.

This topic branch fixes that.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:08 +01:00
dd53ea7220 Merge branch 'turn-on-protectntfs-by-default'
This patch series makes it safe to use Git on Windows drives, even if
running on a mounted network share or within the Windows Subsystem for
Linux (WSL).

This topic branch addresses CVE-2019-1353.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:08 +01:00
f82a97eb91 mingw: handle subst-ed "DOS drives"
Over a decade ago, in 25fe217b86 (Windows: Treat Windows style path
names., 2008-03-05), Git was taught to handle absolute Windows paths,
i.e. paths that start with a drive letter and a colon.

Unbeknownst to us, while drive letters of physical drives are limited to
letters of the English alphabet, there is a way to assign virtual drive
letters to arbitrary directories, via the `subst` command, which is
_not_ limited to English letters.

It is therefore possible to have absolute Windows paths of the form
`1:\what\the\hex.txt`. Even "better": pretty much arbitrary Unicode
letters can also be used, e.g. `ä:\tschibät.sch`.

While it can be sensibly argued that users who set up such funny drive
letters really seek adverse consequences, the Windows Operating System
is known to be a platform where many users are at the mercy of
administrators who have their very own idea of what constitutes a
reasonable setup.

Therefore, let's just make sure that such funny paths are still
considered absolute paths by Git, on Windows.

In addition to Unicode characters, pretty much any character is a valid
drive letter, as far as `subst` is concerned, even `:` and `"` or even a
space character. While it is probably the opposite of smart to use them,
let's safeguard `is_dos_drive_prefix()` against all of them.

Note: `[::1]:repo` is a valid URL, but not a valid path on Windows.
As `[` is now considered a valid drive letter, we need to be very
careful to avoid misinterpreting such a string as valid local path in
`url_is_local_not_ssh()`. To do that, we use the just-introduced
function `is_valid_path()` (which will label the string as invalid file
name because of the colon characters).

This fixes CVE-2019-1351.

Reported-by: Nicolas Joly <Nicolas.Joly@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:07 +01:00
7f3551dd68 Merge branch 'disallow-dotgit-via-ntfs-alternate-data-streams'
This patch series plugs an attack vector we had overlooked in our
December 2014 work on `core.protectNTFS`.

Essentially, the path `.git::$INDEX_ALLOCATION/config` is interpreted as
`.git/config` when NTFS Alternate Data Streams are available (which they
are on Windows, and at least on network shares that are SMB-mounted on
macOS).

Needless to say: we don't want that.

In fact, we want to stay on the very safe side and not even special-case
the `$INDEX_ALLOCATION` stream type: let's just prevent Git from
touching _any_ explicitly specified Alternate Data Stream of `.git`.

In essence, we'll prevent Git from tracking, or writing to, any path
with a segment of the form `.git:<anything>`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:07 +01:00
d2c84dad1c mingw: refuse to access paths with trailing spaces or periods
When creating a directory on Windows whose path ends in a space or a
period (or chains thereof), the Win32 API "helpfully" trims those. For
example, `mkdir("abc ");` will return success, but actually create a
directory called `abc` instead.

This stems back to the DOS days, when all file names had exactly 8
characters plus exactly 3 characters for the file extension, and the
only way to have shorter names was by padding with spaces.

Sadly, this "helpful" behavior is a bit inconsistent: after a successful
`mkdir("abc ");`, a `mkdir("abc /def")` will actually _fail_ (because
the directory `abc ` does not actually exist).

Even if it would work, we now have a serious problem because a Git
repository could contain directories `abc` and `abc `, and on Windows,
they would be "merged" unintentionally.

As these paths are illegal on Windows, anyway, let's disallow any
accesses to such paths on that Operating System.

For practical reasons, this behavior is still guarded by the
config setting `core.protectNTFS`: it is possible (and at least two
regression tests make use of it) to create commits without involving the
worktree. In such a scenario, it is of course possible -- even on
Windows -- to create such file names.

Among other consequences, this patch disallows submodules' paths to end
in spaces on Windows (which would formerly have confused Git enough to
try to write into incorrect paths, anyway).

While this patch does not fix a vulnerability on its own, it prevents an
attack vector that was exploited in demonstrations of a number of
recently-fixed security bugs.

The regression test added to `t/t7417-submodule-path-url.sh` reflects
that attack vector.

Note that we have to adjust the test case "prevent git~1 squatting on
Windows" in `t/t7415-submodule-names.sh` because of a very subtle issue.
It tries to clone two submodules whose names differ only in a trailing
period character, and as a consequence their git directories differ in
the same way. Previously, when Git tried to clone the second submodule,
it thought that the git directory already existed (because on Windows,
when you create a directory with the name `b.` it actually creates `b`),
but with this patch, the first submodule's clone will fail because of
the illegal name of the git directory. Therefore, when cloning the
second submodule, Git will take a different code path: a fresh clone
(without an existing git directory). Both code paths fail to clone the
second submodule, both because the the corresponding worktree directory
exists and is not empty, but the error messages are worded differently.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:06 +01:00
379e51d1ae quote-stress-test: offer to test quoting arguments for MSYS2 sh
It is unfortunate that we need to quote arguments differently on
Windows, depending whether we build a command-line for MSYS2's `sh` or
for other Windows executables.

We already have a test helper to verify the latter, with this patch we
can also verify the former.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:06 +01:00
817ddd64c2 mingw: refuse to access paths with illegal characters
Certain characters are not admissible in file names on Windows, even if
Cygwin/MSYS2 (and therefore, Git for Windows' Bash) pretend that they
are, e.g. `:`, `<`, `>`, etc

Let's disallow those characters explicitly in Windows builds of Git.

Note: just like trailing spaces or periods, it _is_ possible on Windows
to create commits adding files with such illegal characters, as long as
the operation leaves the worktree untouched. To allow for that, we
continue to guard `is_valid_win32_path()` behind the config setting
`core.protectNTFS`, so that users _can_ continue to do that, as long as
they turn the protections off via that config setting.

Among other problems, this prevents Git from trying to write to an "NTFS
Alternate Data Stream" (which refers to metadata stored alongside a
file, under a special name: "<filename>:<stream-name>"). This fix
therefore also prevents an attack vector that was exploited in
demonstrations of a number of recently-fixed security bugs.

Further reading on illegal characters in Win32 filenames:
https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:06 +01:00
cc756edda6 unpack-trees: let merged_entry() pass through do_add_entry()'s errors
A `git clone` will end with exit code 0 when `merged_entry()` returns a
positive value during a call of `unpack_trees()` to `traverse_trees()`.
The reason is that `unpack_trees()` will interpret a positive value not
to be an error.

The problem is, however, that `add_index_entry()` (which is called by
`merged_entry()` can report an error, and we really should fail the
entire clone in such a case.

Let's fix this problem, in preparation for a Windows-specific patch
disallowing `mkdir()` with directory names that contain a trailing space
(which is illegal on NTFS): we want `git clone` to abort when a path
cannot be checked out due to that condition.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:06 +01:00
7530a6287e quote-stress-test: allow skipping some trials
When the, say, 93rd trial run fails, it is a good idea to have a way to
skip the first 92 trials and dig directly into the 93rd in a debugger.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:06 +01:00
35edce2056 t6130/t9350: prepare for stringent Win32 path validation
On Windows, file names cannot contain asterisks nor newline characters.
In an upcoming commit, we will make this limitation explicit,
disallowing even the creation of commits that introduce such file names.

However, in the test scripts touched by this patch, we _know_ that those
paths won't be checked out, so we _want_ to allow such file names.

Happily, the stringent path validation will be guarded via the
`core.protectNTFS` flag, so all we need to do is to force that flag off
temporarily.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:37:06 +01:00
55953c77c0 quote-stress-test: accept arguments to test via the command-line
When the stress test reported a problem with quoting certain arguments,
it is helpful to have a facility to play with those arguments in order
to find out whether variations of those arguments are affected, too.

Let's allow `test-run-command quote-stress-test -- <args>` to be used
for that purpose.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:53 +01:00
ad15592529 tests: add a helper to stress test argument quoting
On Windows, we have to do all the command-line argument quoting
ourselves. Worse: we have to have two versions of said quoting, one for
MSYS2 programs (which have their own dequoting rules) and the rest.

We care mostly about the rest, and to make sure that that works, let's
have a stress test that comes up with all kinds of awkward arguments,
verifying that a spawned sub-process receives those unharmed.

Signed-off-by: Garima Singh <garima.singh@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:52 +01:00
a8dee3ca61 Disallow dubiously-nested submodule git directories
Currently it is technically possible to let a submodule's git
directory point right into the git dir of a sibling submodule.

Example: the git directories of two submodules with the names `hippo`
and `hippo/hooks` would be `.git/modules/hippo/` and
`.git/modules/hippo/hooks/`, respectively, but the latter is already
intended to house the former's hooks.

In most cases, this is just confusing, but there is also a (quite
contrived) attack vector where Git can be fooled into mistaking remote
content for file contents it wrote itself during a recursive clone.

Let's plug this bug.

To do so, we introduce the new function `validate_submodule_git_dir()`
which simply verifies that no git dir exists for any leading directories
of the submodule name (if there are any).

Note: this patch specifically continues to allow sibling modules names
of the form `core/lib`, `core/doc`, etc, as long as `core` is not a
submodule name.

This fixes CVE-2019-1387.

Reported-by: Nicolas Joly <Nicolas.Joly@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:51 +01:00
9102f958ee protect_ntfs: turn on NTFS protection by default
Back in the DOS days, in the FAT file system, file names always
consisted of a base name of length 8 plus a file extension of length 3.
Shorter file names were simply padded with spaces to the full 8.3
format.

Later, the FAT file system was taught to support _also_ longer names,
with an 8.3 "short name" as primary file name. While at it, the same
facility allowed formerly illegal file names, such as `.git` (empty base
names were not allowed), which would have the "short name" `git~1`
associated with it.

For backwards-compatibility, NTFS supports alternative 8.3 short
filenames, too, even if starting with Windows Vista, they are only
generated on the system drive by default.

We addressed the problem that the `.git/` directory can _also_ be
accessed via `git~1/` (when short names are enabled) in 2b4c6efc82
(read-cache: optionally disallow NTFS .git variants, 2014-12-16), i.e.
since Git v1.9.5, by introducing the config setting `core.protectNTFS`
and enabling it by default on Windows.

In the meantime, Windows 10 introduced the "Windows Subsystem for Linux"
(short: WSL), i.e. a way to run Linux applications/distributions in a
thinly-isolated subsystem on Windows (giving rise to many a "2016 is the
Year of Linux on the Desktop" jokes). WSL is getting increasingly
popular, also due to the painless way Linux application can operate
directly ("natively") on files on Windows' file system: the Windows
drives are mounted automatically (e.g. `C:` as `/mnt/c/`).

Taken together, this means that we now have to enable the safe-guards of
Git v1.9.5 also in WSL: it is possible to access a `.git` directory
inside `/mnt/c/` via the 8.3 name `git~1` (unless short name generation
was disabled manually). Since regular Linux distributions run in WSL,
this means we have to enable `core.protectNTFS` at least on Linux, too.

To enable Services for Macintosh in Windows NT to store so-called
resource forks, NTFS introduced "Alternate Data Streams". Essentially,
these constitute additional metadata that are connected to (and copied
with) their associated files, and they are accessed via pseudo file
names of the form `filename:<stream-name>:<stream-type>`.

In a recent patch, we extended `core.protectNTFS` to also protect
against accesses via NTFS Alternate Data Streams, e.g. to prevent
contents of the `.git/` directory to be "tracked" via yet another
alternative file name.

While it is not possible (at least by default) to access files via NTFS
Alternate Data Streams from within WSL, the defaults on macOS when
mounting network shares via SMB _do_ allow accessing files and
directories in that way. Therefore, we need to enable `core.protectNTFS`
on macOS by default, too, and really, on any Operating System that can
mount network shares via SMB/CIFS.

A couple of approaches were considered for fixing this:

1. We could perform a dynamic NTFS check similar to the `core.symlinks`
   check in `init`/`clone`: instead of trying to create a symbolic link
   in the `.git/` directory, we could create a test file and try to
   access `.git/config` via 8.3 name and/or Alternate Data Stream.

2. We could simply "flip the switch" on `core.protectNTFS`, to make it
   "on by default".

The obvious downside of 1. is that it won't protect worktrees that were
clone with a vulnerable Git version already. We considered patching code
paths that check out files to check whether we're running on an NTFS
system dynamically and persist the result in the repository-local config
setting `core.protectNTFS`, but in the end decided that this solution
would be too fragile, and too involved.

The obvious downside of 2. is that everybody will have to "suffer" the
performance penalty incurred from calling `is_ntfs_dotgit()` on every
path, even in setups where.

After the recent work to accelerate `is_ntfs_dotgit()` in most cases,
it looks as if the time spent on validating ten million random
file names increases only negligibly (less than 20ms, well within the
standard deviation of ~50ms). Therefore the benefits outweigh the cost.

Another downside of this is that paths that might have been acceptable
previously now will be forbidden. Realistically, though, this is an
improvement because public Git hosters already would reject any `git
push` that contains such file names.

Note: There might be a similar problem mounting HFS+ on Linux. However,
this scenario has been considered unlikely and in light of the cost (in
the aforementioned benchmark, `core.protectHFS = true` increased the
time from ~440ms to ~610ms), it was decided _not_ to touch the default
of `core.protectHFS`.

This change addresses CVE-2019-1353.

Reported-by: Nicolas Joly <Nicolas.Joly@microsoft.com>
Helped-by: Garima Singh <garima.singh@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:51 +01:00
91bd46588e path: also guard .gitmodules against NTFS Alternate Data Streams
We just safe-guarded `.git` against NTFS Alternate Data Stream-related
attack vectors, and now it is time to do the same for `.gitmodules`.

Note: In the added regression test, we refrain from verifying all kinds
of variations between short names and NTFS Alternate Data Streams: as
the new code disallows _all_ Alternate Data Streams of `.gitmodules`, it
is enough to test one in order to know that all of them are guarded
against.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:51 +01:00
6d8684161e mingw: fix quoting of arguments
We need to be careful to follow proper quoting rules. For example, if an
argument contains spaces, we have to quote them. Double-quotes need to
be escaped. Backslashes need to be escaped, but only if they are
followed by a double-quote character.

We need to be _extra_ careful to consider the case where an argument
ends in a backslash _and_ needs to be quoted: in this case, we append a
double-quote character, i.e. the backslash now has to be escaped!

The current code, however, fails to recognize that, and therefore can
turn an argument that ends in a single backslash into a quoted argument
that now ends in an escaped double-quote character. This allows
subsequent command-line parameters to be split and part of them being
mistaken for command-line options, e.g. through a maliciously-crafted
submodule URL during a recursive clone.

Technically, we would not need to quote _all_ arguments which end in a
backslash _unless_ the argument needs to be quoted anyway. For example,
`test\` would not need to be quoted, while `test \` would need to be.

To keep the code simple, however, and therefore easier to reason about
and ensure its correctness, we now _always_ quote an argument that ends
in a backslash.

This addresses CVE-2019-1350.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:51 +01:00
3a85dc7d53 is_ntfs_dotgit(): speed it up
Previously, this function was written without focusing on speed,
intending to make reviewing the code as easy as possible, to avoid any
bugs in this critical code.

Turns out: we can do much better on both accounts. With this patch, we
make it as fast as this developer can make it go:

- We avoid the call to `is_dir_sep()` and make all the character
  comparisons explicit.

- We avoid the cost of calling `strncasecmp()` and unroll the test for
  `.git` and `git~1`, not even using `tolower()` because it is faster to
  compare against two constant values.

- We look for `.git` and `.git~1` first thing, and return early if not
  found.

- We also avoid calling a separate function for detecting chains of
  spaces and periods.

Each of these improvements has a noticeable impact on the speed of
`is_ntfs_dotgit()`.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:51 +01:00
7c3745fc61 path: safeguard .git against NTFS Alternate Streams Accesses
Probably inspired by HFS' resource streams, NTFS supports "Alternate
Data Streams": by appending `:<stream-name>` to the file name,
information in addition to the file contents can be written and read,
information that is copied together with the file (unless copied to a
non-NTFS location).

These Alternate Data Streams are typically used for things like marking
an executable as having just been downloaded from the internet (and
hence not necessarily being trustworthy).

In addition to a stream name, a stream type can be appended, like so:
`:<stream-name>:<stream-type>`. Unless specified, the default stream
type is `$DATA` for files and `$INDEX_ALLOCATION` for directories. In
other words, `.git::$INDEX_ALLOCATION` is a valid way to reference the
`.git` directory!

In our work in Git v2.2.1 to protect Git on NTFS drives under
`core.protectNTFS`, we focused exclusively on NTFS short names, unaware
of the fact that NTFS Alternate Data Streams offer a similar attack
vector.

Let's fix this.

Seeing as it is better to be safe than sorry, we simply disallow paths
referring to *any* NTFS Alternate Data Stream of `.git`, not just
`::$INDEX_ALLOCATION`. This also simplifies the implementation.

This closes CVE-2019-1352.

Further reading about NTFS Alternate Data Streams:
https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-fscc/c54dec26-1551-4d3a-a0ea-4fa40f848eb3

Reported-by: Nicolas Joly <Nicolas.Joly@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:50 +01:00
288a74bcd2 is_ntfs_dotgit(): only verify the leading segment
The config setting `core.protectNTFS` is specifically designed to work
not only on Windows, but anywhere, to allow for repositories hosted on,
say, Linux servers to be protected against NTFS-specific attack vectors.

As a consequence, `is_ntfs_dotgit()` manually splits backslash-separated
paths (but does not do the same for paths separated by forward slashes),
under the assumption that the backslash might not be a valid directory
separator on the _current_ Operating System.

However, the two callers, `verify_path()` and `fsck_tree()`, are
supposed to feed only individual path segments to the `is_ntfs_dotgit()`
function.

This causes a lot of duplicate scanning (and very inefficient scanning,
too, as the inner loop of `is_ntfs_dotgit()` was optimized for
readability rather than for speed.

Let's simplify the design of `is_ntfs_dotgit()` by putting the burden of
splitting the paths by backslashes as directory separators on the
callers of said function.

Consequently, the `verify_path()` function, which already splits the
path by directory separators, now treats backslashes as directory
separators _explicitly_ when `core.protectNTFS` is turned on, even on
platforms where the backslash is _not_ a directory separator.

Note that we have to repeat some code in `verify_path()`: if the
backslash is not a directory separator on the current Operating System,
we want to allow file names like `\`, but we _do_ want to disallow paths
that are clearly intended to cause harm when the repository is cloned on
Windows.

The `fsck_tree()` function (the other caller of `is_ntfs_dotgit()`) now
needs to look for backslashes in tree entries' names specifically when
`core.protectNTFS` is turned on. While it would be tempting to
completely disallow backslashes in that case (much like `fsck` reports
names containing forward slashes as "full paths"), this would be
overzealous: when `core.protectNTFS` is turned on in a non-Windows
setup, backslashes are perfectly valid characters in file names while we
_still_ want to disallow tree entries that are clearly designed to
exploit NTFS-specific behavior.

This simplification will make subsequent changes easier to implement,
such as turning `core.protectNTFS` on by default (not only on Windows)
or protecting against attack vectors involving NTFS Alternate Data
Streams.

Incidentally, this change allows for catching malicious repositories
that contain tree entries of the form `dir\.gitmodules` already on the
server side rather than only on the client side (and previously only on
Windows): in contrast to `is_ntfs_dotgit()`, the
`is_ntfs_dotgitmodules()` function already expects the caller to split
the paths by directory separators.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:50 +01:00
a62f9d1ace test-path-utils: offer to run a protectNTFS/protectHFS benchmark
In preparation to flipping the default on `core.protectNTFS`, let's have
some way to measure the speed impact of this config setting reliably
(and for comparison, the `core.protectHFS` config setting).

For now, this is a manual performance benchmark:

	./t/helper/test-path-utils protect_ntfs_hfs [arguments...]

where the arguments are an optional number of file names to test with,
optionally followed by minimum and maximum length of the random file
names. The default values are one million, 3 and 20, respectively.

Just like `sqrti()` in `bisect.c`, we introduce a very simple function
to approximation the square root of a given value, in order to avoid
having to introduce the first user of `<math.h>` in Git's source code.

Note: this is _not_ implemented as a Unix shell script in t/perf/
because we really care about _very_ precise timings here, and Unix shell
scripts are simply unsuited for precise and consistent benchmarking.

Signed-off-by: Garima Singh <garima.singh@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-05 15:36:40 +01:00
4778452597 Merge branch 'prevent-name-squatting-on-windows'
This patch series fixes an issue where Git could formerly have been
tricked into creating a `.git` file with an unexpected (and therefore
unprotected) NTFS short name.

Incidentally, it also fixes an issue where a tree entry containing a
backslash could be tricked into following a symbolic link, i.e. Git
could be tricked into writing files outside the worktree.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-04 13:23:22 +01:00
a7b1ad3b05 Merge branch 'jk/fast-import-unsafe'
The `--export-marks` option of `git fast-import` is exposed also via the
in-stream command `feature export-marks=...` and it allows overwriting
arbitrary paths.

This topic branch prevents the in-stream version, to prevent arbitrary
file accesses by `git fast-import` streams coming from untrusted sources
(e.g. in remote helpers that are based on `git fast-import`).

This fixes CVE-2019-1348.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-04 13:23:22 +01:00
525e7fba78 path.c: document the purpose of is_ntfs_dotgit()
Previously, this function was completely undocumented. It is worth,
though, to explain what is going on, as it is not really obvious at all.

Suggested-by: Garima Singh <garima.singh@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-04 13:20:05 +01:00
e1d911dd4c mingw: disallow backslash characters in tree objects' file names
The backslash character is not a valid part of a file name on Windows.
Hence it is dangerous to allow writing files that were unpacked from
tree objects, when the stored file name contains a backslash character:
it will be misinterpreted as directory separator.

This not only causes ambiguity when a tree contains a blob `a\b` and a
tree `a` that contains a blob `b`, but it also can be used as part of an
attack vector to side-step the careful protections against writing into
the `.git/` directory during a clone of a maliciously-crafted
repository.

Let's prevent that, addressing CVE-2019-1354.

Note: we guard against backslash characters in tree objects' file names
_only_ on Windows (because on other platforms, even on those where NTFS
volumes can be mounted, the backslash character is _not_ a directory
separator), and _only_ when `core.protectNTFS = true` (because users
might need to generate tree objects for other platforms, of course
without touching the worktree, e.g. using `git update-index
--cacheinfo`).

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-04 13:20:05 +01:00
0060fd1511 clone --recurse-submodules: prevent name squatting on Windows
In addition to preventing `.git` from being tracked by Git, on Windows
we also have to prevent `git~1` from being tracked, as the default NTFS
short name (also known as the "8.3 filename") for the file name `.git`
is `git~1`, otherwise it would be possible for malicious repositories to
write directly into the `.git/` directory, e.g. a `post-checkout` hook
that would then be executed _during_ a recursive clone.

When we implemented appropriate protections in 2b4c6efc82 (read-cache:
optionally disallow NTFS .git variants, 2014-12-16), we had analyzed
carefully that the `.git` directory or file would be guaranteed to be
the first directory entry to be written. Otherwise it would be possible
e.g. for a file named `..git` to be assigned the short name `git~1` and
subsequently, the short name generated for `.git` would be `git~2`. Or
`git~3`. Or even `~9999999` (for a detailed explanation of the lengths
we have to go to protect `.gitmodules`, see the commit message of
e7cb0b4455 (is_ntfs_dotgit: match other .git files, 2018-05-11)).

However, by exploiting two issues (that will be addressed in a related
patch series close by), it is currently possible to clone a submodule
into a non-empty directory:

- On Windows, file names cannot end in a space or a period (for
  historical reasons: the period separating the base name from the file
  extension was not actually written to disk, and the base name/file
  extension was space-padded to the full 8/3 characters, respectively).
  Helpfully, when creating a directory under the name, say, `sub.`, that
  trailing period is trimmed automatically and the actual name on disk
  is `sub`.

  This means that while Git thinks that the submodule names `sub` and
  `sub.` are different, they both access `.git/modules/sub/`.

- While the backslash character is a valid file name character on Linux,
  it is not so on Windows. As Git tries to be cross-platform, it
  therefore allows backslash characters in the file names stored in tree
  objects.

  Which means that it is totally possible that a submodule `c` sits next
  to a file `c\..git`, and on Windows, during recursive clone a file
  called `..git` will be written into `c/`, of course _before_ the
  submodule is cloned.

Note that the actual exploit is not quite as simple as having a
submodule `c` next to a file `c\..git`, as we have to make sure that the
directory `.git/modules/b` already exists when the submodule is checked
out, otherwise a different code path is taken in `module_clone()` that
does _not_ allow a non-empty submodule directory to exist already.

Even if we will address both issues nearby (the next commit will
disallow backslash characters in tree entries' file names on Windows,
and another patch will disallow creating directories/files with trailing
spaces or periods), it is a wise idea to defend in depth against this
sort of attack vector: when submodules are cloned recursively, we now
_require_ the directory to be empty, addressing CVE-2019-1349.

Note: the code path we patch is shared with the code path of `git
submodule update --init`, which must not expect, in general, that the
directory is empty. Hence we have to introduce the new option
`--force-init` and hand it all the way down from `git submodule` to the
actual `git submodule--helper` process that performs the initial clone.

Reported-by: Nicolas Joly <Nicolas.Joly@microsoft.com>
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
2019-12-04 13:20:05 +01:00
a52ed76142 fast-import: disallow "feature import-marks" by default
As with export-marks in the previous commit, import-marks can access the
filesystem. This is significantly less dangerous than export-marks
because it only involves reading from arbitrary paths, rather than
writing them. However, it could still be surprising and have security
implications (e.g., exfiltrating data from a service that accepts
fast-import streams).

Let's lump it (and its "if-exists" counterpart) in with export-marks,
and enable the in-stream version only if --allow-unsafe-features is set.

Signed-off-by: Jeff King <peff@peff.net>
2019-12-04 13:20:04 +01:00
68061e3470 fast-import: disallow "feature export-marks" by default
The fast-import stream command "feature export-marks=<path>" lets the
stream write marks to an arbitrary path. This may be surprising if you
are running fast-import against an untrusted input (which otherwise
cannot do anything except update Git objects and refs).

Let's disallow the use of this feature by default, and provide a
command-line option to re-enable it (you can always just use the
command-line --export-marks as well, but the in-stream version provides
an easy way for exporters to control the process).

This is a backwards-incompatible change, since the default is flipping
to the new, safer behavior. However, since the main users of the
in-stream versions would be import/export-based remote helpers, and
since we trust remote helpers already (which are already running
arbitrary code), we'll pass the new option by default when reading a
remote helper's stream. This should minimize the impact.

Note that the implementation isn't totally simple, as we have to work
around the fact that fast-import doesn't parse its command-line options
until after it has read any "feature" lines from the stream. This is how
it lets command-line options override in-stream. But in our case, it's
important to parse the new --allow-unsafe-features first.

There are three options for resolving this:

  1. Do a separate "early" pass over the options. This is easy for us to
     do because there are no command-line options that allow the
     "unstuck" form (so there's no chance of us mistaking an argument
     for an option), though it does introduce a risk of incorrect
     parsing later (e.g,. if we convert to parse-options).

  2. Move the option parsing phase back to the start of the program, but
     teach the stream-reading code never to override an existing value.
     This is tricky, because stream "feature" lines override each other
     (meaning we'd have to start tracking the source for every option).

  3. Accept that we might parse a "feature export-marks" line that is
     forbidden, as long we don't _act_ on it until after we've parsed
     the command line options.

     This would, in fact, work with the current code, but only because
     the previous patch fixed the export-marks parser to avoid touching
     the filesystem.

     So while it works, it does carry risk of somebody getting it wrong
     in the future in a rather subtle and unsafe way.

I've gone with option (1) here as simple, safe, and unlikely to cause
regressions.

This fixes CVE-2019-1348.

Signed-off-by: Jeff King <peff@peff.net>
2019-12-04 13:20:04 +01:00
019683025f fast-import: delay creating leading directories for export-marks
When we parse the --export-marks option, we don't immediately open the
file, but we do create any leading directories. This can be especially
confusing when a command-line option overrides an in-stream one, in
which case we'd create the leading directory for the in-stream file,
even though we never actually write the file.

Let's instead create the directories just before opening the file, which
means we'll create only useful directories. Note that this could change
the handling of relative paths if we chdir() in between, but we don't
actually do so; the only permanent chdir is from setup_git_directory()
which runs before either code path (potentially we should take the
pre-setup dir into account to avoid surprising the user, but that's an
orthogonal change).

The test just adapts the existing "override" test to use paths with
leading directories. This checks both that the correct directory is
created (which worked before but was not tested), and that the
overridden one is not (our new fix here).

While we're here, let's also check the error result of
safe_create_leading_directories(). We'd presumably notice any failure
immediately after when we try to open the file itself, but we can give a
more specific error message in this case.

Signed-off-by: Jeff King <peff@peff.net>
2019-12-04 13:20:04 +01:00
e075dba372 fast-import: stop creating leading directories for import-marks
When asked to import marks from "subdir/file.marks", we create the
leading directory "subdir" if it doesn't exist. This makes no sense for
importing marks, where we only ever open the path for reading.

Most of the time this would be a noop, since if the marks file exists,
then the leading directories exist, too. But if it doesn't (e.g.,
because --import-marks-if-exists was used), then we'd create the useless
directory.

This dates back to 580d5f83e7 (fast-import: always create marks_file
directories, 2010-03-29). Even then it was useless, so it seems to have
been added in error alongside the --export-marks case (which _is_
helpful).

Signed-off-by: Jeff King <peff@peff.net>
2019-12-04 13:20:04 +01:00
11e934d56e fast-import: tighten parsing of boolean command line options
We parse options like "--max-pack-size=" using skip_prefix(), which
makes sense to get at the bytes after the "=". However, we also parse
"--quiet" and "--stats" with skip_prefix(), which allows things like
"--quiet-nonsense" to behave like "--quiet".

This was a mistaken conversion in 0f6927c229 (fast-import: put option
parsing code in separate functions, 2009-12-04). Let's tighten this to
an exact match, which was the original intent.

Signed-off-by: Jeff King <peff@peff.net>
2019-12-04 13:20:04 +01:00
816f806786 t9300: create marks files for double-import-marks test
Our tests confirm that providing two "import-marks" options in a
fast-import stream is an error. However, the invoked command would fail
even without covering this case, because the marks files themselves do
not actually exist.  Let's create the files to make sure we fail for the
right reason (we actually do, because the option parsing happens before
we open anything, but this future-proofs our test).

Signed-off-by: Jeff King <peff@peff.net>
2019-12-04 13:20:03 +01:00
f94804c1f2 t9300: drop some useless uses of cat
These waste a process, and make the line longer than it needs to be.

Signed-off-by: Jeff King <peff@peff.net>
2019-12-04 13:20:03 +01:00
859 changed files with 55700 additions and 131298 deletions

View File

@ -149,7 +149,7 @@ Cpp11BracedListStyle: false
# A list of macros that should be interpreted as foreach loops instead of as
# function calls.
ForEachMacros: ['for_each_string_list_item', 'for_each_wanted_builtin', 'for_each_builtin', 'for_each_ut']
ForEachMacros: ['for_each_string_list_item']
# The maximum number of consecutive empty lines to keep.
MaxEmptyLinesToKeep: 1

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!

6
.gitignore vendored
View File

@ -1,4 +1,3 @@
/fuzz-commit-graph
/fuzz_corpora
/fuzz-pack-headers
/fuzz-pack-idx
@ -82,7 +81,7 @@
/git-init-db
/git-interpret-trailers
/git-instaweb
/git-legacy-stash
/git-legacy-rebase
/git-log
/git-ls-files
/git-ls-remote
@ -125,6 +124,7 @@
/git-rebase--am
/git-rebase--common
/git-rebase--interactive
/git-rebase--merge
/git-rebase--preserve-merges
/git-receive-pack
/git-reflog
@ -135,6 +135,7 @@
/git-remote-ftps
/git-remote-fd
/git-remote-ext
/git-remote-testgit
/git-remote-testpy
/git-remote-testsvn
/git-repack
@ -228,4 +229,3 @@
*.pdb
/Debug/
/Release/
*.dSYM

View File

@ -27,7 +27,6 @@ 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>
@ -40,8 +39,6 @@ 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>

View File

@ -8,8 +8,6 @@ os:
- linux
- osx
osx_image: xcode10.1
compiler:
- clang
- gcc
@ -21,6 +19,16 @@ matrix:
compiler:
addons:
before_install:
- env: jobname=Windows
os: linux
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:

View File

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

View File

@ -580,14 +580,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
@ -97,13 +89,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
@ -334,15 +324,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
@ -352,14 +333,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 $@+ $@
@ -367,16 +347,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 $@+ $@
@ -386,8 +366,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
@ -444,7 +423,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) - >$@+ && \
@ -478,9 +457,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

View File

@ -0,0 +1,54 @@
Git v2.14.6 Release Notes
=========================
This release addresses 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.
Fixes since v2.14.5
-------------------
* CVE-2019-1348:
The --export-marks option of git fast-import is exposed also via
the in-stream command feature export-marks=... and it allows
overwriting arbitrary paths.
* CVE-2019-1349:
When submodules are cloned recursively, under certain circumstances
Git could be fooled into using the same Git directory twice. We now
require the directory to be empty.
* CVE-2019-1350:
Incorrect quoting of command-line arguments allowed remote code
execution during a recursive clone in conjunction with SSH URLs.
* CVE-2019-1351:
While the only permitted drive letters for physical drives on
Windows are letters of the US-English alphabet, this restriction
does not apply to virtual drives assigned via subst <letter>:
<path>. Git mistook such paths for relative paths, allowing writing
outside of the worktree while cloning.
* CVE-2019-1352:
Git was unaware of NTFS Alternate Data Streams, allowing files
inside the .git/ directory to be overwritten during a clone.
* CVE-2019-1353:
When running Git in the Windows Subsystem for Linux (also known as
"WSL") while accessing a working directory on a regular Windows
drive, none of the NTFS protections were active.
* CVE-2019-1354:
Filenames on Linux/Unix can contain backslashes. On Windows,
backslashes are directory separators. Git did not use to refuse to
write out tracked files with such filenames.
* CVE-2019-1387:
Recursive clones are currently affected by a vulnerability that is
caused by too-lax validation of submodule names, allowing very
targeted attacks via remote code execution in recursive clones.
Credit for finding these vulnerabilities goes to Microsoft Security
Response Center, in particular to Nicolas Joly. The `fast-import`
fixes were provided by Jeff King, the other fixes by Johannes
Schindelin with help from Garima Singh.

View File

@ -0,0 +1,11 @@
Git v2.15.4 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6 to address
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 that version for details.
In conjunction with a vulnerability that was fixed in v2.20.2,
`.gitmodules` is no longer allowed to contain entries of the form
`submodule.<name>.update=!command`.

View File

@ -0,0 +1,8 @@
Git v2.16.6 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6 and in
v2.15.4 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.

View File

@ -0,0 +1,12 @@
Git v2.17.3 Release Notes
=========================
This release merges up the fixes that appear in v2.14.6 and in
v2.15.4 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.
In addition, `git fsck` was taught to identify `.gitmodules` entries
of the form `submodule.<name>.update=!command`, which have been
disallowed in v2.15.4.

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,8 @@
Git v2.18.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.

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,8 @@
Git v2.19.3 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.

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,18 @@
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

@ -0,0 +1,5 @@
Git v2.20.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

@ -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,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

@ -372,15 +372,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 Pat Thoyts:
- 'git-gui/' comes from git-gui project, maintained by Pat Thoyts:
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

@ -11,12 +11,12 @@ module Git
def process(parent, target, attrs)
if parent.document.basebackend? 'html'
prefix = parent.document.attr('git-relative-html-prefix')
%(<a href="#{prefix}#{target}.html">#{target}(#{attrs[1]})</a>)
%(<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

View File

@ -422,8 +422,6 @@ include::config/submodule.txt[]
include::config/tag.txt[]
include::config/trace2.txt[]
include::config/transfer.txt[]
include::config/uploadarchive.txt[]

View File

@ -30,13 +30,6 @@ advice.*::
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.
statusHints::
Show directions on how to proceed from the current
state in the output of linkgit:git-status[1], in
@ -90,6 +83,4 @@ advice.*::
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.
--

View File

@ -85,9 +85,9 @@ 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 preserve, 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.
+

View File

@ -121,14 +121,11 @@ core.quotePath::
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).
files that have the `text` property set when core.autocrlf is false.
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`.
conversion.
core.safecrlf::
If true, makes Git check if converting `CRLF` is reversible when
@ -414,7 +411,7 @@ 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`.
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].
@ -429,8 +426,8 @@ core.askPass::
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
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
@ -438,10 +435,10 @@ core.attributesFile::
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`.
'$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

View File

@ -10,7 +10,7 @@ diff.autoRefreshIndex::
diff.dirstat::
A comma separated list of `--dirstat` parameters specifying the
default behavior of the `--dirstat` option to linkgit:git-diff[1]
default behavior of the `--dirstat` option to linkgit:git-diff[1]`
and friends. The defaults can be overridden on the command line
(using `--dirstat=<param1,param2,...>`). The fallback defaults
(when not changed by `diff.dirstat`) are `changes,noncumulative,3`.
@ -73,7 +73,7 @@ diff.external::
environment variable. The command is called with parameters
as described under "git Diffs" in linkgit:git[1]. Note: if
you want to use an external diff program only on a subset of
your files, you might want to use linkgit:gitattributes[5] instead.
your files, you might want to use linkgit:gitattributes[5] instead.
diff.ignoreSubmodules::
Sets the default value of --ignore-submodules. Note that this

View File

@ -23,9 +23,9 @@ When `fsck.<msg-id>` is set, errors can be switched to warnings and
vice versa by configuring the `fsck.<msg-id>` setting where the
`<msg-id>` is the fsck message ID and the value is one of `error`,
`warn` or `ignore`. For convenience, fsck prefixes the error/warning
with the message ID, e.g. "missingEmail: invalid author/committer
line - missing email" means that setting `fsck.missingEmail = ignore`
will hide that issue.
with the message ID, e.g. "missingEmail: invalid author/committer line
- missing email" means that setting `fsck.missingEmail = ignore` will
hide that issue.
+
In general, it is better to enumerate existing objects with problems
with `fsck.skipList`, instead of listing the kind of breakages these

View File

@ -1,42 +1,25 @@
gc.aggressiveDepth::
The depth parameter used in the delta compression
algorithm used by 'git gc --aggressive'. This defaults
to 50, which is the default for the `--depth` option when
`--aggressive` isn't in use.
+
See the documentation for the `--depth` option in
linkgit:git-repack[1] for more details.
to 50.
gc.aggressiveWindow::
The window size parameter used in the delta compression
algorithm used by 'git gc --aggressive'. This defaults
to 250, which is a much more aggressive window size than
the default `--window` of 10.
+
See the documentation for the `--window` option in
linkgit:git-repack[1] for more details.
to 250.
gc.auto::
When there are approximately more than this many loose
objects in the repository, `git gc --auto` will pack them.
Some Porcelain commands use this command to perform a
light-weight garbage collection from time to time. The
default value is 6700.
+
Setting this to 0 disables not only automatic packing based on the
number of loose objects, but any other heuristic `git gc --auto` will
otherwise use to determine if there's work to do, such as
`gc.autoPackLimit`.
default value is 6700. Setting this to 0 disables it.
gc.autoPackLimit::
When there are more than this many packs that are not
marked with `*.keep` file in the repository, `git gc
--auto` consolidates them into one larger pack. The
default value is 50. Setting this to 0 disables it.
Setting `gc.auto` to 0 will also disable this.
+
See the `gc.bigPackThreshold` configuration variable below. When in
use, it'll affect how the auto pack limit works.
default value is 50. Setting this to 0 disables it.
gc.autoDetach::
Make `git gc --auto` return immediately and run in background
@ -53,16 +36,11 @@ Note that if the number of kept packs is more than gc.autoPackLimit,
this configuration variable is ignored, all packs except the base pack
will be repacked. After this the number of packs should go below
gc.autoPackLimit and gc.bigPackThreshold should be respected again.
+
If the amount of memory estimated for `git repack` to run smoothly is
not available and `gc.bigPackThreshold` is not set, the largest pack
will also be excluded (this is the equivalent of running `git gc` with
`--keep-base-pack`).
gc.writeCommitGraph::
If true, then gc will rewrite the commit-graph file when
linkgit:git-gc[1] is run. When using `git gc --auto`
the commit-graph will be updated if housekeeping is
linkgit:git-gc[1] is run. When using linkgit:git-gc[1]
'--auto' the commit-graph will be updated if housekeeping is
required. Default is false. See linkgit:git-commit-graph[1]
for details.
@ -116,12 +94,6 @@ gc.<pattern>.reflogExpireUnreachable::
With "<pattern>" (e.g. "refs/stash")
in the middle, the setting applies only to the refs that
match the <pattern>.
+
These types of entries are generally created as a result of using `git
commit --amend` or `git rebase` and are the commits prior to the amend
or rebase occurring. Since these changes are not part of the current
project most users will want to expire them sooner, which is why the
default is more aggressive than `gc.reflogExpire`.
gc.rerereResolved::
Records of conflicted merge you resolved earlier are

View File

@ -16,5 +16,5 @@ gpg.format::
gpg.<format>.program::
Use this to customize the program used for the signing format you
chose. (see `gpg.program` and `gpg.format`) `gpg.program` can still
be used as a legacy synonym for `gpg.openpgp.program`. The default
be used as a legacy synonym for `gpg.openpgp.program`. The default
value for `gpg.x509.program` is "gpgsm".

View File

@ -68,15 +68,6 @@ http.saveCookies::
If set, store cookies received during requests to the file specified by
http.cookieFile. Has no effect if http.cookieFile is unset.
http.version::
Use the specified HTTP protocol version when communicating with a server.
If you want to force the default. The available and default version depend
on libcurl. Actually the possible values of
this option are:
- HTTP/2
- HTTP/1.1
http.sslVersion::
The SSL version to use when negotiating an SSL connection, if you
want to force the default. The available and default version

View File

@ -39,22 +39,9 @@ merge.renameLimit::
is turned off.
merge.renames::
Whether Git detects renames. If set to "false", rename detection
is disabled. If set to "true", basic rename detection is enabled.
Defaults to the value of diff.renames.
merge.directoryRenames::
Whether Git detects directory renames, affecting what happens at
merge time to new files added to a directory on one side of
history when that directory was renamed on the other side of
history. If merge.directoryRenames is set to "false", directory
rename detection is disabled, meaning that such new files will be
left behind in the old directory. If set to "true", directory
rename detection is enabled, meaning that such new files will be
moved into the new directory. If set to "conflict", a conflict
will be reported for such paths. If merge.renames is false,
merge.directoryRenames is ignored and treated as false. Defaults
to "conflict".
Whether and how Git detects renames. If set to "false",
rename detection is disabled. If set to "true", basic rename
detection is enabled. Defaults to the value of diff.renames.
merge.renormalize::
Tell Git that canonical representation of files in the

View File

@ -105,15 +105,6 @@ pack.useBitmaps::
true. You should not generally need to turn this off unless
you are debugging pack bitmaps.
pack.useSparse::
When true, git will default to using the '--sparse' option in
'git pack-objects' when the '--revs' option is present. This
algorithm only walks trees that appear in paths that introduce new
objects. This can have significant performance benefits when
computing a pack to send a small change. However, it is possible
that extra objects are added to the pack-file if the included
commits contain certain types of direct renames.
pack.writeBitmaps (deprecated)::
This is a deprecated synonym for `repack.writeBitmaps`.
@ -124,4 +115,6 @@ pack.writeBitmapHashCache::
bitmapped and non-bitmapped objects (e.g., when serving a fetch
between an older, bitmapped pack and objects that have been
pushed since the last gc). The downside is that it consumes 4
bytes per object of disk space. Defaults to true.
bytes per object of disk space, and that JGit's bitmap
implementation does not understand it, causing it to complain if
Git and JGit are used on the same repository. Defaults to false.

View File

@ -18,9 +18,9 @@ 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 preserve, 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.
+

View File

@ -1,9 +1,16 @@
rebase.useBuiltin::
Unused configuration variable. Used in Git versions 2.20 and
2.21 as an escape hatch to enable the legacy shellscript
implementation of rebase. Now the built-in rewrite of it in C
is always used. Setting this will emit a warning, to alert any
remaining users that setting this now does nothing.
Set to `false` to use the legacy shellscript implementation of
linkgit:git-rebase[1]. Is `true` by default, which means use
the built-in rewrite of it in C.
+
The C rewrite is first included with Git version 2.20. This option
serves an an escape hatch to re-enable the legacy version in case any
bugs are found in the rewrite. This option and the shellscript version
of linkgit:git-rebase[1] will be removed in some future release.
+
If you find some reason to set this option to `false` other than
one-off testing you should report the behavior difference as a bug in
git.
rebase.stat::
Whether to show a diffstat of what changed upstream since the last
@ -57,8 +64,3 @@ instead of:
-------------------------------------------
+
Defaults to false.
rebase.rescheduleFailedExec::
Automatically reschedule `exec` commands that failed. This only makes
sense in interactive mode (or when an `--exec` option was provided).
This is the same as specifying the `--reschedule-failed-exec` option.

View File

@ -24,4 +24,4 @@ repack.writeBitmaps::
packs created for clones and fetches, at the cost of some disk
space and extra time spent on the initial repack. This has
no effect if multiple packfiles are created.
Defaults to true on bare repos, false otherwise.
Defaults to false.

View File

@ -1,18 +1,3 @@
stash.useBuiltin::
Set to `false` to use the legacy shell script implementation of
linkgit:git-stash[1]. Is `true` by default, which means use
the built-in rewrite of it in C.
+
The C rewrite is first included with Git version 2.22 (and Git for Windows
version 2.19). This option serves an an escape hatch to re-enable the
legacy version in case any bugs are found in the rewrite. This option and
the shell script version of linkgit:git-stash[1] will be removed in some
future release.
+
If you find some reason to set this option to `false`, other than
one-off testing, you should report the behavior difference as a bug in
Git (see https://git-scm.com/community for details).
stash.showPatch::
If this is set to true, the `git stash show` command without an
option will show the stash entry in patch form. Defaults to false.

View File

@ -1,56 +0,0 @@
Trace2 config settings are only read from the system and global
config files; repository local and worktree config files and `-c`
command line arguments are not respected.
trace2.normalTarget::
This variable controls the normal target destination.
It may be overridden by the `GIT_TRACE2` environment variable.
The following table shows possible values.
trace2.perfTarget::
This variable controls the performance target destination.
It may be overridden by the `GIT_TRACE2_PERF` environment variable.
The following table shows possible values.
trace2.eventTarget::
This variable controls the event target destination.
It may be overridden by the `GIT_TRACE2_EVENT` environment variable.
The following table shows possible values.
+
include::../trace2-target-values.txt[]
trace2.normalBrief::
Boolean. When true `time`, `filename`, and `line` fields are
omitted from normal output. May be overridden by the
`GIT_TRACE2_BRIEF` environment variable. Defaults to false.
trace2.perfBrief::
Boolean. When true `time`, `filename`, and `line` fields are
omitted from PERF output. May be overridden by the
`GIT_TRACE2_PERF_BRIEF` environment variable. Defaults to false.
trace2.eventBrief::
Boolean. When true `time`, `filename`, and `line` fields are
omitted from event output. May be overridden by the
`GIT_TRACE2_EVENT_BRIEF` environment variable. Defaults to false.
trace2.eventNesting::
Integer. Specifies desired depth of nested regions in the
event output. Regions deeper than this value will be
omitted. May be overridden by the `GIT_TRACE2_EVENT_NESTING`
environment variable. Defaults to 2.
trace2.configParams::
A comma-separated list of patterns of "important" config
settings that should be recorded in the trace2 output.
For example, `core.*,remote.*.url` would cause the trace2
output to contain events listing each configured remote.
May be overridden by the `GIT_TRACE2_CONFIG_PARAMS` environment
variable. Unset by default.
trace2.destinationDebug::
Boolean. When true Git will print error messages when a
trace target destination cannot be opened for writing.
By default, these errors are suppressed and tracing is
silently disabled. May be overridden by the
`GIT_TRACE2_DST_DEBUG` environment variable.

View File

@ -1,19 +1,12 @@
user.name::
user.email::
author.name::
author.email::
committer.name::
committer.email::
The `user.name` and `user.email` variables determine what ends
up in the `author` and `committer` field of commit
objects.
If you need the `author` or `committer` to be different, the
`author.name`, `author.email`, `committer.name` or
`committer.email` variables can be set.
Also, all of these can be overridden by the `GIT_AUTHOR_NAME`,
`GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_NAME`,
`GIT_COMMITTER_EMAIL` and `EMAIL` environment variables.
See linkgit:git-commit-tree[1] for more information.
Your email address to be recorded in any newly created commits.
Can be overridden by the `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_EMAIL`, and
`EMAIL` environment variables. See linkgit:git-commit-tree[1].
user.name::
Your full name to be recorded in any newly created commits.
Can be overridden by the `GIT_AUTHOR_NAME` and `GIT_COMMITTER_NAME`
environment variables. See linkgit:git-commit-tree[1].
user.useConfigOnly::
Instruct Git to avoid trying to guess defaults for `user.email`

View File

@ -1,6 +1,6 @@
worktree.guessRemote::
If no branch is specified and neither `-b` nor `-B` nor
`--detach` is used, then `git worktree add` defaults to
With `add`, if no branch argument, and neither of `-b` nor
`-B` nor `--detach` are given, the command defaults to
creating a new branch from HEAD. If `worktree.guessRemote` is
set to true, `worktree add` tries to find a remote-tracking
branch whose name uniquely matches the new branch name. If

View File

@ -95,26 +95,12 @@ from the format described above in the following way:
. there are more "src" modes and "src" sha1
. status is concatenated status characters for each parent
. no optional "score" number
. tab-separated pathname(s) of the file
. single path, only for "dst"
For `-c` and `--cc`, only the destination or final path is shown even
if the file was renamed on any side of history. With
`--combined-all-paths`, the name of the path in each parent is shown
followed by the name of the path in the merge commit.
Examples for `-c` and `--cc` without `--combined-all-paths`:
------------------------------------------------
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR phooey.c
------------------------------------------------
Examples when `--combined-all-paths` added to either `-c` or `--cc`:
Example:
------------------------------------------------
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM desc.c desc.c desc.c
::100755 100755 100755 52b7a2d 6d1ac04 d2ac7d7 RM foo.sh bar.sh bar.sh
::100644 100644 100644 e07d6c5 9042e82 ee91881 RR fooey.c fuey.c phooey.c
::100644 100644 100644 fabadb8 cc95eb0 4866510 MM describe.c
------------------------------------------------
Note that 'combined diff' lists only files which were modified from

View File

@ -143,19 +143,6 @@ copying detection) are designed to work with diff of two
Similar to two-line header for traditional 'unified' diff
format, `/dev/null` is used to signal created or deleted
files.
+
However, if the --combined-all-paths option is provided, instead of a
two-line from-file/to-file you get a N+1 line from-file/to-file header,
where N is the number of parents in the merge commit
--- a/file
--- a/file
--- a/file
+++ b/file
+
This extended format can be useful if rename or copy detection is
active, to allow you to see the original name of the file in different
parents.
4. Chunk header format is modified to prevent people from
accidentally feeding it to `patch -p1`. Combined diff format

View File

@ -36,21 +36,11 @@ endif::git-format-patch[]
-U<n>::
--unified=<n>::
Generate diffs with <n> lines of context instead of
the usual three. Implies `--patch`.
the usual three.
ifndef::git-format-patch[]
Implies `-p`.
endif::git-format-patch[]
--output=<file>::
Output to a specific file instead of stdout.
--output-indicator-new=<char>::
--output-indicator-old=<char>::
--output-indicator-context=<char>::
Specify the character used to indicate new, old or context
lines in the generated patch. Normally they are '+', '-' and
' ' respectively.
ifndef::git-format-patch[]
--raw::
ifndef::git-log[]
@ -158,7 +148,6 @@ These parameters can also be set individually with `--stat-width=<width>`,
number of modified files, as well as number of added and deleted
lines.
-X[<param1,param2,...>]::
--dirstat[=<param1,param2,...>]::
Output the distribution of relative amount of changes for each
sub-directory. The behavior of `--dirstat` can be customized by
@ -203,12 +192,6 @@ directories with less than 10% of the total amount of changed files,
and accumulating child directory counts in the parent directories:
`--dirstat=files,10,cumulative`.
--cumulative::
Synonym for --dirstat=cumulative
--dirstat-by-file[=<param1,param2>...]::
Synonym for --dirstat=files,param1,param2...
--summary::
Output a condensed summary of extended header information
such as creations, renames and mode changes.
@ -310,12 +293,8 @@ dimmed-zebra::
`dimmed_zebra` is a deprecated synonym.
--
--no-color-moved::
Turn off move detection. This can be used to override configuration
settings. It is the same as `--color-moved=no`.
--color-moved-ws=<modes>::
This configures how whitespace is ignored when performing the
This configures how white spaces are ignored when performing the
move detection for `--color-moved`.
ifdef::git-diff[]
It can be set by the `diff.colorMovedWS` configuration setting.
@ -323,8 +302,6 @@ endif::git-diff[]
These modes can be given as a comma separated list:
+
--
no::
Do not ignore whitespace when performing move detection.
ignore-space-at-eol::
Ignore changes in whitespace at EOL.
ignore-space-change::
@ -335,17 +312,12 @@ ignore-all-space::
Ignore whitespace when comparing lines. This ignores differences
even if one line has whitespace where the other line has none.
allow-indentation-change::
Initially ignore any whitespace in the move detection, then
Initially ignore any white spaces in the move detection, then
group the moved code blocks only into a block if the change in
whitespace is the same per line. This is incompatible with the
other modes.
--
--no-color-moved-ws::
Do not ignore whitespace when performing move detection. This can be
used to override configuration settings. It is the same as
`--color-moved-ws=no`.
--word-diff[=<mode>]::
Show a word diff, using the <mode> to delimit changed words.
By default, words are delimited by whitespace; see
@ -403,9 +375,6 @@ endif::git-format-patch[]
Turn off rename detection, even when the configuration
file gives the default to do so.
--[no-]rename-empty::
Whether to use empty blobs as rename source.
ifndef::git-format-patch[]
--check::
Warn if changes introduce conflict markers or whitespace errors.
@ -436,7 +405,7 @@ endif::git-format-patch[]
--binary::
In addition to `--full-index`, output a binary diff that
can be applied with `git-apply`. Implies `--patch`.
can be applied with `git-apply`.
--abbrev[=<n>]::
Instead of showing the full 40-byte hexadecimal object
@ -555,8 +524,6 @@ struct), and want to know the history of that block since it first
came into being: use the feature iteratively to feed the interesting
block in the preimage back into `-S`, and keep going until you get the
very first version of the block.
+
Binary files are searched as well.
-G<regex>::
Look for differences whose patch text contains added/removed
@ -576,9 +543,6 @@ While `git log -G"regexec\(regexp"` will show this commit, `git log
-S"regexec\(regexp" --pickaxe-regex` will not (because the number of
occurrences of that string did not change).
+
Unless `--text` is supplied patches of binary files without a textconv
filter will be ignored.
+
See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
information.

View File

@ -12,16 +12,9 @@ OPTIONS_SPEC="\
doc-diff [options] <from> <to> [-- <diff-options>]
doc-diff (-c|--clean)
--
j=n parallel argument to pass to make
f force rebuild; do not rely on cached results
c,clean cleanup temporary working files
from-asciidoc use asciidoc with the 'from'-commit
from-asciidoctor use asciidoctor with the 'from'-commit
asciidoc use asciidoc with both commits
to-asciidoc use asciidoc with the 'to'-commit
to-asciidoctor use asciidoctor with the 'to'-commit
asciidoctor use asciidoctor with both commits
cut-header-footer cut away header and footer
j=n parallel argument to pass to make
f force rebuild; do not rely on cached results
c,clean cleanup temporary working files
"
SUBDIRECTORY_OK=1
. "$(git --exec-path)/git-sh-setup"
@ -29,9 +22,6 @@ SUBDIRECTORY_OK=1
parallel=
force=
clean=
from_program=
to_program=
cut_header_footer=
while test $# -gt 0
do
case "$1" in
@ -41,22 +31,6 @@ do
clean=t ;;
-f)
force=t ;;
--from-asciidoctor)
from_program=-asciidoctor ;;
--to-asciidoctor)
to_program=-asciidoctor ;;
--asciidoctor)
from_program=-asciidoctor
to_program=-asciidoctor ;;
--from-asciidoc)
from_program=-asciidoc ;;
--to-asciidoc)
to_program=-asciidoc ;;
--asciidoc)
from_program=-asciidoc
to_program=-asciidoc ;;
--cut-header-footer)
cut_header_footer=-cut-header-footer ;;
--)
shift; break ;;
*)
@ -65,7 +39,8 @@ do
shift
done
tmp="$(git rev-parse --show-toplevel)/Documentation/tmp-doc-diff" || exit 1
cd_to_toplevel
tmp=Documentation/tmp-doc-diff
if test -n "$clean"
then
@ -105,22 +80,6 @@ then
ln -s "$dots/config.mak" "$tmp/worktree/config.mak"
fi
construct_makemanflags () {
if test "$1" = "-asciidoc"
then
echo USE_ASCIIDOCTOR=
elif test "$1" = "-asciidoctor"
then
echo USE_ASCIIDOCTOR=YesPlease
fi
}
from_makemanflags=$(construct_makemanflags "$from_program") &&
to_makemanflags=$(construct_makemanflags "$to_program") &&
from_dir=$from_oid$from_program$cut_header_footer &&
to_dir=$to_oid$to_program$cut_header_footer &&
# generate_render_makefile <srcdir> <dstdir>
generate_render_makefile () {
find "$1" -type f |
@ -136,7 +95,7 @@ generate_render_makefile () {
done
}
# render_tree <committish_oid> <directory_name> <makemanflags>
# render_tree <committish_oid>
render_tree () {
# Skip install-man entirely if we already have an installed directory.
# We can't rely on make here, since "install-man" unconditionally
@ -144,44 +103,28 @@ render_tree () {
# we then can't rely on during the render step). We use "mv" to make
# sure we don't get confused by a previous run that failed partway
# through.
oid=$1 &&
dname=$2 &&
makemanflags=$3 &&
if ! test -d "$tmp/installed/$dname"
if ! test -d "$tmp/installed/$1"
then
git -C "$tmp/worktree" checkout --detach "$oid" &&
git -C "$tmp/worktree" checkout --detach "$1" &&
make -j$parallel -C "$tmp/worktree" \
$makemanflags \
GIT_VERSION=omitted \
SOURCE_DATE_EPOCH=0 \
DESTDIR="$tmp/installed/$dname+" \
DESTDIR="$PWD/$tmp/installed/$1+" \
install-man &&
mv "$tmp/installed/$dname+" "$tmp/installed/$dname"
mv "$tmp/installed/$1+" "$tmp/installed/$1"
fi &&
# As with "installed" above, we skip the render if it's already been
# done. So using make here is primarily just about running in
# parallel.
if ! test -d "$tmp/rendered/$dname"
if ! test -d "$tmp/rendered/$1"
then
generate_render_makefile "$tmp/installed/$dname" \
"$tmp/rendered/$dname+" |
generate_render_makefile "$tmp/installed/$1" "$tmp/rendered/$1+" |
make -j$parallel -f - &&
mv "$tmp/rendered/$dname+" "$tmp/rendered/$dname"
if test "$cut_header_footer" = "-cut-header-footer"
then
for f in $(find "$tmp/rendered/$dname" -type f)
do
tail -n +3 "$f" | head -n -2 |
sed -e '1{/^$/d}' -e '${/^$/d}' >"$f+" &&
mv "$f+" "$f" ||
return 1
done
fi
mv "$tmp/rendered/$1+" "$tmp/rendered/$1"
fi
}
render_tree $from_oid $from_dir $from_makemanflags &&
render_tree $to_oid $to_dir $to_makemanflags &&
git -C $tmp/rendered diff --no-index "$@" $from_dir $to_dir
render_tree $from_oid &&
render_tree $to_oid &&
git -C $tmp/rendered diff --no-index "$@" $from_oid $to_oid

View File

@ -216,8 +216,7 @@ endif::git-pull[]
--server-option=<option>::
Transmit the given string to the server when communicating using
protocol version 2. The given string must not contain a NUL or LF
character. The server's handling of server options, including
unknown ones, is server-specific.
character.
When multiple `--server-option=<option>` are given, they are all
sent to the other side in the order listed on the command line.

View File

@ -58,9 +58,9 @@ OPTIONS
specifying `dir` will record not just a file `dir/file1`
modified in the working tree, a file `dir/file2` added to
the working tree, but also a file `dir/file3` removed from
the working tree). Note that older versions of Git used
the working tree. Note that older versions of Git used
to ignore removed files; use `--no-all` option if you want
to add modified or new files but ignore removed ones.
to add modified or new files but ignore removed ones.
+
For more details about the <pathspec> syntax, see the 'pathspec' entry
in linkgit:gitglossary[7].
@ -124,7 +124,7 @@ subdirectories).
--no-ignore-removal::
Update the index not only where the working tree has a file
matching <pathspec> but also where the index already has an
entry. This adds, modifies, and removes index entries to
entry. This adds, modifies, and removes index entries to
match the working tree.
+
If no <pathspec> is given when `-A` option is used, all
@ -193,11 +193,20 @@ for "git add --no-all <pathspec>...", i.e. ignored removed files.
for command-line options).
CONFIGURATION
-------------
The optional configuration variable `core.excludesFile` indicates a path to a
file containing patterns of file names to exclude from git-add, similar to
$GIT_DIR/info/exclude. Patterns in the exclude file are used in addition to
those in info/exclude. See linkgit:gitignore[5].
EXAMPLES
--------
* Adds content from all `*.txt` files under `Documentation` directory
and its subdirectories:
and its subdirectories:
+
------------
$ git add Documentation/\*.txt

View File

@ -99,11 +99,6 @@ default. You can use `--no-utf8` to override this.
am.threeWay configuration variable. For more information,
see am.threeWay in linkgit:git-config[1].
--rerere-autoupdate::
--no-rerere-autoupdate::
Allow the rerere mechanism to update the index with the
result of auto-conflict resolution if possible.
--ignore-space-change::
--ignore-whitespace::
--whitespace=<option>::

View File

@ -9,7 +9,7 @@ SYNOPSIS
--------
[verse]
'git branch' [--color[=<when>] | --no-color] [-r | -a]
[--list] [--show-current] [-v [--abbrev=<length> | --no-abbrev]]
[--list] [-v [--abbrev=<length> | --no-abbrev]]
[--column[=<options>] | --no-column] [--sort=<key>]
[(--merged | --no-merged) [<commit>]]
[--contains [<commit]] [--no-contains [<commit>]]
@ -45,11 +45,7 @@ argument is missing it defaults to `HEAD` (i.e. the tip of the current
branch).
The command's second form creates a new branch head named <branchname>
which points to the current `HEAD`, or <start-point> if given. As a
special case, for <start-point>, you may use `"A...B"` as a shortcut for
the merge base of `A` and `B` if there is exactly one merge base. You
can leave out at most one of `A` and `B`, in which case it defaults to
`HEAD`.
which points to the current `HEAD`, or <start-point> if given.
Note that this will create the new branch, but it will not switch the
working tree to it; use "git checkout <newbranch>" to switch to the
@ -164,10 +160,6 @@ This option is only applicable in non-verbose mode.
branch --list 'maint-*'`, list only the branches that match
the pattern(s).
--show-current::
Print the name of the current branch. In detached HEAD state,
nothing is printed.
-v::
-vv::
--verbose::
@ -305,7 +297,7 @@ $ git checkout my2.6.14
------------
+
<1> This step and the next one could be combined into a single step with
"checkout -b my2.6.14 v2.6.14".
"checkout -b my2.6.14 v2.6.14".
Delete an unneeded branch::
+
@ -317,10 +309,10 @@ $ git branch -D test <2>
------------
+
<1> Delete the remote-tracking branches "todo", "html" and "man". The next
'fetch' or 'pull' will create them again unless you configure them not to.
See linkgit:git-fetch[1].
'fetch' or 'pull' will create them again unless you configure them not to.
See linkgit:git-fetch[1].
<2> Delete the "test" branch even if the "master" branch (or whichever branch
is currently checked out) does not have all commits from the test branch.
is currently checked out) does not have all commits from the test branch.
NOTES

View File

@ -23,8 +23,8 @@ In the second form, a list of objects (separated by linefeeds) is provided on
stdin, and the SHA-1, type, and size of each object is printed on stdout. The
output format can be overridden using the optional `<format>` argument. If
either `--textconv` or `--filters` was specified, the input is expected to
list the object names followed by the path name, separated by a single
whitespace, so that the appropriate drivers can be determined.
list the object names followed by the path name, separated by a single white
space, so that the appropriate drivers can be determined.
OPTIONS
-------
@ -79,7 +79,7 @@ OPTIONS
Print object information and contents for each object provided
on stdin. May not be combined with any other options or arguments
except `--textconv` or `--filters`, in which case the input lines
also need to specify the path, separated by whitespace. See the
also need to specify the path, separated by white space. See the
section `BATCH OUTPUT` below for details.
--batch-check::
@ -87,7 +87,7 @@ OPTIONS
Print object information for each object provided on stdin. May
not be combined with any other options or arguments except
`--textconv` or `--filters`, in which case the input lines also
need to specify the path, separated by whitespace. See the
need to specify the path, separated by white space. See the
section `BATCH OUTPUT` below for details.
--batch-all-objects::
@ -252,12 +252,6 @@ the repository, then `cat-file` will ignore any custom format and print:
<object> SP missing LF
------------
If a name is specified that might refer to more than one object (an ambiguous short sha), then `cat-file` will ignore any custom format and print:
------------
<object> SP ambiguous LF
------------
If --follow-symlinks is used, and a symlink in the repository points
outside the repository, then `cat-file` will ignore any custom format
and print:

View File

@ -242,8 +242,6 @@ should result in deletion of the path).
+
When checking out paths from the index, this option lets you recreate
the conflicted merge in the specified paths.
+
When switching branches with `--merge`, staged changes may be lost.
--conflict=<style>::
The same as --merge option above, but changes the way the
@ -262,9 +260,6 @@ When switching branches with `--merge`, staged changes may be lost.
This means that you can use `git checkout -p` to selectively discard
edits from your current working tree. See the ``Interactive Mode''
section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
+
Note that this option uses the no overlay mode by default (see also
`--[no-]overlay`), and currently doesn't support overlay mode.
--ignore-other-worktrees::
`git checkout` refuses when the wanted ref is already checked
@ -281,17 +276,6 @@ Note that this option uses the no overlay mode by default (see also
Just like linkgit:git-submodule[1], this will detach the
submodules HEAD.
--no-guess::
Do not attempt to create a branch if a remote tracking branch
of the same name exists.
--[no-]overlay::
In the default overlay mode, `git checkout` never
removes files from the index or the working tree. When
specifying `--no-overlay`, files that appear in the index and
working tree, but not in <tree-ish> are removed, to make them
match <tree-ish> exactly.
<branch>::
Branch to checkout; if it refers to a branch (i.e., a name that,
when prepended with "refs/heads/", is a valid ref), then that
@ -301,7 +285,7 @@ Note that this option uses the no overlay mode by default (see also
+
You can use the `"@{-N}"` syntax to refer to the N-th last
branch/commit checked out using "git checkout" operation. You may
also specify `-` which is synonymous to `"@{-1}"`.
also specify `-` which is synonymous to `"@{-1}`.
+
As a special case, you may use `"A...B"` as a shortcut for the
merge base of `A` and `B` if there is exactly one merge base. You can
@ -313,10 +297,6 @@ leave out at most one of `A` and `B`, in which case it defaults to `HEAD`.
<start_point>::
The name of a commit at which to start the new branch; see
linkgit:git-branch[1] for details. Defaults to HEAD.
+
As a special case, you may use `"A...B"` as a shortcut for the
merge base of `A` and `B` if there is exactly one merge base. You can
leave out at most one of `A` and `B`, in which case it defaults to `HEAD`.
<tree-ish>::
Tree to checkout from (when paths are given). If not specified,
@ -440,14 +420,14 @@ $ git tag foo <3>
------------
<1> creates a new branch 'foo', which refers to commit 'f', and then
updates HEAD to refer to branch 'foo'. In other words, we'll no longer
be in detached HEAD state after this command.
updates HEAD to refer to branch 'foo'. In other words, we'll no longer
be in detached HEAD state after this command.
<2> similarly creates a new branch 'foo', which refers to commit 'f',
but leaves HEAD detached.
but leaves HEAD detached.
<3> creates a new tag 'foo', which refers to commit 'f',
leaving HEAD detached.
leaving HEAD detached.
If we have moved away from commit 'f', then we must first recover its object
name (typically by using git reflog), and then we can create a reference to
@ -475,8 +455,8 @@ EXAMPLES
--------
. The following sequence checks out the `master` branch, reverts
the `Makefile` to two revisions back, deletes hello.c by
mistake, and gets it back from the index.
the `Makefile` to two revisions back, deletes hello.c by
mistake, and gets it back from the index.
+
------------
$ git checkout master <1>
@ -510,7 +490,7 @@ $ git checkout -- hello.c
------------
. After working in the wrong branch, switching to the correct
branch would be done using:
branch would be done using:
+
------------
$ git checkout mytopic
@ -538,7 +518,7 @@ registered in your index file, so `git diff` would show you what
changes you made since the tip of the new branch.
. When a merge conflict happens during switching branches with
the `-m` option, you would see something like this:
the `-m` option, you would see something like this:
+
------------
$ git checkout -m mytopic

View File

@ -57,13 +57,6 @@ OPTIONS
With this option, 'git cherry-pick' will let you edit the commit
message prior to committing.
--cleanup=<mode>::
This option determines how the commit message will be cleaned up before
being passed on to the commit machinery. See linkgit:git-commit[1] for more
details. In particular, if the '<mode>' is given a value of `scissors`,
scissors will be appended to `MERGE_MSG` before being passed on in the case
of a conflict.
-x::
When recording the commit, append a line that says
"(cherry picked from commit ...)" to the original commit
@ -155,11 +148,6 @@ effect to your index in a row.
Pass the merge strategy-specific option through to the
merge strategy. See linkgit:git-merge[1] for details.
--rerere-autoupdate::
--no-rerere-autoupdate::
Allow the rerere mechanism to update the index with the
result of auto-conflict resolution if possible.
SEQUENCER SUBCOMMANDS
---------------------
include::sequencer.txt[]
@ -225,16 +213,16 @@ $ git reset --merge ORIG_HEAD <3>
$ git cherry-pick -Xpatience topic^ <4>
------------
<1> apply the change that would be shown by `git show topic^`.
In this example, the patch does not apply cleanly, so
information about the conflict is written to the index and
working tree and no new commit results.
In this example, the patch does not apply cleanly, so
information about the conflict is written to the index and
working tree and no new commit results.
<2> summarize changes to be reconciled
<3> cancel the cherry-pick. In other words, return to the
pre-cherry-pick state, preserving any local modifications
you had in the working tree.
pre-cherry-pick state, preserving any local modifications you had in
the working tree.
<4> try to apply the change introduced by `topic^` again,
spending extra time to avoid mistakes based on incorrectly
matching context lines.
spending extra time to avoid mistakes based on incorrectly matching
context lines.
SEE ALSO
--------

View File

@ -55,13 +55,14 @@ OPTIONS
-e <pattern>::
--exclude=<pattern>::
Use the given exclude pattern in addition to the standard ignore rules
(see linkgit:gitignore[5]).
In addition to those found in .gitignore (per directory) and
$GIT_DIR/info/exclude, also consider these patterns to be in the
set of the ignore rules in effect.
-x::
Don't use the standard ignore rules (see linkgit:gitignore[5]), but
still use the ignore rules given with `-e` options from the command
line. This allows removing all untracked
Don't use the standard ignore rules read from .gitignore (per
directory) and $GIT_DIR/info/exclude, but do still use the ignore
rules given with `-e` options. This allows removing all untracked
files, including build products. This can be used (possibly in
conjunction with 'git reset') to create a pristine
working directory to test a clean build.

View File

@ -131,14 +131,6 @@ objects from the source repository into a pack in the cloned repository.
is specified. This flag forces progress status even if the
standard error stream is not directed to a terminal.
--server-option=<option>::
Transmit the given string to the server when communicating using
protocol version 2. The given string must not contain a NUL or LF
character. The server's handling of server options, including
unknown ones, is server-specific.
When multiple `--server-option=<option>` are given, they are all
sent to the other side in the order listed on the command line.
--no-checkout::
-n::
No checkout of HEAD is performed after the clone is complete.
@ -197,12 +189,6 @@ objects from the source repository into a pack in the cloned repository.
values are given for the same key, each value will be written to
the config file. This makes it safe, for example, to add
additional fetch refspecs to the origin remote.
+
Due to limitations of the current implementation, some configuration
variables do not take effect until after the initial fetch and checkout.
Configuration variables known to not take effect are:
`remote.<name>.mirror` and `remote.<name>.tagOpt`. Use the
corresponding `--mirror` and `--no-tags` options instead.
--depth <depth>::
Create a 'shallow' clone with a history truncated to the

View File

@ -47,7 +47,7 @@ OPTIONS
The number of spaces between columns. One space by default.
EXAMPLES
--------
------
Format data by columns:
------------

View File

@ -23,10 +23,6 @@ Creates a new commit object based on the provided tree object and
emits the new commit object id on stdout. The log message is read
from the standard input, unless `-m` or `-F` options are given.
The `-m` and `-F` options can be given any number of times, in any
order. The commit log message will be composed in the order in which
the options are given.
A commit object may have any number of parents. With exactly one
parent, it is an ordinary commit. Having more than one parent makes
the commit a merge between several lines of history. Initial (root)
@ -45,7 +41,7 @@ state was.
OPTIONS
-------
<tree>::
An existing tree object.
An existing tree object
-p <parent>::
Each `-p` indicates the id of a parent commit object.
@ -56,8 +52,7 @@ OPTIONS
-F <file>::
Read the commit log message from the given file. Use `-` to read
from the standard input. This can be given more than once and the
content of each file becomes its own paragraph.
from the standard input.
-S[<keyid>]::
--gpg-sign[=<keyid>]::

View File

@ -17,20 +17,16 @@ SYNOPSIS
DESCRIPTION
-----------
Create a new commit containing the current contents of the index and
the given log message describing the changes. The new commit is a
direct child of HEAD, usually the tip of the current branch, and the
branch is updated to point to it (unless no branch is associated with
the working tree, in which case HEAD is "detached" as described in
linkgit:git-checkout[1]).
Stores the current contents of the index in a new commit along
with a log message from the user describing the changes.
The content to be committed can be specified in several ways:
The content to be added can be specified in several ways:
1. by using linkgit:git-add[1] to incrementally "add" changes to the
index before using the 'commit' command (Note: even modified files
must be "added");
1. by using 'git add' to incrementally "add" changes to the
index before using the 'commit' command (Note: even modified
files must be "added");
2. by using linkgit:git-rm[1] to remove files from the working tree
2. by using 'git rm' to remove files from the working tree
and the index, again before using the 'commit' command;
3. by listing files as arguments to the 'commit' command

View File

@ -126,7 +126,7 @@ See also <<FILES>>.
--local::
For writing options: write to the repository `.git/config` file.
This is the default behavior.
This is the default behavior.
+
For reading options: read only from the repository `.git/config` rather than
from all available files.
@ -240,9 +240,7 @@ Valid `<type>`'s include:
output. The optional `default` parameter is used instead, if
there is no color configured for `name`.
+
`--type=color [--default=<default>]` is preferred over `--get-color`
(but note that `--get-color` will omit the trailing newline printed by
`--type=color`).
`--type=color [--default=<default>]` is preferred over `--get-color`.
-e::
--edit::

View File

@ -57,7 +57,7 @@ OPTIONS
This is sort of "Git root" - if you run 'git daemon' with
'--base-path=/srv/git' on example.com, then if you later try to pull
'git://example.com/hello.git', 'git daemon' will interpret the path
as `/srv/git/hello.git`.
as '/srv/git/hello.git'.
--base-path-relaxed::
If --base-path is enabled and repo lookup fails, with this option

View File

@ -139,7 +139,7 @@ at the end.
The number of additional commits is the number
of commits which would be displayed by "git log v1.0.4..parent".
The hash suffix is "-g" + unambiguous abbreviation for the tip commit
The hash suffix is "-g" + 7-char abbreviation for the tip commit
of parent (which was `2414721b194453f058079d897d13c4e377f92dc6`).
The "g" prefix stands for "git" and is used to allow describing the version of
a software depending on the SCM the software is managed with. This is useful

View File

@ -10,8 +10,8 @@ SYNOPSIS
--------
[verse]
'git diff-tree' [--stdin] [-m] [-s] [-v] [--no-commit-id] [--pretty]
[-t] [-r] [-c | --cc] [--combined-all-paths] [--root]
[<common diff options>] <tree-ish> [<tree-ish>] [<path>...]
[-t] [-r] [-c | --cc] [--root] [<common diff options>]
<tree-ish> [<tree-ish>] [<path>...]
DESCRIPTION
-----------
@ -31,7 +31,10 @@ include::diff-options.txt[]
<path>...::
If provided, the results are limited to a subset of files
matching one of the provided pathspecs.
matching one of these prefix strings.
i.e., file matches `/^<pattern1>|<pattern2>|.../`
Note that this parameter does not provide any wildcard or regexp
features.
-r::
recurse into sub-trees
@ -105,13 +108,6 @@ include::pretty-options.txt[]
itself and the commit log message is not shown, just like in any other
"empty diff" case.
--combined-all-paths::
This flag causes combined diffs (used for merge commits) to
list the name of the file from all parents. It thus only has
effect when -c or --cc are specified, and is likely only
useful if filename changes are detected (i.e. when either
rename or copy detection have been requested).
--always::
Show the commit itself and the commit log message even
if the diff itself is empty.
@ -119,6 +115,51 @@ include::pretty-options.txt[]
include::pretty-formats.txt[]
LIMITING OUTPUT
---------------
If you're only interested in differences in a subset of files, for
example some architecture-specific files, you might do:
git diff-tree -r <tree-ish> <tree-ish> arch/ia64 include/asm-ia64
and it will only show you what changed in those two directories.
Or if you are searching for what changed in just `kernel/sched.c`, just do
git diff-tree -r <tree-ish> <tree-ish> kernel/sched.c
and it will ignore all differences to other files.
The pattern is always the prefix, and is matched exactly. There are no
wildcards. Even stricter, it has to match a complete path component.
I.e. "foo" does not pick up `foobar.h`. "foo" does match `foo/bar.h`
so it can be used to name subdirectories.
An example of normal usage is:
torvalds@ppc970:~/git> git diff-tree --abbrev 5319e4
:100664 100664 ac348b... a01513... git-fsck-objects.c
which tells you that the last commit changed just one file (it's from
this one:
-----------------------------------------------------------------------------
commit 3c6f7ca19ad4043e9e72fa94106f352897e651a8
tree 5319e4d609cdd282069cc4dce33c1db559539b03
parent b4e628ea30d5ab3606119d2ea5caeab141d38df7
author Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005
committer Linus Torvalds <torvalds@ppc970.osdl.org> Sat Apr 9 12:02:30 2005
Make "git-fsck-objects" print out all the root commits it finds.
Once I do the reference tracking, I'll also make it print out all the
HEAD commits it finds, which is even more interesting.
-----------------------------------------------------------------------------
in case you care).
include::diff-format.txt[]
GIT

View File

@ -132,9 +132,9 @@ $ git diff HEAD <3>
+
<1> Changes in the working tree not yet staged for the next commit.
<2> Changes between the index and your last commit; what you
would be committing if you run "git commit" without "-a" option.
would be committing if you run "git commit" without "-a" option.
<3> Changes in the working tree since your last commit; what you
would be committing if you run "git commit -a"
would be committing if you run "git commit -a"
Comparing with arbitrary commits::
+
@ -145,10 +145,10 @@ $ git diff HEAD^ HEAD <3>
------------
+
<1> Instead of using the tip of the current branch, compare with the
tip of "test" branch.
tip of "test" branch.
<2> Instead of comparing with the tip of "test" branch, compare with
the tip of the current branch, but limit the comparison to the
file "test".
the tip of the current branch, but limit the comparison to the
file "test".
<3> Compare the version before the last commit and the last commit.
Comparing branches::
@ -162,7 +162,7 @@ $ git diff topic...master <3>
<1> Changes between the tips of the topic and the master branches.
<2> Same as above.
<3> Changes that occurred on the master branch since when the topic
branch was started off it.
branch was started off it.
Limiting the diff output::
+
@ -173,9 +173,9 @@ $ git diff arch/i386 include/asm-i386 <3>
------------
+
<1> Show only modification, rename, and copy, but not addition
or deletion.
or deletion.
<2> Show only names and the nature of change, but not actual
diff output.
diff output.
<3> Limit diff output to named subtrees.
Munging the diff output::
@ -186,7 +186,7 @@ $ git diff -R <2>
------------
+
<1> Spend extra cycles to find renames, copies and complete
rewrites (very expensive).
rewrites (very expensive).
<2> Output diff in reverse.
SEE ALSO

View File

@ -90,9 +90,7 @@ instead. `--no-symlinks` is the default on Windows.
When 'git-difftool' is invoked with the `-g` or `--gui` option
the default diff tool will be read from the configured
`diff.guitool` variable instead of `diff.tool`. The `--no-gui`
option can be used to override this setting. If `diff.guitool`
is not set, we will fallback in the order of `merge.guitool`,
`diff.tool`, `merge.tool` until a tool is found.
option can be used to override this setting.
--[no-]trust-exit-code::
'git-difftool' invokes a diff tool individually on each file.

View File

@ -110,25 +110,6 @@ marks the same across runs.
the shape of the history and stored tree. See the section on
`ANONYMIZING` below.
--reference-excluded-parents::
By default, running a command such as `git fast-export
master~5..master` will not include the commit master{tilde}5
and will make master{tilde}4 no longer have master{tilde}5 as
a parent (though both the old master{tilde}4 and new
master{tilde}4 will have all the same files). Use
--reference-excluded-parents to instead have the the stream
refer to commits in the excluded range of history by their
sha1sum. Note that the resulting stream can only be used by a
repository which already contains the necessary parent
commits.
--show-original-ids::
Add an extra directive to the output for commits and blobs,
`original-oid <SHA1SUM>`. While such directives will likely be
ignored by importers such as git-fast-import, it may be useful
for intermediary filters (e.g. for rewriting commit messages
which refer to older commits, or for stripping blobs by id).
--refspec::
Apply the specified refspec to each ref exported. Multiple of them can
be specified.
@ -138,9 +119,7 @@ marks the same across runs.
'git rev-list', that specifies the specific objects and references
to export. For example, `master~10..master` causes the
current master reference to be exported along with all objects
added since its 10th ancestor commit and (unless the
--reference-excluded-parents option is specified) all files
common to master{tilde}9 and master{tilde}10.
added since its 10th ancestor commit.
EXAMPLES
--------

View File

@ -40,10 +40,9 @@ OPTIONS
not contain the old commit).
--quiet::
Disable the output shown by --stats, making fast-import usually
be silent when it is successful. However, if the import stream
has directives intended to show user output (e.g. `progress`
directives), the corresponding messages will still be shown.
Disable all non-fatal output, making fast-import silent when it
is successful. This option disables the output shown by
--stats.
--stats::
Display some basic statistics about the objects fast-import has
@ -51,6 +50,21 @@ OPTIONS
memory used by fast-import during this run. Showing this output
is currently the default, but can be disabled with --quiet.
--allow-unsafe-features::
Many command-line options can be provided as part of the
fast-import stream itself by using the `feature` or `option`
commands. However, some of these options are unsafe (e.g.,
allowing fast-import to access the filesystem outside of the
repository). These options are disabled by default, but can be
allowed by providing this option on the command line. This
currently impacts only the `export-marks`, `import-marks`, and
`import-marks-if-exists` feature commands.
+
Only enable this option if you trust the program generating the
fast-import stream! This option is enabled automatically for
remote-helpers that use the `import` capability, as they are
already trusted to run their own code.
Options for Frontends
~~~~~~~~~~~~~~~~~~~~~
@ -385,7 +399,6 @@ change to the project.
....
'commit' SP <ref> LF
mark?
original-oid?
('author' (SP <name>)? SP LT <email> GT SP <when> LF)?
'committer' (SP <name>)? SP LT <email> GT SP <when> LF
data
@ -422,12 +435,7 @@ However it is recommended that a `filedeleteall` command precede
all `filemodify`, `filecopy`, `filerename` and `notemodify` commands in
the same commit, as `filedeleteall` wipes the branch clean (see below).
The `LF` after the command is optional (it used to be required). Note
that for reasons of backward compatibility, if the commit ends with a
`data` command (i.e. it has has no `from`, `merge`, `filemodify`,
`filedelete`, `filecopy`, `filerename`, `filedeleteall` or
`notemodify` commands) then two `LF` commands may appear at the end of
the command instead of just one.
The `LF` after the command is optional (it used to be required).
`author`
^^^^^^^^
@ -747,19 +755,6 @@ New marks are created automatically. Existing marks can be moved
to another object simply by reusing the same `<idnum>` in another
`mark` command.
`original-oid`
~~~~~~~~~~~~~~
Provides the name of the object in the original source control system.
fast-import will simply ignore this directive, but filter processes
which operate on and modify the stream before feeding to fast-import
may have uses for this information
....
'original-oid' SP <object-identifier> LF
....
where `<object-identifer>` is any string not containing LF.
`tag`
~~~~~
Creates an annotated tag referring to a specific commit. To create
@ -768,7 +763,6 @@ lightweight (non-annotated) tags see the `reset` command below.
....
'tag' SP <name> LF
'from' SP <commit-ish> LF
original-oid?
'tagger' (SP <name>)? SP LT <email> GT SP <when> LF
data
....
@ -843,7 +837,6 @@ assigned mark.
....
'blob' LF
mark?
original-oid?
data
....
@ -971,6 +964,10 @@ might want to refer to in their commit messages.
'get-mark' SP ':' <idnum> LF
....
This command can be used anywhere in the stream that comments are
accepted. In particular, the `get-mark` command can be used in the
middle of a commit but not in the middle of a `data` command.
See ``Responses To Commands'' below for details about how to read
this output safely.
@ -997,10 +994,9 @@ Output uses the same format as `git cat-file --batch`:
<contents> LF
====
This command can be used where a `filemodify` directive can appear,
allowing it to be used in the middle of a commit. For a `filemodify`
using an inline directive, it can also appear right before the `data`
directive.
This command can be used anywhere in the stream that comments are
accepted. In particular, the `cat-blob` command can be used in the
middle of a commit but not in the middle of a `data` command.
See ``Responses To Commands'' below for details about how to read
this output safely.
@ -1013,8 +1009,8 @@ printing a blob from the active commit (with `cat-blob`) or copying a
blob or tree from a previous commit for use in the current one (with
`filemodify`).
The `ls` command can also be used where a `filemodify` directive can
appear, allowing it to be used in the middle of a commit.
The `ls` command can be used anywhere in the stream that comments are
accepted, including the middle of a commit.
Reading from the active commit::
This form can only be used in the middle of a `commit`.
@ -1398,13 +1394,6 @@ deltas are suboptimal (see above) then also adding the `-f` option
to force recomputation of all deltas can significantly reduce the
final packfile size (30-50% smaller can be quite typical).
Instead of running `git repack` you can also run `git gc
--aggressive`, which will also optimize other things after an import
(e.g. pack loose refs). As noted in the "AGGRESSIVE" section in
linkgit:git-gc[1] the `--aggressive` option will find new deltas with
the `-f` option to linkgit:git-repack[1]. For the reasons elaborated
on above using `--aggressive` after a fast-import is one of the few
cases where it's known to be worthwhile.
MEMORY UTILIZATION
------------------

View File

@ -266,7 +266,7 @@ The `pu` branch will be updated even if it is does not fast-forward,
because it is prefixed with a plus sign; `tmp` will not be.
* Peek at a remote's branch, without configuring the remote in your local
repository:
repository:
+
------------------------------------------------
$ git fetch git://git.kernel.org/pub/scm/git/git.git maint

View File

@ -189,7 +189,7 @@ to other tags will be rewritten to point to the underlying commit.
rewriting. When applying a tree filter, the command needs to
temporarily check out the tree to some directory, which may consume
considerable space in case of large projects. By default it
does this in the `.git-rewrite/` directory but you can override
does this in the '.git-rewrite/' directory but you can override
that choice by this parameter.
-f::

View File

@ -128,18 +128,13 @@ objecttype::
objectsize::
The size of the object (the same as 'git cat-file -s' reports).
Append `:disk` to get the size, in bytes, that the object takes up on
disk. See the note about on-disk sizes in the `CAVEATS` section below.
objectname::
The object name (aka SHA-1).
For a non-ambiguous abbreviation of the object name append `:short`.
For an abbreviation of the object name with desired length append
`:short=<length>`, where the minimum length is MINIMUM_ABBREV. The
length may be exceeded to ensure unique object names.
deltabase::
This expands to the object name of the delta base for the
given object, if it is stored as a delta. Otherwise it
expands to the null object name (all zeroes).
upstream::
The name of a local ref which can be considered ``upstream''
@ -366,20 +361,6 @@ This prints the authorname, if present.
git for-each-ref --format="%(refname)%(if)%(authorname)%(then) Authored by: %(authorname)%(end)"
------------
CAVEATS
-------
Note that the sizes of objects on disk are reported accurately, but care
should be taken in drawing conclusions about which refs or objects are
responsible for disk usage. The size of a packed non-delta object may be
much larger than the size of objects which delta against it, but the
choice of which object is the base and which is the delta is arbitrary
and is subject to change during a repack.
Note also that multiple copies of an object may be present in the object
database; in this case, it is undefined which copy's size or delta base
will be reported.
SEE ALSO
--------
linkgit:git-show-ref[1]

View File

@ -504,9 +504,9 @@ Toggle it to make sure it is set to `false`. Also, search for
"mailnews.wraplength" and set the value to 0.
3. Disable the use of format=flowed:
Edit..Preferences..Advanced..Config Editor. Search for
"mailnews.send_plaintext_flowed".
Toggle it to make sure it is set to `false`.
Edit..Preferences..Advanced..Config Editor. Search for
"mailnews.send_plaintext_flowed".
Toggle it to make sure it is set to `false`.
After that is done, you should be able to compose email as you
otherwise would (cut + paste, 'git format-patch' | 'git imap-send', etc),
@ -629,14 +629,14 @@ EXAMPLES
--------
* Extract commits between revisions R1 and R2, and apply them on top of
the current branch using 'git am' to cherry-pick them:
the current branch using 'git am' to cherry-pick them:
+
------------
$ git format-patch -k --stdout R1..R2 | git am -3 -k
------------
* Extract all commits which are in the current branch but not in the
origin branch:
origin branch:
+
------------
$ git format-patch origin
@ -645,7 +645,7 @@ $ git format-patch origin
For each commit a separate file is created in the current directory.
* Extract all commits that lead to 'origin' since the inception of the
project:
project:
+
------------
$ git format-patch --root origin
@ -664,7 +664,7 @@ Note that non-Git "patch" programs won't understand renaming patches, so
use it only when you know the recipient uses Git to apply your patch.
* Extract three topmost commits from the current branch and format them
as e-mailable patches:
as e-mailable patches:
+
------------
$ git format-patch -3

View File

@ -62,17 +62,9 @@ index file, all SHA-1 references in `refs` namespace, and all reflogs
with --no-full.
--connectivity-only::
Check only the connectivity of reachable objects, making sure
that any objects referenced by a reachable tag, commit, or tree
is present. This speeds up the operation by avoiding reading
blobs entirely (though it does still check that referenced blobs
exist). This will detect corruption in commits and trees, but
not do any semantic checks (e.g., for format errors). Corruption
in blob objects will not be detected at all.
+
Unreachable tags, commits, and trees will also be accessed to find the
tips of dangling segments of history. Use `--no-dangling` if you don't
care about this output and want to speed it up further.
Check only the connectivity of tags, commits and tree objects. By
avoiding to unpack blobs, this speeds up the operation, at the
expense of missing corrupt objects or other problematic issues.
--strict::
Enable more strict checking, namely to catch a file mode
@ -148,9 +140,9 @@ dangling <type> <object>::
The <type> object <object>, is present in the database but never
'directly' used. A dangling commit could be a root node.
hash mismatch <object>::
The database has an object whose hash doesn't match the
object database value.
sha1 mismatch <object>::
The database has an object who's sha1 doesn't match the
database value.
This indicates a serious data integrity problem.
Environment Variables

View File

@ -20,16 +20,17 @@ created from prior invocations of 'git add', packing refs, pruning
reflog, rerere metadata or stale working trees. May also update ancillary
indexes such as the commit-graph.
When common porcelain operations that create objects are run, they
will check whether the repository has grown substantially since the
last maintenance, and if so run `git gc` automatically. See `gc.auto`
below for how to disable this behavior.
Users are encouraged to run this task on a regular basis within
each repository to maintain good disk space utilization and good
operating performance.
Running `git gc` manually should only be needed when adding objects to
a repository without regularly running such porcelain commands, to do
a one-off repository optimization, or e.g. to clean up a suboptimal
mass-import. See the "PACKFILE OPTIMIZATION" section in
linkgit:git-fast-import[1] for more details on the import case.
Some git commands may automatically run 'git gc'; see the `--auto` flag
below for details. If you know what you're doing and all you want is to
disable this behavior permanently without further considerations, just do:
----------------------
$ git config --global gc.auto 0
----------------------
OPTIONS
-------
@ -39,17 +40,35 @@ OPTIONS
space utilization and performance. This option will cause
'git gc' to more aggressively optimize the repository at the expense
of taking much more time. The effects of this optimization are
mostly persistent. See the "AGGRESSIVE" section below for details.
persistent, so this option only needs to be used occasionally; every
few hundred changesets or so.
--auto::
With this option, 'git gc' checks whether any housekeeping is
required; if not, it exits without performing any work.
Some git commands run `git gc --auto` after performing
operations that could create many loose objects. Housekeeping
is required if there are too many loose objects or too many
packs in the repository.
+
See the `gc.auto` option in the "CONFIGURATION" section below for how
this heuristic works.
If the number of loose objects exceeds the value of the `gc.auto`
configuration variable, then all loose objects are combined into a
single pack using `git repack -d -l`. Setting the value of `gc.auto`
to 0 disables automatic packing of loose objects.
+
Once housekeeping is triggered by exceeding the limits of
configuration options such as `gc.auto` and `gc.autoPackLimit`, all
If the number of packs exceeds the value of `gc.autoPackLimit`,
then existing packs (except those marked with a `.keep` file
or over `gc.bigPackThreshold` limit)
are consolidated into a single pack by using the `-A` option of
'git repack'.
If the amount of memory is estimated not enough for `git repack` to
run smoothly and `gc.bigPackThreshold` is not set, the largest
pack will also be excluded (this is the equivalent of running `git gc`
with `--keep-base-pack`).
Setting `gc.autoPackLimit` to 0 disables automatic consolidation of
packs.
+
If houskeeping is required due to many loose objects or packs, all
other housekeeping tasks (e.g. rerere, working trees, reflog...) will
be performed as well.
@ -57,7 +76,7 @@ be performed as well.
--prune=<date>::
Prune loose objects older than date (default is 2 weeks ago,
overridable by the config variable `gc.pruneExpire`).
--prune=now prunes loose objects regardless of their age and
--prune=all prunes loose objects regardless of their age and
increases the risk of corruption if another process is writing to
the repository concurrently; see "NOTES" below. --prune is on by
default.
@ -77,39 +96,69 @@ be performed as well.
`.keep` files are consolidated into a single pack. When this
option is used, `gc.bigPackThreshold` is ignored.
AGGRESSIVE
----------
When the `--aggressive` option is supplied, linkgit:git-repack[1] will
be invoked with the `-f` flag, which in turn will pass
`--no-reuse-delta` to linkgit:git-pack-objects[1]. This will throw
away any existing deltas and re-compute them, at the expense of
spending much more time on the repacking.
The effects of this are mostly persistent, e.g. when packs and loose
objects are coalesced into one another pack the existing deltas in
that pack might get re-used, but there are also various cases where we
might pick a sub-optimal delta from a newer pack instead.
Furthermore, supplying `--aggressive` will tweak the `--depth` and
`--window` options passed to linkgit:git-repack[1]. See the
`gc.aggressiveDepth` and `gc.aggressiveWindow` settings below. By
using a larger window size we're more likely to find more optimal
deltas.
It's probably not worth it to use this option on a given repository
without running tailored performance benchmarks on it. It takes a lot
more time, and the resulting space/delta optimization may or may not
be worth it. Not using this at all is the right trade-off for most
users and their repositories.
CONFIGURATION
-------------
The below documentation is the same as what's found in
linkgit:git-config[1]:
The optional configuration variable `gc.reflogExpire` can be
set to indicate how long historical entries within each branch's
reflog should remain available in this repository. The setting is
expressed as a length of time, for example '90 days' or '3 months'.
It defaults to '90 days'.
The optional configuration variable `gc.reflogExpireUnreachable`
can be set to indicate how long historical reflog entries which
are not part of the current branch should remain available in
this repository. These types of entries are generally created as
a result of using `git commit --amend` or `git rebase` and are the
commits prior to the amend or rebase occurring. Since these changes
are not part of the current project most users will want to expire
them sooner. This option defaults to '30 days'.
The above two configuration variables can be given to a pattern. For
example, this sets non-default expiry values only to remote-tracking
branches:
------------
[gc "refs/remotes/*"]
reflogExpire = never
reflogExpireUnreachable = 3 days
------------
The optional configuration variable `gc.rerereResolved` indicates
how long records of conflicted merge you resolved earlier are
kept. This defaults to 60 days.
The optional configuration variable `gc.rerereUnresolved` indicates
how long records of conflicted merge you have not resolved are
kept. This defaults to 15 days.
The optional configuration variable `gc.packRefs` determines if
'git gc' runs 'git pack-refs'. This can be set to "notbare" to enable
it within all non-bare repos or it can be set to a boolean value.
This defaults to true.
The optional configuration variable `gc.commitGraph` determines if
'git gc' should run 'git commit-graph write'. This can be set to a
boolean value. This defaults to false.
The optional configuration variable `gc.aggressiveWindow` controls how
much time is spent optimizing the delta compression of the objects in
the repository when the --aggressive option is specified. The larger
the value, the more time is spent optimizing the delta compression. See
the documentation for the --window option in linkgit:git-repack[1] for
more details. This defaults to 250.
Similarly, the optional configuration variable `gc.aggressiveDepth`
controls --depth option in linkgit:git-repack[1]. This defaults to 50.
The optional configuration variable `gc.pruneExpire` controls how old
the unreferenced loose objects have to be before they are pruned. The
default is "2 weeks ago".
Optional configuration variable `gc.worktreePruneExpire` controls how
old a stale working tree should be before `git worktree prune` deletes
it. Default is "3 months ago".
include::config/gc.txt[]
NOTES
-----
@ -119,8 +168,8 @@ anywhere in your repository. In
particular, it will keep not only objects referenced by your current set
of branches and tags, but also objects referenced by the index,
remote-tracking branches, refs saved by 'git filter-branch' in
refs/original/, reflogs (which may reference commits in branches
that were later amended or rewound), and anything else in the refs/* namespace.
refs/original/, or reflogs (which may reference commits in branches
that were later amended or rewound).
If you are expecting some objects to be deleted and they aren't, check
all of those locations and decide whether it makes sense in your case to
remove those references.
@ -141,7 +190,8 @@ mitigate this problem:
However, these features fall short of a complete solution, so users who
run commands concurrently have to live with some risk of corruption (which
seems to be low in practice).
seems to be low in practice) unless they turn off automatic garbage
collection with 'git config gc.auto 0'.
HOOKS
-----

View File

@ -88,7 +88,7 @@ OPTIONS
mechanism. Only useful with `--untracked`.
--exclude-standard::
Do not pay attention to ignored files specified via the `.gitignore`
Do not pay attention to ignored files specified via the `.gitignore`
mechanism. Only useful when searching files in the current directory
with `--no-index`.

View File

@ -118,9 +118,9 @@ format is chosen. The following values are currently supported:
* "man": use the 'man' program as usual,
* "woman": use 'emacsclient' to launch the "woman" mode in emacs
(this only works starting with emacsclient versions 22),
(this only works starting with emacsclient versions 22),
* "konqueror": use 'kfmclient' to open the man page in a new konqueror
tab (see 'Note about konqueror' below).
tab (see 'Note about konqueror' below).
Values for other tools can be used if there is a corresponding
`man.<tool>.cmd` configuration entry (see below).
@ -171,8 +171,8 @@ variable, we launch 'kfmclient' to try to open the man page on an
already opened konqueror in a new tab if possible.
For consistency, we also try such a trick if 'man.konqueror.path' is
set to something like `A_PATH_TO/konqueror`. That means we will try to
launch `A_PATH_TO/kfmclient` instead.
set to something like 'A_PATH_TO/konqueror'. That means we will try to
launch 'A_PATH_TO/kfmclient' instead.
If you really want to use 'konqueror', then you can use something like
the following:

View File

@ -162,7 +162,7 @@ ScriptAliasMatch ^/git/[^/]*(.*) /usr/libexec/git-core/git-http-backend/storage.
Accelerated static Apache 2.x::
Similar to the above, but Apache can be used to return static
files that are stored on disk. On many systems this may
files that are stored on disk. On many systems this may
be more efficient as Apache can ask the kernel to copy the
file contents from the file system directly to the network:
+

View File

@ -38,6 +38,8 @@ the repository to another place if --separate-git-dir is given).
OPTIONS
-------
--
-q::
--quiet::
@ -109,6 +111,8 @@ into it.
If you provide a 'directory', the command is run inside it. If this directory
does not exist, it will be created.
--
TEMPLATE DIRECTORY
------------------
@ -128,7 +132,7 @@ The template directory will be one of the following (in order):
The default template directory includes some directory structure, suggested
"exclude patterns" (see linkgit:gitignore[5]), and sample hook files.
The sample hooks are all disabled by default. To enable one of the
The sample hooks are all disabled by default, To enable one of the
sample hooks rename it by removing its `.sample` suffix.
See linkgit:githooks[5] for more general info on hook execution.

View File

@ -29,8 +29,7 @@ OPTIONS
The HTTP daemon command-line that will be executed.
Command-line options may be specified here, and the
configuration file will be added at the end of the command-line.
Currently apache2, lighttpd, mongoose, plackup, python and
webrick are supported.
Currently apache2, lighttpd, mongoose, plackup and webrick are supported.
(Default: lighttpd)
-m::

View File

@ -3,7 +3,7 @@ git-interpret-trailers(1)
NAME
----
git-interpret-trailers - Add or parse structured information in commit messages
git-interpret-trailers - add or parse structured information in commit messages
SYNOPSIS
--------

View File

@ -192,10 +192,6 @@ log.date::
Default format for human-readable dates. (Compare the
`--date` option.) Defaults to "default", which means to write
dates like `Sat May 8 19:35:34 2010 -0500`.
+
If the format is set to "auto:foo" and the pager is in use, format
"foo" will be the used for the date format. Otherwise "default" will
be used.
log.follow::
If `true`, `git log` will act as if the `--follow` option was used when

View File

@ -118,7 +118,6 @@ OPTIONS
linkgit:git-status[1] `--short` or linkgit:git-diff[1]
`--name-status` for more user-friendly alternatives.
+
--
This option identifies the file status with the following tags (followed by
a space) at the start of each line:
@ -129,7 +128,6 @@ a space) at the start of each line:
C:: modified/changed
K:: to be killed
?:: other
--
-v::
Similar to `-t`, but use lowercase letters for files

View File

@ -31,7 +31,7 @@ OPTIONS
displayed.
--refs::
Do not show peeled tags or pseudorefs like `HEAD` in the output.
Do not show peeled tags or pseudorefs like HEAD in the output.
-q::
--quiet::

View File

@ -27,9 +27,9 @@ in the current working directory. Note that:
taken as relative to the current working directory. E.g. when you are
in a directory 'sub' that has a directory 'dir', you can run 'git
ls-tree -r HEAD dir' to list the contents of the tree (that is
`sub/dir` in `HEAD`). You don't want to give a tree that is not at the
'sub/dir' in `HEAD`). You don't want to give a tree that is not at the
root level (e.g. `git ls-tree -r HEAD:sub dir`) in this case, as that
would result in asking for `sub/sub/dir` in the `HEAD` commit.
would result in asking for 'sub/sub/dir' in the `HEAD` commit.
However, the current working directory can be ignored by passing
--full-tree option.

View File

@ -83,8 +83,7 @@ invocations. The automated message can include the branch description.
If `--log` is specified, a shortlog of the commits being merged
will be appended to the specified message.
--rerere-autoupdate::
--no-rerere-autoupdate::
--[no-]rerere-autoupdate::
Allow the rerere mechanism to update the index with the
result of auto-conflict resolution if possible.

View File

@ -28,9 +28,7 @@ to define the operation mode for the functions listed below.
FUNCTIONS
---------
get_merge_tool::
returns a merge tool. the return code is 1 if we returned a guessed
merge tool, else 0. '$GIT_MERGETOOL_GUI' may be set to 'true' to
search for the appropriate guitool.
returns a merge tool.
get_merge_tool_cmd::
returns the custom command for a merge tool.

View File

@ -83,9 +83,7 @@ success of the resolution after the custom tool has exited.
--gui::
When 'git-mergetool' is invoked with the `-g` or `--gui` option
the default merge tool will be read from the configured
`merge.guitool` variable instead of `merge.tool`. If
`merge.guitool` is not set, we will fallback to the tool
configured under `merge.tool`.
`merge.guitool` variable instead of `merge.tool`.
--no-gui::
This overrides a previous `-g` or `--gui` setting and reads the

View File

@ -146,7 +146,7 @@ OPTIONS
-C <object>::
--reuse-message=<object>::
Take the given blob object (for example, another note) as the
Take the given blob object (for example, another note) as the
note message. (Use `git notes copy <object>` instead to
copy notes between objects.)

View File

@ -71,12 +71,12 @@ $ git p4 clone //depot/path/project
------------
This:
1. Creates an empty Git repository in a subdirectory called 'project'.
1. Creates an empty Git repository in a subdirectory called 'project'.
+
2. Imports the full contents of the head revision from the given p4
depot path into a single commit in the Git branch 'refs/remotes/p4/master'.
2. Imports the full contents of the head revision from the given p4
depot path into a single commit in the Git branch 'refs/remotes/p4/master'.
+
3. Creates a local branch, 'master' from this remote and checks it out.
3. Creates a local branch, 'master' from this remote and checks it out.
To reproduce the entire p4 history in Git, use the '@all' modifier on
the depot path:

View File

@ -14,7 +14,7 @@ SYNOPSIS
[--local] [--incremental] [--window=<n>] [--depth=<n>]
[--revs [--unpacked | --all]] [--keep-pack=<pack-name>]
[--stdout [--filter=<filter-spec>] | base-name]
[--shallow] [--keep-true-parents] [--sparse] < object-list
[--shallow] [--keep-true-parents] < object-list
DESCRIPTION
@ -196,15 +196,6 @@ depth is 4095.
Add --no-reuse-object if you want to force a uniform compression
level on all data no matter the source.
--sparse::
Use the "sparse" algorithm to determine which objects to include in
the pack, when combined with the "--revs" option. This algorithm
only walks trees that appear in paths that introduce new objects.
This can have significant performance benefits when computing
a pack to send a small change. However, it is possible that extra
objects are added to the pack-file if the included commits contain
certain types of direct renames.
--thin::
Create a "thin" pack by omitting the common objects between a
sender and a receiver in order to reduce network transfer. This

View File

@ -112,9 +112,8 @@ When set to `merges`, rebase using `git rebase --rebase-merges` so that
the local merge commits are included in the rebase (see
linkgit:git-rebase[1] for details).
+
When set to `preserve` (deprecated in favor of `merges`), rebase with the
`--preserve-merges` option passed to `git rebase` so that locally created
merge commits will not be flattened.
When set to preserve, rebase with the `--preserve-merges` option passed
to `git rebase` so that locally created merge commits will not be flattened.
+
When false, merge the current branch into the upstream branch.
+

View File

@ -73,26 +73,6 @@ be omitted--such a push will update a ref that `<src>` normally updates
without any `<refspec>` on the command line. Otherwise, missing
`:<dst>` means to update the same ref as the `<src>`.
+
If <dst> doesn't start with `refs/` (e.g. `refs/heads/master`) we will
try to infer where in `refs/*` on the destination <repository> it
belongs based on the the type of <src> being pushed and whether <dst>
is ambiguous.
+
--
* If <dst> unambiguously refers to a ref on the <repository> remote,
then push to that ref.
* If <src> resolves to a ref starting with refs/heads/ or refs/tags/,
then prepend that to <dst>.
* Other ambiguity resolutions might be added in the future, but for
now any other cases will error out with an error indicating what we
tried, and depending on the `advice.pushUnqualifiedRefname`
configuration (see linkgit:git-config[1]) suggest what refs/
namespace you may have wanted to push to.
--
+
The object referenced by <src> is used to update the <dst> reference
on the remote side. Whether this is allowed depends on where in
`refs/*` the <dst> reference lives as described in detail below, in
@ -611,9 +591,6 @@ the ones in the examples below) can be configured as the default for
`refs/remotes/satellite/master`) in the `mothership` repository;
do the same for `dev` and `satellite/dev`.
+
See the section describing `<refspec>...` above for a discussion of
the matching semantics.
+
This is to emulate `git fetch` run on the `mothership` using `git
push` that is run in the opposite direction in order to integrate
the work done on `satellite`, and is often necessary when you can

View File

@ -10,7 +10,7 @@ SYNOPSIS
--------
[verse]
'git quiltimport' [--dry-run | -n] [--author <author>] [--patches <dir>]
[--series <file>] [--keep-non-patch]
[--series <file>]
DESCRIPTION
@ -56,9 +56,6 @@ The default for the series file is <patches>/series
or the value of the `$QUILT_SERIES` environment
variable.
--keep-non-patch::
Pass `-b` flag to 'git mailinfo' (see linkgit:git-mailinfo[1]).
GIT
---
Part of the linkgit:git[1] suite

View File

@ -38,9 +38,8 @@ OPTIONS
started.
--reset::
Same as -m, except that unmerged entries are discarded instead
of failing. When used with `-u`, updates leading to loss of
working tree changes will not abort the operation.
Same as -m, except that unmerged entries are discarded
instead of failing.
-u::
After a successful merge, update the files in the work
@ -129,10 +128,6 @@ OPTIONS
Instead of reading tree object(s) into the index, just empty
it.
-q::
--quiet::
Quiet, suppress feedback messages.
<tree-ish#>::
The id of the tree object(s) to be read/merged.

View File

@ -300,11 +300,6 @@ See also INCOMPATIBLE OPTIONS below.
+
See also INCOMPATIBLE OPTIONS below.
--rerere-autoupdate::
--no-rerere-autoupdate::
Allow the rerere mechanism to update the index with the
result of auto-conflict resolution if possible.
-S[<keyid>]::
--gpg-sign[=<keyid>]::
GPG-sign commits. The `keyid` argument is optional and
@ -415,14 +410,14 @@ See also INCOMPATIBLE OPTIONS below.
+
By default, or when `no-rebase-cousins` was specified, commits which do not
have `<upstream>` as direct ancestor will keep their original branch point,
i.e. commits that would be excluded by linkgit:git-log[1]'s
i.e. commits that would be excluded by gitlink:git-log[1]'s
`--ancestry-path` option will keep their original ancestry by default. If
the `rebase-cousins` mode is turned on, such commits are instead rebased
onto `<upstream>` (or `<onto>`, if specified).
+
The `--rebase-merges` mode is similar in spirit to the deprecated
`--preserve-merges`, but in contrast to that option works well in interactive
rebases: commits can be reordered, inserted and dropped at will.
The `--rebase-merges` mode is similar in spirit to `--preserve-merges`, but
in contrast to that option works well in interactive rebases: commits can be
reordered, inserted and dropped at will.
+
It is currently only possible to recreate the merge commits using the
`recursive` merge strategy; Different merge strategies can be used only via
@ -432,10 +427,9 @@ See also REBASING MERGES and INCOMPATIBLE OPTIONS below.
-p::
--preserve-merges::
[DEPRECATED: use `--rebase-merges` instead] Recreate merge commits
instead of flattening the history by replaying commits a merge commit
introduces. Merge conflict resolutions or manual amendments to merge
commits are not preserved.
Recreate merge commits instead of flattening the history by replaying
commits a merge commit introduces. Merge conflict resolutions or manual
amendments to merge commits are not preserved.
+
This uses the `--interactive` machinery internally, but combining it
with the `--interactive` option explicitly is generally not a good
@ -507,15 +501,18 @@ See also INCOMPATIBLE OPTIONS below.
with care: the final stash application after a successful
rebase might result in non-trivial conflicts.
--reschedule-failed-exec::
--no-reschedule-failed-exec::
Automatically reschedule `exec` commands that failed. This only makes
sense in interactive mode (or when an `--exec` option was provided).
INCOMPATIBLE OPTIONS
--------------------
The following options:
git-rebase has many flags that are incompatible with each other,
predominantly due to the fact that it has three different underlying
implementations:
* one based on linkgit:git-am[1] (the default)
* one based on git-merge-recursive (merge backend)
* one based on linkgit:git-cherry-pick[1] (interactive backend)
Flags only understood by the am backend:
* --committer-date-is-author-date
* --ignore-date
@ -523,22 +520,26 @@ The following options:
* --ignore-whitespace
* -C
are incompatible with the following options:
Flags understood by both merge and interactive backends:
* --merge
* --strategy
* --strategy-option
* --allow-empty-message
Flags only understood by the interactive backend:
* --[no-]autosquash
* --rebase-merges
* --preserve-merges
* --interactive
* --exec
* --keep-empty
* --autosquash
* --edit-todo
* --root when used in combination with --onto
In addition, the following pairs of options are incompatible:
Other incompatible flag pairs:
* --preserve-merges and --interactive
* --preserve-merges and --signoff
@ -559,6 +560,8 @@ commit started empty (had no changes relative to its parent to
start with) or ended empty (all changes were already applied
upstream in other commits).
The merge backend does the same.
The interactive backend drops commits by default that
started empty and halts if it hits a commit that ended up empty.
The `--keep-empty` option exists for the interactive backend to allow
@ -567,9 +570,8 @@ it to keep commits that started empty.
Directory rename detection
~~~~~~~~~~~~~~~~~~~~~~~~~~
Directory rename heuristics are enabled in the merge and interactive
backends. Due to the lack of accurate tree information, directory
rename detection is disabled in the am backend.
The merge and interactive backends work fine with
directory rename detection. The am backend sometimes does not.
include::merge-strategies.txt[]
@ -675,8 +677,7 @@ $ git rebase -i HEAD~5
And move the first patch to the end of the list.
You might want to recreate merge commits, e.g. if you have a history
like this:
You might want to preserve merges, if you have a history like this:
------------------
X
@ -690,7 +691,7 @@ Suppose you want to rebase the side branch starting at "A" to "Q". Make
sure that the current HEAD is "B", and call
-----------------------------
$ git rebase -i -r --onto Q O
$ git rebase -i -p --onto Q O
-----------------------------
Reordering and editing commits usually creates untested intermediate
@ -978,7 +979,7 @@ when the merge operation did not even start), it is rescheduled immediately.
At this time, the `merge` command will *always* use the `recursive`
merge strategy for regular merges, and `octopus` for octopus merges,
with no way to choose a different one. To work around
strategy, with no way to choose a different one. To work around
this, an `exec` command can be used to call `git merge` explicitly,
using the fact that the labels are worktree-local refs (the ref
`refs/rewritten/onto` would correspond to the label `onto`, for example).
@ -1027,11 +1028,11 @@ merge cmake
BUGS
----
The todo list presented by the deprecated `--preserve-merges --interactive`
does not represent the topology of the revision graph (use `--rebase-merges`
instead). Editing commits and rewording their commit messages should work
fine, but attempts to reorder commits tend to produce counterintuitive results.
Use `--rebase-merges` in such scenarios instead.
The todo list presented by `--preserve-merges --interactive` does not
represent the topology of the revision graph. Editing commits and
rewording their commit messages should work fine, but attempts to
reorder commits tend to produce counterintuitive results. Use
`--rebase-merges` in such scenarios instead.
For example, an attempt to rearrange
------------

View File

@ -104,7 +104,7 @@ begins with `ext::`. Examples:
link-level address).
"ext::git-server-alias foo %G/repo% with% spaces %Vfoo"::
Represents a repository with path `/repo with spaces` accessed
Represents a repository with path '/repo with spaces' accessed
using the helper program "git-server-alias foo". The hostname for
the remote server passed in the protocol stream will be "foo"
(this allows multiple virtual Git servers to share a
@ -118,7 +118,7 @@ begins with `ext::`. Examples:
SEE ALSO
--------
linkgit:gitremote-helpers[7]
linkgit:gitremote-helpers[1]
GIT
---

View File

@ -52,7 +52,7 @@ EXAMPLES
SEE ALSO
--------
linkgit:gitremote-helpers[7]
linkgit:gitremote-helpers[1]
GIT
---

View File

@ -1,7 +1,7 @@
git-remote-helpers
==================
This document has been moved to linkgit:gitremote-helpers[7].
This document has been moved to linkgit:gitremote-helpers[1].
Please let the owners of the referring site know so that they can update the
link you clicked to get here.

View File

@ -0,0 +1,30 @@
git-remote-testgit(1)
=====================
NAME
----
git-remote-testgit - Example remote-helper
SYNOPSIS
--------
[verse]
git clone testgit::<source-repo> [<destination>]
DESCRIPTION
-----------
This command is a simple remote-helper, that is used both as a
testcase for the remote-helper functionality, and as an example to
show remote-helper authors one possible implementation.
The best way to learn more is to read the comments and source code in
'git-remote-testgit'.
SEE ALSO
--------
linkgit:gitremote-helpers[1]
GIT
---
Part of the linkgit:git[1] suite

View File

@ -24,7 +24,7 @@ on the initial manual merge, and applying previously recorded
hand resolutions to their corresponding automerge results.
[NOTE]
You need to set the configuration variable `rerere.enabled` in order to
You need to set the configuration variable rerere.enabled in order to
enable this command.

View File

@ -115,17 +115,17 @@ $ git pull git://info.example.com/ nitfol <4>
------------
+
<1> You are happily working on something, and find the changes
in these files are in good order. You do not want to see them
when you run `git diff`, because you plan to work on other files
and changes with these files are distracting.
in these files are in good order. You do not want to see them
when you run `git diff`, because you plan to work on other files
and changes with these files are distracting.
<2> Somebody asks you to pull, and the changes sound worthy of merging.
<3> However, you already dirtied the index (i.e. your index does
not match the `HEAD` commit). But you know the pull you are going
to make does not affect `frotz.c` or `filfre.c`, so you revert the
index changes for these two files. Your changes in working tree
remain there.
not match the `HEAD` commit). But you know the pull you are going
to make does not affect `frotz.c` or `filfre.c`, so you revert the
index changes for these two files. Your changes in working tree
remain there.
<4> Then you can pull and merge, leaving `frotz.c` and `filfre.c`
changes still in the working tree.
changes still in the working tree.
Undo a commit and redo::
+
@ -137,12 +137,12 @@ $ git commit -a -c ORIG_HEAD <3>
------------
+
<1> This is most often done when you remembered what you
just committed is incomplete, or you misspelled your commit
message, or both. Leaves working tree as it was before "reset".
just committed is incomplete, or you misspelled your commit
message, or both. Leaves working tree as it was before "reset".
<2> Make corrections to working tree files.
<3> "reset" copies the old head to `.git/ORIG_HEAD`; redo the
commit by starting with its log message. If you do not need to
edit the message further, you can give `-C` option instead.
commit by starting with its log message. If you do not need to
edit the message further, you can give `-C` option instead.
+
See also the `--amend` option to linkgit:git-commit[1].
@ -155,9 +155,9 @@ $ git checkout topic/wip <3>
------------
+
<1> You have made some commits, but realize they were premature
to be in the `master` branch. You want to continue polishing
them in a topic branch, so create `topic/wip` branch off of the
current `HEAD`.
to be in the `master` branch. You want to continue polishing
them in a topic branch, so create `topic/wip` branch off of the
current `HEAD`.
<2> Rewind the master branch to get rid of those three commits.
<3> Switch to `topic/wip` branch and keep working.
@ -169,10 +169,10 @@ $ git reset --hard HEAD~3 <1>
------------
+
<1> The last three commits (`HEAD`, `HEAD^`, and `HEAD~2`) were bad
and you do not want to ever see them again. Do *not* do this if
you have already given these commits to somebody else. (See the
"RECOVERING FROM UPSTREAM REBASE" section in linkgit:git-rebase[1]
for the implications of doing so.)
and you do not want to ever see them again. Do *not* do this if
you have already given these commits to somebody else. (See the
"RECOVERING FROM UPSTREAM REBASE" section in linkgit:git-rebase[1] for
the implications of doing so.)
Undo a merge or pull::
+
@ -189,18 +189,18 @@ $ git reset --hard ORIG_HEAD <4>
------------
+
<1> Try to update from the upstream resulted in a lot of
conflicts; you were not ready to spend a lot of time merging
right now, so you decide to do that later.
conflicts; you were not ready to spend a lot of time merging
right now, so you decide to do that later.
<2> "pull" has not made merge commit, so `git reset --hard`
which is a synonym for `git reset --hard HEAD` clears the mess
from the index file and the working tree.
which is a synonym for `git reset --hard HEAD` clears the mess
from the index file and the working tree.
<3> Merge a topic branch into the current branch, which resulted
in a fast-forward.
in a fast-forward.
<4> But you decided that the topic branch is not ready for public
consumption yet. "pull" or "merge" always leaves the original
tip of the current branch in `ORIG_HEAD`, so resetting hard to it
brings your index file and the working tree back to that state,
and resets the tip of the branch to that commit.
consumption yet. "pull" or "merge" always leaves the original
tip of the current branch in `ORIG_HEAD`, so resetting hard to it
brings your index file and the working tree back to that state,
and resets the tip of the branch to that commit.
Undo a merge or pull inside a dirty working tree::
+
@ -214,14 +214,14 @@ $ git reset --merge ORIG_HEAD <2>
------------
+
<1> Even if you may have local modifications in your
working tree, you can safely say `git pull` when you know
that the change in the other branch does not overlap with
them.
working tree, you can safely say `git pull` when you know
that the change in the other branch does not overlap with
them.
<2> After inspecting the result of the merge, you may find
that the change in the other branch is unsatisfactory. Running
`git reset --hard ORIG_HEAD` will let you go back to where you
were, but it will discard your local changes, which you do not
want. `git reset --merge` keeps your local changes.
that the change in the other branch is unsatisfactory. Running
`git reset --hard ORIG_HEAD` will let you go back to where you
were, but it will discard your local changes, which you do not
want. `git reset --merge` keeps your local changes.
Interrupted workflow::
@ -428,8 +428,8 @@ working index HEAD target working index HEAD
`reset --merge` is meant to be used when resetting out of a conflicted
merge. Any mergy operation guarantees that the working tree file that is
involved in the merge does not have a local change with respect to the index
before it starts, and that it writes the result out to the working tree. So if
involved in the merge does not have local change wrt the index before
it starts, and that it writes the result out to the working tree. So if
we see some difference between the index and the target and also
between the index and the working tree, then it means that we are not
resetting out from a state that a mergy operation left after failing

View File

@ -66,13 +66,6 @@ more details.
With this option, 'git revert' will not start the commit
message editor.
--cleanup=<mode>::
This option determines how the commit message will be cleaned up before
being passed on to the commit machinery. See linkgit:git-commit[1] for more
details. In particular, if the '<mode>' is given a value of `scissors`,
scissors will be appended to `MERGE_MSG` before being passed on in the case
of a conflict.
-n::
--no-commit::
Usually the command automatically creates some commits with
@ -108,11 +101,6 @@ effect to your index in a row.
Pass the merge strategy-specific option through to the
merge strategy. See linkgit:git-merge[1] for details.
--rerere-autoupdate::
--no-rerere-autoupdate::
Allow the rerere mechanism to update the index with the
result of auto-conflict resolution if possible.
SEQUENCER SUBCOMMANDS
---------------------
include::sequencer.txt[]

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