Compare commits

..

40 Commits

Author SHA1 Message Date
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
d0832b2847 Git 2.14.5
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-27 11:19:11 -07:00
273c61496f submodule-config: ban submodule paths that start with a dash
We recently banned submodule urls that look like
command-line options. This is the matching change to ban
leading-dash paths.

As with the urls, this should not break any use cases that
currently work. Even with our "--" separator passed to
git-clone, git-submodule.sh gets confused. Without the code
portion of this patch, the clone of "-sub" added in t7417
would yield results like:

    /path/to/git-submodule: 410: cd: Illegal option -s
    /path/to/git-submodule: 417: cd: Illegal option -s
    /path/to/git-submodule: 410: cd: Illegal option -s
    /path/to/git-submodule: 417: cd: Illegal option -s
    Fetched in submodule path '-sub', but it did not contain b56243f8f4eb91b2f1f8109452e659f14dd3fbe4. Direct fetching of that commit failed.

Moreover, naively adding such a submodule doesn't work:

  $ git submodule add $url -sub
  The following path is ignored by one of your .gitignore files:
  -sub

even though there is no such ignore pattern (the test script
hacks around this with a well-placed "git mv").

Unlike leading-dash urls, though, it's possible that such a
path _could_ be useful if we eventually made it work. So
this commit should be seen not as recommending a particular
policy, but rather temporarily closing off a broken and
possibly dangerous code-path. We may revisit this decision
later.

There are two minor differences to the tests in t7416 (that
covered urls):

  1. We don't have a "./-sub" escape hatch to make this
     work, since the submodule code expects to be able to
     match canonical index names to the path field (so you
     are free to add submodule config with that path, but we
     would never actually use it, since an index entry would
     never start with "./").

  2. After this patch, cloning actually succeeds. Since we
     ignore the submodule.*.path value, we fail to find a
     config stanza for our submodule at all, and simply
     treat it as inactive. We still check for the "ignoring"
     message.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-27 09:34:59 -07:00
f6adec4e32 submodule-config: ban submodule urls that start with dash
The previous commit taught the submodule code to invoke our
"git clone $url $path" with a "--" separator so that we
aren't confused by urls or paths that start with dashes.

However, that's just one code path. It's not clear if there
are others, and it would be an easy mistake to add one in
the future. Moreover, even with the fix in the previous
commit, it's quite hard to actually do anything useful with
such an entry. Any url starting with a dash must fall into
one of three categories:

 - it's meant as a file url, like "-path". But then any
   clone is not going to have the matching path, since it's
   by definition relative inside the newly created clone. If
   you spell it as "./-path", the submodule code sees the
   "/" and translates this to an absolute path, so it at
   least works (assuming the receiver has the same
   filesystem layout as you). But that trick does not apply
   for a bare "-path".

 - it's meant as an ssh url, like "-host:path". But this
   already doesn't work, as we explicitly disallow ssh
   hostnames that begin with a dash (to avoid option
   injection against ssh).

 - it's a remote-helper scheme, like "-scheme::data". This
   _could_ work if the receiver bends over backwards and
   creates a funny-named helper like "git-remote--scheme".
   But normally there would not be any helper that matches.

Since such a url does not work today and is not likely to do
anything useful in the future, let's simply disallow them
entirely. That protects the existing "git clone" path (in a
belt-and-suspenders way), along with any others that might
exist.

Our tests cover two cases:

  1. A file url with "./" continues to work, showing that
     there's an escape hatch for people with truly silly
     repo names.

  2. A url starting with "-" is rejected.

Note that we expect case (2) to fail, but it would have done
so even without this commit, for the reasons given above.
So instead of just expecting failure, let's also check for
the magic word "ignoring" on stderr. That lets us know that
we failed for the right reason.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-27 09:34:58 -07:00
98afac7a7c submodule--helper: use "--" to signal end of clone options
When we clone a submodule, we call "git clone $url $path".
But there's nothing to say that those components can't begin
with a dash themselves, confusing git-clone into thinking
they're options. Let's pass "--" to make it clear what we
expect.

There's no test here, because it's actually quite hard to
make these names work, even with "git clone" parsing them
correctly. And we're going to restrict these cases even
further in future commits. So we'll leave off testing until
then; this is just the minimal fix to prevent us from doing
something stupid with a badly formed entry.

Reported-by: joernchen <joernchen@phenoelit.de>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-27 09:34:55 -07:00
788 changed files with 48874 additions and 96207 deletions

View File

@ -1,169 +0,0 @@
# This file is an example configuration for clang-format 5.0.
#
# Note that this style definition should only be understood as a hint
# for writing new code. The rules are still work-in-progress and does
# not yet exactly match the style we have in the existing code.
# Use tabs whenever we need to fill whitespace that spans at least from one tab
# stop to the next one.
UseTab: Always
TabWidth: 8
IndentWidth: 8
ContinuationIndentWidth: 8
ColumnLimit: 80
# C Language specifics
Language: Cpp
# Align parameters on the open bracket
# someLongFunction(argument1,
# argument2);
AlignAfterOpenBracket: Align
# Don't align consecutive assignments
# int aaaa = 12;
# int b = 14;
AlignConsecutiveAssignments: false
# Don't align consecutive declarations
# int aaaa = 12;
# double b = 3.14;
AlignConsecutiveDeclarations: false
# Align escaped newlines as far left as possible
# #define A \
# int aaaa; \
# int b; \
# int cccccccc;
AlignEscapedNewlines: Left
# Align operands of binary and ternary expressions
# int aaa = bbbbbbbbbbb +
# cccccc;
AlignOperands: true
# Don't align trailing comments
# int a; // Comment a
# int b = 2; // Comment b
AlignTrailingComments: false
# By default don't allow putting parameters onto the next line
# myFunction(foo, bar, baz);
AllowAllParametersOfDeclarationOnNextLine: false
# Don't allow short braced statements to be on a single line
# if (a) not if (a) return;
# return;
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
# By default don't add a line break after the return type of top-level functions
# int foo();
AlwaysBreakAfterReturnType: None
# Pack as many parameters or arguments onto the same line as possible
# int myFunction(int aaaaaaaaaaaa, int bbbbbbbb,
# int cccc);
BinPackArguments: true
BinPackParameters: true
# Attach braces to surrounding context except break before braces on function
# definitions.
# void foo()
# {
# if (true) {
# } else {
# }
# };
BreakBeforeBraces: Linux
# Break after operators
# int valuve = aaaaaaaaaaaaa +
# bbbbbb -
# ccccccccccc;
BreakBeforeBinaryOperators: None
BreakBeforeTernaryOperators: false
# Don't break string literals
BreakStringLiterals: false
# Use the same indentation level as for the switch statement.
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
# Align pointer to the right
# int *a;
PointerAlignment: Right
# Don't insert a space after a cast
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
# Insert spaces before and after assignment operators
# int a = 5; not int a=5;
# a += 42; a+=42;
SpaceBeforeAssignmentOperators: true
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
# f();
# }
# }
SpaceBeforeParens: ControlStatements
# Don't insert spaces inside empty '()'
SpaceInEmptyParentheses: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
SpacesBeforeTrailingComments: 1
# Don't insert spaces in casts
# x = (int32) y; not x = ( int32 ) y;
SpacesInCStyleCastParentheses: false
# Don't insert spaces inside container literals
# var arr = [1, 2, 3]; not var arr = [ 1, 2, 3 ];
SpacesInContainerLiterals: false
# Don't insert spaces after '(' or before ')'
# f(arg); not f( arg );
SpacesInParentheses: false
# Don't insert spaces after '[' or before ']'
# int a[5]; not int a[ 5 ];
SpacesInSquareBrackets: false
# Insert a space after '{' and before '}' in struct initializers
Cpp11BracedListStyle: false
# A list of macros that should be interpreted as foreach loops instead of as
# function calls.
ForEachMacros: ['for_each_string_list_item']
# The maximum number of consecutive empty lines to keep.
MaxEmptyLinesToKeep: 1
# No empty line at the start of a block.
KeepEmptyLinesAtTheStartOfBlocks: false
# Penalties
# This decides what order things should be done if a line is too long
PenaltyBreakAssignment: 10
PenaltyBreakBeforeFirstCallParameter: 30
PenaltyBreakComment: 10
PenaltyBreakFirstLessLess: 0
PenaltyBreakString: 10
PenaltyExcessCharacter: 100
PenaltyReturnTypeOnItsOwnLine: 60
# Don't sort #include's
SortIncludes: false

View File

@ -113,7 +113,6 @@ Junio C Hamano <gitster@pobox.com> <junio@pobox.com>
Junio C Hamano <gitster@pobox.com> <junio@twinsun.com>
Junio C Hamano <gitster@pobox.com> <junkio@cox.net>
Junio C Hamano <gitster@pobox.com> <junkio@twinsun.com>
Kaartic Sivaraam <kaartic.sivaraam@gmail.com> <kaarticsivaraam91196@gmail.com>
Karl Wiberg <kha@treskal.com> Karl Hasselström
Karl Wiberg <kha@treskal.com> <kha@yoghurt.hemma.treskal.com>
Karsten Blees <blees@dcon.de> <karsten.blees@dcon.de>

View File

@ -21,32 +21,49 @@ addons:
- git-svn
- apache2
env:
global:
- DEVELOPER=1
# The Linux build installs the defined dependency versions below.
# The OS X build installs the latest available versions. Keep that
# in mind when you encounter a broken OS X build!
- LINUX_P4_VERSION="16.2"
- LINUX_GIT_LFS_VERSION="1.5.2"
- DEFAULT_TEST_TARGET=prove
- GIT_PROVE_OPTS="--timer --jobs 3 --state=failed,slow,save"
- GIT_TEST_OPTS="--verbose-log"
- GIT_TEST_CLONE_2GB=YesPlease
# t9810 occasionally fails on Travis CI OS X
# t9816 occasionally fails with "TAP out of sequence errors" on Travis CI OS X
- GIT_SKIP_TESTS="t9810 t9816"
matrix:
include:
- env: jobname=GETTEXT_POISON
- env: GETTEXT_POISON=YesPlease
os: linux
compiler:
addons:
before_install:
- env: jobname=Windows
- env: Windows
os: linux
compiler:
addons:
before_install:
before_script:
script:
- >
test "$TRAVIS_REPO_SLUG" != "git/git" ||
ci/run-windows-build.sh $TRAVIS_BRANCH $(git rev-parse HEAD)
after_failure:
- env: jobname=Linux32
- env: Linux32
os: linux
compiler:
addons:
services:
- docker
before_install:
before_script:
script: ci/run-linux32-docker.sh
- env: jobname=StaticAnalysis
- env: Static Analysis
os: linux
compiler:
addons:
@ -54,9 +71,10 @@ matrix:
packages:
- coccinelle
before_install:
# "before_script" that builds Git is inherited from base job
script: ci/run-static-analysis.sh
after_failure:
- env: jobname=Documentation
- env: Documentation
os: linux
compiler:
addons:
@ -65,11 +83,13 @@ matrix:
- asciidoc
- xmlto
before_install:
before_script:
script: ci/test-documentation.sh
after_failure:
before_install: ci/install-dependencies.sh
script: ci/run-build-and-tests.sh
before_script: ci/run-build.sh
script: ci/run-tests.sh
after_failure: ci/print-test-failures.sh
notifications:

View File

@ -11,4 +11,3 @@ doc.dep
cmds-*.txt
mergetools-*.txt
manpage-base-url.xsl
SubmittingPatches.txt

View File

@ -386,11 +386,6 @@ For C programs:
- Use Git's gettext wrappers to make the user interface
translatable. See "Marking strings for translation" in po/README.
- Variables and functions local to a given source file should be marked
with "static". Variables that are visible to other source files
must be declared with "extern" in header files. However, function
declarations should not use "extern", as that is already the default.
For Perl programs:
- Most of the C guidelines above apply.

View File

@ -39,7 +39,6 @@ MAN7_TXT += gitworkflows.txt
MAN_TXT = $(MAN1_TXT) $(MAN5_TXT) $(MAN7_TXT)
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
@ -68,11 +67,8 @@ SP_ARTICLES += howto/maintain-git
API_DOCS = $(patsubst %.txt,%,$(filter-out technical/api-index-skel.txt technical/api-index.txt, $(wildcard technical/api-*.txt)))
SP_ARTICLES += $(API_DOCS)
TECH_DOCS += SubmittingPatches
TECH_DOCS += technical/hash-function-transition
TECH_DOCS += technical/http-protocol
TECH_DOCS += technical/index-format
TECH_DOCS += technical/long-running-process-protocol
TECH_DOCS += technical/pack-format
TECH_DOCS += technical/pack-heuristics
TECH_DOCS += technical/pack-protocol
@ -184,7 +180,6 @@ ASCIIDOC = asciidoctor
ASCIIDOC_CONF =
ASCIIDOC_HTML = xhtml5
ASCIIDOC_DOCBOOK = docbook45
ASCIIDOC_EXTRA += -acompat-mode
ASCIIDOC_EXTRA += -I. -rasciidoctor-extensions
ASCIIDOC_EXTRA += -alitdd='&\#x2d;&\#x2d;'
DBLATEX_COMMON =
@ -327,7 +322,6 @@ clean:
$(RM) *.pdf
$(RM) howto-index.txt howto/*.html doc.dep
$(RM) technical/*.html technical/api-index.txt
$(RM) SubmittingPatches.txt
$(RM) $(cmds_txt) $(mergetools_txt) *.made
$(RM) manpage-base-url.xsl
@ -366,9 +360,6 @@ technical/%.html: ASCIIDOC_EXTRA += -a git-relative-html-prefix=../
$(patsubst %,%.html,$(API_DOCS) technical/api-index $(TECH_DOCS)): %.html : %.txt asciidoc.conf
$(QUIET_ASCIIDOC)$(TXT_TO_HTML) $*.txt
SubmittingPatches.txt: SubmittingPatches
$(QUIET_GEN) cp $< $@
XSLT = docbook.xsl
XSLTOPTS = --xinclude --stringparam html.stylesheet docbook-xsl.css
@ -439,14 +430,14 @@ require-manrepo::
then echo "git-manpages repository must exist at $(MAN_REPO)"; exit 1; fi
quick-install-man: require-manrepo
'$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(MAN_REPO) $(DESTDIR)$(mandir) $(GIT_MAN_REF)
'$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(MAN_REPO) $(DESTDIR)$(mandir)
require-htmlrepo::
@if test ! -d $(HTML_REPO); \
then echo "git-htmldocs repository must exist at $(HTML_REPO)"; exit 1; fi
quick-install-html: require-htmlrepo
'$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(HTML_REPO) $(DESTDIR)$(htmldir) $(GIT_MAN_REF)
'$(SHELL_PATH_SQ)' ./install-doc-quick.sh $(HTML_REPO) $(DESTDIR)$(htmldir)
print-man1:
@for i in $(MAN1_TXT); do echo $$i; done

View File

@ -0,0 +1,16 @@
Git v2.14.5 Release Notes
=========================
This release is to address the recently reported CVE-2018-17456.
Fixes since v2.14.4
-------------------
* Submodules' "URL"s come from the untrusted .gitmodules file, but
we blindly gave it to "git clone" to clone submodules when "git
clone --recurse-submodules" was used to clone a project that has
such a submodule. The code has been hardened to reject such
malformed URLs (e.g. one that begins with a dash).
Credit for finding and fixing this vulnerability goes to joernchen
and Jeff King, respectively.

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

@ -1,508 +0,0 @@
Git 2.15 Release Notes
======================
Backward compatibility notes and other notable changes.
* Use of an empty string as a pathspec element that is used for
'everything matches' is still warned and Git asks users to use a
more explicit '.' for that instead. The hope is that existing
users will not mind this change, and eventually the warning can be
turned into a hard error, upgrading the deprecation into removal of
this (mis)feature. That is now scheduled to happen in Git v2.16,
the next major release after this one.
* Git now avoids blindly falling back to ".git" when the setup
sequence said we are _not_ in Git repository. A corner case that
happens to work right now may be broken by a call to BUG().
We've tried hard to locate such cases and fixed them, but there
might still be cases that need to be addressed--bug reports are
greatly appreciated.
* "branch --set-upstream" that has been deprecated in Git 1.8 has
finally been retired.
Updates since v2.14
-------------------
UI, Workflows & Features
* An example that is now obsolete has been removed from a sample hook,
and an old example in it that added a sign-off manually has been
improved to use the interpret-trailers command.
* The advice message given when "git rebase" stops for conflicting
changes has been improved.
* The "rerere-train" script (in contrib/) learned the "--overwrite"
option to allow overwriting existing recorded resolutions.
* "git contacts" (in contrib/) now lists the address on the
"Reported-by:" trailer to its output, in addition to those on
S-o-b: and other trailers, to make it easier to notify (and thank)
the original bug reporter.
* "git rebase", especially when it is run by mistake and ends up
trying to replay many changes, spent long time in silence. The
command has been taught to show progress report when it spends
long time preparing these many changes to replay (which would give
the user a chance to abort with ^C).
* "git merge" learned a "--signoff" option to add the Signed-off-by:
trailer with the committer's name.
* "git diff" learned to optionally paint new lines that are the same
as deleted lines elsewhere differently from genuinely new lines.
* "git interpret-trailers" learned to take the trailer specifications
from the command line that overrides the configured values.
* "git interpret-trailers" has been taught a "--parse" and a few
other options to make it easier for scripts to grab existing
trailer lines from a commit log message.
* The "--format=%(trailers)" option "git log" and its friends take
learned to take the 'unfold' and 'only' modifiers to normalize its
output, e.g. "git log --format=%(trailers:only,unfold)".
* "gitweb" shows a link to visit the 'raw' contents of blobs in the
history overview page.
* "[gc] rerereResolved = 5.days" used to be invalid, as the variable
is defined to take an integer counting the number of days. It now
is allowed.
* The code to acquire a lock on a reference (e.g. while accepting a
push from a client) used to immediately fail when the reference is
already locked---now it waits for a very short while and retries,
which can make it succeed if the lock holder was holding it during
a read-only operation.
* "branch --set-upstream" that has been deprecated in Git 1.8 has
finally been retired.
* The codepath to call external process filter for smudge/clean
operation learned to show the progress meter.
* "git rev-parse" learned "--is-shallow-repository", that is to be
used in a way similar to existing "--is-bare-repository" and
friends.
* "git describe --match <pattern>" has been taught to play well with
the "--all" option.
* "git branch" learned "-c/-C" to create a new branch by copying an
existing one.
* Some commands (most notably "git status") makes an opportunistic
update when performing a read-only operation to help optimize later
operations in the same repository. The new "--no-optional-locks"
option can be passed to Git to disable them.
* "git for-each-ref --format=..." learned a new format element,
%(trailers), to show only the commit log trailer part of the log
message.
Performance, Internal Implementation, Development Support etc.
* Conversion from uchar[20] to struct object_id continues.
* Start using selected c99 constructs in small, stable and
essential part of the system to catch people who care about
older compilers that do not grok them.
* The filter-process interface learned to allow a process with long
latency give a "delayed" response.
* Many uses of comparison callback function the hashmap API uses
cast the callback function type when registering it to
hashmap_init(), which defeats the compile time type checking when
the callback interface changes (e.g. gaining more parameters).
The callback implementations have been updated to take "void *"
pointers and cast them to the type they expect instead.
* Because recent Git for Windows do come with a real msgfmt, the
build procedure for git-gui has been updated to use it instead of a
hand-rolled substitute.
* "git grep --recurse-submodules" has been reworked to give a more
consistent output across submodule boundary (and do its thing
without having to fork a separate process).
* A helper function to read a single whole line into strbuf
mistakenly triggered OOM error at EOF under certain conditions,
which has been fixed.
* The "ref-store" code reorganization continues.
* "git commit" used to discard the index and re-read from the filesystem
just in case the pre-commit hook has updated it in the middle; this
has been optimized out when we know we do not run the pre-commit hook.
(merge 680ee550d7 kw/commit-keep-index-when-pre-commit-is-not-run later to maint).
* Updates to the HTTP layer we made recently unconditionally used
features of libCurl without checking the existence of them, causing
compilation errors, which has been fixed. Also migrate the code to
check feature macros, not version numbers, to cope better with
libCurl that vendor ships with backported features.
* The API to start showing progress meter after a short delay has
been simplified.
(merge 8aade107dd jc/simplify-progress later to maint).
* Code clean-up to avoid mixing values read from the .gitmodules file
and values read from the .git/config file.
* We used to spend more than necessary cycles allocating and freeing
piece of memory while writing each index entry out. This has been
optimized.
* Platforms that ship with a separate sha1 with collision detection
library can link to it instead of using the copy we ship as part of
our source tree.
* Code around "notes" have been cleaned up.
(merge 3964281524 mh/notes-cleanup later to maint).
* The long-standing rule that an in-core lockfile instance, once it
is used, must not be freed, has been lifted and the lockfile and
tempfile APIs have been updated to reduce the chance of programming
errors.
* Our hashmap implementation in hashmap.[ch] is not thread-safe when
adding a new item needs to expand the hashtable by rehashing; add
an API to disable the automatic rehashing to work it around.
* Many of our programs consider that it is OK to release dynamic
storage that is used throughout the life of the program by simply
exiting, but this makes it harder to leak detection tools to avoid
reporting false positives. Plug many existing leaks and introduce
a mechanism for developers to mark that the region of memory
pointed by a pointer is not lost/leaking to help these tools.
* As "git commit" to conclude a conflicted "git merge" honors the
commit-msg hook, "git merge" that records a merge commit that
cleanly auto-merges should, but it didn't.
* The codepath for "git merge-recursive" has been cleaned up.
* Many leaks of strbuf have been fixed.
* "git imap-send" has our own implementation of the protocol and also
can use more recent libCurl with the imap protocol support. Update
the latter so that it can use the credential subsystem, and then
make it the default option to use, so that we can eventually
deprecate and remove the former.
* "make style" runs git-clang-format to help developers by pointing
out coding style issues.
* A test to demonstrate "git mv" failing to adjust nested submodules
has been added.
(merge c514167df2 hv/mv-nested-submodules-test later to maint).
* On Cygwin, "ulimit -s" does not report failure but it does not work
at all, which causes an unexpected success of some tests that
expect failures under a limited stack situation. This has been
fixed.
* Many codepaths have been updated to squelch -Wimplicit-fallthrough
warnings from Gcc 7 (which is a good code hygiene).
* Add a helper for DLL loading in anticipation for its need in a
future topic RSN.
* "git status --ignored", when noticing that a directory without any
tracked path is ignored, still enumerated all the ignored paths in
the directory, which is unnecessary. The codepath has been
optimized to avoid this overhead.
* The final batch to "git rebase -i" updates to move more code from
the shell script to C has been merged.
* Operations that do not touch (majority of) packed refs have been
optimized by making accesses to packed-refs file lazy; we no longer
pre-parse everything, and an access to a single ref in the
packed-refs does not touch majority of irrelevant refs, either.
* Add comment to clarify that the style file is meant to be used with
clang-5 and the rules are still work in progress.
* Many variables that points at a region of memory that will live
throughout the life of the program have been marked with UNLEAK
marker to help the leak checkers concentrate on real leaks..
* Plans for weaning us off of SHA-1 has been documented.
* A new "oidmap" API has been introduced and oidset API has been
rewritten to use it.
Also contains various documentation updates and code clean-ups.
Fixes since v2.14
-----------------
* "%C(color name)" in the pretty print format always produced ANSI
color escape codes, which was an early design mistake. They now
honor the configuration (e.g. "color.ui = never") and also tty-ness
of the output medium.
* The http.{sslkey,sslCert} configuration variables are to be
interpreted as a pathname that honors "~[username]/" prefix, but
weren't, which has been fixed.
* Numerous bugs in walking of reflogs via "log -g" and friends have
been fixed.
* "git commit" when seeing an totally empty message said "you did not
edit the message", which is clearly wrong. The message has been
corrected.
* When a directory is not readable, "gitweb" fails to build the
project list. Work this around by skipping such a directory.
* Some versions of GnuPG fails to kill gpg-agent it auto-spawned
and such a left-over agent can interfere with a test. Work it
around by attempting to kill one before starting a new test.
* A recently added test for the "credential-cache" helper revealed
that EOF detection done around the time the connection to the cache
daemon is torn down were flaky. This was fixed by reacting to
ECONNRESET and behaving as if we got an EOF.
* "git log --tag=no-such-tag" showed log starting from HEAD, which
has been fixed---it now shows nothing.
* The "tag.pager" configuration variable was useless for those who
actually create tag objects, as it interfered with the use of an
editor. A new mechanism has been introduced for commands to enable
pager depending on what operation is being carried out to fix this,
and then "git tag -l" is made to run pager by default.
* "git push --recurse-submodules $there HEAD:$target" was not
propagated down to the submodules, but now it is.
* Commands like "git rebase" accepted the --rerere-autoupdate option
from the command line, but did not always use it. This has been
fixed.
* "git clone --recurse-submodules --quiet" did not pass the quiet
option down to submodules.
* Test portability fix for OBSD.
* Portability fix for OBSD.
* "git am -s" has been taught that some input may end with a trailer
block that is not Signed-off-by: and it should refrain from adding
an extra blank line before adding a new sign-off in such a case.
* "git svn" used with "--localtime" option did not compute the tz
offset for the timestamp in question and instead always used the
current time, which has been corrected.
* Memory leak in an error codepath has been plugged.
* "git stash -u" used the contents of the committed version of the
".gitignore" file to decide which paths are ignored, even when the
file has local changes. The command has been taught to instead use
the locally modified contents.
* bash 4.4 or newer gave a warning on NUL byte in command
substitution done in "git stash"; this has been squelched.
* "git grep -L" and "git grep --quiet -L" reported different exit
codes; this has been corrected.
* When handshake with a subprocess filter notices that the process
asked for an unknown capability, Git did not report what program
the offending subprocess was running. This has been corrected.
* "git apply" that is used as a better "patch -p1" failed to apply a
taken from a file with CRLF line endings to a file with CRLF line
endings. The root cause was because it misused convert_to_git()
that tried to do "safe-crlf" processing by looking at the index
entry at the same path, which is a nonsense---in that mode, "apply"
is not working on the data in (or derived from) the index at all.
This has been fixed.
* Killing "git merge --edit" before the editor returns control left
the repository in a state with MERGE_MSG but without MERGE_HEAD,
which incorrectly tells the subsequent "git commit" that there was
a squash merge in progress. This has been fixed.
* "git archive" did not work well with pathspecs and the
export-ignore attribute.
* In addition to "cc: <a@dd.re.ss> # cruft", "cc: a@dd.re.ss # cruft"
was taught to "git send-email" as a valid way to tell it that it
needs to also send a carbon copy to <a@dd.re.ss> in the trailer
section.
* "git branch -M a b" while on a branch that is completely unrelated
to either branch a or branch b misbehaved when multiple worktree
was in use. This has been fixed.
(merge 31824d180d nd/worktree-kill-parse-ref later to maint).
* "git gc" and friends when multiple worktrees are used off of a
single repository did not consider the index and per-worktree refs
of other worktrees as the root for reachability traversal, making
objects that are in use only in other worktrees to be subject to
garbage collection.
* A regression to "gitk --bisect" by a recent update has been fixed.
* "git -c submodule.recurse=yes pull" did not work as if the
"--recurse-submodules" option was given from the command line.
This has been corrected.
* Unlike "git commit-tree < file", "git commit-tree -F file" did not
pass the contents of the file verbatim and instead completed an
incomplete line at the end, if exists. The latter has been updated
to match the behaviour of the former.
* Many codepaths did not diagnose write failures correctly when disks
go full, due to their misuse of write_in_full() helper function,
which have been corrected.
(merge f48ecd38cb jk/write-in-full-fix later to maint).
* "git help co" now says "co is aliased to ...", not "git co is".
(merge b3a8076e0d ks/help-alias-label later to maint).
* "git archive", especially when used with pathspec, stored an empty
directory in its output, even though Git itself never does so.
This has been fixed.
* API error-proofing which happens to also squelch warnings from GCC.
* The explanation of the cut-line in the commit log editor has been
slightly tweaked.
(merge 8c4b1a3593 ks/commit-do-not-touch-cut-line later to maint).
* "git gc" tries to avoid running two instances at the same time by
reading and writing pid/host from and to a lock file; it used to
use an incorrect fscanf() format when reading, which has been
corrected.
* The scripts to drive TravisCI has been reorganized and then an
optimization to avoid spending cycles on a branch whose tip is
tagged has been implemented.
(merge 8376eb4a8f ls/travis-scriptify later to maint).
* The test linter has been taught that we do not like "echo -e".
* Code cmp.std.c nitpick.
* A regression fix for 2.11 that made the code to read the list of
alternate object stores overrun the end of the string.
(merge f0f7bebef7 jk/info-alternates-fix later to maint).
* "git describe --match" learned to take multiple patterns in v2.13
series, but the feature ignored the patterns after the first one
and did not work at all. This has been fixed.
* "git filter-branch" cannot reproduce a history with a tag without
the tagger field, which only ancient versions of Git allowed to be
created. This has been corrected.
(merge b2c1ca6b4b ic/fix-filter-branch-to-handle-tag-without-tagger later to maint).
* "git cat-file --textconv" started segfaulting recently, which
has been corrected.
* The built-in pattern to detect the "function header" for HTML did
not match <H1>..<H6> elements without any attributes, which has
been fixed.
* "git mailinfo" was loose in decoding quoted printable and produced
garbage when the two letters after the equal sign are not
hexadecimal. This has been fixed.
* The machinery to create xdelta used in pack files received the
sizes of the data in size_t, but lost the higher bits of them by
storing them in "unsigned int" during the computation, which is
fixed.
* The delta format used in the packfile cannot reference data at
offset larger than what can be expressed in 4-byte, but the
generator for the data failed to make sure the offset does not
overflow. This has been corrected.
* The documentation for '-X<option>' for merges was misleadingly
written to suggest that "-s theirs" exists, which is not the case.
* "git fast-export" with -M/-C option issued "copy" instruction on a
path that is simultaneously modified, which was incorrect.
(merge b3e8ca89cf jt/fast-export-copy-modify-fix later to maint).
* Many codepaths have been updated to squelch -Wsign-compare
warnings.
(merge 071bcaab64 rj/no-sign-compare later to maint).
* Memory leaks in various codepaths have been plugged.
(merge 4d01a7fa65 ma/leakplugs later to maint).
* Recent versions of "git rev-parse --parseopt" did not parse the
option specification that does not have the optional flags (*=?!)
correctly, which has been corrected.
(merge a6304fa4c2 bc/rev-parse-parseopt-fix later to maint).
* The checkpoint command "git fast-import" did not flush updates to
refs and marks unless at least one object was created since the
last checkpoint, which has been corrected, as these things can
happen without any new object getting created.
(merge 30e215a65c er/fast-import-dump-refs-on-checkpoint later to maint).
* Spell the name of our system as "Git" in the output from
request-pull script.
* Fixes for a handful memory access issues identified by valgrind.
* Backports a moral equivalent of 2015 fix to the poll() emulation
from the upstream gnulib to fix occasional breakages on HPE NonStop.
* Users with "color.ui = always" in their configuration were broken
by a recent change that made plumbing commands to pay attention to
them as the patch created internally by "git add -p" were colored
(heh) and made unusable. This has been fixed by reverting the
offending change.
* In the "--format=..." option of the "git for-each-ref" command (and
its friends, i.e. the listing mode of "git branch/tag"), "%(atom:)"
(e.g. "%(refname:)", "%(body:)" used to error out. Instead, treat
them as if the colon and an empty string that follows it were not
there.
* An ancient bug that made Git misbehave with creation/renaming of
refs has been fixed.
* "git fetch <there> <src>:<dst>" allows an object name on the <src>
side when the other side accepts such a request since Git v2.5, but
the documentation was left stale.
(merge 83558a412a jc/fetch-refspec-doc-update later to maint).
* Update the documentation for "git filter-branch" so that the filter
options are listed in the same order as they are applied, as
described in an earlier part of the doc.
(merge 07c4984508 dg/filter-branch-filter-order-doc later to maint).
* A possible oom error is now caught as a fatal error, instead of
continuing and dereferencing NULL.
(merge 55d7d15847 ao/path-use-xmalloc later to maint).
* Other minor doc, test and build updates and code cleanups.
(merge f094b89a4d ma/parse-maybe-bool later to maint).
(merge 6cdf8a7929 ma/ts-cleanups later to maint).
(merge 7560f547e6 ma/up-to-date later to maint).
(merge 0db3dc75f3 rs/apply-epoch later to maint).
(merge 276d0e35c0 ma/split-symref-update-fix later to maint).
(merge f777623514 ks/branch-tweak-error-message-for-extra-args later to maint).
(merge 33f3c683ec ks/verify-filename-non-option-error-message-tweak later to maint).
(merge 7cbbf9d6a2 ls/filter-process-delayed later to maint).
(merge 488aa65c8f wk/merge-options-gpg-sign-doc later to maint).
(merge e61cb19a27 jc/branch-force-doc-readability-fix later to maint).
(merge 32fceba3fd np/config-path-doc later to maint).
(merge e38c681fb7 sb/rev-parse-show-superproject-root later to maint).
(merge 4f851dc883 sg/rev-list-doc-reorder-fix later to maint).

View File

@ -1,88 +0,0 @@
Git v2.15.1 Release Notes
=========================
Fixes since v2.15
-----------------
* TravisCI build updates.
* "auto" as a value for the columnar output configuration ought to
judge "is the output consumed by humans?" with the same criteria as
"auto" for coloured output configuration, i.e. either the standard
output stream is going to tty, or a pager is in use. We forgot the
latter, which has been fixed.
* The experimental "color moved lines differently in diff output"
feature was buggy around "ignore whitespace changes" edges, which
has been corrected.
* Instead of using custom line comparison and hashing functions to
implement "moved lines" coloring in the diff output, use the pair
of these functions from lower-layer xdiff/ code.
* Some codepaths did not check for errors when asking what branch the
HEAD points at, which have been fixed.
* "git commit", after making a commit, did not check for errors when
asking on what branch it made the commit, which has been corrected.
* "git status --ignored -u" did not stop at a working tree of a
separate project that is embedded in an ignored directory and
listed files in that other project, instead of just showing the
directory itself as ignored.
* A broken access to object databases in recent update to "git grep
--recurse-submodules" has been fixed.
* A recent regression in "git rebase -i" that broke execution of git
commands from subdirectories via "exec" instruction has been fixed.
* "git check-ref-format --branch @{-1}" bit a "BUG()" when run
outside a repository for obvious reasons; clarify the documentation
and make sure we do not even try to expand the at-mark magic in
such a case, but still call the validation logic for branch names.
* Command line completion (in contrib/) update.
* Description of blame.{showroot,blankboundary,showemail,date}
configuration variables have been added to "git config --help".
* After an error from lstat(), diff_populate_filespec() function
sometimes still went ahead and used invalid data in struct stat,
which has been fixed.
* UNC paths are also relevant in Cygwin builds and they are now
tested just like Mingw builds.
* Correct start-up sequence so that a repository could be placed
immediately under the root directory again (which was broken at
around Git 2.13).
* The credential helper for libsecret (in contrib/) has been improved
to allow possibly prompting the end user to unlock secrets that are
currently locked (otherwise the secrets may not be loaded).
* Updates from GfW project.
* "git rebase -i" recently started misbehaving when a submodule that
is configured with 'submodule.<name>.ignore' is dirty; this has
been corrected.
* Some error messages did not quote filenames shown in it, which have
been fixed.
* Building with NO_LIBPCRE1_JIT did not disable it, which has been fixed.
* We used to add an empty alternate object database to the system
that does not help anything; it has been corrected.
* Error checking in "git imap-send" for empty response has been
improved.
* An ancient bug in "git apply --ignore-space-change" codepath has
been fixed.
* There was a recent semantic mismerge in the codepath to write out a
section of a configuration section, which has been corrected.
Also contains various documentation updates and code clean-ups.

View File

@ -1,50 +0,0 @@
Git v2.15.2 Release Notes
=========================
Fixes since v2.15.1
-------------------
* Recent update to the refs infrastructure implementation started
rewriting packed-refs file more often than before; this has been
optimized again for most trivial cases.
* The SubmittingPatches document has been converted to produce an
HTML version via AsciiDoc/Asciidoctor.
* Contrary to the documentation, "git pull -4/-6 other-args" did not
ask the underlying "git fetch" to go over IPv4/IPv6, which has been
corrected.
* When "git rebase" prepared an mailbox of changes and fed it to "git
am" to replay them, it was confused when a stray "From " happened
to be in the log message of one of the replayed changes. This has
been corrected.
* Command line completion (in contrib/) has been taught about the
"--copy" option of "git branch".
* "git apply --inaccurate-eof" when used with "--ignore-space-change"
triggered an internal sanity check, which has been fixed.
* The sequencer machinery (used by "git cherry-pick A..B", and "git
rebase -i", among other things) would have lost a commit if stopped
due to an unlockable index file, which has been fixed.
* The three-way merge performed by "git cherry-pick" was confused
when a new submodule was added in the meantime, which has been
fixed (or "papered over").
* "git notes" sent its error message to its standard output stream,
which was corrected.
* A few scripts (both in production and tests) incorrectly redirected
their error output. These have been corrected.
* Clarify and enhance documentation for "merge-base --fork-point", as
it was clear what it computed but not why/what for.
* This release also contains the fixes made in the v2.13.7 version of
Git. See its release notes for details.
Also contains various documentation updates and code clean-ups.

View File

@ -1,482 +0,0 @@
Git 2.16 Release Notes
======================
Backward compatibility notes and other notable changes.
* Use of an empty string as a pathspec element that is used for
'everything matches' is now an error.
Updates since v2.15
-------------------
UI, Workflows & Features
* An empty string as a pathspec element that means "everything"
i.e. 'git add ""', is now illegal. We started this by first
deprecating and warning a pathspec that has such an element in
2.11 (Nov 2016).
* A hook script that is set unexecutable is simply ignored. Git
notifies when such a file is ignored, unless the message is
squelched via advice.ignoredHook configuration.
* "git pull" has been taught to accept "--[no-]signoff" option and
pass it down to "git merge".
* The "--push-option=<string>" option to "git push" now defaults to a
list of strings configured via push.pushOption variable.
* "gitweb" checks if a directory is searchable with Perl's "-x"
operator, which can be enhanced by using "filetest 'access'"
pragma, which now we do.
* "git stash save" has been deprecated in favour of "git stash push".
* The set of paths output from "git status --ignored" was tied
closely with its "--untracked=<mode>" option, but now it can be
controlled more flexibly. Most notably, a directory that is
ignored because it is listed to be ignored in the ignore/exclude
mechanism can be handled differently from a directory that ends up
to be ignored only because all files in it are ignored.
* The remote-helper for talking to MediaWiki has been updated to
truncate an overlong pagename so that ".mw" suffix can still be
added.
* The remote-helper for talking to MediaWiki has been updated to
work with mediawiki namespaces.
* The "--format=..." option "git for-each-ref" takes learned to show
the name of the 'remote' repository and the ref at the remote side
that is affected for 'upstream' and 'push' via "%(push:remotename)"
and friends.
* Doc and message updates to teach users "bisect view" is a synonym
for "bisect visualize".
* "git bisect run" that did not specify any command to run used to go
ahead and treated all commits to be tested as 'good'. This has
been corrected by making the command error out.
* The SubmittingPatches document has been converted to produce an
HTML version via AsciiDoc/Asciidoctor.
* We learned to optionally talk to a file system monitor via new
fsmonitor extension to speed up "git status" and other operations
that need to see which paths have been modified. Currently we only
support "watchman". See File System Monitor section of
git-update-index(1) for more detail.
* The "diff" family of commands learned to ignore differences in
carriage return at the end of line.
* Places that know about "sendemail.to", like documentation and shell
completion (in contrib/) have been taught about "sendemail.tocmd",
too.
* "git add --renormalize ." is a new and safer way to record the fact
that you are correcting the end-of-line convention and other
"convert_to_git()" glitches in the in-repository data.
* "git branch" and "git checkout -b" are now forbidden from creating
a branch whose name is "HEAD".
* "git branch --list" learned to show its output through the pager by
default when the output is going to a terminal, which is controlled
by the pager.branch configuration variable. This is similar to a
recent change to "git tag --list".
* "git grep -W", "git diff -W" and their friends learned a heuristic
to extend a pre-context beyond the line that matches the "function
pattern" (aka "diff.*.xfuncname") to include a comment block, if
exists, that immediately precedes it.
* "git config --expiry-date gc.reflogexpire" can read "2.weeks" from
the configuration and report it as a timestamp, just like "--int"
would read "1k" and report 1024, to help consumption by scripts.
* The shell completion (in contrib/) learned that "git pull" can take
the "--autostash" option.
* The tagnames "git log --decorate" uses to annotate the commits can
now be limited to subset of available refs with the two additional
options, --decorate-refs[-exclude]=<pattern>.
* "git grep" compiled with libpcre2 sometimes triggered a segfault,
which is being fixed.
* "git send-email" tries to see if the sendmail program is available
in /usr/lib and /usr/sbin; extend the list of locations to be
checked to also include directories on $PATH.
* "git diff" learned, "--anchored", a variant of the "--patience"
algorithm, to which the user can specify which 'unique' line to be
used as anchoring points.
* The way "git worktree add" determines what branch to create from
where and checkout in the new worktree has been updated a bit.
* Ancient part of codebase still shows dots after an abbreviated
object name just to show that it is not a full object name, but
these ellipses are confusing to people who newly discovered Git
who are used to seeing abbreviated object names and find them
confusing with the range syntax.
* With a configuration variable rebase.abbreviateCommands set,
"git rebase -i" produces the todo list with a single-letter
command names.
* "git worktree add" learned to run the post-checkout hook, just like
"git checkout" does, after the initial checkout.
* "git svn" has been updated to strip CRs in the commit messages, as
recent versions of Subversion rejects them.
* "git imap-send" did not correctly quote the folder name when
making a request to the server, which has been corrected.
* Error messages from "git rebase" have been somewhat cleaned up.
* Git has been taught to support an https:// URL used for http.proxy
when using recent versions of libcurl.
* "git merge" learned to pay attention to merge.verifySignatures
configuration variable and pretend as if '--verify-signatures'
option was given from the command line.
* "git describe" was taught to dig trees deeper to find a
<commit-ish>:<path> that refers to a given blob object.
Performance, Internal Implementation, Development Support etc.
* An earlier update made it possible to use an on-stack in-core
lockfile structure (as opposed to having to deliberately leak an
on-heap one). Many codepaths have been updated to take advantage
of this new facility.
* Calling cmd_foo() as if it is a general purpose helper function is
a no-no. Correct two instances of such to set an example.
* We try to see if somebody runs our test suite with a shell that
does not support "local" like bash/dash does.
* An early part of piece-by-piece rewrite of "git bisect" in C.
* GSoC to piece-by-piece rewrite "git submodule" in C.
* Optimize the code to find shortest unique prefix of object names.
* Pathspec-limited revision traversal was taught not to keep finding
unneeded differences once it knows two trees are different inside
given pathspec.
* Conversion from uchar[20] to struct object_id continues.
* Code cleanup.
* A single-word "unsigned flags" in the diff options is being split
into a structure with many bitfields.
* TravisCI build updates.
* Parts of a test to drive the long-running content filter interface
has been split into its own module, hopefully to eventually become
reusable.
* Drop (perhaps overly cautious) sanity check before using the index
read from the filesystem at runtime.
* The build procedure has been taught to avoid some unnecessary
instability in the build products.
* A new mechanism to upgrade the wire protocol in place is proposed
and demonstrated that it works with the older versions of Git
without harming them.
* An infrastructure to define what hash function is used in Git is
introduced, and an effort to plumb that throughout various
codepaths has been started.
* The code to iterate over loose object files got optimized.
* An internal function that was left for backward compatibility has
been removed, as there is no remaining callers.
* Historically, the diff machinery for rename detection had a
hardcoded limit of 32k paths; this is being lifted to allow users
trade cycles with a (possibly) easier to read result.
* The tracing infrastructure has been optimized for cases where no
tracing is requested.
* In preparation for implementing narrow/partial clone, the object
walking machinery has been taught a way to tell it to "filter" some
objects from enumeration.
* A few structures and variables that are implementation details of
the decorate API have been renamed and then the API got documented
better.
* Assorted updates for TravisCI integration.
(merge 4f26366679 sg/travis-fixes later to maint).
* Introduce a helper to simplify code to parse a common pattern that
expects either "--key" or "--key=<something>".
* "git version --build-options" learned to report the host CPU and
the exact commit object name the binary was built from.
Also contains various documentation updates and code clean-ups.
Fixes since v2.15
-----------------
* "auto" as a value for the columnar output configuration ought to
judge "is the output consumed by humans?" with the same criteria as
"auto" for coloured output configuration, i.e. either the standard
output stream is going to tty, or a pager is in use. We forgot the
latter, which has been fixed.
* The experimental "color moved lines differently in diff output"
feature was buggy around "ignore whitespace changes" edges, which
has been corrected.
* Instead of using custom line comparison and hashing functions to
implement "moved lines" coloring in the diff output, use the pair
of these functions from lower-layer xdiff/ code.
* Some codepaths did not check for errors when asking what branch the
HEAD points at, which have been fixed.
* "git commit", after making a commit, did not check for errors when
asking on what branch it made the commit, which has been corrected.
* "git status --ignored -u" did not stop at a working tree of a
separate project that is embedded in an ignored directory and
listed files in that other project, instead of just showing the
directory itself as ignored.
* A broken access to object databases in recent update to "git grep
--recurse-submodules" has been fixed.
* A recent regression in "git rebase -i" that broke execution of git
commands from subdirectories via "exec" instruction has been fixed.
* A (possibly flakey) test fix.
* "git check-ref-format --branch @{-1}" bit a "BUG()" when run
outside a repository for obvious reasons; clarify the documentation
and make sure we do not even try to expand the at-mark magic in
such a case, but still call the validation logic for branch names.
* "git fetch --recurse-submodules" now knows that submodules can be
moved around in the superproject in addition to getting updated,
and finds the ones that need to be fetched accordingly.
* Command line completion (in contrib/) update.
* Description of blame.{showroot,blankboundary,showemail,date}
configuration variables have been added to "git config --help".
* After an error from lstat(), diff_populate_filespec() function
sometimes still went ahead and used invalid data in struct stat,
which has been fixed.
* UNC paths are also relevant in Cygwin builds and they are now
tested just like Mingw builds.
* Correct start-up sequence so that a repository could be placed
immediately under the root directory again (which was broken at
around Git 2.13).
* The credential helper for libsecret (in contrib/) has been improved
to allow possibly prompting the end user to unlock secrets that are
currently locked (otherwise the secrets may not be loaded).
* MinGW updates.
* Error checking in "git imap-send" for empty response has been
improved.
* Recent update to the refs infrastructure implementation started
rewriting packed-refs file more often than before; this has been
optimized again for most trivial cases.
* Some error messages did not quote filenames shown in it, which have
been fixed.
* "git rebase -i" recently started misbehaving when a submodule that
is configured with 'submodule.<name>.ignore' is dirty; this has
been corrected.
* Building with NO_LIBPCRE1_JIT did not disable it, which has been fixed.
* We used to add an empty alternate object database to the system
that does not help anything; it has been corrected.
* Doc update around use of "format-patch --subject-prefix" etc.
* A fix for an ancient bug in "git apply --ignore-space-change" codepath.
* Clarify and enhance documentation for "merge-base --fork-point", as
it was clear what it computed but not why/what for.
* A few scripts (both in production and tests) incorrectly redirected
their error output. These have been corrected.
* "git notes" sent its error message to its standard output stream,
which was corrected.
* The three-way merge performed by "git cherry-pick" was confused
when a new submodule was added in the meantime, which has been
fixed (or "papered over").
* The sequencer machinery (used by "git cherry-pick A..B", and "git
rebase -i", among other things) would have lost a commit if stopped
due to an unlockable index file, which has been fixed.
* "git apply --inaccurate-eof" when used with "--ignore-space-change"
triggered an internal sanity check, which has been fixed.
* Command line completion (in contrib/) has been taught about the
"--copy" option of "git branch".
* When "git rebase" prepared a mailbox of changes and fed it to "git
am" to replay them, it was confused when a stray "From " happened
to be in the log message of one of the replayed changes. This has
been corrected.
* There was a recent semantic mismerge in the codepath to write out a
section of a configuration section, which has been corrected.
* Mentions of "git-rebase" and "git-am" (dashed form) still remained
in end-user visible strings emitted by the "git rebase" command;
they have been corrected.
* Contrary to the documentation, "git pull -4/-6 other-args" did not
ask the underlying "git fetch" to go over IPv4/IPv6, which has been
corrected.
* "git checkout --recursive" may overwrite and rewind the history of
the branch that happens to be checked out in submodule
repositories, which might not be desirable. Detach the HEAD but
still allow the recursive checkout to succeed in such a case.
(merge 57f22bf997 sb/submodule-recursive-checkout-detach-head later to maint).
* "git branch --set-upstream" has been deprecated and (sort of)
removed, as "--set-upstream-to" is the preferred one these days.
The documentation still had "--set-upstream" listed on its
synopsis section, which has been corrected.
(merge a060f3d3d8 tz/branch-doc-remove-set-upstream later to maint).
* Internally we use 0{40} as a placeholder object name to signal the
codepath that there is no such object (e.g. the fast-forward check
while "git fetch" stores a new remote-tracking ref says "we know
there is no 'old' thing pointed at by the ref, as we are creating
it anew" by passing 0{40} for the 'old' side), and expect that a
codepath to locate an in-core object to return NULL as a sign that
the object does not exist. A look-up for an object that does not
exist however is quite costly with a repository with large number
of packfiles. This access pattern has been optimized.
(merge 87b5e236a1 jk/fewer-pack-rescan later to maint).
* In addition to "git stash -m message", the command learned to
accept "git stash -mmessage" form.
(merge 5675473fcb ph/stash-save-m-option-fix later to maint).
* @{-N} in "git checkout @{-N}" may refer to a detached HEAD state,
but the documentation was not clear about it, which has been fixed.
(merge 75ce149575 ks/doc-checkout-previous later to maint).
* A regression in the progress eye-candy was fixed.
(merge 9c5951cacf jk/progress-delay-fix later to maint).
* The code internal to the recursive merge strategy was not fully
prepared to see a path that is renamed to try overwriting another
path that is only different in case on case insensitive systems.
This does not matter in the current code, but will start to matter
once the rename detection logic starts taking hints from nearby
paths moving to some directory and moves a new path along with them.
(merge 4cba2b0108 en/merge-recursive-icase-removal later to maint).
* An v2.12-era regression in pathspec match logic, which made it look
into submodule tree even when it is not desired, has been fixed.
(merge eef3df5a93 bw/pathspec-match-submodule-boundary later to maint).
* Amending commits in git-gui broke the author name that is non-ascii
due to incorrect enconding conversion.
* Recent update to the submodule configuration code broke "diff-tree"
by accidentally stopping to read from the index upfront.
(merge fd66bcc31f bw/submodule-config-cleanup later to maint).
* Git shows a message to tell the user that it is waiting for the
user to finish editing when spawning an editor, in case the editor
opens to a hidden window or somewhere obscure and the user gets
lost.
(merge abfb04d0c7 ls/editor-waiting-message later to maint).
* The "safe crlf" check incorrectly triggered for contents that does
not use CRLF as line endings, which has been corrected.
(merge 649f1f0948 tb/check-crlf-for-safe-crlf later to maint).
* "git clone --shared" to borrow from a (secondary) worktree did not
work, even though "git clone --local" did. Both are now accepted.
(merge b3b05971c1 es/clone-shared-worktree later to maint).
* The build procedure now allows not just the repositories but also
the refs to be used to take pre-formatted manpages and html
documents to install.
(merge 65289e9dcd rb/quick-install-doc later to maint).
* Update the shell prompt script (in contrib/) to strip trailing CR
from strings read from various "state" files.
(merge 041fe8fc83 ra/prompt-eread-fix later to maint).
* "git merge -s recursive" did not correctly abort when the index is
dirty, if the merged tree happened to be the same as the current
HEAD, which has been fixed.
* Bytes with high-bit set were encoded incorrectly and made
credential helper fail.
(merge 4c267f2ae3 jd/fix-strbuf-add-urlencode-bytes later to maint).
* "git rebase -p -X<option>" did not propagate the option properly
down to underlying merge strategy backend.
(merge dd6fb0053c js/fix-merge-arg-quoting-in-rebase-p later to maint).
* "git merge -s recursive" did not correctly abort when the index is
dirty, if the merged tree happened to be the same as the current
HEAD, which has been fixed.
(merge f309e8e768 ew/empty-merge-with-dirty-index-maint later to maint).
* Other minor doc, test and build updates and code cleanups.
(merge 1a1fc2d5b5 rd/man-prune-progress later to maint).
(merge 0ba014035a rd/man-reflog-add-n later to maint).
(merge e54b63359f rd/doc-notes-prune-fix later to maint).
(merge ff4c9b413a sp/doc-info-attributes later to maint).
(merge 7db2cbf4f1 jc/receive-pack-hook-doc later to maint).
(merge 5a0526264b tg/t-readme-updates later to maint).
(merge 5e83cca0b8 jk/no-optional-locks later to maint).
(merge 826c778f7c js/hashmap-update-sample later to maint).
(merge 176b2d328c sg/setup-doc-update later to maint).
(merge 1b09073514 rs/am-builtin-leakfix later to maint).
(merge addcf6cfde rs/fmt-merge-msg-string-leak-fix later to maint).
(merge c3ff8f6c14 rs/strbuf-read-once-reset-length later to maint).
(merge 6b0eb884f9 db/doc-workflows-neuter-the-maintainer later to maint).
(merge 8c87bdfb21 jk/cvsimport-quoting later to maint).
(merge 176cb979fe rs/fmt-merge-msg-leakfix later to maint).
(merge 5a03360e73 tb/delimit-pretty-trailers-args-with-comma later to maint).
(merge d0e6326026 ot/pretty later to maint).
(merge 44103f4197 sb/test-helper-excludes later to maint).
(merge 170078693f jt/transport-no-more-rsync later to maint).
(merge c07b3adff1 bw/path-doc later to maint).
(merge bf9d7df950 tz/lib-git-svn-svnserve-tests later to maint).
(merge dec366c9a8 sr/http-sslverify-config-doc later to maint).
(merge 3f824e91c8 jk/test-suite-tracing later to maint).
(merge 1feb061701 db/doc-config-section-names-with-bs later to maint).
(merge 74dea0e13c jh/memihash-opt later to maint).
(merge 2e9fdc795c ma/bisect-leakfix later to maint).

View File

@ -1,11 +0,0 @@
Git v2.16.1 Release Notes
=========================
Fixes since v2.16
-----------------
* "git clone" segfaulted when cloning a project that happens to
track two paths that differ only in case on a case insensitive
filesystem.
Does not contain any other documentation updates or code clean-ups.

View File

@ -1,30 +0,0 @@
Git v2.16.2 Release Notes
=========================
Fixes since v2.16.1
-------------------
* An old regression in "git describe --all $annotated_tag^0" has been
fixed.
* "git svn dcommit" did not take into account the fact that a
svn+ssh:// URL with a username@ (typically used for pushing) refers
to the same SVN repository without the username@ and failed when
svn.pushmergeinfo option is set.
* "git merge -Xours/-Xtheirs" learned to use our/their version when
resolving a conflicting updates to a symbolic link.
* "git clone $there $here" is allowed even when here directory exists
as long as it is an empty directory, but the command incorrectly
removed it upon a failure of the operation.
* "git stash -- <pathspec>" incorrectly blew away untracked files in
the directory that matched the pathspec, which has been corrected.
* "git add -p" was taught to ignore local changes to submodules as
they do not interfere with the partial addition of regular changes
anyway.
Also contains various documentation updates and code clean-ups.

View File

@ -1,49 +0,0 @@
Git v2.16.3 Release Notes
=========================
Fixes since v2.16.2
-------------------
* "git status" after moving a path in the working tree (hence making
it appear "removed") and then adding with the -N option (hence
making that appear "added") detected it as a rename, but did not
report the old and new pathnames correctly.
* "git commit --fixup" did not allow "-m<message>" option to be used
at the same time; allow it to annotate resulting commit with more
text.
* When resetting the working tree files recursively, the working tree
of submodules are now also reset to match.
* Fix for a commented-out code to adjust it to a rather old API change
around object ID.
* When there are too many changed paths, "git diff" showed a warning
message but in the middle of a line.
* The http tracing code, often used to debug connection issues,
learned to redact potentially sensitive information from its output
so that it can be more safely sharable.
* Crash fix for a corner case where an error codepath tried to unlock
what it did not acquire lock on.
* The split-index mode had a few corner case bugs fixed.
* Assorted fixes to "git daemon".
* Completion of "git merge -s<strategy>" (in contrib/) did not work
well in non-C locale.
* Workaround for segfault with more recent versions of SVN.
* Recently introduced leaks in fsck have been plugged.
* Travis CI integration now builds the executable in 'script' phase
to follow the established practice, rather than during
'before_script' phase. This allows the CI categorize the failures
better ('failed' is project's fault, 'errored' is build
environment's).
Also contains various documentation updates and code clean-ups.

View File

@ -1,5 +0,0 @@
Git v2.16.4 Release Notes
=========================
This release is to forward-port the fixes made in the v2.13.7 version
of Git. See its release notes for details.

View File

@ -1,398 +0,0 @@
Git 2.17 Release Notes
======================
Updates since v2.16
-------------------
UI, Workflows & Features
* "diff" family of commands learned "--find-object=<object-id>" option
to limit the findings to changes that involve the named object.
* "git format-patch" learned to give 72-cols to diffstat, which is
consistent with other line length limits the subcommand uses for
its output meant for e-mails.
* The log from "git daemon" can be redirected with a new option; one
relevant use case is to send the log to standard error (instead of
syslog) when running it from inetd.
* "git rebase" learned to take "--allow-empty-message" option.
* "git am" has learned the "--quit" option, in addition to the
existing "--abort" option; having the pair mirrors a few other
commands like "rebase" and "cherry-pick".
* "git worktree add" learned to run the post-checkout hook, just like
"git clone" runs it upon the initial checkout.
* "git tag" learned an explicit "--edit" option that allows the
message given via "-m" and "-F" to be further edited.
* "git fetch --prune-tags" may be used as a handy short-hand for
getting rid of stale tags that are locally held.
* The new "--show-current-patch" option gives an end-user facing way
to get the diff being applied when "git rebase" (and "git am")
stops with a conflict.
* "git add -p" used to offer "/" (look for a matching hunk) as a
choice, even there was only one hunk, which has been corrected.
Also the single-key help is now given only for keys that are
enabled (e.g. help for '/' won't be shown when there is only one
hunk).
* Since Git 1.7.9, "git merge" defaulted to --no-ff (i.e. even when
the side branch being merged is a descendant of the current commit,
create a merge commit instead of fast-forwarding) when merging a
tag object. This was appropriate default for integrators who pull
signed tags from their downstream contributors, but caused an
unnecessary merges when used by downstream contributors who
habitually "catch up" their topic branches with tagged releases
from the upstream. Update "git merge" to default to --no-ff only
when merging a tag object that does *not* sit at its usual place in
refs/tags/ hierarchy, and allow fast-forwarding otherwise, to
mitigate the problem.
* "git status" can spend a lot of cycles to compute the relation
between the current branch and its upstream, which can now be
disabled with "--no-ahead-behind" option.
* "git diff" and friends learned funcname patterns for Go language
source files.
* "git send-email" learned "--reply-to=<address>" option.
* Funcname pattern used for C# now recognizes "async" keyword.
* In a way similar to how "git tag" learned to honor the pager
setting only in the list mode, "git config" learned to ignore the
pager setting when it is used for setting values (i.e. when the
purpose of the operation is not to "show").
Performance, Internal Implementation, Development Support etc.
* More perf tests for threaded grep
* "perf" test output can be sent to codespeed server.
* The build procedure for perl/ part has been greatly simplified by
weaning ourselves off of MakeMaker.
* Perl 5.8 or greater has been required since Git 1.7.4 released in
2010, but we continued to assume some core modules may not exist and
used a conditional "eval { require <<module>> }"; we no longer do
this. Some platforms (Fedora/RedHat/CentOS, for example) ship Perl
without all core modules by default (e.g. Digest::MD5, File::Temp,
File::Spec, Net::Domain, Net::SMTP). Users on such platforms may
need to install these additional modules.
* As a convenience, we install copies of Perl modules we require which
are not part of the core Perl distribution (e.g. Error and
Mail::Address). Users and packagers whose operating system provides
these modules can set NO_PERL_CPAN_FALLBACKS to avoid installing the
bundled modules.
* In preparation for implementing narrow/partial clone, the machinery
for checking object connectivity used by gc and fsck has been
taught that a missing object is OK when it is referenced by a
packfile specially marked as coming from trusted repository that
promises to make them available on-demand and lazily.
* The machinery to clone & fetch, which in turn involves packing and
unpacking objects, has been told how to omit certain objects using
the filtering mechanism introduced by another topic. It now knows
to mark the resulting pack as a promisor pack to tolerate missing
objects, laying foundation for "narrow" clones.
* The first step to getting rid of mru API and using the
doubly-linked list API directly instead.
* Retire mru API as it does not give enough abstraction over
underlying list API to be worth it.
* Rewrite two more "git submodule" subcommands in C.
* The tracing machinery learned to report tweaking of environment
variables as well.
* Update Coccinelle rules to catch and optimize strbuf_addf(&buf, "%s", str)
* Prevent "clang-format" from breaking line after function return type.
* The sequencer infrastructure is shared across "git cherry-pick",
"git rebase -i", etc., and has always spawned "git commit" when it
needs to create a commit. It has been taught to do so internally,
when able, by reusing the codepath "git commit" itself uses, which
gives performance boost for a few tens of percents in some sample
scenarios.
* Push the submodule version of collision-detecting SHA-1 hash
implementation a bit harder on builders.
* Avoid mmapping small files while using packed refs (especially ones
with zero size, which would cause later munmap() to fail).
* Conversion from uchar[20] to struct object_id continues.
* More tests for wildmatch functions.
* The code to binary search starting from a fan-out table (which is
how the packfile is indexed with object names) has been refactored
into a reusable helper.
* We now avoid using identifiers that clash with C++ keywords. Even
though it is not a goal to compile Git with C++ compilers, changes
like this help use of code analysis tools that targets C++ on our
codebase.
* The executable is now built in 'script' phase in Travis CI integration,
to follow the established practice, rather than during 'before_script'
phase. This allows the CI categorize the failures better ('failed'
is project's fault, 'errored' is build environment's).
(merge 3c93b82920 sg/travis-build-during-script-phase later to maint).
* Writing out the index file when the only thing that changed in it
is the untracked cache information is often wasteful, and this has
been optimized out.
* Various pieces of Perl code we have have been cleaned up.
* Internal API clean-up to allow write_locked_index() optionally skip
writing the in-core index when it is not modified.
Also contains various documentation updates and code clean-ups.
Fixes since v2.16
-----------------
* An old regression in "git describe --all $annotated_tag^0" has been
fixed.
* "git status" after moving a path in the working tree (hence making
it appear "removed") and then adding with the -N option (hence
making that appear "added") detected it as a rename, but did not
report the old and new pathnames correctly.
* "git svn dcommit" did not take into account the fact that a
svn+ssh:// URL with a username@ (typically used for pushing) refers
to the same SVN repository without the username@ and failed when
svn.pushmergeinfo option is set.
* API clean-up around revision traversal.
* "git merge -Xours/-Xtheirs" learned to use our/their version when
resolving a conflicting updates to a symbolic link.
* "git clone $there $here" is allowed even when here directory exists
as long as it is an empty directory, but the command incorrectly
removed it upon a failure of the operation.
* "git commit --fixup" did not allow "-m<message>" option to be used
at the same time; allow it to annotate resulting commit with more
text.
* When resetting the working tree files recursively, the working tree
of submodules are now also reset to match.
* "git stash -- <pathspec>" incorrectly blew away untracked files in
the directory that matched the pathspec, which has been corrected.
* Instead of maintaining home-grown email address parsing code, ship
a copy of reasonably recent Mail::Address to be used as a fallback
in 'git send-email' when the platform lacks it.
(merge d60be8acab mm/send-email-fallback-to-local-mail-address later to maint).
* "git add -p" was taught to ignore local changes to submodules as
they do not interfere with the partial addition of regular changes
anyway.
* Avoid showing a warning message in the middle of a line of "git
diff" output.
(merge 4e056c989f nd/diff-flush-before-warning later to maint).
* The http tracing code, often used to debug connection issues,
learned to redact potentially sensitive information from its output
so that it can be more safely sharable.
(merge 8ba18e6fa4 jt/http-redact-cookies later to maint).
* Crash fix for a corner case where an error codepath tried to unlock
what it did not acquire lock on.
(merge 81fcb698e0 mr/packed-ref-store-fix later to maint).
* The split-index mode had a few corner case bugs fixed.
(merge ae59a4e44f tg/split-index-fixes later to maint).
* Assorted fixes to "git daemon".
(merge ed15e58efe jk/daemon-fixes later to maint).
* Completion of "git merge -s<strategy>" (in contrib/) did not work
well in non-C locale.
(merge 7cc763aaa3 nd/list-merge-strategy later to maint).
* Workaround for segfault with more recent versions of SVN.
(merge 7f6f75e97a ew/svn-branch-segfault-fix later to maint).
* Plug recently introduced leaks in fsck.
(merge ba3a08ca0e jt/fsck-code-cleanup later to maint).
* "git pull --rebase" did not pass verbosity setting down when
recursing into a submodule.
(merge a56771a668 sb/pull-rebase-submodule later to maint).
* The way "git reset --hard" reports the commit the updated HEAD
points at is made consistent with the way how the commit title is
generated by the other parts of the system. This matters when the
title is spread across physically multiple lines.
(merge 1cf823fb68 tg/reset-hard-show-head-with-pretty later to maint).
* Test fixes.
(merge 63b1a175ee sg/test-i18ngrep later to maint).
* Some bugs around "untracked cache" feature have been fixed. This
will notice corrupt data in the untracked cache left by old and
buggy code and issue a warning---the index can be fixed by clearing
the untracked cache from it.
(merge 0cacebf099 nd/fix-untracked-cache-invalidation later to maint).
(merge 7bf0be7501 ab/untracked-cache-invalidation-docs later to maint).
* "git blame HEAD COPYING" in a bare repository failed to run, while
"git blame HEAD -- COPYING" run just fine. This has been corrected.
* "git add" files in the same directory, but spelling the directory
path in different cases on case insensitive filesystem, corrupted
the name hash data structure and led to unexpected results. This
has been corrected.
(merge c95525e90d bp/name-hash-dirname-fix later to maint).
* "git rebase -p" mangled log messages of a merge commit, which is
now fixed.
(merge ed5144d7eb js/fix-merge-arg-quoting-in-rebase-p later to maint).
* Some low level protocol codepath could crash when they get an
unexpected flush packet, which is now fixed.
(merge bb1356dc64 js/packet-read-line-check-null later to maint).
* "git check-ignore" with multiple paths got confused when one is a
file and the other is a directory, which has been fixed.
(merge d60771e930 rs/check-ignore-multi later to maint).
* "git describe $garbage" stopped giving any errors when the garbage
happens to be a string with 40 hexadecimal letters.
(merge a8e7a2bf0f sb/describe-blob later to maint).
* Code to unquote single-quoted string (used in the parser for
configuration files, etc.) did not diagnose bogus input correctly
and produced bogus results instead.
(merge ddbbf8eb25 jk/sq-dequote-on-bogus-input later to maint).
* Many places in "git apply" knew that "/dev/null" that signals
"there is no such file on this side of the diff" can be followed by
whitespace and garbage when parsing a patch, except for one, which
made an otherwise valid patch (e.g. ones from subversion) rejected.
(merge e454ad4bec tk/apply-dev-null-verify-name-fix later to maint).
* We no longer create any *.spec file, so "make clean" should not
remove it.
(merge 4321bdcabb tz/do-not-clean-spec-file later to maint).
* "git push" over http transport did not unquote the push-options
correctly.
(merge 90dce21eb0 jk/push-options-via-transport-fix later to maint).
* "git send-email" learned to complain when the batch-size option is
not defined when the relogin-delay option is, since these two are
mutually required.
(merge 9caa70697b xz/send-email-batch-size later to maint).
* Y2k20 fix ;-) for our perl scripts.
(merge a40e06ee33 bw/perl-timegm-timelocal-fix later to maint).
* Threaded "git grep" has been optimized to avoid allocation in code
section that is covered under a mutex.
(merge 38ef24dccf rv/grep-cleanup later to maint).
* "git subtree" script (in contrib/) scripted around "git log", whose
output got affected by end-user configuration like log.showsignature
(merge 8841b5222c sg/subtree-signed-commits later to maint).
* While finding unique object name abbreviation, the code may
accidentally have read beyond the end of the array of object names
in a pack.
(merge 21abed500c ds/find-unique-abbrev-optim later to maint).
* Micro optimization in revision traversal code.
(merge ebbed3ba04 ds/mark-parents-uninteresting-optim later to maint).
* "git commit" used to run "gc --auto" near the end, which was lost
when the command was reimplemented in C by mistake.
(merge 095c741edd ab/gc-auto-in-commit later to maint).
* Allow running a couple of tests with "sh -x".
(merge c20bf94abc sg/cvs-tests-with-x later to maint).
* The codepath to replace an existing entry in the index had a bug in
updating the name hash structure, which has been fixed.
(merge 0e267b7a24 bp/refresh-cache-ent-rehash-fix later to maint).
* The transfer.fsckobjects configuration tells "git fetch" to
validate the data and connected-ness of objects in the received
pack; the code to perform this check has been taught about the
narrow clone's convention that missing objects that are reachable
from objects in a pack that came from a promissor remote is OK.
* There was an unused file-scope static variable left in http.c when
building for versions of libCURL that is older than 7.19.4, which
has been fixed.
(merge b8fd6008ec rj/http-code-cleanup later to maint).
* Shell script portability fix.
(merge 206a6ae013 ml/filter-branch-portability-fix later to maint).
* Other minor doc, test and build updates and code cleanups.
(merge e2a5a028c7 bw/oidmap-autoinit later to maint).
(merge ec3b4b06f8 cl/t9001-cleanup later to maint).
(merge e1b3f3dd38 ks/submodule-doc-updates later to maint).
(merge fbac558a9b rs/describe-unique-abbrev later to maint).
(merge 8462ff43e4 tb/crlf-conv-flags later to maint).
(merge 7d68bb0766 rb/hashmap-h-compilation-fix later to maint).
(merge 3449847168 cc/sha1-file-name later to maint).
(merge ad622a256f ds/use-get-be64 later to maint).
(merge f919ffebed sg/cocci-move-array later to maint).
(merge 4e801463c7 jc/mailinfo-cleanup-fix later to maint).
(merge ef5b3a6c5e nd/shared-index-fix later to maint).
(merge 9f5258cbb8 tz/doc-show-defaults-to-head later to maint).
(merge b780e4407d jc/worktree-add-short-help later to maint).
(merge ae239fc8e5 rs/cocci-strbuf-addf-to-addstr later to maint).
(merge 2e22a85e5c nd/ignore-glob-doc-update later to maint).
(merge 3738031581 jk/gettext-poison later to maint).
(merge 54360a1956 rj/sparse-updates later to maint).
(merge 12e31a6b12 sg/doc-test-must-fail-args later to maint).
(merge 760f1ad101 bc/doc-interpret-trailers-grammofix later to maint).
(merge 4ccf461f56 bp/fsmonitor later to maint).
(merge a6119f82b1 jk/test-hashmap-updates later to maint).
(merge 5aea9fe6cc rd/typofix later to maint).
(merge e4e5da2796 sb/status-doc-fix later to maint).
(merge 7976e901c8 gs/test-unset-xdg-cache-home later to maint).
(merge d023df1ee6 tg/worktree-create-tracking later to maint).
(merge 4cbe92fd41 sm/mv-dry-run-update later to maint).
(merge 75e5e9c3f7 sb/color-h-cleanup later to maint).
(merge 2708ef4af6 sg/t6300-modernize later to maint).
(merge d88e92d4e0 bw/doc-submodule-recurse-config-with-clone later to maint).
(merge f74bbc8dd2 jk/cached-commit-buffer later to maint).
(merge 1316416903 ms/non-ascii-ticks later to maint).
(merge 878056005e rs/strbuf-read-file-or-whine later to maint).
(merge 79f0ba1547 jk/strbuf-read-file-close-error later to maint).
(merge edfb8ba068 ot/ref-filter-cleanup later to maint).
(merge 11395a3b4b jc/test-must-be-empty later to maint).
(merge 768b9d6db7 mk/doc-pretty-fill later to maint).
(merge 2caa7b8d27 ab/man-sec-list later to maint).
(merge 40c17eb184 ks/t3200-typofix later to maint).
(merge bd9958c358 dp/merge-strategy-doc-fix later to maint).
(merge 9ee0540a40 js/ming-strftime later to maint).
(merge 1775e990f7 tz/complete-tag-delete-tagname later to maint).
(merge 00a4b03501 rj/warning-uninitialized-fix later to maint).
(merge b635ed97a0 jk/attributes-path-doc later to maint).

View File

@ -1,16 +0,0 @@
Git v2.17.1 Release Notes
=========================
Fixes since v2.17
-----------------
* This release contains the same fixes made in the v2.13.7 version of
Git, covering CVE-2018-11233 and 11235, and forward-ported to
v2.14.4, v2.15.2 and v2.16.4 releases. See release notes to
v2.13.7 for details.
* In addition to the above fixes, this release has support on the
server side to reject pushes to repositories that attempt to create
such problematic .gitmodules file etc. as tracked contents, to help
hosting sites protect their customers by preventing malicious
contents from spreading.

View File

@ -1,47 +1,40 @@
Submitting Patches
==================
== Guidelines
Here are some guidelines for people who want to contribute their code
to this software.
[[base-branch]]
=== Decide what to base your work on.
(0) Decide what to base your work on.
In general, always base your work on the oldest branch that your
change is relevant to.
* A bugfix should be based on `maint` in general. If the bug is not
present in `maint`, base it on `master`. For a bug that's not yet
in `master`, find the topic that introduces the regression, and
base your work on the tip of the topic.
- A bugfix should be based on 'maint' in general. If the bug is not
present in 'maint', base it on 'master'. For a bug that's not yet
in 'master', find the topic that introduces the regression, and
base your work on the tip of the topic.
* A new feature should be based on `master` in general. If the new
feature depends on a topic that is in `pu`, but not in `master`,
base your work on the tip of that topic.
- A new feature should be based on 'master' in general. If the new
feature depends on a topic that is in 'pu', but not in 'master',
base your work on the tip of that topic.
* Corrections and enhancements to a topic not yet in `master` should
be based on the tip of that topic. If the topic has not been merged
to `next`, it's alright to add a note to squash minor corrections
into the series.
- Corrections and enhancements to a topic not yet in 'master' should
be based on the tip of that topic. If the topic has not been merged
to 'next', it's alright to add a note to squash minor corrections
into the series.
* In the exceptional case that a new feature depends on several topics
not in `master`, start working on `next` or `pu` privately and send
out patches for discussion. Before the final merge, you may have to
wait until some of the dependent topics graduate to `master`, and
rebase your work.
- In the exceptional case that a new feature depends on several topics
not in 'master', start working on 'next' or 'pu' privately and send
out patches for discussion. Before the final merge, you may have to
wait until some of the dependent topics graduate to 'master', and
rebase your work.
* Some parts of the system have dedicated maintainers with their own
repositories (see the section "Subsystems" below). Changes to
these parts should be based on their trees.
- Some parts of the system have dedicated maintainers with their own
repositories (see the section "Subsystems" below). Changes to
these parts should be based on their trees.
To find the tip of a topic branch, run `git log --first-parent
master..pu` and look for the merge commit. The second parent of this
To find the tip of a topic branch, run "git log --first-parent
master..pu" and look for the merge commit. The second parent of this
commit is the tip of the topic branch.
[[separate-commits]]
=== Make separate commits for logically separate changes.
(1) Make separate commits for logically separate changes.
Unless your patch is really trivial, you should not be sending
out a patch that was generated between your working tree and
@ -65,9 +58,8 @@ differs substantially from the prior version, are all good things
to have.
Make sure that you have tests for the bug you are fixing. See
`t/README` for guidance.
t/README for guidance.
[[tests]]
When adding a new feature, make sure that you have new tests to show
the feature triggers the new behavior when it should, and to show the
feature does not trigger when it shouldn't. After any code change, make
@ -92,45 +84,41 @@ turning en_UK spelling to en_US). Obvious typographical fixes are much
more welcomed ("teh -> "the"), preferably submitted as independent
patches separate from other documentation changes.
[[whitespace-check]]
Oh, another thing. We are picky about whitespaces. Make sure your
changes do not trigger errors with the sample pre-commit hook shipped
in `templates/hooks--pre-commit`. To help ensure this does not happen,
run `git diff --check` on your changes before you commit.
in templates/hooks--pre-commit. To help ensure this does not happen,
run "git diff --check" on your changes before you commit.
[[describe-changes]]
=== Describe your changes well.
(2) Describe your changes well.
The first line of the commit message should be a short description (50
characters is the soft limit, see DISCUSSION in linkgit:git-commit[1]),
and should skip the full stop. It is also conventional in most cases to
characters is the soft limit, see DISCUSSION in git-commit(1)), and
should skip the full stop. It is also conventional in most cases to
prefix the first line with "area: " where the area is a filename or
identifier for the general area of the code being modified, e.g.
* doc: clarify distinction between sign-off and pgp-signing
* githooks.txt: improve the intro section
. doc: clarify distinction between sign-off and pgp-signing
. githooks.txt: improve the intro section
If in doubt which identifier to use, run `git log --no-merges` on the
If in doubt which identifier to use, run "git log --no-merges" on the
files you are modifying to see the current conventions.
[[summary-section]]
It's customary to start the remainder of the first line after "area: "
with a lower-case letter. E.g. "doc: clarify...", not "doc:
Clarify...", or "githooks.txt: improve...", not "githooks.txt:
Improve...".
[[meaningful-message]]
The body should provide a meaningful commit message, which:
. explains the problem the change tries to solve, i.e. what is wrong
with the current code without the change.
. explains the problem the change tries to solve, i.e. what is wrong
with the current code without the change.
. justifies the way the change solves the problem, i.e. why the
result with the change is better.
. justifies the way the change solves the problem, i.e. why the
result with the change is better.
. alternate solutions considered but discarded, if any.
. alternate solutions considered but discarded, if any.
[[imperative-mood]]
Describe your changes in imperative mood, e.g. "make xyzzy do frotz"
instead of "[This patch] makes xyzzy do frotz" or "[I] changed xyzzy
to do frotz", as if you are giving orders to the codebase to change
@ -138,43 +126,36 @@ its behavior. Try to make sure your explanation can be understood
without external resources. Instead of giving a URL to a mailing list
archive, summarize the relevant points of the discussion.
[[commit-reference]]
If you want to reference a previous commit in the history of a stable
branch, use the format "abbreviated sha1 (subject, date)",
with the subject enclosed in a pair of double-quotes, like this:
....
Commit f86a374 ("pack-bitmap.c: fix a memleak", 2015-03-30)
noticed that ...
....
Commit f86a374 ("pack-bitmap.c: fix a memleak", 2015-03-30)
noticed that ...
The "Copy commit summary" command of gitk can be used to obtain this
format, or this invocation of `git show`:
format, or this invocation of "git show":
....
git show -s --date=short --pretty='format:%h ("%s", %ad)' <commit>
....
git show -s --date=short --pretty='format:%h ("%s", %ad)' <commit>
[[git-tools]]
=== Generate your patch using Git tools out of your commits.
(3) Generate your patch using Git tools out of your commits.
Git based diff tools generate unidiff which is the preferred format.
You do not have to be afraid to use `-M` option to `git diff` or
`git format-patch`, if your patch involves file renames. The
You do not have to be afraid to use -M option to "git diff" or
"git format-patch", if your patch involves file renames. The
receiving end can handle them just fine.
[[review-patch]]
Please make sure your patch does not add commented out debugging code,
or include any extra files which do not relate to what your patch
is trying to achieve. Make sure to review
your patch after generating it, to ensure accuracy. Before
sending out, please make sure it cleanly applies to the `master`
sending out, please make sure it cleanly applies to the "master"
branch head. If you are preparing a work based on "next" branch,
that is fine, but please mark it as such.
[[send-patches]]
=== Sending your patches.
(4) Sending your patches.
Learn to use format-patch and send-email if possible. These commands
are optimized for the workflow of sending patches, avoiding many ways
@ -203,15 +184,14 @@ lose tabs that way if you are not careful.
It is a common convention to prefix your subject line with
[PATCH]. This lets people easily distinguish patches from other
e-mail discussions. Use of markers in addition to PATCH within
the brackets to describe the nature of the patch is also
encouraged. E.g. [RFC PATCH] (where RFC stands for "request for
comments") is often used to indicate a patch needs further
discussion before being accepted, [PATCH v2], [PATCH v3] etc.
are often seen when you are sending an update to what you have
previously sent.
e-mail discussions. Use of additional markers after PATCH and
the closing bracket to mark the nature of the patch is also
encouraged. E.g. [PATCH/RFC] is often used when the patch is
not ready to be applied but it is for discussion, [PATCH v2],
[PATCH v3] etc. are often seen when you are sending an update to
what you have previously sent.
The `git format-patch` command follows the best current practice to
"git format-patch" command follows the best current practice to
format the body of an e-mail message. At the beginning of the
patch should come your commit message, ending with the
Signed-off-by: lines, and a line that consists of three dashes,
@ -219,10 +199,6 @@ followed by the diffstat information and the patch itself. If
you are forwarding a patch from somebody else, optionally, at
the beginning of the e-mail message just before the commit
message starts, you can put a "From: " line to name that person.
To change the default "[PATCH]" in the subject to "[<text>]", use
`git format-patch --subject-prefix=<text>`. As a shortcut, you
can use `--rfc` instead of `--subject-prefix="RFC PATCH"`, or
`-v <n>` instead of `--subject-prefix="PATCH v<n>"`.
You often want to add additional explanation about the patch,
other than the commit message itself. Place such "cover letter"
@ -232,7 +208,6 @@ an explanation of changes between each iteration can be kept in
Git-notes and inserted automatically following the three-dash
line via `git format-patch --notes`.
[[attachment]]
Do not attach the patch as a MIME attachment, compressed or not.
Do not let your e-mail client send quoted-printable. Do not let
your e-mail client send format=flowed which would destroy
@ -247,7 +222,6 @@ that it will be postponed.
Exception: If your mailer is mangling patches then someone may ask
you to re-send them using MIME, that is OK.
[[pgp-signature]]
Do not PGP sign your patch. Most likely, your maintainer or other people on the
list would not have your PGP key and would not bother obtaining it anyway.
Your patch is not judged by who you are; a good patch from an unknown origin
@ -256,27 +230,28 @@ origin that is done poorly or does incorrect things.
If you really really really really want to do a PGP signed
patch, format it as "multipart/signed", not a text/plain message
that starts with `-----BEGIN PGP SIGNED MESSAGE-----`. That is
that starts with '-----BEGIN PGP SIGNED MESSAGE-----'. That is
not a text/plain, it's something else.
Send your patch with "To:" set to the mailing list, with "cc:" listing
people who are involved in the area you are touching (the output from
`git blame $path` and `git shortlog --no-merges $path` would help to
"git blame $path" and "git shortlog --no-merges $path" would help to
identify them), to solicit comments and reviews.
:1: footnote:[The current maintainer: gitster@pobox.com]
:2: footnote:[The mailing list: git@vger.kernel.org]
After the list reached a consensus that it is a good idea to apply the
patch, re-send it with "To:" set to the maintainer{1} and "cc:" the
list{2} for inclusion.
patch, re-send it with "To:" set to the maintainer [*1*] and "cc:" the
list [*2*] for inclusion.
Do not forget to add trailers such as `Acked-by:`, `Reviewed-by:` and
`Tested-by:` lines as necessary to credit people who helped your
Do not forget to add trailers such as "Acked-by:", "Reviewed-by:" and
"Tested-by:" lines as necessary to credit people who helped your
patch.
[[sign-off]]
=== Certify your work by adding your "Signed-off-by: " line
[Addresses]
*1* The current maintainer: gitster@pobox.com
*2* The mailing list: git@vger.kernel.org
(5) Certify your work by adding your "Signed-off-by: " line
To improve tracking of who did what, we've borrowed the
"sign-off" procedure from the Linux kernel project on patches
@ -288,39 +263,35 @@ the patch, which certifies that you wrote it or otherwise have
the right to pass it on as a open-source patch. The rules are
pretty simple: if you can certify the below D-C-O:
[[dco]]
.Developer's Certificate of Origin 1.1
____
By making a contribution to this project, I certify that:
Developer's Certificate of Origin 1.1
a. The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
By making a contribution to this project, I certify that:
b. The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
(a) The contribution was created in whole or in part by me and I
have the right to submit it under the open source license
indicated in the file; or
c. The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(b) The contribution is based upon previous work that, to the best
of my knowledge, is covered under an appropriate open source
license and I have the right under that license to submit that
work with modifications, whether created in whole or in part
by me, under the same open source license (unless I am
permitted to submit under a different license), as indicated
in the file; or
d. I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
____
(c) The contribution was provided directly to me by some other
person who certified (a), (b) or (c) and I have not modified
it.
(d) I understand and agree that this project and the contribution
are public and that a record of the contribution (including all
personal information I submit with it, including my sign-off) is
maintained indefinitely and may be redistributed consistent with
this project or the open source license(s) involved.
then you just add a line saying
....
Signed-off-by: Random J Developer <random@developer.example.org>
....
Signed-off-by: Random J Developer <random@developer.example.org>
This line can be automatically added by Git if you run the git-commit
command with the -s option.
@ -331,86 +302,85 @@ D-C-O. Indeed you are encouraged to do so. Do not forget to
place an in-body "From: " line at the beginning to properly attribute
the change to its true author (see (2) above).
[[real-name]]
Also notice that a real name is used in the Signed-off-by: line. Please
don't hide your real name.
[[commit-trailers]]
If you like, you can put extra tags at the end:
. `Reported-by:` is used to credit someone who found the bug that
the patch attempts to fix.
. `Acked-by:` says that the person who is more familiar with the area
the patch attempts to modify liked the patch.
. `Reviewed-by:`, unlike the other tags, can only be offered by the
reviewer and means that she is completely satisfied that the patch
is ready for application. It is usually offered only after a
detailed review.
. `Tested-by:` is used to indicate that the person applied the patch
and found it to have the desired effect.
1. "Reported-by:" is used to credit someone who found the bug that
the patch attempts to fix.
2. "Acked-by:" says that the person who is more familiar with the area
the patch attempts to modify liked the patch.
3. "Reviewed-by:", unlike the other tags, can only be offered by the
reviewer and means that she is completely satisfied that the patch
is ready for application. It is usually offered only after a
detailed review.
4. "Tested-by:" is used to indicate that the person applied the patch
and found it to have the desired effect.
You can also create your own tag or use one that's in common usage
such as "Thanks-to:", "Based-on-patch-by:", or "Mentored-by:".
== Subsystems with dedicated maintainers
------------------------------------------------
Subsystems with dedicated maintainers
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
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
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/
Patches to these parts should be based on their trees.
[[patch-flow]]
== An ideal patch flow
------------------------------------------------
An ideal patch flow
Here is an ideal patch flow for this project the current maintainer
suggests to the contributors:
. You come up with an itch. You code it up.
(0) You come up with an itch. You code it up.
. Send it to the list and cc people who may need to know about
the change.
+
The people who may need to know are the ones whose code you
are butchering. These people happen to be the ones who are
most likely to be knowledgeable enough to help you, but
they have no obligation to help you (i.e. you ask for help,
don't demand). +git log -p {litdd} _$area_you_are_modifying_+ would
help you find out who they are.
(1) Send it to the list and cc people who may need to know about
the change.
. You get comments and suggestions for improvements. You may
even get them in a "on top of your change" patch form.
The people who may need to know are the ones whose code you
are butchering. These people happen to be the ones who are
most likely to be knowledgeable enough to help you, but
they have no obligation to help you (i.e. you ask for help,
don't demand). "git log -p -- $area_you_are_modifying" would
help you find out who they are.
. Polish, refine, and re-send to the list and the people who
spend their time to improve your patch. Go back to step (2).
(2) You get comments and suggestions for improvements. You may
even get them in a "on top of your change" patch form.
. The list forms consensus that the last round of your patch is
good. Send it to the maintainer and cc the list.
(3) Polish, refine, and re-send to the list and the people who
spend their time to improve your patch. Go back to step (2).
. A topic branch is created with the patch and is merged to `next`,
and cooked further and eventually graduates to `master`.
(4) The list forms consensus that the last round of your patch is
good. Send it to the maintainer and cc the list.
(5) A topic branch is created with the patch and is merged to 'next',
and cooked further and eventually graduates to 'master'.
In any time between the (2)-(3) cycle, the maintainer may pick it up
from the list and queue it to `pu`, in order to make it easier for
from the list and queue it to 'pu', in order to make it easier for
people play with it without having to pick up and apply the patch to
their trees themselves.
[[patch-status]]
== Know the status of your patch after submission
------------------------------------------------
Know the status of your patch after submission
* You can use Git itself to find out when your patch is merged in
master. `git pull --rebase` will automatically skip already-applied
master. 'git pull --rebase' will automatically skip already-applied
patches, and will let you know. This works only if you rebase on top
of the branch in which your patch has been merged (i.e. it will not
tell you if your patch is merged in pu if you rebase on top of
@ -420,8 +390,8 @@ their trees themselves.
entitled "What's cooking in git.git" and "What's in git.git" giving
the status of various proposed changes.
[[travis]]
== GitHub-Travis CI hints
--------------------------------------------------
GitHub-Travis CI hints
With an account at GitHub (you can get one for free to work on open
source projects), you can use Travis CI to test your changes on Linux,
@ -430,25 +400,25 @@ test build here: https://travis-ci.org/git/git/builds/120473209
Follow these steps for the initial setup:
. Fork https://github.com/git/git to your GitHub account.
You can find detailed instructions how to fork here:
https://help.github.com/articles/fork-a-repo/
(1) Fork https://github.com/git/git to your GitHub account.
You can find detailed instructions how to fork here:
https://help.github.com/articles/fork-a-repo/
. Open the Travis CI website: https://travis-ci.org
(2) Open the Travis CI website: https://travis-ci.org
. Press the "Sign in with GitHub" button.
(3) Press the "Sign in with GitHub" button.
. Grant Travis CI permissions to access your GitHub account.
You can find more information about the required permissions here:
https://docs.travis-ci.com/user/github-oauth-scopes
(4) Grant Travis CI permissions to access your GitHub account.
You can find more information about the required permissions here:
https://docs.travis-ci.com/user/github-oauth-scopes
. Open your Travis CI profile page: https://travis-ci.org/profile
(5) Open your Travis CI profile page: https://travis-ci.org/profile
. Enable Travis CI builds for your Git fork.
(6) Enable Travis CI builds for your Git fork.
After the initial setup, Travis CI will run whenever you push new changes
to your fork of Git on GitHub. You can monitor the test state of all your
branches here: https://travis-ci.org/__<Your GitHub handle>__/git/branches
branches here: https://travis-ci.org/<Your GitHub handle>/git/branches
If a branch did not pass all test cases then it is marked with a red
cross. In that case you can click on the failing Travis CI job and
@ -460,16 +430,17 @@ example: https://travis-ci.org/git/git/jobs/122676187
Fix the problem and push your fix to your Git fork. This will trigger
a new Travis CI build to ensure all tests pass.
[[mua]]
== MUA specific hints
------------------------------------------------
MUA specific hints
Some of patches I receive or pick up from the list share common
patterns of breakage. Please make sure your MUA is set up
properly not to corrupt whitespaces.
See the DISCUSSION section of linkgit:git-format-patch[1] for hints on
See the DISCUSSION section of git-format-patch(1) for hints on
checking your patch by mailing it to yourself and applying with
linkgit:git-am[1].
git-am(1).
While you are at it, check the resulting commit log message from
a trial run of applying the patch. If what is in the resulting
@ -481,24 +452,23 @@ should come after the three-dash line that signals the end of the
commit message.
=== Pine
Pine
----
(Johannes Schindelin)
....
I don't know how many people still use pine, but for those poor
souls it may be good to mention that the quell-flowed-text is
needed for recent versions.
... the "no-strip-whitespace-before-send" option, too. AFAIK it
was introduced in 4.60.
....
(Linus Torvalds)
....
And 4.58 needs at least this.
---
diff-tree 8326dd8350be64ac7fc805f6563a1d61ad10d32c (from e886a61f76edf5410573e92e38ce22974f9c40f1)
Author: Linus Torvalds <torvalds@g5.osdl.org>
Date: Mon Aug 15 17:23:51 2005 -0700
@ -520,11 +490,10 @@ diff --git a/pico/pico.c b/pico/pico.c
+#endif
c |= COMP_EXIT;
break;
....
(Daniel Barkalow)
....
> A patch to SubmittingPatches, MUA specific help section for
> users of Pine 4.63 would be very much appreciated.
@ -534,21 +503,23 @@ that or Gentoo did it.) So you need to set the
"no-strip-whitespace-before-send" option, unless the option you have is
"strip-whitespace-before-send", in which case you should avoid checking
it.
....
=== Thunderbird, KMail, GMail
See the MUA-SPECIFIC HINTS section of linkgit:git-format-patch[1].
Thunderbird, KMail, GMail
-------------------------
=== Gnus
See the MUA-SPECIFIC HINTS section of git-format-patch(1).
"|" in the `*Summary*` buffer can be used to pipe the current
Gnus
----
'|' in the *Summary* buffer can be used to pipe the current
message to an external program, and this is a handy way to drive
`git am`. However, if the message is MIME encoded, what is
"git am". However, if the message is MIME encoded, what is
piped into the program is the representation you see in your
`*Article*` buffer after unwrapping MIME. This is often not what
*Article* buffer after unwrapping MIME. This is often not what
you would want for two reasons. It tends to screw up non ASCII
characters (most notably in people's names), and also
whitespaces (fatal in patches). Running "C-u g" to display the
message in raw form before using "|" to run the pipe can work
whitespaces (fatal in patches). Running 'C-u g' to display the
message in raw form before using '|' to run the pipe can work
this problem around.

View File

@ -41,13 +41,11 @@ in the section header, like in the example below:
--------
Subsection names are case sensitive and can contain any characters except
newline and the null byte. Doublequote `"` and backslash can be included
by escaping them as `\"` and `\\`, respectively. Backslashes preceding
other characters are dropped when reading; for example, `\t` is read as
`t` and `\0` is read as `0` Section headers cannot span multiple lines.
Variables may belong directly to a section or to a given subsection. You
can have `[section]` if you have `[section "subsection"]`, but you don't
need to.
newline (doublequote `"` and backslash can be included by escaping them
as `\"` and `\\`, respectively). Section headers cannot span multiple
lines. Variables may belong directly to a section or to a given subsection.
You can have `[section]` if you have `[section "subsection"]`, but you
don't need to.
There is also a deprecated `[section.subsection]` syntax. With this
syntax, the subsection name is converted to lower-case and is also
@ -353,12 +351,6 @@ advice.*::
addEmbeddedRepo::
Advice on what to do when you've accidentally added one
git repo inside of another.
ignoredHook::
Advice shown if an hook is ignored because the hook is not
set as executable.
waitingForEditor::
Print a message to the terminal whenever Git is waiting for
editor input from the user.
--
core.fileMode::
@ -421,13 +413,6 @@ core.protectNTFS::
8.3 "short" names.
Defaults to `true` on Windows, and `false` elsewhere.
core.fsmonitor::
If set, the value of this variable is used as a command which
will identify all files that may have changed since the
requested date/time. This information is used to speed up git by
avoiding unnecessary processing of files that have not changed.
See the "fsmonitor-watchman" section of linkgit:githooks[5].
core.trustctime::
If false, the ctime differences between the index and the
working tree are ignored; useful when the inode change time
@ -791,12 +776,6 @@ core.commentChar::
If set to "auto", `git-commit` would select a character that is not
the beginning character of any line in existing commit messages.
core.filesRefLockTimeout::
The length of time, in milliseconds, to retry when trying to
lock an individual reference. Value 0 means not to retry at
all; -1 means to try indefinitely. Default is 100 (i.e.,
retry for 100ms).
core.packedRefsTimeout::
The length of time, in milliseconds, to retry when trying to
lock the `packed-refs` file. Value 0 means not to retry at
@ -964,23 +943,6 @@ apply.whitespace::
Tells 'git apply' how to handle whitespaces, in the same way
as the `--whitespace` option. See linkgit:git-apply[1].
blame.showRoot::
Do not treat root commits as boundaries in linkgit:git-blame[1].
This option defaults to false.
blame.blankBoundary::
Show blank commit object name for boundary commits in
linkgit:git-blame[1]. This option defaults to false.
blame.showEmail::
Show the author email instead of author name in linkgit:git-blame[1].
This option defaults to false.
blame.date::
Specifies the format used to output dates in linkgit:git-blame[1].
If unset the iso format is used. For supported values,
see the discussion of the `--date` option at linkgit:git-log[1].
branch.autoSetupMerge::
Tells 'git branch' and 'git checkout' to set up new branches
so that linkgit:git-pull[1] will appropriately merge from the
@ -1115,25 +1077,14 @@ This does not affect linkgit:git-format-patch[1] or the
'git-diff-{asterisk}' plumbing commands. Can be overridden on the
command line with the `--color[=<when>]` option.
diff.colorMoved::
If set to either a valid `<mode>` or a true value, moved lines
in a diff are colored differently, for details of valid modes
see '--color-moved' in linkgit:git-diff[1]. If simply set to
true the default color mode will be used. When set to false,
moved lines are not colored.
color.diff.<slot>::
Use customized color for diff colorization. `<slot>` specifies
which part of the patch to use the specified color, and is one
of `context` (context text - `plain` is a historical synonym),
`meta` (metainformation), `frag`
(hunk header), 'func' (function in hunk header), `old` (removed lines),
`new` (added lines), `commit` (commit headers), `whitespace`
(highlighting whitespace errors), `oldMoved` (deleted lines),
`newMoved` (added lines), `oldMovedDimmed`, `oldMovedAlternative`,
`oldMovedAlternativeDimmed`, `newMovedDimmed`, `newMovedAlternative`
and `newMovedAlternativeDimmed` (See the '<mode>'
setting of '--color-moved' in linkgit:git-diff[1] for details).
`new` (added lines), `commit` (commit headers), or `whitespace`
(highlighting whitespace errors).
color.decorate.<slot>::
Use customized color for 'git log --decorate' output. `<slot>` is one
@ -1398,16 +1349,7 @@ fetch.unpackLimit::
fetch.prune::
If true, fetch will automatically behave as if the `--prune`
option was given on the command line. See also `remote.<name>.prune`
and the PRUNING section of linkgit:git-fetch[1].
fetch.pruneTags::
If true, fetch will automatically behave as if the
`refs/tags/*:refs/tags/*` refspec was provided when pruning,
if not set already. This allows for setting both this option
and `fetch.prune` to maintain a 1=1 mapping to upstream
refs. See also `remote.<name>.pruneTags` and the PRUNING
section of linkgit:git-fetch[1].
option was given on the command line. See also `remote.<name>.prune`.
fetch.output::
Control how ref update status is printed. Valid values are
@ -1611,13 +1553,11 @@ gc.<pattern>.reflogExpireUnreachable::
gc.rerereResolved::
Records of conflicted merge you resolved earlier are
kept for this many days when 'git rerere gc' is run.
You can also use more human-readable "1.month.ago", etc.
The default is 60 days. See linkgit:git-rerere[1].
gc.rerereUnresolved::
Records of conflicted merge you have not resolved are
kept for this many days when 'git rerere gc' is run.
You can also use more human-readable "1.month.ago", etc.
The default is 15 days. See linkgit:git-rerere[1].
gitcvs.commitMsgAnnotation::
@ -1979,8 +1919,8 @@ empty string.
http.sslVerify::
Whether to verify the SSL certificate when fetching or pushing
over HTTPS. Defaults to true. Can be overridden by the
`GIT_SSL_NO_VERIFY` environment variable.
over HTTPS. Can be overridden by the `GIT_SSL_NO_VERIFY` environment
variable.
http.sslCert::
File containing the SSL certificate when fetching or pushing
@ -2122,40 +2062,15 @@ matched against are those given directly to Git commands. This means any URLs
visited as a result of a redirection do not participate in matching.
ssh.variant::
By default, Git determines the command line arguments to use
based on the basename of the configured SSH command (configured
using the environment variable `GIT_SSH` or `GIT_SSH_COMMAND` or
the config setting `core.sshCommand`). If the basename is
unrecognized, Git will attempt to detect support of OpenSSH
options by first invoking the configured SSH command with the
`-G` (print configuration) option and will subsequently use
OpenSSH options (if that is successful) or no options besides
the host and remote command (if it fails).
Depending on the value of the environment variables `GIT_SSH` or
`GIT_SSH_COMMAND`, or the config setting `core.sshCommand`, Git
auto-detects whether to adjust its command-line parameters for use
with plink or tortoiseplink, as opposed to the default (OpenSSH).
+
The config variable `ssh.variant` can be set to override this detection.
Valid values are `ssh` (to use OpenSSH options), `plink`, `putty`,
`tortoiseplink`, `simple` (no options except the host and remote command).
The default auto-detection can be explicitly requested using the value
`auto`. Any other value is treated as `ssh`. This setting can also be
overridden via the environment variable `GIT_SSH_VARIANT`.
+
The current command-line parameters used for each variant are as
follows:
+
--
* `ssh` - [-p port] [-4] [-6] [-o option] [username@]host command
* `simple` - [username@]host command
* `plink` or `putty` - [-P port] [-4] [-6] [username@]host command
* `tortoiseplink` - [-P port] [-4] [-6] -batch [username@]host command
--
+
Except for the `simple` variant, command-line parameters are likely to
change as git gains new features.
The config variable `ssh.variant` can be set to override this auto-detection;
valid values are `ssh`, `plink`, `putty` or `tortoiseplink`. Any other value
will be treated as normal ssh. This setting can be overridden via the
environment variable `GIT_SSH_VARIANT`.
i18n.commitEncoding::
Character encoding the commit messages are stored in; Git itself
@ -2583,23 +2498,6 @@ The protocol names currently used by git are:
`hg` to allow the `git-remote-hg` helper)
--
protocol.version::
Experimental. If set, clients will attempt to communicate with a
server using the specified protocol version. If unset, no
attempt will be made by the client to communicate using a
particular protocol version, this results in protocol version 0
being used.
Supported versions:
+
--
* `0` - the original wire protocol.
* `1` - the original wire protocol with the addition of a version string
in the initial response from the server.
--
pull.ff::
By default, Git does not create an extra merge commit when merging
a commit that is a descendant of the current commit. Instead, the
@ -2704,35 +2602,6 @@ push.gpgSign::
override a value from a lower-priority config file. An explicit
command-line flag always overrides this config option.
push.pushOption::
When no `--push-option=<option>` argument is given from the
command line, `git push` behaves as if each <value> of
this variable is given as `--push-option=<value>`.
+
This is a multi-valued variable, and an empty value can be used in a
higher priority configuration file (e.g. `.git/config` in a
repository) to clear the values inherited from a lower priority
configuration files (e.g. `$HOME/.gitconfig`).
+
--
Example:
/etc/gitconfig
push.pushoption = a
push.pushoption = b
~/.gitconfig
push.pushoption = c
repo/.git/config
push.pushoption =
push.pushoption = b
This will result in only b (a and c are cleared).
--
push.recurseSubmodules::
Make sure all submodule commits used by the revisions to be pushed
are available on a remote-tracking branch. If the value is 'check'
@ -2747,7 +2616,36 @@ push.recurseSubmodules::
is retained. You may override this configuration at time of push by
specifying '--recurse-submodules=check|on-demand|no'.
include::rebase-config.txt[]
rebase.stat::
Whether to show a diffstat of what changed upstream since the last
rebase. False by default.
rebase.autoSquash::
If set to true enable `--autosquash` option by default.
rebase.autoStash::
When set to true, automatically create a temporary stash entry
before the operation begins, and apply it after the operation
ends. This means that you can run rebase on a dirty worktree.
However, use with care: the final stash application after a
successful rebase might result in non-trivial conflicts.
Defaults to false.
rebase.missingCommitsCheck::
If set to "warn", git rebase -i will print a warning if some
commits are removed (e.g. a line was deleted), however the
rebase will still proceed. If set to "error", it will print
the previous warning and stop the rebase, 'git rebase
--edit-todo' can then be used to correct the error. If set to
"ignore", no checking is done.
To drop a commit without warning or error, use the `drop`
command in the todo-list.
Defaults to "ignore".
rebase.instructionFormat::
A format string, as specified in linkgit:git-log[1], to be used for
the instruction list during an interactive rebase. The format will automatically
have the long commit hash prepended to the format.
receive.advertiseAtomic::
By default, git-receive-pack will advertise the atomic push
@ -2954,15 +2852,6 @@ remote.<name>.prune::
remote (as if the `--prune` option was given on the command line).
Overrides `fetch.prune` settings, if any.
remote.<name>.pruneTags::
When set to true, fetching from this remote by default will also
remove any local tags that no longer exist on the remote if pruning
is activated in general via `remote.<name>.prune`, `fetch.prune` or
`--prune`. Overrides `fetch.pruneTags` settings, if any.
+
See also `remote.<name>.prune` and the PRUNING section of
linkgit:git-fetch[1].
remotes.<group>::
The list of remotes which are fetched by "git remote update
<group>". See linkgit:git-remote[1].
@ -3043,7 +2932,6 @@ sendemail.smtpPass::
sendemail.suppresscc::
sendemail.suppressFrom::
sendemail.to::
sendemail.tocmd::
sendemail.smtpDomain::
sendemail.smtpServer::
sendemail.smtpServerPort::
@ -3178,14 +3066,10 @@ submodule.<name>.url::
See linkgit:git-submodule[1] and linkgit:gitmodules[5] for details.
submodule.<name>.update::
The method by which a submodule is updated by 'git submodule update',
which is the only affected command, others such as
'git checkout --recurse-submodules' are unaffected. It exists for
historical reasons, when 'git submodule' was the only command to
interact with submodules; settings like `submodule.active`
and `pull.rebase` are more specific. It is populated by
`git submodule init` from the linkgit:gitmodules[5] file.
See description of 'update' command in linkgit:git-submodule[1].
The default update procedure for a submodule. This variable
is populated by `git submodule init` from the
linkgit:gitmodules[5] file. See description of 'update'
command in linkgit:git-submodule[1].
submodule.<name>.branch::
The remote branch name for a submodule, used by `git submodule
@ -3228,8 +3112,7 @@ submodule.active::
submodule.recurse::
Specifies if commands recurse into submodules by default. This
applies to all commands that have a `--recurse-submodules` option,
except `clone`.
applies to all commands that have a `--recurse-submodules` option.
Defaults to false.
submodule.fetchJobs::
@ -3362,10 +3245,6 @@ uploadpack.packObjectsHook::
was run. I.e., `upload-pack` will feed input intended for
`pack-objects` to the hook, and expects a completed packfile on
stdout.
uploadpack.allowFilter::
If this option is set, `upload-pack` will support partial
clone and partial fetch object filtering.
+
Note that this configuration variable is ignored if it is seen in the
repository-level config (this is a safety measure against fetching from
@ -3467,13 +3346,3 @@ web.browser::
Specify a web browser that may be used by some commands.
Currently only linkgit:git-instaweb[1] and linkgit:git-help[1]
may use it.
worktree.guessRemote::
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
such a branch exists, it is checked out and set as "upstream"
for the new branch. If no such match can be found, it falls
back to creating a new branch from the current HEAD.

View File

@ -0,0 +1,5 @@
--indent-heuristic::
--no-indent-heuristic::
These are to help debugging and tuning experimental heuristics
(which are off by default) that shift diff hunk boundaries to
make patches easier to read.

View File

@ -63,12 +63,7 @@ ifndef::git-format-patch[]
Synonym for `-p --raw`.
endif::git-format-patch[]
--indent-heuristic::
Enable the heuristic that shift diff hunk boundaries to make patches
easier to read. This is the default.
--no-indent-heuristic::
Disable the indent heuristic.
include::diff-heuristic-options.txt[]
--minimal::
Spend extra time to make sure the smallest possible
@ -80,16 +75,6 @@ endif::git-format-patch[]
--histogram::
Generate a diff using the "histogram diff" algorithm.
--anchored=<text>::
Generate a diff using the "anchored diff" algorithm.
+
This option may be specified more than once.
+
If a line exists in both the source and destination, exists only once,
and starts with this text, this algorithm attempts to prevent it from
appearing as a deletion or addition in the output. It uses the "patience
diff" algorithm internally.
--diff-algorithm={patience|minimal|histogram|myers}::
Choose a diff algorithm. The variants are as follows:
+
@ -128,14 +113,6 @@ have to use `--diff-algorithm=default` option.
These parameters can also be set individually with `--stat-width=<width>`,
`--stat-name-width=<name-width>` and `--stat-count=<count>`.
--compact-summary::
Output a condensed summary of extended header information such
as file creations or deletions ("new" or "gone", optionally "+l"
if it's a symlink) and mode changes ("+x" or "-x" for adding
or removing executable bit respectively) in diffstat. The
information is put betwen the filename part and the graph
part. Implies `--stat`.
--numstat::
Similar to `--stat`, but shows number of added and
deleted lines in decimal notation and pathname without
@ -254,40 +231,6 @@ ifdef::git-diff[]
endif::git-diff[]
It is the same as `--color=never`.
--color-moved[=<mode>]::
Moved lines of code are colored differently.
ifdef::git-diff[]
It can be changed by the `diff.colorMoved` configuration setting.
endif::git-diff[]
The <mode> defaults to 'no' if the option is not given
and to 'zebra' if the option with no mode is given.
The mode must be one of:
+
--
no::
Moved lines are not highlighted.
default::
Is a synonym for `zebra`. This may change to a more sensible mode
in the future.
plain::
Any line that is added in one location and was removed
in another location will be colored with 'color.diff.newMoved'.
Similarly 'color.diff.oldMoved' will be used for removed lines
that are added somewhere else in the diff. This mode picks up any
moved line, but it is not very useful in a review to determine
if a block of code was moved without permutation.
zebra::
Blocks of moved text of at least 20 alphanumeric characters
are detected greedily. The detected blocks are
painted using either the 'color.diff.{old,new}Moved' color or
'color.diff.{old,new}MovedAlternative'. The change between
the two colors indicates that a new block was detected.
dimmed_zebra::
Similar to 'zebra', but additional dimming of uninteresting parts
of moved code is performed. The bordering lines of two adjacent
blocks are considered interesting, the rest is uninteresting.
--
--word-diff[=<mode>]::
Show a word diff, using the <mode> to delimit changed words.
By default, words are delimited by whitespace; see
@ -477,12 +420,6 @@ ifndef::git-format-patch[]
+
Also, these upper-case letters can be downcased to exclude. E.g.
`--diff-filter=ad` excludes added and deleted paths.
+
Note that not all diffs can feature all types. For instance, diffs
from the index to the working tree can never have Added entries
(because the set of paths included in the diff is limited by what is in
the index). Similarly, copied and renamed entries cannot appear if
detection for those types is disabled.
-S<string>::
Look for differences that change the number of occurrences of
@ -516,15 +453,6 @@ occurrences of that string did not change).
See the 'pickaxe' entry in linkgit:gitdiffcore[7] for more
information.
--find-object=<object-id>::
Look for differences that change the number of occurrences of
the specified object. Similar to `-S`, just the argument is different
in that it doesn't search for a specific string but for a specific
object id.
+
The object can be a blob or a submodule commit. It implies the `-t` option in
`git-log` to also find trees.
--pickaxe-all::
When `-S` or `-G` finds a change, show all the changes in that
changeset, not just the files that contain the change
@ -533,7 +461,6 @@ The object can be a blob or a submodule commit. It implies the `-t` option in
--pickaxe-regex::
Treat the <string> given to `-S` as an extended POSIX regular
expression to match.
endif::git-format-patch[]
-O<orderfile>::
@ -591,9 +518,6 @@ endif::git-format-patch[]
--text::
Treat all files as text.
--ignore-cr-at-eol::
Ignore carrige-return at the end of line when doing a comparison.
--ignore-space-at-eol::
Ignore changes in whitespace at EOL.

View File

@ -73,22 +73,7 @@ ifndef::git-pull[]
are fetched due to an explicit refspec (either on the command
line or in the remote configuration, for example if the remote
was cloned with the --mirror option), then they are also
subject to pruning. Supplying `--prune-tags` is a shorthand for
providing the tag refspec.
+
See the PRUNING section below for more details.
-P::
--prune-tags::
Before fetching, remove any local tags that no longer exist on
the remote if `--prune` is enabled. This option should be used
more carefully, unlike `--prune` it will remove any local
references (local tags) that have been created. This option is
a shorthand for providing the explicit tag refspec along with
`--prune`, see the discussion about that in its documentation.
+
See the PRUNING section below for more details.
subject to pruning.
endif::git-pull[]
ifndef::git-pull[]

View File

@ -10,7 +10,7 @@ SYNOPSIS
[verse]
'git add' [--verbose | -v] [--dry-run | -n] [--force | -f] [--interactive | -i] [--patch | -p]
[--edit | -e] [--[no-]all | --[no-]ignore-removal | [--update | -u]]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing] [--renormalize]
[--intent-to-add | -N] [--refresh] [--ignore-errors] [--ignore-missing]
[--chmod=(+|-)x] [--] [<pathspec>...]
DESCRIPTION
@ -175,13 +175,6 @@ for "git add --no-all <pathspec>...", i.e. ignored removed files.
warning (e.g., if you are manually performing operations on
submodules).
--renormalize::
Apply the "clean" process freshly to all tracked files to
forcibly add them again to the index. This is useful after
changing `core.autocrlf` configuration or the `text` attribute
in order to correct files added with wrong CRLF/LF line endings.
This option implies `-u`.
--chmod=(+|-)x::
Override the executable bit of the added files. The executable
bit is only changed in the index, the files on disk are left

View File

@ -16,7 +16,7 @@ SYNOPSIS
[--exclude=<path>] [--include=<path>] [--reject] [-q | --quiet]
[--[no-]scissors] [-S[<keyid>]] [--patch-format=<format>]
[(<mbox> | <Maildir>)...]
'git am' (--continue | --skip | --abort | --quit | --show-current-patch)
'git am' (--continue | --skip | --abort)
DESCRIPTION
-----------
@ -167,14 +167,6 @@ default. You can use `--no-utf8` to override this.
--abort::
Restore the original branch and abort the patching operation.
--quit::
Abort the patching operation but keep HEAD and the index
untouched.
--show-current-patch::
Show the patch being applied when "git am" is stopped because
of conflicts.
DISCUSSION
----------

View File

@ -23,6 +23,7 @@ familiar command name for people coming from other SCM systems.
OPTIONS
-------
include::blame-options.txt[]
include::diff-heuristic-options.txt[]
SEE ALSO
--------

View File

@ -66,7 +66,7 @@ OPTIONS
disables it is in effect), make sure the patch is
applicable to what the current index file records. If
the file to be patched in the working tree is not
up to date, it is flagged as an error. This flag also
up-to-date, it is flagged as an error. This flag also
causes the index file to be updated.
--cached::
@ -259,7 +259,7 @@ treats these changes as follows.
If `--index` is specified (explicitly or implicitly), then the submodule
commits must match the index exactly for the patch to apply. If any
of the submodules are checked-out, then these check-outs are completely
ignored, i.e., they are not required to be up to date or clean and they
ignored, i.e., they are not required to be up-to-date or clean and they
are not updated.
If `--index` is not specified, then the submodule commits in the patch

View File

@ -23,7 +23,7 @@ on the subcommand:
git bisect terms [--term-good | --term-bad]
git bisect skip [(<rev>|<range>)...]
git bisect reset [<commit>]
git bisect (visualize|view)
git bisect visualize
git bisect replay <logfile>
git bisect log
git bisect run <cmd>...
@ -193,23 +193,24 @@ git bisect start --term-new fixed --term-old broken
Then, use `git bisect <term-old>` and `git bisect <term-new>` instead
of `git bisect good` and `git bisect bad` to mark commits.
Bisect visualize/view
~~~~~~~~~~~~~~~~~~~~~
Bisect visualize
~~~~~~~~~~~~~~~~
To see the currently remaining suspects in 'gitk', issue the following
command during the bisection process (the subcommand `view` can be used
as an alternative to `visualize`):
command during the bisection process:
------------
$ git bisect visualize
------------
`view` may also be used as a synonym for `visualize`.
If the `DISPLAY` environment variable is not set, 'git log' is used
instead. You can also give command-line options such as `-p` and
`--stat`.
------------
$ git bisect visualize --stat
$ git bisect view --stat
------------
Bisect log and bisect replay

View File

@ -89,6 +89,8 @@ include::blame-options.txt[]
abbreviated object name, use <n>+1 digits. Note that 1 column
is used for a caret to mark the boundary commit.
include::diff-heuristic-options.txt[]
THE PORCELAIN FORMAT
--------------------

View File

@ -14,11 +14,10 @@ SYNOPSIS
[(--merged | --no-merged) [<commit>]]
[--contains [<commit]] [--no-contains [<commit>]]
[--points-at <object>] [--format=<format>] [<pattern>...]
'git branch' [--track | --no-track] [-l] [-f] <branchname> [<start-point>]
'git branch' [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
'git branch' (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
'git branch' --unset-upstream [<branchname>]
'git branch' (-m | -M) [<oldbranch>] <newbranch>
'git branch' (-c | -C) [<oldbranch>] <newbranch>
'git branch' (-d | -D) [-r] <branchname>...
'git branch' --edit-description [<branchname>]
@ -65,10 +64,6 @@ If <oldbranch> had a corresponding reflog, it is renamed to match
renaming. If <newbranch> exists, -M must be used to force the rename
to happen.
The `-c` and `-C` options have the exact same semantics as `-m` and
`-M`, except instead of the branch being renamed it along with its
config and reflog will be copied to a new name.
With a `-d` or `-D` option, `<branchname>` will be deleted. You may
specify more than one branch for deletion. If the branch currently
has a reflog then the reflog will also be deleted.
@ -86,7 +81,7 @@ OPTIONS
--delete::
Delete a branch. The branch must be fully merged in its
upstream branch, or in `HEAD` if no upstream was set with
`--track` or `--set-upstream-to`.
`--track` or `--set-upstream`.
-D::
Shortcut for `--delete --force`.
@ -104,12 +99,12 @@ OPTIONS
-f::
--force::
Reset <branchname> to <startpoint>, even if <branchname> exists
already. Without `-f`, 'git branch' refuses to change an existing branch.
Reset <branchname> to <startpoint> if <branchname> exists
already. Without `-f` 'git branch' refuses to change an existing branch.
In combination with `-d` (or `--delete`), allow deleting the
branch irrespective of its merged status. In combination with
`-m` (or `--move`), allow renaming the branch even if the new
branch name already exists, the same applies for `-c` (or `--copy`).
branch name already exists.
-m::
--move::
@ -118,13 +113,6 @@ OPTIONS
-M::
Shortcut for `--move --force`.
-c::
--copy::
Copy a branch and the corresponding reflog.
-C::
Shortcut for `--copy --force`.
--color[=<when>]::
Color branches to highlight current, local, and
remote-tracking branches.
@ -207,8 +195,10 @@ start-point is either a local or remote-tracking branch.
branch.autoSetupMerge configuration variable is true.
--set-upstream::
As this option had confusing syntax, it is no longer supported.
Please use `--track` or `--set-upstream-to` instead.
If specified branch does not exist yet or if `--force` has been
given, acts exactly like `--track`. Otherwise sets up configuration
like `--track` would when creating the branch, except that where
branch points to is not changed.
-u <upstream>::
--set-upstream-to=<upstream>::
@ -281,12 +271,6 @@ start-point is either a local or remote-tracking branch.
and the object it points at. The format is the same as
that of linkgit:git-for-each-ref[1].
CONFIGURATION
-------------
`pager.branch` is only respected when listing branches, i.e., when
`--list` is used or implied. The default is to use a pager.
See linkgit:git-config[1].
Examples
--------

View File

@ -42,9 +42,8 @@ OPTIONS
<object>.
-e::
Exit with zero status if <object> exists and is a valid
object. If <object> is of an invalid format exit with non-zero and
emits an error on stderr.
Suppress all output; instead exit with zero status if <object>
exists and is a valid object.
-p::
Pretty-print the contents of <object> based on its type.
@ -169,7 +168,7 @@ If `-t` is specified, one of the <type>.
If `-s` is specified, the size of the <object> in bytes.
If `-e` is specified, no output, unless the <object> is malformed.
If `-e` is specified, no output.
If `-p` is specified, the contents of <object> are pretty-printed.

View File

@ -77,23 +77,11 @@ reference name expressions (see linkgit:gitrevisions[7]):
. at-open-brace `@{` is used as a notation to access a reflog entry.
With the `--branch` option, the command takes a name and checks if
it can be used as a valid branch name (e.g. when creating a new
branch). But be cautious when using the
previous checkout syntax that may refer to a detached HEAD state.
The rule `git check-ref-format --branch $name` implements
may be stricter than what `git check-ref-format refs/heads/$name`
says (e.g. a dash may appear at the beginning of a ref component,
but it is explicitly forbidden at the beginning of a branch name).
When run with `--branch` option in a repository, the input is first
expanded for the ``previous checkout syntax''
`@{-n}`. For example, `@{-1}` is a way to refer the last thing that
was checked out using "git checkout" operation. This option should be
used by porcelains to accept this syntax anywhere a branch name is
expected, so they can act as if you typed the branch name. As an
exception note that, the ``previous checkout operation'' might result
in a commit object name when the N-th last thing checked out was not
a branch.
With the `--branch` option, it expands the ``previous branch syntax''
`@{-n}`. For example, `@{-1}` is a way to refer the last branch you
were on. This option should be used by porcelains to accept this
syntax anywhere a branch name is expected, so they can act as if you
typed the branch name.
OPTIONS
-------
@ -121,7 +109,7 @@ OPTIONS
EXAMPLES
--------
* Print the name of the previous thing checked out:
* Print the name of the previous branch:
+
------------
$ git check-ref-format --branch @{-1}

View File

@ -264,8 +264,6 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
local modifications in a submodule would be overwritten the checkout
will fail unless `-f` is used. If nothing (or --no-recurse-submodules)
is used, the work trees of submodules will not be updated.
Just like linkgit:git-submodule[1], this will detach the
submodules HEAD.
<branch>::
Branch to checkout; if it refers to a branch (i.e., a name that,
@ -274,11 +272,11 @@ section of linkgit:git-add[1] to learn how to operate the `--patch` mode.
commit, your HEAD becomes "detached" and you are no longer on
any branch (see below for details).
+
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}`.
As a special case, the `"@{-N}"` syntax for the N-th last branch/commit
checks out branches (instead of detaching). You may also specify
`-` which is synonymous with `"@{-1}"`.
+
As a special case, you may use `"A...B"` as a shortcut for the
As a further 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`.

View File

@ -14,7 +14,7 @@ SYNOPSIS
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
[--dissociate] [--separate-git-dir <git dir>]
[--depth <depth>] [--[no-]single-branch] [--no-tags]
[--recurse-submodules[=<pathspec>]] [--[no-]shallow-submodules]
[--recurse-submodules] [--[no-]shallow-submodules]
[--jobs <n>] [--] <repository> [<directory>]
DESCRIPTION
@ -231,17 +231,14 @@ branch of some repository for search indexing.
After the clone is created, initialize and clone submodules
within based on the provided pathspec. If no pathspec is
provided, all submodules are initialized and cloned.
This option can be given multiple times for pathspecs consisting
of multiple entries. The resulting clone has `submodule.active` set to
Submodules are initialized and cloned using their default
settings. The resulting clone has `submodule.active` set to
the provided pathspec, or "." (meaning all submodules) if no
pathspec is provided.
+
Submodules are initialized and cloned using their default settings. This is
equivalent to running
`git submodule update --init --recursive <pathspec>` immediately after
the clone is finished. This option is ignored if the cloned repository does
not have a worktree/checkout (i.e. if any of `--no-checkout`/`-n`, `--bare`,
or `--mirror` is given)
pathspec is provided. This is equivalent to running
`git submodule update --init --recursive` immediately after
the clone is finished. This option is ignored if the cloned
repository does not have a worktree/checkout (i.e. if any of
`--no-checkout`/`-n`, `--bare`, or `--mirror` is given)
--[no-]shallow-submodules::
All submodules which are cloned will be shallow with a depth of 1.

View File

@ -144,8 +144,6 @@ OPTIONS
Use the given <msg> as the commit message.
If multiple `-m` options are given, their values are
concatenated as separate paragraphs.
+
The `-m` option is mutually exclusive with `-c`, `-C`, and `-F`.
-t <file>::
--template=<file>::

View File

@ -174,16 +174,11 @@ See also <<FILES>>.
either --bool or --int, as described above.
--path::
`git config` will expand a leading `~` to the value of
`$HOME`, and `~user` to the home directory for the
'git-config' will expand leading '{tilde}' to the value of
'$HOME', and '{tilde}user' to the home directory for the
specified user. This option has no effect when setting the
value (but you can use `git config section.variable ~/`
from the command line to let your shell do the expansion).
--expiry-date::
`git config` will ensure that the output is converted from
a fixed or relative date-string to a timestamp. This option
has no effect when setting the value.
value (but you can use 'git config bla {tilde}/' from the
command line to let your shell do the expansion).
-z::
--null::
@ -233,12 +228,6 @@ See also <<FILES>>.
using `--file`, `--global`, etc) and `on` when searching all
config files.
CONFIGURATION
-------------
`pager.config` is only respected when listing configuration, i.e., when
using `--list` or any of the `--get-*` which may return multiple results.
The default is to use a pager.
[[FILES]]
FILES
-----

View File

@ -223,7 +223,7 @@ access method and requested operation.
That means that even if you offer only read access (e.g. by using
the pserver method), 'git-cvsserver' should have write access to
the database to work reliably (otherwise you need to make sure
that the database is up to date any time 'git-cvsserver' is executed).
that the database is up-to-date any time 'git-cvsserver' is executed).
By default it uses SQLite databases in the Git directory, named
`gitcvs.<module_name>.sqlite`. Note that the SQLite backend creates

View File

@ -20,7 +20,6 @@ SYNOPSIS
[--inetd |
[--listen=<host_or_ipaddr>] [--port=<n>]
[--user=<user> [--group=<group>]]]
[--log-destination=(stderr|syslog|none)]
[<directory>...]
DESCRIPTION
@ -81,8 +80,7 @@ OPTIONS
do not have the 'git-daemon-export-ok' file.
--inetd::
Have the server run as an inetd service. Implies --syslog (may be
overridden with `--log-destination=`).
Have the server run as an inetd service. Implies --syslog.
Incompatible with --detach, --port, --listen, --user and --group
options.
@ -112,28 +110,8 @@ OPTIONS
zero for no limit.
--syslog::
Short for `--log-destination=syslog`.
--log-destination=<destination>::
Send log messages to the specified destination.
Note that this option does not imply --verbose,
thus by default only error conditions will be logged.
The <destination> must be one of:
+
--
stderr::
Write to standard error.
Note that if `--detach` is specified,
the process disconnects from the real standard error,
making this destination effectively equivalent to `none`.
syslog::
Write to syslog, using the `git-daemon` identifier.
none::
Disable all logging.
--
+
The default destination is `syslog` if `--inetd` or `--detach` is specified,
otherwise `stderr`.
Log to syslog instead of stderr. Note that this option does not imply
--verbose, thus by default only error conditions will be logged.
--user-path::
--user-path=<path>::

View File

@ -3,14 +3,14 @@ git-describe(1)
NAME
----
git-describe - Give an object a human readable name based on an available ref
git-describe - Describe a commit using the most recent tag reachable from it
SYNOPSIS
--------
[verse]
'git describe' [--all] [--tags] [--contains] [--abbrev=<n>] [<commit-ish>...]
'git describe' [--all] [--tags] [--contains] [--abbrev=<n>] --dirty[=<mark>]
'git describe' <blob>
DESCRIPTION
-----------
@ -24,12 +24,6 @@ By default (without --all or --tags) `git describe` only shows
annotated tags. For more information about creating annotated tags
see the -a and -s options to linkgit:git-tag[1].
If the given object refers to a blob, it will be described
as `<commit-ish>:<path>`, such that the blob can be found
at `<path>` in the `<commit-ish>`, which itself describes the
first commit in which this blob occurs in a reverse revision walk
from HEAD.
OPTIONS
-------
<commit-ish>...::
@ -93,23 +87,19 @@ OPTIONS
--match <pattern>::
Only consider tags matching the given `glob(7)` pattern,
excluding the "refs/tags/" prefix. If used with `--all`, it also
considers local branches and remote-tracking references matching the
pattern, excluding respectively "refs/heads/" and "refs/remotes/"
prefix; references of other types are never considered. If given
multiple times, a list of patterns will be accumulated, and tags
matching any of the patterns will be considered. Use `--no-match` to
clear and reset the list of patterns.
excluding the "refs/tags/" prefix. This can be used to avoid
leaking private tags from the repository. If given multiple times, a
list of patterns will be accumulated, and tags matching any of the
patterns will be considered. Use `--no-match` to clear and reset the
list of patterns.
--exclude <pattern>::
Do not consider tags matching the given `glob(7)` pattern, excluding
the "refs/tags/" prefix. If used with `--all`, it also does not consider
local branches and remote-tracking references matching the pattern,
excluding respectively "refs/heads/" and "refs/remotes/" prefix;
references of other types are never considered. If given multiple times,
a list of patterns will be accumulated and tags matching any of the
patterns will be excluded. When combined with --match a tag will be
considered when it matches at least one --match pattern and does not
the "refs/tags/" prefix. This can be used to narrow the tag space and
find only tags matching some meaningful criteria. If given multiple
times, a list of patterns will be accumulated and tags matching any
of the patterns will be excluded. When combined with --match a tag will
be considered when it matches at least one --match pattern and does not
match any of the --exclude patterns. Use `--no-exclude` to clear and
reset the list of patterns.
@ -192,14 +182,6 @@ selected and output. Here fewest commits different is defined as
the number of commits which would be shown by `git log tag..input`
will be the smallest number of commits possible.
BUGS
----
Tree objects as well as tag objects not pointing at commits, cannot be described.
When describing blobs, the lightweight tags pointing at blobs are ignored,
but the blob is still described as <committ-ish>:<path> despite the lightweight
tag being favorable.
GIT
---
Part of the linkgit:git[1] suite

View File

@ -85,7 +85,7 @@ a 'git write-tree' + 'git diff-tree'. Thus that's the default mode.
The non-cached version asks the question:
show me the differences between HEAD and the currently checked out
tree - index contents _and_ files that aren't up to date
tree - index contents _and_ files that aren't up-to-date
which is obviously a very useful question too, since that tells you what
you *could* commit. Again, the output matches the 'git diff-tree -r'
@ -100,8 +100,8 @@ have not actually done a 'git update-index' on it yet - there is no
torvalds@ppc970:~/v2.6/linux> git diff-index --abbrev HEAD
:100644 100664 7476bb... 000000... kernel/sched.c
i.e., it shows that the tree has changed, and that `kernel/sched.c` is
not up to date and may contain new stuff. The all-zero sha1 means that to
i.e., it shows that the tree has changed, and that `kernel/sched.c` has is
not up-to-date and may contain new stuff. The all-zero sha1 means that to
get the real diff, you need to look at the object in the working directory
directly rather than do an object-to-object diff.

View File

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

View File

@ -99,93 +99,6 @@ The latter use of the `remote.<repository>.fetch` values can be
overridden by giving the `--refmap=<refspec>` parameter(s) on the
command line.
PRUNING
-------
Git has a default disposition of keeping data unless it's explicitly
thrown away; this extends to holding onto local references to branches
on remotes that have themselves deleted those branches.
If left to accumulate, these stale references might make performance
worse on big and busy repos that have a lot of branch churn, and
e.g. make the output of commands like `git branch -a --contains
<commit>` needlessly verbose, as well as impacting anything else
that'll work with the complete set of known references.
These remote-tracking references can be deleted as a one-off with
either of:
------------------------------------------------
# While fetching
$ git fetch --prune <name>
# Only prune, don't fetch
$ git remote prune <name>
------------------------------------------------
To prune references as part of your normal workflow without needing to
remember to run that, set `fetch.prune` globally, or
`remote.<name>.prune` per-remote in the config. See
linkgit:git-config[1].
Here's where things get tricky and more specific. The pruning feature
doesn't actually care about branches, instead it'll prune local <->
remote-references as a function of the refspec of the remote (see
`<refspec>` and <<CRTB,CONFIGURED REMOTE-TRACKING BRANCHES>> above).
Therefore if the refspec for the remote includes
e.g. `refs/tags/*:refs/tags/*`, or you manually run e.g. `git fetch
--prune <name> "refs/tags/*:refs/tags/*"` it won't be stale remote
tracking branches that are deleted, but any local tag that doesn't
exist on the remote.
This might not be what you expect, i.e. you want to prune remote
`<name>`, but also explicitly fetch tags from it, so when you fetch
from it you delete all your local tags, most of which may not have
come from the `<name>` remote in the first place.
So be careful when using this with a refspec like
`refs/tags/*:refs/tags/*`, or any other refspec which might map
references from multiple remotes to the same local namespace.
Since keeping up-to-date with both branches and tags on the remote is
a common use-case the `--prune-tags` option can be supplied along with
`--prune` to prune local tags that don't exist on the remote, and
force-update those tags that differ. Tag pruning can also be enabled
with `fetch.pruneTags` or `remote.<name>.pruneTags` in the config. See
linkgit:git-config[1].
The `--prune-tags` option is equivalent to having
`refs/tags/*:refs/tags/*` declared in the refspecs of the remote. This
can lead to some seemingly strange interactions:
------------------------------------------------
# These both fetch tags
$ git fetch --no-tags origin 'refs/tags/*:refs/tags/*'
$ git fetch --no-tags --prune-tags origin
------------------------------------------------
The reason it doesn't error out when provided without `--prune` or its
config versions is for flexibility of the configured versions, and to
maintain a 1=1 mapping between what the command line flags do, and
what the configuration versions do.
It's reasonable to e.g. configure `fetch.pruneTags=true` in
`~/.gitconfig` to have tags pruned whenever `git fetch --prune` is
run, without making every invocation of `git fetch` without `--prune`
an error.
Pruning tags with `--prune-tags` also works when fetching a URL
instead of a named remote. These will all prune tags not found on
origin:
------------------------------------------------
$ git fetch origin --prune --prune-tags
$ git fetch origin --prune 'refs/tags/*:refs/tags/*'
$ git fetch <url of origin> --prune --prune-tags
$ git fetch <url of origin> --prune 'refs/tags/*:refs/tags/*'
------------------------------------------------
OUTPUT
------

View File

@ -8,13 +8,13 @@ git-filter-branch - Rewrite branches
SYNOPSIS
--------
[verse]
'git filter-branch' [--setup <command>] [--subdirectory-filter <directory>]
[--env-filter <command>] [--tree-filter <command>]
[--index-filter <command>] [--parent-filter <command>]
[--msg-filter <command>] [--commit-filter <command>]
[--tag-name-filter <command>] [--prune-empty]
'git filter-branch' [--setup <command>] [--env-filter <command>]
[--tree-filter <command>] [--index-filter <command>]
[--parent-filter <command>] [--msg-filter <command>]
[--commit-filter <command>] [--tag-name-filter <command>]
[--subdirectory-filter <directory>] [--prune-empty]
[--original <namespace>] [-d <directory>] [-f | --force]
[--state-branch <branch>] [--] [<rev-list options>...]
[--] [<rev-list options>...]
DESCRIPTION
-----------
@ -89,11 +89,6 @@ OPTIONS
can be used or modified in the following filter steps except
the commit filter, for technical reasons.
--subdirectory-filter <directory>::
Only look at the history which touches the given subdirectory.
The result will contain that directory (and only that) as its
project root. Implies <<Remap_to_ancestor>>.
--env-filter <command>::
This filter may be used if you only need to modify the environment
in which the commit will be performed. Specifically, you might
@ -172,6 +167,11 @@ be removed, buyer beware. There is also no support for changing the
author or timestamp (or the tag message for that matter). Tags which point
to other tags will be rewritten to point to the underlying commit.
--subdirectory-filter <directory>::
Only look at the history which touches the given subdirectory.
The result will contain that directory (and only that) as its
project root. Implies <<Remap_to_ancestor>>.
--prune-empty::
Some filters will generate empty commits that leave the tree untouched.
This option instructs git-filter-branch to remove such commits if they
@ -198,12 +198,6 @@ to other tags will be rewritten to point to the underlying commit.
directory or when there are already refs starting with
'refs/original/', unless forced.
--state-branch <branch>::
This option will cause the mapping from old to new objects to
be loaded from named branch upon startup and saved as a new
commit to that branch upon exit, enabling incremental of large
trees. If '<branch>' does not exist it will be created.
<rev-list options>...::
Arguments for 'git rev-list'. All positive refs included by
these options are rewritten. You may also specify options

View File

@ -145,25 +145,18 @@ upstream::
(behind), "<>" (ahead and behind), or "=" (in sync). `:track`
also prints "[gone]" whenever unknown upstream ref is
encountered. Append `:track,nobracket` to show tracking
information without brackets (i.e "ahead N, behind M").
+
For any remote-tracking branch `%(upstream)`, `%(upstream:remotename)`
and `%(upstream:remoteref)` refer to the name of the remote and the
name of the tracked remote ref, respectively. In other words, the
remote-tracking branch can be updated explicitly and individually by
using the refspec `%(upstream:remoteref):%(upstream)` to fetch from
`%(upstream:remotename)`.
+
Has no effect if the ref does not have tracking information associated
with it. All the options apart from `nobracket` are mutually exclusive,
but if used together the last option is selected.
information without brackets (i.e "ahead N, behind M"). Has
no effect if the ref does not have tracking information
associated with it. All the options apart from `nobracket`
are mutually exclusive, but if used together the last option
is selected.
push::
The name of a local ref which represents the `@{push}`
location for the displayed ref. Respects `:short`, `:lstrip`,
`:rstrip`, `:track`, `:trackshort`, `:remotename`, and `:remoteref`
options as `upstream` does. Produces an empty string if no `@{push}`
ref is configured.
`:rstrip`, `:track`, and `:trackshort` options as `upstream`
does. Produces an empty string if no `@{push}` ref is
configured.
HEAD::
'*' if HEAD matches current ref (the checked out branch), ' '
@ -225,15 +218,11 @@ and `date` to extract the named component.
The complete message in a commit and tag object is `contents`.
Its first line is `contents:subject`, where subject is the concatenation
of all lines of the commit message up to the first blank line. The next
line is `contents:body`, where body is all of the lines after the first
line is 'contents:body', where body is all of the lines after the first
blank line. The optional GPG signature is `contents:signature`. The
first `N` lines of the message is obtained using `contents:lines=N`.
Additionally, the trailers as interpreted by linkgit:git-interpret-trailers[1]
are obtained as `trailers` (or by using the historical alias
`contents:trailers`). Non-trailer lines from the trailer block can be omitted
with `trailers:only`. Whitespace-continuations can be removed from trailers so
that each trailer appears on a line by itself with its full content with
`trailers:unfold`. Both can be used together as `trailers:unfold,only`.
are obtained as 'contents:trailers'.
For sorting purposes, fields with numeric values sort in numeric order
(`objectsize`, `authordate`, `committerdate`, `creatordate`, `taggerdate`).

View File

@ -23,7 +23,6 @@ SYNOPSIS
[(--reroll-count|-v) <n>]
[--to=<email>] [--cc=<email>]
[--[no-]cover-letter] [--quiet] [--notes[=<ref>]]
[--progress]
[<common diff options>]
[ <since> | <revision range> ]
@ -284,9 +283,6 @@ you can use `--suffix=-patch` to get `0001-description-of-my-change-patch`.
range are always formatted as creation patches, independently
of this flag.
--progress::
Show progress reports on stderr as patches are generated.
CONFIGURATION
-------------
You can specify extra mail header lines to be added to each message,

View File

@ -95,6 +95,13 @@ OPTIONS
<tree> option the prefix of all submodule output will be the name of
the parent project's <tree> object.
--parent-basename <basename>::
For internal use only. In order to produce uniform output with the
--recurse-submodules option, this option can be used to provide the
basename of a parent's <tree> object to a submodule so the submodule
can prefix its output with the parent's name rather than the SHA1 of
the submodule.
-a::
--text::
Process binary files as if they were text.

View File

@ -77,9 +77,6 @@ OPTIONS
--check-self-contained-and-connected::
Die if the pack contains broken links. For internal use only.
--fsck-objects::
Die if the pack contains broken objects. For internal use only.
--threads=<n>::
Specifies the number of threads to spawn when resolving
deltas. This requires that index-pack be compiled with

View File

@ -3,27 +3,24 @@ git-interpret-trailers(1)
NAME
----
git-interpret-trailers - add or parse structured information in commit messages
git-interpret-trailers - help add structured information into commit messages
SYNOPSIS
--------
[verse]
'git interpret-trailers' [options] [(--trailer <token>[(=|:)<value>])...] [<file>...]
'git interpret-trailers' [options] [--parse] [<file>...]
'git interpret-trailers' [--in-place] [--trim-empty] [(--trailer <token>[(=|:)<value>])...] [<file>...]
DESCRIPTION
-----------
Help parsing or adding 'trailers' lines, that look similar to RFC 822 e-mail
Help adding 'trailers' lines, that look similar to RFC 822 e-mail
headers, at the end of the otherwise free-form part of a commit
message.
This command reads some patches or commit messages from either the
<file> arguments or the standard input if no <file> is specified. If
`--parse` is specified, the output consists of the parsed trailers.
Otherwise, this command applies the arguments passed using the
`--trailer` option, if any, to the commit message part of each input
file. The result is emitted on the standard output.
<file> arguments or the standard input if no <file> is specified. Then
this command applies the arguments passed using the `--trailer`
option, if any, to the commit message part of each input file. The
result is emitted on the standard output.
Some configuration variables control the way the `--trailer` arguments
are applied to each commit message and the way any existing trailer in
@ -51,7 +48,7 @@ with only spaces at the end of the commit message part, one blank line
will be added before the new trailer.
Existing trailers are extracted from the input message by looking for
a group of one or more lines that (i) is all trailers, or (ii) contains at
a group of one or more lines that (i) are all trailers, or (ii) contains at
least one Git-generated or user-configured trailer and consists of at
least 25% trailers.
The group must be preceded by one or more empty (or whitespace-only) lines.
@ -83,45 +80,6 @@ OPTIONS
trailer to the input messages. See the description of this
command.
--where <placement>::
--no-where::
Specify where all new trailers will be added. A setting
provided with '--where' overrides all configuration variables
and applies to all '--trailer' options until the next occurrence of
'--where' or '--no-where'.
--if-exists <action>::
--no-if-exists::
Specify what action will be performed when there is already at
least one trailer with the same <token> in the message. A setting
provided with '--if-exists' overrides all configuration variables
and applies to all '--trailer' options until the next occurrence of
'--if-exists' or '--no-if-exists'.
--if-missing <action>::
--no-if-missing::
Specify what action will be performed when there is no other
trailer with the same <token> in the message. A setting
provided with '--if-missing' overrides all configuration variables
and applies to all '--trailer' options until the next occurrence of
'--if-missing' or '--no-if-missing'.
--only-trailers::
Output only the trailers, not any other parts of the input.
--only-input::
Output only trailers that exist in the input; do not add any
from the command-line or by following configured `trailer.*`
rules.
--unfold::
Remove any whitespace-continuation in trailers, so that each
trailer appears on a line by itself with its full content.
--parse::
A convenience alias for `--only-trailers --only-input
--unfold`.
CONFIGURATION VARIABLES
-----------------------
@ -212,8 +170,8 @@ trailer.<token>.where::
configuration variable and it overrides what is specified by
that option for trailers with the specified <token>.
trailer.<token>.ifexists::
This option takes the same values as the 'trailer.ifexists'
trailer.<token>.ifexist::
This option takes the same values as the 'trailer.ifexist'
configuration variable and it overrides what is specified by
that option for trailers with the specified <token>.

View File

@ -38,13 +38,6 @@ OPTIONS
are shown as if 'short' were given, otherwise no ref names are
shown. The default option is 'short'.
--decorate-refs=<pattern>::
--decorate-refs-exclude=<pattern>::
If no `--decorate-refs` is given, pretend as if all refs were
included. For each candidate, do not use it for decoration if it
matches any patterns given to `--decorate-refs-exclude` or if it
doesn't match any of the patterns given to `--decorate-refs`.
--source::
Print out the ref name given on the command line by which each
commit was reached.

View File

@ -9,7 +9,7 @@ git-ls-files - Show information about files in the index and the working tree
SYNOPSIS
--------
[verse]
'git ls-files' [-z] [-t] [-v] [-f]
'git ls-files' [-z] [-t] [-v]
(--[cached|deleted|others|ignored|stage|unmerged|killed|modified])*
(-[c|d|o|i|s|u|k|m])*
[--eol]
@ -133,11 +133,6 @@ a space) at the start of each line:
that are marked as 'assume unchanged' (see
linkgit:git-update-index[1]).
-f::
Similar to `-t`, but use lowercase letters for files
that are marked as 'fsmonitor valid' (see
linkgit:git-update-index[1]).
--full-name::
When run from a subdirectory, the command usually
outputs paths relative to the current directory. This

View File

@ -154,71 +154,23 @@ topic origin/master`, the history of remote-tracking branch
`origin/master` may have been rewound and rebuilt, leading to a
history of this shape:
o---B2
o---B1
/
---o---o---B1--o---o---o---B (origin/master)
---o---o---B2--o---o---o---B (origin/master)
\
B0
B3
\
D0---D1---D (topic)
Derived (topic)
where `origin/master` used to point at commits B0, B1, B2 and now it
where `origin/master` used to point at commits B3, B2, B1 and now it
points at B, and your `topic` branch was started on top of it back
when `origin/master` was at B0, and you built three commits, D0, D1,
and D, on top of it. Imagine that you now want to rebase the work
you did on the topic on top of the updated origin/master.
In such a case, `git merge-base origin/master topic` would return the
parent of B0 in the above picture, but B0^..D is *not* the range of
commits you would want to replay on top of B (it includes B0, which
is not what you wrote; it is a commit the other side discarded when
it moved its tip from B0 to B1).
`git merge-base --fork-point origin/master topic` is designed to
help in such a case. It takes not only B but also B0, B1, and B2
(i.e. old tips of the remote-tracking branches your repository's
reflog knows about) into account to see on which commit your topic
branch was built and finds B0, allowing you to replay only the
commits on your topic, excluding the commits the other side later
discarded.
Hence
when `origin/master` was at B3. This mode uses the reflog of
`origin/master` to find B3 as the fork point, so that the `topic`
can be rebased on top of the updated `origin/master` by:
$ fork_point=$(git merge-base --fork-point origin/master topic)
will find B0, and
$ git rebase --onto origin/master $fork_point topic
will replay D0, D1 and D on top of B to create a new history of this
shape:
o---B2
/
---o---o---B1--o---o---o---B (origin/master)
\ \
B0 D0'--D1'--D' (topic - updated)
\
D0---D1---D (topic - old)
A caveat is that older reflog entries in your repository may be
expired by `git gc`. If B0 no longer appears in the reflog of the
remote-tracking branch `origin/master`, the `--fork-point` mode
obviously cannot find it and fails, avoiding to give a random and
useless result (such as the parent of B0, like the same command
without the `--fork-point` option gives).
Also, the remote-tracking branch you use the `--fork-point` mode
with must be the one your topic forked from its tip. If you forked
from an older commit than the tip, this mode would not find the fork
point (imagine in the above sample history B0 did not exist,
origin/master started at B1, moved to B2 and then B, and you forked
your topic at origin/master^ when origin/master was B1; the shape of
the history would be the same as above, without B0, and the parent
of B1 is what `git merge-base origin/master topic` correctly finds,
but the `--fork-point` mode will not, because it is not one of the
commits that used to be at the tip of origin/master).
See also
--------

View File

@ -64,6 +64,12 @@ OPTIONS
-------
include::merge-options.txt[]
-S[<keyid>]::
--gpg-sign[=<keyid>]::
GPG-sign the resulting merge commit. The `keyid` argument is
optional and defaults to the committer identity; if specified,
it must be stuck to the option without a space.
-m <msg>::
Set the commit message to be used for the merge commit (in
case one is created).
@ -127,7 +133,7 @@ exception is when the changed index entries are in the state that
would result from the merge already.)
If all named commits are already ancestors of `HEAD`, 'git merge'
will exit early with the message "Already up to date."
will exit early with the message "Already up-to-date."
FAST-FORWARD MERGE
------------------

View File

@ -18,7 +18,7 @@ SYNOPSIS
'git notes' merge --commit [-v | -q]
'git notes' merge --abort [-v | -q]
'git notes' remove [--ignore-missing] [--stdin] [<object>...]
'git notes' prune [-n] [-v]
'git notes' prune [-n | -v]
'git notes' get-ref

View File

@ -157,12 +157,6 @@ The p4 changes will be created as the user invoking 'git p4 submit'. The
according to the author of the Git commit. This option requires admin
privileges in p4, which can be granted using 'p4 protect'.
To shelve changes instead of submitting, use `--shelve` and `--update-shelve`:
----
$ git p4 submit --shelve
$ git p4 submit --update-shelve 1234 --update-shelve 2345
----
OPTIONS
-------
@ -316,7 +310,7 @@ These options can be used to modify 'git p4 submit' behavior.
--update-shelve CHANGELIST::
Update an existing shelved changelist with this commit. Implies
--shelve. Repeat for multiple shelved changelists.
--shelve.
--conflict=(ask|skip|quit)::
Conflicts can occur when applying a commit to p4. When this

View File

@ -12,8 +12,7 @@ SYNOPSIS
'git pack-objects' [-q | --progress | --all-progress] [--all-progress-implied]
[--no-reuse-delta] [--delta-base-offset] [--non-empty]
[--local] [--incremental] [--window=<n>] [--depth=<n>]
[--revs [--unpacked | --all]]
[--stdout [--filter=<filter-spec>] | base-name]
[--revs [--unpacked | --all]] [--stdout | base-name]
[--shallow] [--keep-true-parents] < object-list
@ -237,36 +236,6 @@ So does `git bundle` (see linkgit:git-bundle[1]) when it creates a bundle.
With this option, parents that are hidden by grafts are packed
nevertheless.
--filter=<filter-spec>::
Requires `--stdout`. Omits certain objects (usually blobs) from
the resulting packfile. See linkgit:git-rev-list[1] for valid
`<filter-spec>` forms.
--no-filter::
Turns off any previous `--filter=` argument.
--missing=<missing-action>::
A debug option to help with future "partial clone" development.
This option specifies how missing objects are handled.
+
The form '--missing=error' requests that pack-objects stop with an error if
a missing object is encountered. This is the default action.
+
The form '--missing=allow-any' will allow object traversal to continue
if a missing object is encountered. Missing objects will silently be
omitted from the results.
+
The form '--missing=allow-promisor' is like 'allow-any', but will only
allow object traversal to continue for EXPECTED promisor missing objects.
Unexpected missing object will raise an error.
--exclude-promisor-objects::
Omit objects that are known to be in the promisor remote. (This
option has the purpose of operating only on locally created objects,
so that when we repack, we still maintain a distinction between
locally created objects [without .promisor] and objects from the
promisor remote [with .promisor].) This is used with partial clone.
SEE ALSO
--------
linkgit:git-rev-list[1]

View File

@ -9,7 +9,7 @@ git-prune - Prune all unreachable objects from the object database
SYNOPSIS
--------
[verse]
'git prune' [-n] [-v] [--progress] [--expire <time>] [--] [<head>...]
'git prune' [-n] [-v] [--expire <expire>] [--] [<head>...]
DESCRIPTION
-----------
@ -42,15 +42,12 @@ OPTIONS
--verbose::
Report all removed objects.
--progress::
Show progress.
\--::
Do not interpret any more arguments as options.
--expire <time>::
Only expire loose objects older than <time>.
\--::
Do not interpret any more arguments as options.
<head>...::
In addition to objects
reachable from any of our references, keep objects

View File

@ -12,7 +12,7 @@ SYNOPSIS
'git push' [--all | --mirror | --tags] [--follow-tags] [--atomic] [-n | --dry-run] [--receive-pack=<git-receive-pack>]
[--repo=<repository>] [-f | --force] [-d | --delete] [--prune] [-v | --verbose]
[-u | --set-upstream] [--push-option=<string>]
[--[no-]signed|--signed=(true|false|if-asked)]
[--[no-]signed|--sign=(true|false|if-asked)]
[--force-with-lease[=<refname>[:<expect>]]]
[--no-verify] [<repository> [<refspec>...]]
@ -141,7 +141,7 @@ already exists on the remote side.
information, see `push.followTags` in linkgit:git-config[1].
--[no-]signed::
--signed=(true|false|if-asked)::
--sign=(true|false|if-asked)::
GPG-sign the push request to update refs on the receiving
side, to allow it to be checked by the hooks and/or be
logged. If `false` or `--no-signed`, no signing will be
@ -156,17 +156,11 @@ already exists on the remote side.
Either all refs are updated, or on error, no refs are updated.
If the server does not support atomic pushes the push will fail.
-o <option>::
--push-option=<option>::
-o::
--push-option::
Transmit the given string to the server, which passes them to
the pre-receive as well as the post-receive hook. The given string
must not contain a NUL or LF character.
When multiple `--push-option=<option>` are given, they are
all sent to the other side in the order listed on the
command line.
When no `--push-option=<option>` is given from the command
line, the values of configuration variable `push.pushOption`
are used instead.
--receive-pack=<git-receive-pack>::
--exec=<git-receive-pack>::

View File

@ -81,11 +81,12 @@ OPTIONS
* when both sides add a path identically. The resolution
is to add that path.
--prefix=<prefix>::
--prefix=<prefix>/::
Keep the current index contents, and read the contents
of the named tree-ish under the directory at `<prefix>`.
The command will refuse to overwrite entries that already
existed in the original index file.
existed in the original index file. Note that the `<prefix>/`
value must end with a slash.
--exclude-per-directory=<gitignore>::
When running the command with `-u` and `-m` options, the

View File

@ -12,7 +12,7 @@ SYNOPSIS
[<upstream> [<branch>]]
'git rebase' [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>]
--root [<branch>]
'git rebase' --continue | --skip | --abort | --quit | --edit-todo | --show-current-patch
'git rebase' --continue | --skip | --abort | --quit | --edit-todo
DESCRIPTION
-----------
@ -203,7 +203,24 @@ Alternatively, you can undo the 'git rebase' with
CONFIGURATION
-------------
include::rebase-config.txt[]
rebase.stat::
Whether to show a diffstat of what changed upstream since the last
rebase. False by default.
rebase.autoSquash::
If set to true enable `--autosquash` option by default.
rebase.autoStash::
If set to true enable `--autostash` option by default.
rebase.missingCommitsCheck::
If set to "warn", print warnings about removed commits in
interactive mode. If set to "error", print the warnings and
stop the rebase. If set to "ignore", no checking is
done. "ignore" by default.
rebase.instructionFormat::
Custom commit list format to use during an `--interactive` rebase.
OPTIONS
-------
@ -244,22 +261,12 @@ leave out at most one of A and B, in which case it defaults to HEAD.
Keep the commits that do not change anything from its
parents in the result.
--allow-empty-message::
By default, rebasing commits with an empty message will fail.
This option overrides that behavior, allowing commits with empty
messages to be rebased.
--skip::
Restart the rebasing process by skipping the current patch.
--edit-todo::
Edit the todo list during an interactive rebase.
--show-current-patch::
Show the current patch in an interactive rebase or when rebase
is stopped because of conflicts. This is the equivalent of
`git show REBASE_HEAD`.
-m::
--merge::
Use merging strategies to rebase. When the recursive (default) merge
@ -327,7 +334,7 @@ which makes little sense.
-f::
--force-rebase::
Force a rebase even if the current branch is up to date and
Force a rebase even if the current branch is up-to-date and
the command without `--force` would return without doing anything.
+
You may find this (or --no-ff with an interactive rebase) helpful after
@ -423,15 +430,13 @@ without an explicit `--interactive`.
--autosquash::
--no-autosquash::
When the commit log message begins with "squash! ..." (or
"fixup! ..."), and there is already a commit in the todo list that
matches the same `...`, automatically modify the todo list of rebase
-i so that the commit marked for squashing comes right after the
commit to be modified, and change the action of the moved commit
from `pick` to `squash` (or `fixup`). A commit matches the `...` if
the commit subject matches, or if the `...` refers to the commit's
hash. As a fall-back, partial matches of the commit subject work,
too. The recommended way to create fixup/squash commits is by using
the `--fixup`/`--squash` options of linkgit:git-commit[1].
"fixup! ..."), and there is a commit whose title begins with
the same ..., automatically modify the todo list of rebase -i
so that the commit marked for squashing comes right after the
commit to be modified, and change the action of the moved
commit from `pick` to `squash` (or `fixup`). Ignores subsequent
"fixup! " or "squash! " after the first, in case you referred to an
earlier fixup/squash with `git commit --fixup/--squash`.
+
This option is only valid when the `--interactive` option is used.
+

View File

@ -20,9 +20,9 @@ depending on the subcommand:
'git reflog' ['show'] [log-options] [<ref>]
'git reflog expire' [--expire=<time>] [--expire-unreachable=<time>]
[--rewrite] [--updateref] [--stale-fix]
[--dry-run | -n] [--verbose] [--all | <refs>...]
[--dry-run] [--verbose] [--all | <refs>...]
'git reflog delete' [--rewrite] [--updateref]
[--dry-run | -n] [--verbose] ref@\{specifier\}...
[--dry-run] [--verbose] ref@\{specifier\}...
'git reflog exists' <ref>
Reference logs, or "reflogs", record when the tips of branches and

View File

@ -172,14 +172,10 @@ With `-n` option, the remote heads are not queried first with
'prune'::
Deletes stale references associated with <name>. By default, stale
remote-tracking branches under <name> are deleted, but depending on
global configuration and the configuration of the remote we might even
prune local tags that haven't been pushed there. Equivalent to `git
fetch --prune <name>`, except that no new references will be fetched.
+
See the PRUNING section of linkgit:git-fetch[1] for what it'll prune
depending on various configuration.
Deletes all stale remote-tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in
"remotes/<name>".
+
With `--dry-run` option, report what branches will be pruned, but do not
actually prune them.
@ -193,7 +189,7 @@ remotes.default is not defined, all remotes which do not have the
configuration parameter remote.<name>.skipDefaultUpdate set to true will
be updated. (See linkgit:git-config[1]).
+
With `--prune` option, run pruning against all the remotes that are updated.
With `--prune` option, prune all the remotes that are updated.
DISCUSSION

View File

@ -205,7 +205,7 @@ development on the topic branch:
------------
you could run `git rebase master topic`, to bring yourself
up to date before your topic is ready to be sent upstream.
up-to-date before your topic is ready to be sent upstream.
This would result in falling back to a three-way merge, and it
would conflict the same way as the test merge you resolved earlier.
'git rerere' will be run by 'git rebase' to help you resolve this

View File

@ -47,9 +47,7 @@ SYNOPSIS
[ --fixed-strings | -F ]
[ --date=<format>]
[ [ --objects | --objects-edge | --objects-edge-aggressive ]
[ --unpacked ]
[ --filter=<filter-spec> [ --filter-print-omitted ] ] ]
[ --missing=<missing-action> ]
[ --unpacked ] ]
[ --pretty | --header ]
[ --bisect ]
[ --bisect-vars ]

View File

@ -235,9 +235,6 @@ print a message to stderr and exit with nonzero status.
--is-bare-repository::
When the repository is bare print "true", otherwise "false".
--is-shallow-repository::
When the repository is shallow print "true", otherwise "false".
--resolve-git-dir <path>::
Check if <path> is a valid repository or a gitfile that
points at a valid repository, and print the location of the
@ -264,7 +261,7 @@ print a message to stderr and exit with nonzero status.
--show-toplevel::
Show the absolute path of the top-level directory.
--show-superproject-working-tree::
--show-superproject-working-tree
Show the absolute path of the root of the superproject's
working tree (if exists) that uses the current repository as
its submodule. Outputs nothing if the current repository is

View File

@ -146,7 +146,7 @@ the submodule's history. If it exists the submodule.<name> section
in the linkgit:gitmodules[5] file will also be removed and that file
will be staged (unless --cached or -n are used).
A submodule is considered up to date when the HEAD is the same as
A submodule is considered up-to-date when the HEAD is the same as
recorded in the index, no tracked files are modified and no untracked
files that aren't ignored are present in the submodules work tree.
Ignored files are deemed expendable and won't stop a submodule's work

View File

@ -84,11 +84,6 @@ See the CONFIGURATION section for `sendemail.multiEdit`.
the value of GIT_AUTHOR_IDENT, or GIT_COMMITTER_IDENT if that is not
set, as returned by "git var -l".
--reply-to=<address>::
Specify the address where replies from recipients should go to.
Use this if replies to messages should go to another address than what
is specified with the --from parameter.
--in-reply-to=<identifier>::
Make the first mail (or all the mails with `--no-thread`) appear as a
reply to the given Message-Id, which avoids breaking threads to
@ -208,9 +203,9 @@ a password is obtained using 'git-credential'.
specify a full pathname of a sendmail-like program instead;
the program must support the `-i` option. Default value can
be specified by the `sendemail.smtpServer` configuration
option; the built-in default is to search for `sendmail` in
`/usr/sbin`, `/usr/lib` and $PATH if such program is
available, falling back to `localhost` otherwise.
option; the built-in default is `/usr/sbin/sendmail` or
`/usr/lib/sendmail` if such program is available, or
`localhost` otherwise.
--smtp-server-port=<port>::
Specifies a port different from the default port (SMTP

View File

@ -11,7 +11,7 @@ SYNOPSIS
[verse]
'git send-pack' [--all] [--dry-run] [--force] [--receive-pack=<git-receive-pack>]
[--verbose] [--thin] [--atomic]
[--[no-]signed|--signed=(true|false|if-asked)]
[--[no-]signed|--sign=(true|false|if-asked)]
[<host>:]<directory> [<ref>...]
DESCRIPTION
@ -71,7 +71,7 @@ be in a separate packet, and the list must end with a flush packet.
refs.
--[no-]signed::
--signed=(true|false|if-asked)::
--sign=(true|false|if-asked)::
GPG-sign the push request to update refs on the receiving
side, to allow it to be checked by the hooks and/or be
logged. If `false` or `--no-signed`, no signing will be

View File

@ -9,7 +9,7 @@ git-show - Show various types of objects
SYNOPSIS
--------
[verse]
'git show' [options] [<object>...]
'git show' [options] <object>...
DESCRIPTION
-----------
@ -35,7 +35,7 @@ This manual page describes only the most frequently used options.
OPTIONS
-------
<object>...::
The names of objects to show (defaults to 'HEAD').
The names of objects to show.
For a more complete list of ways to spell object names, see
"SPECIFYING REVISIONS" section in linkgit:gitrevisions[7].

View File

@ -13,8 +13,10 @@ SYNOPSIS
'git stash' drop [-q|--quiet] [<stash>]
'git stash' ( pop | apply ) [--index] [-q|--quiet] [<stash>]
'git stash' branch <branchname> [<stash>]
'git stash' save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [<message>]
'git stash' [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [-m|--message <message>]
[-u|--include-untracked] [-a|--all] [-m|--message <message>]]
[--] [<pathspec>...]]
'git stash' clear
'git stash' create [<message>]
@ -31,7 +33,7 @@ and reverts the working directory to match the `HEAD` commit.
The modifications stashed away by this command can be listed with
`git stash list`, inspected with `git stash show`, and restored
(potentially on top of a different commit) with `git stash apply`.
Calling `git stash` without any arguments is equivalent to `git stash push`.
Calling `git stash` without any arguments is equivalent to `git stash save`.
A stash is by default listed as "WIP on 'branchname' ...", but
you can give a more descriptive message on the command line when
you create one.
@ -46,6 +48,7 @@ stash index (e.g. the integer `n` is equivalent to `stash@{n}`).
OPTIONS
-------
save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <message>] [--] [<pathspec>...]::
Save your local modifications to a new 'stash entry' and roll them
@ -84,12 +87,6 @@ linkgit:git-add[1] to learn how to operate the `--patch` mode.
The `--patch` option implies `--keep-index`. You can use
`--no-keep-index` to override this.
save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<message>]::
This option is deprecated in favour of 'git stash push'. It
differs from "stash push" in that it cannot take pathspecs,
and any non-option arguments form the message.
list [<options>]::
List the stash entries that you currently have. Each 'stash entry' is
@ -121,7 +118,7 @@ pop [--index] [-q|--quiet] [<stash>]::
Remove a single stashed state from the stash list and apply it
on top of the current working tree state, i.e., do the inverse
operation of `git stash push`. The working directory must
operation of `git stash save`. The working directory must
match the index.
+
Applying the state can fail with conflicts; in this case, it is not
@ -140,7 +137,7 @@ apply [--index] [-q|--quiet] [<stash>]::
Like `pop`, but do not remove the state from the stash list. Unlike `pop`,
`<stash>` may be any commit that looks like a commit created by
`stash push` or `stash create`.
`stash save` or `stash create`.
branch <branchname> [<stash>]::
@ -151,7 +148,7 @@ branch <branchname> [<stash>]::
`stash@{<revision>}`, it then drops the `<stash>`. When no `<stash>`
is given, applies the latest one.
+
This is useful if the branch on which you ran `git stash push` has
This is useful if the branch on which you ran `git stash save` has
changed enough that `git stash apply` fails due to conflicts. Since
the stash entry is applied on top of the commit that was HEAD at the
time `git stash` was run, it restores the originally stashed state
@ -175,14 +172,14 @@ create::
return its object name, without storing it anywhere in the ref
namespace.
This is intended to be useful for scripts. It is probably not
the command you want to use; see "push" above.
the command you want to use; see "save" above.
store::
Store a given stash created via 'git stash create' (which is a
dangling merge commit) in the stash ref, updating the stash
reflog. This is intended to be useful for scripts. It is
probably not the command you want to use; see "push" above.
probably not the command you want to use; see "save" above.
DISCUSSION
----------
@ -258,14 +255,14 @@ $ git stash pop
Testing partial commits::
You can use `git stash push --keep-index` when you want to make two or
You can use `git stash save --keep-index` when you want to make two or
more commits out of the changes in the work tree, and you want to test
each change before committing:
+
----------------------------------------------------------------
# ... hack hack hack ...
$ git add --patch foo # add just first part to the index
$ git stash push --keep-index # save all other changes to the stash
$ git stash save --keep-index # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part' # commit fully tested change
$ git stash pop # prepare to work on all other changes

View File

@ -97,27 +97,8 @@ configuration variable documented in linkgit:git-config[1].
(and suppresses the output of submodule summaries when the config option
`status.submoduleSummary` is set).
--ignored[=<mode>]::
--ignored::
Show ignored files as well.
+
The mode parameter is used to specify the handling of ignored files.
It is optional: it defaults to 'traditional'.
+
The possible options are:
+
- 'traditional' - Shows ignored files and directories, unless
--untracked-files=all is specifed, in which case
individual files in ignored directories are
displayed.
- 'no' - Show no ignored files.
- 'matching' - Shows ignored files and directories matching an
ignore pattern.
+
When 'matching' mode is specified, paths that explicity match an
ignored pattern are shown. If a directory matches an ignore pattern,
then it is shown, but not paths contained in the ignored directory. If
a directory does not match an ignore pattern, but all contents are
ignored, then the directory is not shown, but all contents are shown.
-z::
Terminate entries with NUL, instead of LF. This implies
@ -130,11 +111,6 @@ ignored, then the directory is not shown, but all contents are shown.
without options are equivalent to 'always' and 'never'
respectively.
--ahead-behind::
--no-ahead-behind::
Display or do not display detailed ahead/behind counts for the
branch relative to its upstream branch. Defaults to true.
<pathspec>...::
See the 'pathspec' entry in linkgit:gitglossary[7].
@ -154,15 +130,14 @@ the status.relativePaths config option below.
Short Format
~~~~~~~~~~~~
In the short-format, the status of each path is shown as one of these
forms
In the short-format, the status of each path is shown as
XY PATH
XY ORIG_PATH -> PATH
XY PATH1 -> PATH2
where `ORIG_PATH` is where the renamed/copied contents came
from. `ORIG_PATH` is only shown when the entry is renamed or
copied. The `XY` is a two-letter status code.
where `PATH1` is the path in the `HEAD`, and the " `-> PATH2`" part is
shown only when `PATH1` corresponds to a different path in the
index/worktree (i.e. the file is renamed). The `XY` is a two-letter
status code.
The fields (including the `->`) are separated from each other by a
single space. If a filename contains whitespace or other nonprintable
@ -189,17 +164,15 @@ in which case `XY` are `!!`.
X Y Meaning
-------------------------------------------------
[AMD] not updated
[MD] not updated
M [ MD] updated in index
A [ MD] added to index
D deleted from index
D [ M] deleted from index
R [ MD] renamed in index
C [ MD] copied in index
[MARC] index and work tree matches
[ MARC] M work tree changed since index
[ MARC] D deleted in work tree
[ D] R renamed in work tree
[ D] C copied in work tree
-------------------------------------------------
D D unmerged, both deleted
A U unmerged, added by us
@ -317,13 +290,13 @@ Renamed or copied entries have the following format:
of similarity between the source and target of the
move or copy). For example "R100" or "C75".
<path> The pathname. In a renamed/copied entry, this
is the target path.
is the path in the index and in the working tree.
<sep> When the `-z` option is used, the 2 pathnames are separated
with a NUL (ASCII 0x00) byte; otherwise, a tab (ASCII 0x09)
byte separates them.
<origPath> The pathname in the commit at HEAD or in the index.
This is only present in a renamed/copied entry, and
tells where the renamed/copied contents came from.
<origPath> The pathname in the commit at HEAD. This is only
present in a renamed/copied entry, and tells
where the renamed/copied contents came from.
--------------------------------------------------------
Unmerged entries have the following format; the first character is
@ -395,19 +368,6 @@ ignored submodules you can either use the --ignore-submodules=dirty command
line option or the 'git submodule summary' command, which shows a similar
output but does not honor these settings.
BACKGROUND REFRESH
------------------
By default, `git status` will automatically refresh the index, updating
the cached stat information from the working tree and writing out the
result. Writing out the updated index is an optimization that isn't
strictly necessary (`status` computes the values for itself, but writing
them out is just to save subsequent programs from repeating our
computation). When `status` is run in the background, the lock held
during the write may conflict with other simultaneous processes, causing
them to fail. Scripts running `status` in the background should consider
using `git --no-optional-locks status` (see linkgit:git[1] for details).
SEE ALSO
--------
linkgit:gitignore[5]

View File

@ -70,8 +70,8 @@ status [--cached] [--recursive] [--] [<path>...]::
Show the status of the submodules. This will print the SHA-1 of the
currently checked out commit for each submodule, along with the
submodule path and the output of 'git describe' for the
SHA-1. Each SHA-1 will possibly be prefixed with `-` if the submodule is
not initialized, `+` if the currently checked out submodule commit
SHA-1. Each SHA-1 will be prefixed with `-` if the submodule is not
initialized, `+` if the currently checked out submodule commit
does not match the SHA-1 found in the index of the containing
repository and `U` if the submodule has merge conflicts.
+
@ -132,15 +132,15 @@ expects by cloning missing submodules and updating the working tree of
the submodules. The "updating" can be done in several ways depending
on command line options and the value of `submodule.<name>.update`
configuration variable. The command line option takes precedence over
the configuration variable. If neither is given, a 'checkout' is performed.
The 'update' procedures supported both from the command line as well as
through the `submodule.<name>.update` configuration are:
the configuration variable. if neither is given, a checkout is performed.
update procedures supported both from the command line as well as setting
`submodule.<name>.update`:
checkout;; the commit recorded in the superproject will be
checked out in the submodule on a detached HEAD.
+
If `--force` is specified, the submodule will be checked out (using
`git checkout --force`), even if the commit specified
`git checkout --force` if appropriate), even if the commit specified
in the index of the containing repository already matches the commit
checked out in the submodule.
@ -150,8 +150,8 @@ checked out in the submodule.
merge;; the commit recorded in the superproject will be merged
into the current branch in the submodule.
The following 'update' procedures are only available via the
`submodule.<name>.update` configuration variable:
The following procedures are only available via the `submodule.<name>.update`
configuration variable:
custom command;; arbitrary shell command that takes a single
argument (the sha1 of the commit recorded in the

View File

@ -424,7 +424,7 @@ Any other arguments are passed directly to 'git log'
'set-tree'::
You should consider using 'dcommit' instead of this command.
Commit specified commit or tree objects to SVN. This relies on
your imported fetch data being up to date. This makes
your imported fetch data being up-to-date. This makes
absolutely no attempts to do patching when committing to SVN, it
simply overwrites files with those specified in the tree or
commit. All merging is assumed to have taken place

View File

@ -9,7 +9,7 @@ git-tag - Create, list, delete or verify a tag object signed with GPG
SYNOPSIS
--------
[verse]
'git tag' [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] [-e]
'git tag' [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>]
<tagname> [<commit> | <object>]
'git tag' -d <tagname>...
'git tag' [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
@ -167,12 +167,6 @@ This option is only applicable when listing tags without annotation lines.
Implies `-a` if none of `-a`, `-s`, or `-u <keyid>`
is given.
-e::
--edit::
The message taken from file with `-F` and command line with
`-m` are usually used as the tag message unmodified.
This option lets you further edit the message taken from these sources.
--cleanup=<mode>::
This option sets how the tag message is cleaned up.
The '<mode>' can be one of 'verbatim', 'whitespace' and 'strip'. The

View File

@ -16,11 +16,9 @@ SYNOPSIS
[--chmod=(+|-)x]
[--[no-]assume-unchanged]
[--[no-]skip-worktree]
[--[no-]fsmonitor-valid]
[--ignore-submodules]
[--[no-]split-index]
[--[no-|test-|force-]untracked-cache]
[--[no-]fsmonitor]
[--really-refresh] [--unresolve] [--again | -g]
[--info-only] [--index-info]
[-z] [--stdin] [--index-version <n>]
@ -113,12 +111,6 @@ you will need to handle the situation manually.
set and unset the "skip-worktree" bit for the paths. See
section "Skip-worktree bit" below for more information.
--[no-]fsmonitor-valid::
When one of these flags is specified, the object name recorded
for the paths are not updated. Instead, these options
set and unset the "fsmonitor valid" bit for the paths. See
section "File System Monitor" below for more information.
-g::
--again::
Runs 'git update-index' itself on the paths whose index
@ -209,15 +201,6 @@ will remove the intended effect of the option.
`--untracked-cache` used to imply `--test-untracked-cache` but
this option would enable the extension unconditionally.
--fsmonitor::
--no-fsmonitor::
Enable or disable files system monitor feature. These options
take effect whatever the value of the `core.fsmonitor`
configuration variable (see linkgit:git-config[1]). But a warning
is emitted when the change goes against the configured value, as
the configured value will take effect next time the index is
read and this will remove the intended effect of the option.
\--::
Do not interpret any more arguments as options.
@ -231,7 +214,7 @@ will remove the intended effect of the option.
Using --refresh
---------------
`--refresh` does not calculate a new sha1 file or bring the index
up to date for mode/content changes. But what it *does* do is to
up-to-date for mode/content changes. But what it *does* do is to
"re-match" the stat information of a file with the index, so that you
can refresh the index for a file that hasn't been changed but where
the stat entry is out of date.
@ -464,60 +447,6 @@ command reads the index; while when `--[no-|force-]untracked-cache`
are used, the untracked cache is immediately added to or removed from
the index.
Before 2.17, the untracked cache had a bug where replacing a directory
with a symlink to another directory could cause it to incorrectly show
files tracked by git as untracked. See the "status: add a failing test
showing a core.untrackedCache bug" commit to git.git. A workaround for
that is (and this might work for other undiscovered bugs in the
future):
----------------
$ git -c core.untrackedCache=false status
----------------
This bug has also been shown to affect non-symlink cases of replacing
a directory with a file when it comes to the internal structures of
the untracked cache, but no case has been reported where this resulted in
wrong "git status" output.
There are also cases where existing indexes written by git versions
before 2.17 will reference directories that don't exist anymore,
potentially causing many "could not open directory" warnings to be
printed on "git status". These are new warnings for existing issues
that were previously silently discarded.
As with the bug described above the solution is to one-off do a "git
status" run with `core.untrackedCache=false` to flush out the leftover
bad data.
File System Monitor
-------------------
This feature is intended to speed up git operations for repos that have
large working directories.
It enables git to work together with a file system monitor (see the
"fsmonitor-watchman" section of linkgit:githooks[5]) that can
inform it as to what files have been modified. This enables git to avoid
having to lstat() every file to find modified files.
When used in conjunction with the untracked cache, it can further improve
performance by avoiding the cost of scanning the entire working directory
looking for new files.
If you want to enable (or disable) this feature, it is easier to use
the `core.fsmonitor` configuration variable (see
linkgit:git-config[1]) than using the `--fsmonitor` option to
`git update-index` in each repository, especially if you want to do so
across all repositories you use, because you can set the configuration
variable in your `$HOME/.gitconfig` just once and have it affect all
repositories you touch.
When the `core.fsmonitor` configuration variable is changed, the
file system monitor is added to or removed from the index the next time
a command reads the index. When `--[no-]fsmonitor` are used, the file
system monitor is immediately added to or removed from the index.
Configuration
-------------

View File

@ -9,12 +9,10 @@ git-worktree - Manage multiple working trees
SYNOPSIS
--------
[verse]
'git worktree add' [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<commit-ish>]
'git worktree add' [-f] [--detach] [--checkout] [--lock] [-b <new-branch>] <path> [<branch>]
'git worktree list' [--porcelain]
'git worktree lock' [--reason <string>] <worktree>
'git worktree move' <worktree> <new-path>
'git worktree prune' [-n] [-v] [--expire <expire>]
'git worktree remove' [--force] <worktree>
'git worktree unlock' <worktree>
DESCRIPTION
@ -36,6 +34,10 @@ The working tree's administrative files in the repository (see
`git worktree prune` in the main or any linked working tree to
clean up any stale administrative files.
If you move a linked working tree, you need to manually update the
administrative files so that they do not get pruned automatically. See
section "DETAILS" for more information.
If a linked working tree is stored on a portable device or network share
which is not always mounted, you can prevent its administrative files from
being pruned by issuing the `git worktree lock` command, optionally
@ -43,23 +45,14 @@ specifying `--reason` to explain why the working tree is locked.
COMMANDS
--------
add <path> [<commit-ish>]::
add <path> [<branch>]::
Create `<path>` and checkout `<commit-ish>` into it. The new working directory
Create `<path>` and checkout `<branch>` into it. The new working directory
is linked to the current repository, sharing everything except working
directory specific files such as HEAD, index, etc. `-` may also be
specified as `<commit-ish>`; it is synonymous with `@{-1}`.
specified as `<branch>`; it is synonymous with `@{-1}`.
+
If <commit-ish> is a branch name (call it `<branch>`) and is not found,
and neither `-b` nor `-B` nor `--detach` are used, but there does
exist a tracking branch in exactly one remote (call it `<remote>`)
with a matching name, treat as equivalent to:
+
------------
$ git worktree add --track -b <branch> <path> <remote>/<branch>
------------
+
If `<commit-ish>` is omitted and neither `-b` nor `-B` nor `--detach` used,
If `<branch>` is omitted and neither `-b` nor `-B` nor `--detach` used,
then, as a convenience, a new branch based at HEAD is created automatically,
as if `-b $(basename <path>)` was specified.
@ -78,22 +71,10 @@ files from being pruned automatically. This also prevents it from
being moved or deleted. Optionally, specify a reason for the lock
with `--reason`.
move::
Move a working tree to a new location. Note that the main working tree
or linked working trees containing submodules cannot be moved.
prune::
Prune working tree information in $GIT_DIR/worktrees.
remove::
Remove a working tree. Only clean working trees (no untracked files
and no modification in tracked files) can be removed. Unclean working
trees or ones with submodules can be removed with `--force`. The main
working tree cannot be removed.
unlock::
Unlock a working tree, allowing it to be pruned, moved or deleted.
@ -103,46 +84,29 @@ OPTIONS
-f::
--force::
By default, `add` refuses to create a new working tree when
`<commit-ish>` is a branch name and is already checked out by
another working tree and `remove` refuses to remove an unclean
working tree. This option overrides that safeguard.
By default, `add` refuses to create a new working tree when `<branch>`
is already checked out by another working tree. This option overrides
that safeguard.
-b <new-branch>::
-B <new-branch>::
With `add`, create a new branch named `<new-branch>` starting at
`<commit-ish>`, and check out `<new-branch>` into the new working tree.
If `<commit-ish>` is omitted, it defaults to HEAD.
`<branch>`, and check out `<new-branch>` into the new working tree.
If `<branch>` is omitted, it defaults to HEAD.
By default, `-b` refuses to create a new branch if it already
exists. `-B` overrides this safeguard, resetting `<new-branch>` to
`<commit-ish>`.
`<branch>`.
--detach::
With `add`, detach HEAD in the new working tree. See "DETACHED HEAD"
in linkgit:git-checkout[1].
--[no-]checkout::
By default, `add` checks out `<commit-ish>`, however, `--no-checkout` can
By default, `add` checks out `<branch>`, however, `--no-checkout` can
be used to suppress checkout in order to make customizations,
such as configuring sparse-checkout. See "Sparse checkout"
in linkgit:git-read-tree[1].
--[no-]guess-remote::
With `worktree add <path>`, without `<commit-ish>`, instead
of creating a new branch from HEAD, if there exists a tracking
branch in exactly one remote matching the basename of `<path>`,
base the new branch on the remote-tracking branch, and mark
the remote-tracking branch as "upstream" from the new branch.
+
This can also be set up as the default behaviour by using the
`worktree.guessRemote` config option.
--[no-]track::
When creating a new branch, if `<commit-ish>` is a branch,
mark it as "upstream" from the new branch. This is the
default if `<commit-ish>` is a remote-tracking branch. See
"--track" in linkgit:git-branch[1] for details.
--lock::
Keep the working tree locked after creation. This is the
equivalent of `git worktree lock` after `git worktree add`,
@ -208,7 +172,7 @@ thumb is do not make any assumption about whether a path belongs to
$GIT_DIR or $GIT_COMMON_DIR when you need to directly access something
inside $GIT_DIR. Use `git rev-parse --git-path` to get the final path.
If you manually move a linked working tree, you need to update the 'gitdir' file
If you move a linked working tree, you need to update the 'gitdir' file
in the entry's directory. For example, if a linked working tree is moved
to `/newpath/test-next` and its `.git` file points to
`/path/main/.git/worktrees/test-next`, then update
@ -288,6 +252,13 @@ Multiple checkout in general is still experimental, and the support
for submodules is incomplete. It is NOT recommended to make multiple
checkouts of a superproject.
git-worktree could provide more automation for tasks currently
performed manually, such as:
- `remove` to remove a linked working tree and its administrative files (and
warn if the working tree is dirty)
- `mv` to move or rename a working tree and update its administrative files
GIT
---
Part of the linkgit:git[1] suite

View File

@ -159,10 +159,6 @@ foo.bar= ...`) sets `foo.bar` to the empty string which `git config
Add "icase" magic to all pathspec. This is equivalent to setting
the `GIT_ICASE_PATHSPECS` environment variable to `1`.
--no-optional-locks::
Do not perform optional operations that require locks. This is
equivalent to setting the `GIT_OPTIONAL_LOCKS` to `0`.
GIT COMMANDS
------------
@ -522,10 +518,11 @@ other
If either of these environment variables is set then 'git fetch'
and 'git push' will use the specified command instead of 'ssh'
when they need to connect to a remote system.
The command-line parameters passed to the configured command are
determined by the ssh variant. See `ssh.variant` option in
linkgit:git-config[1] for details.
The command will be given exactly two or four arguments: the
'username@host' (or just 'host') from the URL and the shell
command to execute on that remote system, optionally preceded by
`-p` (literally) and the 'port' from the URL when it specifies
something other than the default SSH port.
+
`$GIT_SSH_COMMAND` takes precedence over `$GIT_SSH`, and is interpreted
by the shell, which allows additional arguments to be included.
@ -594,10 +591,6 @@ into it.
Unsetting the variable, or setting it to empty, "0" or
"false" (case insensitive) disables trace messages.
`GIT_TRACE_FSMONITOR`::
Enables trace messages for the filesystem monitor extension.
See `GIT_TRACE` for available trace output options.
`GIT_TRACE_PACK_ACCESS`::
Enables trace messages for all accesses to any packs. For each
access, the pack file name and an offset in the pack is
@ -646,16 +639,6 @@ of clones and fetches.
variable.
See `GIT_TRACE` for available trace output options.
`GIT_TRACE_CURL_NO_DATA`::
When a curl trace is enabled (see `GIT_TRACE_CURL` above), do not dump
data (that is, only dump info lines and headers).
`GIT_REDACT_COOKIES`::
This can be set to a comma-separated list of strings. When a curl trace
is enabled (see `GIT_TRACE_CURL` above), whenever a "Cookies:" header
sent by the client is dumped, values of cookies whose key is in that
list (case-sensitive) are redacted.
`GIT_LITERAL_PATHSPECS`::
Setting this variable to `1` will cause Git to treat all
pathspecs literally, rather than as glob patterns. For example,
@ -714,47 +697,6 @@ of clones and fetches.
which feed potentially-untrusted URLS to git commands. See
linkgit:git-config[1] for more details.
`GIT_PROTOCOL`::
For internal use only. Used in handshaking the wire protocol.
Contains a colon ':' separated list of keys with optional values
'key[=value]'. Presence of unknown keys and values must be
ignored.
`GIT_OPTIONAL_LOCKS`::
If set to `0`, Git will complete any requested operation without
performing any optional sub-operations that require taking a lock.
For example, this will prevent `git status` from refreshing the
index as a side effect. This is useful for processes running in
the background which do not want to cause lock contention with
other operations on the repository. Defaults to `1`.
`GIT_REDIRECT_STDIN`::
`GIT_REDIRECT_STDOUT`::
`GIT_REDIRECT_STDERR`::
Windows-only: allow redirecting the standard input/output/error
handles to paths specified by the environment variables. This is
particularly useful in multi-threaded applications where the
canonical way to pass standard handles via `CreateProcess()` is
not an option because it would require the handles to be marked
inheritable (and consequently *every* spawned process would
inherit them, possibly blocking regular Git operations). The
primary intended use case is to use named pipes for communication
(e.g. `\\.\pipe\my-git-stdin-123`).
+
Two special values are supported: `off` will simply close the
corresponding standard handle, and if `GIT_REDIRECT_STDERR` is
`2>&1`, standard error will be redirected to the same handle as
standard output.
`GIT_PRINT_SHA1_ELLIPSIS` (deprecated)::
If set to `yes`, print an ellipsis following an
(abbreviated) SHA-1 value. This affects indications of
detached HEADs (linkgit:git-checkout[1]) and the raw
diff output (linkgit:git-diff[1]). Printing an
ellipsis in the cases mentioned is no longer considered
adequate and support for it is likely to be removed in the
foreseeable future (along with the variable).
Discussion[[Discussion]]
------------------------
@ -849,9 +791,6 @@ Report bugs to the Git mailing list <git@vger.kernel.org> where the
development and maintenance is primarily done. You do not have to be
subscribed to the list to send a message there.
Issues which are security relevant should be disclosed privately to
the Git Security mailing list <git-security@googlegroups.com>.
SEE ALSO
--------
linkgit:gittutorial[7], linkgit:gittutorial-2[7],

View File

@ -56,16 +56,9 @@ Unspecified::
When more than one pattern matches the path, a later line
overrides an earlier line. This overriding is done per
attribute.
The rules by which the pattern matches paths are the same as in
`.gitignore` files (see linkgit:gitignore[5]), with a few exceptions:
- negative patterns are forbidden
- patterns that match a directory do not recursively match paths
inside that directory (so using the trailing-slash `path/` syntax is
pointless in an attributes file; use `path/**` instead)
attribute. The rules how the pattern matches paths are the
same as in `.gitignore` files; see linkgit:gitignore[5].
Unlike `.gitignore`, negative patterns are forbidden.
When deciding what attributes are assigned to a path, Git
consults `$GIT_DIR/info/attributes` file (which has the highest
@ -239,7 +232,8 @@ From a clean working directory:
-------------------------------------------------
$ echo "* text=auto" >.gitattributes
$ git add --renormalize .
$ git read-tree --empty # Clean index, force re-scan of working directory
$ git add .
$ git status # Show files that will be normalized
$ git commit -m "Introduce end-of-line normalization"
-------------------------------------------------
@ -334,9 +328,6 @@ You can declare that a filter turns a content that by itself is unusable
into a usable content by setting the filter.<driver>.required configuration
variable to `true`.
Note: Whenever the clean filter is changed, the repo should be renormalized:
$ git add --renormalize .
For example, in .gitattributes, you would assign the `filter`
attribute for paths.
@ -399,14 +390,46 @@ Long Running Filter Process
If the filter command (a string value) is defined via
`filter.<driver>.process` then Git can process all blobs with a
single filter invocation for the entire life of a single Git
command. This is achieved by using the long-running process protocol
(described in technical/long-running-process-protocol.txt).
command. This is achieved by using a packet format (pkt-line,
see technical/protocol-common.txt) based protocol over standard
input and standard output as follows. All packets, except for the
"*CONTENT" packets and the "0000" flush packet, are considered
text and therefore are terminated by a LF.
When Git encounters the first file that needs to be cleaned or smudged,
it starts the filter and performs the handshake. In the handshake, the
welcome message sent by Git is "git-filter-client", only version 2 is
suppported, and the supported capabilities are "clean", "smudge", and
"delay".
Git starts the filter when it encounters the first file
that needs to be cleaned or smudged. After the filter started
Git sends a welcome message ("git-filter-client"), a list of supported
protocol version numbers, and a flush packet. Git expects to read a welcome
response message ("git-filter-server"), exactly one protocol version number
from the previously sent list, and a flush packet. All further
communication will be based on the selected version. The remaining
protocol description below documents "version=2". Please note that
"version=42" in the example below does not exist and is only there
to illustrate how the protocol would look like with more than one
version.
After the version negotiation Git sends a list of all capabilities that
it supports and a flush packet. Git expects to read a list of desired
capabilities, which must be a subset of the supported capabilities list,
and a flush packet as response:
------------------------
packet: git> git-filter-client
packet: git> version=2
packet: git> version=42
packet: git> 0000
packet: git< git-filter-server
packet: git< version=2
packet: git< 0000
packet: git> capability=clean
packet: git> capability=smudge
packet: git> capability=not-yet-invented
packet: git> 0000
packet: git< capability=clean
packet: git< capability=smudge
packet: git< 0000
------------------------
Supported filter capabilities in version 2 are "clean", "smudge",
and "delay".
Afterwards Git sends a list of "key=value" pairs terminated with
a flush packet. The list will contain at least the filter command
@ -492,6 +515,12 @@ the protocol then Git will stop the filter process and restart it
with the next file that needs to be processed. Depending on the
`filter.<driver>.required` flag Git will interpret that as error.
After the filter has processed a command it is expected to wait for
a "key=value" list containing the next command. Git will close
the command pipe on exit. The filter is expected to detect EOF
and exit gracefully on its own. Git will wait until the filter
process has stopped.
Delay
^^^^^
@ -721,8 +750,6 @@ patterns are available:
- `fountain` suitable for Fountain documents.
- `golang` suitable for source code in the Go language.
- `html` suitable for HTML/XHTML documents.
- `java` suitable for source code in the Java language.

View File

@ -631,7 +631,7 @@ So after you do a `cp -a` to create a new copy, you'll want to do
$ git update-index --refresh
----------------
+
in the new repository to make sure that the index file is up to date.
in the new repository to make sure that the index file is up-to-date.
Note that the second point is true even across machines. You can
duplicate a remote Git repository with *any* regular copy mechanism, be it
@ -701,7 +701,7 @@ $ git checkout-index -u -a
----------------
where the `-u` flag means that you want the checkout to keep the index
up to date (so that you don't have to refresh it afterward), and the
up-to-date (so that you don't have to refresh it afterward), and the
`-a` flag means "check out all files" (if you have a stale copy or an
older version of a checked out tree you may also need to add the `-f`
flag first, to tell 'git checkout-index' to *force* overwriting of any old
@ -1283,7 +1283,7 @@ run a single command, 'git-receive-pack'.
First, you need to create an empty repository on the remote
machine that will house your public repository. This empty
repository will be populated and be kept up to date by pushing
repository will be populated and be kept up-to-date by pushing
into it later. Obviously, this repository creation needs to be
done only once.
@ -1450,7 +1450,7 @@ transport protocols (HTTP), you need to keep this repository
would contain a call to 'git update-server-info'
but you need to manually enable the hook with
`mv post-update.sample post-update`. This makes sure
'git update-server-info' keeps the necessary files up to date.
'git update-server-info' keeps the necessary files up-to-date.
3. Push into the public repository from your primary
repository.

View File

@ -121,16 +121,17 @@ it is not suppressed by the `--no-verify` option. A non-zero exit
means a failure of the hook and aborts the commit. It should not
be used as replacement for pre-commit hook.
The sample `prepare-commit-msg` hook that comes with Git removes the
help message found in the commented portion of the commit template.
The sample `prepare-commit-msg` hook that comes with Git comments
out the `Conflicts:` part of a merge's commit message.
commit-msg
~~~~~~~~~~
This hook is invoked by 'git commit' and 'git merge', and can be
bypassed with the `--no-verify` option. It takes a single parameter,
the name of the file that holds the proposed commit log message.
Exiting with a non-zero status causes the command to abort.
This hook is invoked by 'git commit', and can be bypassed
with the `--no-verify` option. It takes a single parameter, the
name of the file that holds the proposed commit log message.
Exiting with a non-zero status causes the 'git commit' to
abort.
The hook is allowed to edit the message file in place, and can be used
to normalize the message into some project standard format. It
@ -170,8 +171,7 @@ This hook cannot affect the outcome of 'git checkout'.
It is also run after 'git clone', unless the --no-checkout (-n) option is
used. The first parameter given to the hook is the null-ref, the second the
ref of the new HEAD and the flag is always 1. Likewise for 'git worktree add'
unless --no-checkout is used.
ref of the new HEAD and the flag is always 1.
This hook can be used to perform repository validity checks, auto-display
differences from the previous HEAD if different, or set working dir metadata
@ -224,8 +224,8 @@ to the user by writing to standard error.
pre-receive
~~~~~~~~~~~
This hook is invoked by 'git-receive-pack' when it reacts to
'git push' and updates reference(s) in its repository.
This hook is invoked by 'git-receive-pack' on the remote repository,
which happens when a 'git push' is done on a local repository.
Just before starting to update refs on the remote repository, the
pre-receive hook is invoked. Its exit status determines the success
or failure of the update.
@ -265,8 +265,8 @@ linkgit:git-receive-pack[1] for some caveats.
update
~~~~~~
This hook is invoked by 'git-receive-pack' when it reacts to
'git push' and updates reference(s) in its repository.
This hook is invoked by 'git-receive-pack' on the remote repository,
which happens when a 'git push' is done on a local repository.
Just before updating the ref on the remote repository, the update hook
is invoked. Its exit status determines the success or failure of
the ref update.
@ -310,8 +310,8 @@ unannotated tags to be pushed.
post-receive
~~~~~~~~~~~~
This hook is invoked by 'git-receive-pack' when it reacts to
'git push' and updates reference(s) in its repository.
This hook is invoked by 'git-receive-pack' on the remote repository,
which happens when a 'git push' is done on a local repository.
It executes on the remote repository once after all the refs have
been updated.
@ -349,8 +349,8 @@ will be set to zero, `GIT_PUSH_OPTION_COUNT=0`.
post-update
~~~~~~~~~~~
This hook is invoked by 'git-receive-pack' when it reacts to
'git push' and updates reference(s) in its repository.
This hook is invoked by 'git-receive-pack' on the remote repository,
which happens when a 'git push' is done on a local repository.
It executes on the remote repository once after all the refs have
been updated.
@ -369,7 +369,7 @@ them.
When enabled, the default 'post-update' hook runs
'git update-server-info' to keep the information used by dumb
transports (e.g., HTTP) up to date. If you are publishing
transports (e.g., HTTP) up-to-date. If you are publishing
a Git repository that is accessible via HTTP, you should
probably enable this hook.
@ -380,8 +380,8 @@ for the user.
push-to-checkout
~~~~~~~~~~~~~~~~
This hook is invoked by 'git-receive-pack' when it reacts to
'git push' and updates reference(s) in its repository, and when
This hook is invoked by 'git-receive-pack' on the remote repository,
which happens when a 'git push' is done on a local repository, when
the push tries to update the branch that is currently checked out
and the `receive.denyCurrentBranch` configuration variable is set to
`updateInstead`. Such a push by default is refused if the working
@ -455,34 +455,6 @@ the name of the file that holds the e-mail to be sent. Exiting with a
non-zero status causes 'git send-email' to abort before sending any
e-mails.
fsmonitor-watchman
~~~~~~~~~~~~~~~~~~
This hook is invoked when the configuration option core.fsmonitor is
set to .git/hooks/fsmonitor-watchman. It takes two arguments, a version
(currently 1) and the time in elapsed nanoseconds since midnight,
January 1, 1970.
The hook should output to stdout the list of all files in the working
directory that may have changed since the requested time. The logic
should be inclusive so that it does not miss any potential changes.
The paths should be relative to the root of the working directory
and be separated by a single NUL.
It is OK to include files which have not actually changed. All changes
including newly-created and deleted files should be included. When
files are renamed, both the old and the new name should be included.
Git will limit what files it checks for changes as well as which
directories are checked for untracked files based on the path names
given.
An optimized way to tell git "all files have changed" is to return
the filename '/'.
The exit status determines whether git will use the data from the
hook to limit its search. On error, it will fall back to verifying
all files and folders.
GIT
---

View File

@ -102,11 +102,12 @@ PATTERN FORMAT
(relative to the toplevel of the work tree if not from a
`.gitignore` file).
- Otherwise, Git treats the pattern as a shell glob: "`*`" matches
anything except "`/`", "`?`" matches any one character except "`/`"
and "`[]`" matches one character in a selected range. See
fnmatch(3) and the FNM_PATHNAME flag for a more detailed
description.
- Otherwise, Git treats the pattern as a shell glob suitable
for consumption by fnmatch(3) with the FNM_PATHNAME flag:
wildcards in the pattern will not match a / in the pathname.
For example, "Documentation/{asterisk}.html" matches
"Documentation/git.html" but not "Documentation/ppc/ppc.html"
or "tools/perf/Documentation/perf.html".
- A leading slash matches the beginning of the pathname.
For example, "/{asterisk}.c" matches "cat-file.c" but not

View File

@ -466,13 +466,6 @@ set by Git if the remote helper has the 'option' capability.
Transmit <string> as a push option. As the push option
must not contain LF or NUL characters, the string is not encoded.
'option from-promisor' {'true'|'false'}::
Indicate that these objects are being fetched from a promisor.
'option no-dependents' {'true'|'false'}::
Indicate that only the objects wanted need to be fetched, not
their dependents.
SEE ALSO
--------
linkgit:git-remote[1]

View File

@ -71,7 +71,7 @@ objects/info/packs::
This file is to help dumb transports discover what packs
are available in this object store. Whenever a pack is
added or removed, `git update-server-info` should be run
to keep this file up to date if the repository is
to keep this file up-to-date if the repository is
published for dumb transports. 'git repack' does this
by default.
@ -208,10 +208,6 @@ info/exclude::
'git clean' look at it but the core Git commands do not look
at it. See also: linkgit:gitignore[5].
info/attributes::
Defines which attributes to assign to a path, similar to per-directory
`.gitattributes` files. See also: linkgit:gitattributes[5].
info/sparse-checkout::
This file stores sparse checkout patterns.
See also: linkgit:git-read-tree[1].

View File

@ -24,7 +24,7 @@ On the filesystem, a submodule usually (but not always - see FORMS below)
consists of (i) a Git directory located under the `$GIT_DIR/modules/`
directory of its superproject, (ii) a working directory inside the
superproject's working directory, and a `.git` file at the root of
the submodule's working directory pointing to (i).
the submodules working directory pointing to (i).
Assuming the submodule has a Git directory at `$GIT_DIR/modules/foo/`
and a working directory at `path/to/bar/`, the superproject tracks the
@ -33,11 +33,11 @@ in its `.gitmodules` file (see linkgit:gitmodules[5]) of the form
`submodule.foo.path = path/to/bar`.
The `gitlink` entry contains the object name of the commit that the
superproject expects the submodule's working directory to be at.
superproject expects the submodules working directory to be at.
The section `submodule.foo.*` in the `.gitmodules` file gives additional
hints to Git's porcelain layer. For example, the `submodule.foo.url`
setting specifies where to obtain the submodule.
hints to Gits porcelain layer such as where to obtain the submodule via
the `submodule.foo.url` setting.
Submodules can be used for at least two different use cases:
@ -51,21 +51,18 @@ Submodules can be used for at least two different use cases:
2. Splitting a (logically single) project into multiple
repositories and tying them back together. This can be used to
overcome current limitations of Git's implementation to have
overcome current limitations of Gits implementation to have
finer grained access:
* Size of the Git repository:
* Size of the git repository:
In its current form Git scales up poorly for large repositories containing
content that is not compressed by delta computation between trees.
For example, you can use submodules to hold large binary assets
and these repositories can be shallowly cloned such that you do not
However you can also use submodules to e.g. hold large binary assets
and these repositories are then shallowly cloned such that you do not
have a large history locally.
* Transfer size:
In its current form Git requires the whole working tree present. It
does not allow partial trees to be transferred in fetch or clone.
If the project you work on consists of multiple repositories tied
together as submodules in a superproject, you can avoid fetching the
working trees of the repositories you are not interested in.
* Access control:
By restricting user access to submodules, this can be used to implement
read/write policies for different users.
@ -76,10 +73,9 @@ The configuration of submodules
Submodule operations can be configured using the following mechanisms
(from highest to lowest precedence):
* The command line for those commands that support taking submodules
as part of their pathspecs. Most commands have a boolean flag
`--recurse-submodules` which specify whether to recurse into submodules.
Examples are `grep` and `checkout`.
* The command line for those commands that support taking submodule specs.
Most commands have a boolean flag '--recurse-submodules' whether to
recurse into submodules. Examples are `ls-files` or `checkout`.
Some commands take enums, such as `fetch` and `push`, where you can
specify how submodules are affected.
@ -91,8 +87,8 @@ Submodule operations can be configured using the following mechanisms
For example an effect from the submodule's `.gitignore` file
would be observed when you run `git status --ignore-submodules=none` in
the superproject. This collects information from the submodule's working
directory by running `status` in the submodule while paying attention
to the `.gitignore` file of the submodule.
directory by running `status` in the submodule, which does pay attention
to its `.gitignore` file.
+
The submodule's `$GIT_DIR/config` file would come into play when running
`git push --recurse-submodules=check` in the superproject, as this would
@ -101,20 +97,20 @@ remotes are configured in the submodule as usual in the `$GIT_DIR/config`
file.
* The configuration file `$GIT_DIR/config` in the superproject.
Git only recurses into active submodules (see "ACTIVE SUBMODULES"
section below).
Typical configuration at this place is controlling if a submodule
is recursed into at all via the `active` flag for example.
+
If the submodule is not yet initialized, then the configuration
inside the submodule does not exist yet, so where to
inside the submodule does not exist yet, so configuration where to
obtain the submodule from is configured here for example.
* The `.gitmodules` file inside the superproject. A project usually
* the `.gitmodules` file inside the superproject. Additionally to the
required mapping between submodule's name and path, a project usually
uses this file to suggest defaults for the upstream collection
of repositories for the mapping that is required between a
submodule's name and its path.
of repositories.
+
This file mainly serves as the mapping between the name and path of submodules
in the superproject, such that the submodule's Git directory can be
This file mainly serves as the mapping between name and path in
the superproject, such that the submodule's git directory can be
located.
+
If the submodule has never been initialized, this is the only place
@ -136,27 +132,27 @@ using older versions of Git.
+
It is possible to construct these old form repositories manually.
+
When deinitialized or deleted (see below), the submodule's Git
When deinitialized or deleted (see below), the submodules Git
directory is automatically moved to `$GIT_DIR/modules/<name>/`
of the superproject.
* Deinitialized submodule: A `gitlink`, and a `.gitmodules` entry,
but no submodule working directory. The submodule's Git directory
may be there as after deinitializing the Git directory is kept around.
but no submodule working directory. The submodules git directory
may be there as after deinitializing the git directory is kept around.
The directory which is supposed to be the working directory is empty instead.
+
A submodule can be deinitialized by running `git submodule deinit`.
Besides emptying the working directory, this command only modifies
the superproject's `$GIT_DIR/config` file, so the superproject's history
the superprojects `$GIT_DIR/config` file, so the superprojects history
is not affected. This can be undone using `git submodule init`.
* Deleted submodule: A submodule can be deleted by running
`git rm <submodule path> && git commit`. This can be undone
using `git revert`.
+
The deletion removes the superproject's tracking data, which are
The deletion removes the superprojects tracking data, which are
both the `gitlink` entry and the section in the `.gitmodules` file.
The submodule's working directory is removed from the file
The submodules working directory is removed from the file
system, but the Git directory is kept around as it to make it
possible to checkout past commits without requiring fetching
from another repository.
@ -164,60 +160,6 @@ from another repository.
To completely remove a submodule, manually delete
`$GIT_DIR/modules/<name>/`.
ACTIVE SUBMODULES
-----------------
A submodule is considered active,
(a) if `submodule.<name>.active` is set to `true`
or
(b) if the submodule's path matches the pathspec in `submodule.active`
or
(c) if `submodule.<name>.url` is set.
and these are evaluated in this order.
For example:
[submodule "foo"]
active = false
url = https://example.org/foo
[submodule "bar"]
active = true
url = https://example.org/bar
[submodule "baz"]
url = https://example.org/baz
In the above config only the submodule 'bar' and 'baz' are active,
'bar' due to (a) and 'baz' due to (c). 'foo' is inactive because
(a) takes precedence over (c)
Note that (c) is a historical artefact and will be ignored if the
(a) and (b) specify that the submodule is not active. In other words,
if we have an `submodule.<name>.active` set to `false` or if the
submodule's path is excluded in the pathspec in `submodule.active`, the
url doesn't matter whether it is present or not. This is illustrated in
the example that follows.
[submodule "foo"]
active = true
url = https://example.org/foo
[submodule "bar"]
url = https://example.org/bar
[submodule "baz"]
url = https://example.org/baz
[submodule "bob"]
ignore = true
[submodule]
active = b*
active = :(exclude) baz
In here all submodules except 'baz' (foo, bar, bob) are active.
'foo' due to its own active flag and all the others due to the
submodule active pathspec, which specifies that any submodule
starting with 'b' except 'baz' are also active, regardless of the
presence of the .url field.
Workflow for a third party library
----------------------------------

View File

@ -109,7 +109,7 @@ summary of the situation with 'git status':
$ git status
On branch master
Changes to be committed:
Your branch is up to date with 'origin/master'.
Your branch is up-to-date with 'origin/master'.
(use "git reset HEAD <file>..." to unstage)
modified: file1

View File

@ -40,7 +40,7 @@ beginning. It is always easier to squash a few commits together than
to split one big commit into several. Don't be afraid of making too
small or imperfect steps along the way. You can always go back later
and edit the commits with `git rebase --interactive` before you
publish them. You can use `git stash push --keep-index` to run the
publish them. You can use `git stash save --keep-index` to run the
test suite independent of other uncommitted changes; see the EXAMPLES
section of linkgit:git-stash[1].
@ -407,8 +407,8 @@ follows.
`git pull <url> <branch>`
=====================================
Occasionally, the maintainer may get merge conflicts when they try to
pull changes from downstream. In this case, they can ask downstream to
Occasionally, the maintainer may get merge conflicts when he tries to
pull changes from downstream. In this case, he can ask downstream to
do the merge and resolve the conflicts themselves (perhaps they will
know better how to resolve them). It is one of the rare cases where
downstream 'should' merge from upstream.

View File

@ -3,12 +3,11 @@
repository=${1?repository}
destdir=${2?destination}
GIT_MAN_REF=${3?master}
GIT_DIR=
head=master GIT_DIR=
for d in "$repository/.git" "$repository"
do
if GIT_DIR="$d" git rev-parse "$GIT_MAN_REF" >/dev/null 2>&1
if GIT_DIR="$d" git rev-parse refs/heads/master >/dev/null 2>&1
then
GIT_DIR="$d"
export GIT_DIR
@ -28,12 +27,12 @@ export GIT_INDEX_FILE GIT_WORK_TREE
rm -f "$GIT_INDEX_FILE"
trap 'rm -f "$GIT_INDEX_FILE"' 0
git read-tree "$GIT_MAN_REF"
git read-tree $head
git checkout-index -a -f --prefix="$destdir"/
if test -n "$GZ"
then
git ls-tree -r --name-only "$GIT_MAN_REF" |
git ls-tree -r --name-only $head |
xargs printf "$destdir/%s\n" |
xargs gzip -f
fi

View File

@ -26,10 +26,6 @@ merge.ff::
allowed (equivalent to giving the `--ff-only` option from the
command line).
merge.verifySignatures::
If true, this is equivalent to the --verify-signatures command
line option. See linkgit:git-merge[1] for details.
include::fmt-merge-msg-config.txt[]
merge.renameLimit::

View File

@ -35,20 +35,13 @@ set to `no` at the beginning of them.
--no-ff::
Create a merge commit even when the merge resolves as a
fast-forward. This is the default behaviour when merging an
annotated (and possibly signed) tag that is not stored in
its natural place in 'refs/tags/' hierarchy.
annotated (and possibly signed) tag.
--ff-only::
Refuse to merge and exit with a non-zero status unless the
current `HEAD` is already up to date or the merge can be
current `HEAD` is already up-to-date or the merge can be
resolved as a fast-forward.
-S[<keyid>]::
--gpg-sign[=<keyid>]::
GPG-sign the resulting merge commit. The `keyid` argument is
optional and defaults to the committer identity; if specified,
it must be stuck to the option without a space.
--log[=<n>]::
--no-log::
In addition to branch names, populate the log message with
@ -58,16 +51,6 @@ set to `no` at the beginning of them.
With --no-log do not list one-line descriptions from the
actual commits being merged.
--signoff::
--no-signoff::
Add Signed-off-by line by the committer at the end of the commit
log message. The meaning of a signoff depends on the project,
but it typically certifies that committer has
the rights to submit this work under the same license and
agrees to a Developer Certificate of Origin
(see http://developercertificate.org/ for more information).
+
With --no-signoff do not add a Signed-off-by line.
--stat::
-n::

View File

@ -40,7 +40,7 @@ the other tree did, declaring 'our' history contains all that happened in it.
theirs;;
This is the opposite of 'ours'; note that, unlike 'ours', there is
no 'theirs' merge strategy to confuse this merge option with.
no 'theirs' merge stragegy to confuse this merge option with.
patience;;
With this option, 'merge-recursive' spends a little extra time
@ -58,12 +58,11 @@ diff-algorithm=[patience|minimal|histogram|myers];;
ignore-space-change;;
ignore-all-space;;
ignore-space-at-eol;;
ignore-cr-at-eol;;
Treats lines with the indicated type of whitespace change as
unchanged for the sake of a three-way merge. Whitespace
changes mixed with other changes to a line are not ignored.
See also linkgit:git-diff[1] `-b`, `-w`,
`--ignore-space-at-eol`, and `--ignore-cr-at-eol`.
See also linkgit:git-diff[1] `-b`, `-w`, and
`--ignore-space-at-eol`.
+
* If 'their' version only introduces whitespace changes to a line,
'our' version is used;

View File

@ -202,15 +202,10 @@ endif::git-rev-list[]
- '%>>(<N>)', '%>>|(<N>)': similar to '%>(<N>)', '%>|(<N>)'
respectively, except that if the next placeholder takes more spaces
than given and there are spaces on its left, use those spaces
- '%><(<N>)', '%><|(<N>)': similar to '%<(<N>)', '%<|(<N>)'
- '%><(<N>)', '%><|(<N>)': similar to '% <(<N>)', '%<|(<N>)'
respectively, but padding both sides (i.e. the text is centered)
- %(trailers[:options]): display the trailers of the body as interpreted
by linkgit:git-interpret-trailers[1]. The `trailers` string may be
followed by a colon and zero or more comma-separated options. If the
`only` option is given, omit non-trailer lines from the trailer block.
If the `unfold` option is given, behave as if interpret-trailer's
`--unfold` option was given. E.g., `%(trailers:only,unfold)` to do
both.
- %(trailers): display the trailers of the body as interpreted by
linkgit:git-interpret-trailers[1]
NOTE: Some placeholders may depend on other options given to the
revision traversal engine. For example, the `%g*` reflog options will

View File

@ -1,52 +0,0 @@
rebase.stat::
Whether to show a diffstat of what changed upstream since the last
rebase. False by default.
rebase.autoSquash::
If set to true enable `--autosquash` option by default.
rebase.autoStash::
When set to true, automatically create a temporary stash entry
before the operation begins, and apply it after the operation
ends. This means that you can run rebase on a dirty worktree.
However, use with care: the final stash application after a
successful rebase might result in non-trivial conflicts.
This option can be overridden by the `--no-autostash` and
`--autostash` options of linkgit:git-rebase[1].
Defaults to false.
rebase.missingCommitsCheck::
If set to "warn", git rebase -i will print a warning if some
commits are removed (e.g. a line was deleted), however the
rebase will still proceed. If set to "error", it will print
the previous warning and stop the rebase, 'git rebase
--edit-todo' can then be used to correct the error. If set to
"ignore", no checking is done.
To drop a commit without warning or error, use the `drop`
command in the todo list.
Defaults to "ignore".
rebase.instructionFormat::
A format string, as specified in linkgit:git-log[1], to be used for the
todo list during an interactive rebase. The format will
automatically have the long commit hash prepended to the format.
rebase.abbreviateCommands::
If set to true, `git rebase` will use abbreviated command names in the
todo list resulting in something like this:
+
-------------------------------------------
p deadbee The oneline of the commit
p fa1afe1 The oneline of the next commit
...
-------------------------------------------
+
instead of:
+
-------------------------------------------
pick deadbee The oneline of the commit
pick fa1afe1 The oneline of the next commit
...
-------------------------------------------
+
Defaults to false.

View File

@ -184,14 +184,6 @@ explicitly.
Pretend as if all objects mentioned by reflogs are listed on the
command line as `<commit>`.
--single-worktree::
By default, all working trees will be examined by the
following options when there are more than one (see
linkgit:git-worktree[1]): `--all`, `--reflog` and
`--indexed-objects`.
This option forces them to examine the current working tree
only.
--ignore-missing::
Upon seeing an invalid object name in the input, pretend as if
the bad input was not given.
@ -686,11 +678,6 @@ ifdef::git-rev-list[]
all object IDs which I need to download if I have the commit
object _bar_ but not _foo_''.
--in-commit-order::
Print tree and blob ids in order of the commits. The tree
and blob ids are printed after they are first referenced
by a commit.
--objects-edge::
Similar to `--objects`, but also print the IDs of excluded
commits prefixed with a ``-'' character. This is used by
@ -711,60 +698,8 @@ ifdef::git-rev-list[]
--unpacked::
Only useful with `--objects`; print the object IDs that are not
in packs.
--filter=<filter-spec>::
Only useful with one of the `--objects*`; omits objects (usually
blobs) from the list of printed objects. The '<filter-spec>'
may be one of the following:
+
The form '--filter=blob:none' omits all blobs.
+
The form '--filter=blob:limit=<n>[kmg]' omits blobs larger than n bytes
or units. n may be zero. The suffixes k, m, and g can be used to name
units in KiB, MiB, or GiB. For example, 'blob:limit=1k' is the same
as 'blob:limit=1024'.
+
The form '--filter=sparse:oid=<blob-ish>' uses a sparse-checkout
specification contained in the blob (or blob-expression) '<blob-ish>'
to omit blobs that would not be not required for a sparse checkout on
the requested refs.
+
The form '--filter=sparse:path=<path>' similarly uses a sparse-checkout
specification contained in <path>.
--no-filter::
Turn off any previous `--filter=` argument.
--filter-print-omitted::
Only useful with `--filter=`; prints a list of the objects omitted
by the filter. Object IDs are prefixed with a ``~'' character.
--missing=<missing-action>::
A debug option to help with future "partial clone" development.
This option specifies how missing objects are handled.
+
The form '--missing=error' requests that rev-list stop with an error if
a missing object is encountered. This is the default action.
+
The form '--missing=allow-any' will allow object traversal to continue
if a missing object is encountered. Missing objects will silently be
omitted from the results.
+
The form '--missing=allow-promisor' is like 'allow-any', but will only
allow object traversal to continue for EXPECTED promisor missing objects.
Unexpected missing objects will raise an error.
+
The form '--missing=print' is like 'allow-any', but will also print a
list of the missing objects. Object IDs are prefixed with a ``?'' character.
endif::git-rev-list[]
--exclude-promisor-objects::
(For internal use only.) Prefilter object traversal at
promisor boundary. This is used with partial clone. This is
stronger than `--missing=allow-promisor` because it limits the
traversal, rather than just silencing errors about missing
objects.
--no-walk[=(sorted|unsorted)]::
Only show the given commits, but do not traverse their ancestors.
This has no effect if a range is specified. If the argument
@ -856,11 +791,11 @@ endif::git-rev-list[]
--parents::
Print also the parents of the commit (in the form "commit parent...").
Also enables parent rewriting, see 'History Simplification' above.
Also enables parent rewriting, see 'History Simplification' below.
--children::
Print also the children of the commit (in the form "commit child...").
Also enables parent rewriting, see 'History Simplification' above.
Also enables parent rewriting, see 'History Simplification' below.
ifdef::git-rev-list[]
--timestamp::
@ -903,7 +838,7 @@ you would get an output like this:
to be drawn properly.
Cannot be combined with `--no-walk`.
+
This enables parent rewriting, see 'History Simplification' above.
This enables parent rewriting, see 'History Simplification' below.
+
This implies the `--topo-order` option by default, but the
`--date-order` option may also be specified.

View File

@ -271,7 +271,7 @@ The '..' (two-dot) Range Notation::
for commits that are reachable from r2 excluding those that are reachable
from r1 by '{caret}r1 r2' and it can be written as 'r1..r2'.
The '...' (three-dot) Symmetric Difference Notation::
The '...' (three dot) Symmetric Difference Notation::
A similar notation 'r1\...r2' is called symmetric difference
of 'r1' and 'r2' and is defined as
'r1 r2 --not $(git merge-base --all r1 r2)'.

View File

@ -8,7 +8,7 @@ always NULL-terminated at the element pointed to by `argv[argc]`. This
makes the result suitable for passing to functions expecting to receive
argv from main(), or the link:api-run-command.html[run-command API].
The string-list API (documented in string-list.h) is similar, but cannot be
The link:api-string-list.html[string-list API] is similar, but cannot be
used for these purposes; instead of storing a straight string pointer,
it contains an item structure with a `util` field that is not compatible
with the traditional argv interface.

View File

@ -186,7 +186,7 @@ parsing is successful, the return value is the result.
Same as `git_config_bool`, except that integers are returned as-is, and
an `is_bool` flag is unset.
`git_parse_maybe_bool`::
`git_config_maybe_bool`::
Same as `git_config_bool`, except that it returns -1 on error rather
than dying.

View File

@ -0,0 +1,6 @@
decorate API
============
Talk about <decorate.h>
(Linus)

View File

@ -22,20 +22,16 @@ The notable options are:
`flags`::
A bit-field of options:
A bit-field of options (the `*IGNORED*` flags are mutually exclusive):
`DIR_SHOW_IGNORED`:::
Return just ignored files in `entries[]`, not untracked
files. This flag is mutually exclusive with
`DIR_SHOW_IGNORED_TOO`.
Return just ignored files in `entries[]`, not untracked files.
`DIR_SHOW_IGNORED_TOO`:::
Similar to `DIR_SHOW_IGNORED`, but return ignored files in
`ignored[]` in addition to untracked files in
`entries[]`. This flag is mutually exclusive with
`DIR_SHOW_IGNORED`.
Similar to `DIR_SHOW_IGNORED`, but return ignored files in `ignored[]`
in addition to untracked files in `entries[]`.
`DIR_KEEP_UNTRACKED_CONTENTS`:::
@ -43,21 +39,6 @@ The notable options are:
untracked contents of untracked directories are also returned in
`entries[]`.
`DIR_SHOW_IGNORED_TOO_MODE_MATCHING`:::
Only has meaning if `DIR_SHOW_IGNORED_TOO` is also set; if
this is set, returns ignored files and directories that match
an exclude pattern. If a directory matches an exclude pattern,
then the directory is returned and the contained paths are
not. A directory that does not match an exclude pattern will
not be returned even if all of its contents are ignored. In
this case, the contents are returned as individual entries.
+
If this is set, files and directories that explicity match an ignore
pattern are reported. Implicity ignored directories (directories that
do not match an ignore pattern, but whose contents are all ignored)
are not reported, instead all of the contents are reported.
`DIR_COLLECT_IGNORED`:::
Special mode for git-add. Return ignored files in `ignored[]` and

View File

@ -7,7 +7,7 @@ Talk about <sha1_file.c> and <object.h> family, things like
* read_object_with_reference()
* has_sha1_file()
* write_sha1_file()
* pretend_object_file()
* pretend_sha1_file()
* lookup_{object,commit,tag,blob,tree}
* parse_{object,commit,tag,blob,tree}
* Use of object flags

View File

@ -32,8 +32,11 @@ Iteration functions
* `for_each_glob_ref_in()` the previous and `for_each_ref_in()` combined.
* Use `refs_` API for accessing submodules. The submodule ref store could
be obtained with `get_submodule_ref_store()`.
* `head_ref_submodule()`, `for_each_ref_submodule()`,
`for_each_ref_in_submodule()`, `for_each_tag_ref_submodule()`,
`for_each_branch_ref_submodule()`, `for_each_remote_ref_submodule()`
do the same as the functions described above but for a specified
submodule.
* `for_each_rawref()` can be used to learn about broken ref and symref.

View File

@ -0,0 +1,209 @@
string-list API
===============
The string_list API offers a data structure and functions to handle
sorted and unsorted string lists. A "sorted" list is one whose
entries are sorted by string value in `strcmp()` order.
The 'string_list' struct used to be called 'path_list', but was renamed
because it is not specific to paths.
The caller:
. Allocates and clears a `struct string_list` variable.
. Initializes the members. You might want to set the flag `strdup_strings`
if the strings should be strdup()ed. For example, this is necessary
when you add something like git_path("..."), since that function returns
a static buffer that will change with the next call to git_path().
+
If you need something advanced, you can manually malloc() the `items`
member (you need this if you add things later) and you should set the
`nr` and `alloc` members in that case, too.
. Adds new items to the list, using `string_list_append`,
`string_list_append_nodup`, `string_list_insert`,
`string_list_split`, and/or `string_list_split_in_place`.
. Can check if a string is in the list using `string_list_has_string` or
`unsorted_string_list_has_string` and get it from the list using
`string_list_lookup` for sorted lists.
. Can sort an unsorted list using `string_list_sort`.
. Can remove duplicate items from a sorted list using
`string_list_remove_duplicates`.
. Can remove individual items of an unsorted list using
`unsorted_string_list_delete_item`.
. Can remove items not matching a criterion from a sorted or unsorted
list using `filter_string_list`, or remove empty strings using
`string_list_remove_empty_items`.
. Finally it should free the list using `string_list_clear`.
Example:
----
struct string_list list = STRING_LIST_INIT_NODUP;
int i;
string_list_append(&list, "foo");
string_list_append(&list, "bar");
for (i = 0; i < list.nr; i++)
printf("%s\n", list.items[i].string)
----
NOTE: It is more efficient to build an unsorted list and sort it
afterwards, instead of building a sorted list (`O(n log n)` instead of
`O(n^2)`).
+
However, if you use the list to check if a certain string was added
already, you should not do that (using unsorted_string_list_has_string()),
because the complexity would be quadratic again (but with a worse factor).
Functions
---------
* General ones (works with sorted and unsorted lists as well)
`string_list_init`::
Initialize the members of the string_list, set `strdup_strings`
member according to the value of the second parameter.
`filter_string_list`::
Apply a function to each item in a list, retaining only the
items for which the function returns true. If free_util is
true, call free() on the util members of any items that have
to be deleted. Preserve the order of the items that are
retained.
`string_list_remove_empty_items`::
Remove any empty strings from the list. If free_util is true,
call free() on the util members of any items that have to be
deleted. Preserve the order of the items that are retained.
`print_string_list`::
Dump a string_list to stdout, useful mainly for debugging purposes. It
can take an optional header argument and it writes out the
string-pointer pairs of the string_list, each one in its own line.
`string_list_clear`::
Free a string_list. The `string` pointer of the items will be freed in
case the `strdup_strings` member of the string_list is set. The second
parameter controls if the `util` pointer of the items should be freed
or not.
* Functions for sorted lists only
`string_list_has_string`::
Determine if the string_list has a given string or not.
`string_list_insert`::
Insert a new element to the string_list. The returned pointer can be
handy if you want to write something to the `util` pointer of the
string_list_item containing the just added string. If the given
string already exists the insertion will be skipped and the
pointer to the existing item returned.
+
Since this function uses xrealloc() (which die()s if it fails) if the
list needs to grow, it is safe not to check the pointer. I.e. you may
write `string_list_insert(...)->util = ...;`.
`string_list_lookup`::
Look up a given string in the string_list, returning the containing
string_list_item. If the string is not found, NULL is returned.
`string_list_remove_duplicates`::
Remove all but the first of consecutive entries that have the
same string value. If free_util is true, call free() on the
util members of any items that have to be deleted.
* Functions for unsorted lists only
`string_list_append`::
Append a new string to the end of the string_list. If
`strdup_string` is set, then the string argument is copied;
otherwise the new `string_list_entry` refers to the input
string.
`string_list_append_nodup`::
Append a new string to the end of the string_list. The new
`string_list_entry` always refers to the input string, even if
`strdup_string` is set. This function can be used to hand
ownership of a malloc()ed string to a `string_list` that has
`strdup_string` set.
`string_list_sort`::
Sort the list's entries by string value in `strcmp()` order.
`unsorted_string_list_has_string`::
It's like `string_list_has_string()` but for unsorted lists.
`unsorted_string_list_lookup`::
It's like `string_list_lookup()` but for unsorted lists.
+
The above two functions need to look through all items, as opposed to their
counterpart for sorted lists, which performs a binary search.
`unsorted_string_list_delete_item`::
Remove an item from a string_list. The `string` pointer of the items
will be freed in case the `strdup_strings` member of the string_list
is set. The third parameter controls if the `util` pointer of the
items should be freed or not.
`string_list_split`::
`string_list_split_in_place`::
Split a string into substrings on a delimiter character and
append the substrings to a `string_list`. If `maxsplit` is
non-negative, then split at most `maxsplit` times. Return the
number of substrings appended to the list.
+
`string_list_split` requires a `string_list` that has `strdup_strings`
set to true; it leaves the input string untouched and makes copies of
the substrings in newly-allocated memory.
`string_list_split_in_place` requires a `string_list` that has
`strdup_strings` set to false; it splits the input string in place,
overwriting the delimiter characters with NULs and creating new
string_list_items that point into the original string (the original
string must therefore not be modified or freed while the `string_list`
is in use).
Data structures
---------------
* `struct string_list_item`
Represents an item of the list. The `string` member is a pointer to the
string, and you may use the `util` member for any purpose, if you want.
* `struct string_list`
Represents the list itself.
. The array of items are available via the `items` member.
. The `nr` member contains the number of items stored in the list.
. The `alloc` member is used to avoid reallocating at every insertion.
You should not tamper with it.
. Setting the `strdup_strings` member to 1 will strdup() the strings
before adding them, see above.
. The `compare_strings_fn` member is used to specify a custom compare
function, otherwise `strcmp()` is used as the default function.

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