Merge branch 'ab/tech-docs-to-help'
Expose a lot of "tech docs" via "git help" interface. * ab/tech-docs-to-help: docs: move http-protocol docs to man section 5 docs: move cruft pack docs to gitformat-pack docs: move pack format docs to man section 5 docs: move signature docs to man section 5 docs: move index format docs to man section 5 docs: move protocol-related docs to man section 5 docs: move commit-graph format docs to man section 5 git docs: add a category for file formats, protocols and interfaces git docs: add a category for user-facing file, repo and command UX git help doc: use "<doc>" instead of "<guide>" help.c: remove common category behavior from drop_prefix() behavior help.c: refactor drop_prefix() to use a "switch" statement"
This commit is contained in:
commit
c0f6dd49f1
@ -24,10 +24,21 @@ MAN1_TXT += gitweb.txt
|
|||||||
|
|
||||||
# man5 / man7 guides (note: new guides should also be added to command-list.txt)
|
# man5 / man7 guides (note: new guides should also be added to command-list.txt)
|
||||||
MAN5_TXT += gitattributes.txt
|
MAN5_TXT += gitattributes.txt
|
||||||
|
MAN5_TXT += gitformat-bundle.txt
|
||||||
|
MAN5_TXT += gitformat-chunk.txt
|
||||||
|
MAN5_TXT += gitformat-commit-graph.txt
|
||||||
|
MAN5_TXT += gitformat-index.txt
|
||||||
|
MAN5_TXT += gitformat-pack.txt
|
||||||
|
MAN5_TXT += gitformat-signature.txt
|
||||||
MAN5_TXT += githooks.txt
|
MAN5_TXT += githooks.txt
|
||||||
MAN5_TXT += gitignore.txt
|
MAN5_TXT += gitignore.txt
|
||||||
MAN5_TXT += gitmailmap.txt
|
MAN5_TXT += gitmailmap.txt
|
||||||
MAN5_TXT += gitmodules.txt
|
MAN5_TXT += gitmodules.txt
|
||||||
|
MAN5_TXT += gitprotocol-capabilities.txt
|
||||||
|
MAN5_TXT += gitprotocol-common.txt
|
||||||
|
MAN5_TXT += gitprotocol-http.txt
|
||||||
|
MAN5_TXT += gitprotocol-pack.txt
|
||||||
|
MAN5_TXT += gitprotocol-v2.txt
|
||||||
MAN5_TXT += gitrepository-layout.txt
|
MAN5_TXT += gitrepository-layout.txt
|
||||||
MAN5_TXT += gitweb.conf.txt
|
MAN5_TXT += gitweb.conf.txt
|
||||||
|
|
||||||
@ -95,26 +106,16 @@ TECH_DOCS += MyFirstObjectWalk
|
|||||||
TECH_DOCS += SubmittingPatches
|
TECH_DOCS += SubmittingPatches
|
||||||
TECH_DOCS += ToolsForGit
|
TECH_DOCS += ToolsForGit
|
||||||
TECH_DOCS += technical/bitmap-format
|
TECH_DOCS += technical/bitmap-format
|
||||||
TECH_DOCS += technical/bundle-format
|
|
||||||
TECH_DOCS += technical/cruft-packs
|
|
||||||
TECH_DOCS += technical/hash-function-transition
|
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/long-running-process-protocol
|
||||||
TECH_DOCS += technical/multi-pack-index
|
TECH_DOCS += technical/multi-pack-index
|
||||||
TECH_DOCS += technical/pack-format
|
|
||||||
TECH_DOCS += technical/pack-heuristics
|
TECH_DOCS += technical/pack-heuristics
|
||||||
TECH_DOCS += technical/pack-protocol
|
|
||||||
TECH_DOCS += technical/parallel-checkout
|
TECH_DOCS += technical/parallel-checkout
|
||||||
TECH_DOCS += technical/partial-clone
|
TECH_DOCS += technical/partial-clone
|
||||||
TECH_DOCS += technical/protocol-capabilities
|
|
||||||
TECH_DOCS += technical/protocol-common
|
|
||||||
TECH_DOCS += technical/protocol-v2
|
|
||||||
TECH_DOCS += technical/racy-git
|
TECH_DOCS += technical/racy-git
|
||||||
TECH_DOCS += technical/reftable
|
TECH_DOCS += technical/reftable
|
||||||
TECH_DOCS += technical/send-pack-pipeline
|
TECH_DOCS += technical/send-pack-pipeline
|
||||||
TECH_DOCS += technical/shallow
|
TECH_DOCS += technical/shallow
|
||||||
TECH_DOCS += technical/signature-format
|
|
||||||
TECH_DOCS += technical/trivial-merge
|
TECH_DOCS += technical/trivial-merge
|
||||||
SP_ARTICLES += $(TECH_DOCS)
|
SP_ARTICLES += $(TECH_DOCS)
|
||||||
SP_ARTICLES += technical/api-index
|
SP_ARTICLES += technical/api-index
|
||||||
@ -290,6 +291,8 @@ cmds_txt = cmds-ancillaryinterrogators.txt \
|
|||||||
cmds-synchingrepositories.txt \
|
cmds-synchingrepositories.txt \
|
||||||
cmds-synchelpers.txt \
|
cmds-synchelpers.txt \
|
||||||
cmds-guide.txt \
|
cmds-guide.txt \
|
||||||
|
cmds-developerinterfaces.txt \
|
||||||
|
cmds-userinterfaces.txt \
|
||||||
cmds-purehelpers.txt \
|
cmds-purehelpers.txt \
|
||||||
cmds-foreignscminterface.txt
|
cmds-foreignscminterface.txt
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
lsrefs.unborn::
|
lsrefs.unborn::
|
||||||
May be "advertise" (the default), "allow", or "ignore". If "advertise",
|
May be "advertise" (the default), "allow", or "ignore". If "advertise",
|
||||||
the server will respond to the client sending "unborn" (as described in
|
the server will respond to the client sending "unborn" (as described in
|
||||||
protocol-v2.txt) and will advertise support for this feature during the
|
linkgit:gitprotocol-v2[5]) and will advertise support for this feature during the
|
||||||
protocol v2 capability advertisement. "allow" is the same as
|
protocol v2 capability advertisement. "allow" is the same as
|
||||||
"advertise" except that the server will not advertise support for this
|
"advertise" except that the server will not advertise support for this
|
||||||
feature; this is useful for load-balanced servers that cannot be
|
feature; this is useful for load-balanced servers that cannot be
|
||||||
|
@ -166,7 +166,7 @@ permuted into their appropriate location when writing a new bitmap.
|
|||||||
|
|
||||||
pack.writeReverseIndex::
|
pack.writeReverseIndex::
|
||||||
When true, git will write a corresponding .rev file (see:
|
When true, git will write a corresponding .rev file (see:
|
||||||
link:../technical/pack-format.html[Documentation/technical/pack-format.txt])
|
linkgit:gitformat-pack[5])
|
||||||
for each new packfile that it writes in all places except for
|
for each new packfile that it writes in all places except for
|
||||||
linkgit:git-fast-import[1] and in the bulk checkin mechanism.
|
linkgit:git-fast-import[1] and in the bulk checkin mechanism.
|
||||||
Defaults to false.
|
Defaults to false.
|
||||||
|
@ -58,6 +58,6 @@ protocol.version::
|
|||||||
* `1` - the original wire protocol with the addition of a version string
|
* `1` - the original wire protocol with the addition of a version string
|
||||||
in the initial response from the server.
|
in the initial response from the server.
|
||||||
|
|
||||||
* `2` - link:technical/protocol-v2.html[wire protocol version 2].
|
* `2` - Wire protocol version 2, see linkgit:gitprotocol-v2[5].
|
||||||
|
|
||||||
--
|
--
|
||||||
|
@ -56,10 +56,8 @@ using "thin packs", bundles created using exclusions are smaller in
|
|||||||
size. That they're "thin" under the hood is merely noted here as a
|
size. That they're "thin" under the hood is merely noted here as a
|
||||||
curiosity, and as a reference to other documentation.
|
curiosity, and as a reference to other documentation.
|
||||||
|
|
||||||
See link:technical/bundle-format.html[the `bundle-format`
|
See linkgit:gitformat-bundle[5] for more details and the discussion of
|
||||||
documentation] for more details and the discussion of "thin pack" in
|
"thin pack" in linkgit:gitformat-pack[5] for further details.
|
||||||
link:technical/pack-format.html[the pack format documentation] for
|
|
||||||
further details.
|
|
||||||
|
|
||||||
OPTIONS
|
OPTIONS
|
||||||
-------
|
-------
|
||||||
@ -77,7 +75,7 @@ verify <file>::
|
|||||||
commits exist and are fully linked in the current repository.
|
commits exist and are fully linked in the current repository.
|
||||||
Then, 'git bundle' prints a list of missing commits, if any.
|
Then, 'git bundle' prints a list of missing commits, if any.
|
||||||
Finally, information about additional capabilities, such as "object
|
Finally, information about additional capabilities, such as "object
|
||||||
filter", is printed. See "Capabilities" in link:technical/bundle-format.html
|
filter", is printed. See "Capabilities" in linkgit:gitformat-bundle[5]
|
||||||
for more information. The exit code is zero for success, but will
|
for more information. The exit code is zero for success, but will
|
||||||
be nonzero if the bundle file is invalid.
|
be nonzero if the bundle file is invalid.
|
||||||
|
|
||||||
@ -337,6 +335,11 @@ You can also see what references it offers:
|
|||||||
$ git ls-remote mybundle
|
$ git ls-remote mybundle
|
||||||
----------------
|
----------------
|
||||||
|
|
||||||
|
FILE FORMAT
|
||||||
|
-----------
|
||||||
|
|
||||||
|
See linkgit:gitformat-bundle[5].
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
---
|
---
|
||||||
Part of the linkgit:git[1] suite
|
Part of the linkgit:git[1] suite
|
||||||
|
@ -143,6 +143,11 @@ $ git rev-parse HEAD | git commit-graph write --stdin-commits --append
|
|||||||
------------------------------------------------
|
------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
FILE FORMAT
|
||||||
|
-----------
|
||||||
|
|
||||||
|
see linkgit:gitformat-commit-graph[5].
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
---
|
---
|
||||||
Part of the linkgit:git[1] suite
|
Part of the linkgit:git[1] suite
|
||||||
|
@ -9,14 +9,16 @@ SYNOPSIS
|
|||||||
--------
|
--------
|
||||||
[verse]
|
[verse]
|
||||||
'git help' [-a|--all] [--[no-]verbose] [--[no-]external-commands] [--[no-]aliases]
|
'git help' [-a|--all] [--[no-]verbose] [--[no-]external-commands] [--[no-]aliases]
|
||||||
'git help' [[-i|--info] [-m|--man] [-w|--web]] [<command>|<guide>]
|
'git help' [[-i|--info] [-m|--man] [-w|--web]] [<command>|<doc>]
|
||||||
'git help' [-g|--guides]
|
'git help' [-g|--guides]
|
||||||
'git help' [-c|--config]
|
'git help' [-c|--config]
|
||||||
|
'git help' [--user-interfaces]
|
||||||
|
'git help' [--developer-interfaces]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
With no options and no '<command>' or '<guide>' given, the synopsis of the 'git'
|
With no options and no '<command>' or '<doc>' given, the synopsis of the 'git'
|
||||||
command and a list of the most commonly used Git commands are printed
|
command and a list of the most commonly used Git commands are printed
|
||||||
on the standard output.
|
on the standard output.
|
||||||
|
|
||||||
@ -26,8 +28,8 @@ printed on the standard output.
|
|||||||
If the option `--guides` or `-g` is given, a list of the
|
If the option `--guides` or `-g` is given, a list of the
|
||||||
Git concept guides is also printed on the standard output.
|
Git concept guides is also printed on the standard output.
|
||||||
|
|
||||||
If a command, or a guide, is given, a manual page for that command or
|
If a command or other documentation is given, the relevant manual page
|
||||||
guide is brought up. The 'man' program is used by default for this
|
will be brought up. The 'man' program is used by default for this
|
||||||
purpose, but this can be overridden by other options or configuration
|
purpose, but this can be overridden by other options or configuration
|
||||||
variables.
|
variables.
|
||||||
|
|
||||||
@ -69,6 +71,23 @@ OPTIONS
|
|||||||
--guides::
|
--guides::
|
||||||
Prints a list of the Git concept guides on the standard output.
|
Prints a list of the Git concept guides on the standard output.
|
||||||
|
|
||||||
|
--user-interfaces::
|
||||||
|
Prints a list of the repository, command and file interfaces
|
||||||
|
documentation on the standard output.
|
||||||
|
+
|
||||||
|
In-repository file interfaces such as `.git/info/exclude` are
|
||||||
|
documented here (see linkgit:gitrepository-layout[5]), as well as
|
||||||
|
in-tree configuration such as `.mailmap` (see linkgit:gitmailmap[5]).
|
||||||
|
+
|
||||||
|
This section of the documentation also covers general or widespread
|
||||||
|
user-interface conventions (e.g. linkgit:gitcli[7]), and
|
||||||
|
pseudo-configuration such as the file-based `.git/hooks/*` interface
|
||||||
|
described in linkgit:githooks[5].
|
||||||
|
|
||||||
|
--developer-interfaces::
|
||||||
|
Print list of file formats, protocols and other developer
|
||||||
|
interfaces documentation on the standard output.
|
||||||
|
|
||||||
-i::
|
-i::
|
||||||
--info::
|
--info::
|
||||||
Display manual page for the command in the 'info' format. The
|
Display manual page for the command in the 'info' format. The
|
||||||
|
@ -128,8 +128,8 @@ $ git multi-pack-index verify
|
|||||||
SEE ALSO
|
SEE ALSO
|
||||||
--------
|
--------
|
||||||
See link:technical/multi-pack-index.html[The Multi-Pack-Index Design
|
See link:technical/multi-pack-index.html[The Multi-Pack-Index Design
|
||||||
Document] and link:technical/pack-format.html[The Multi-Pack-Index
|
Document] and linkgit:gitformat-pack[5] for more information on the
|
||||||
Format] for more information on the multi-pack-index feature.
|
multi-pack-index feature and its file format.
|
||||||
|
|
||||||
|
|
||||||
GIT
|
GIT
|
||||||
|
@ -39,10 +39,9 @@ OPTIONS
|
|||||||
--http-backend-info-refs::
|
--http-backend-info-refs::
|
||||||
Used by linkgit:git-http-backend[1] to serve up
|
Used by linkgit:git-http-backend[1] to serve up
|
||||||
`$GIT_URL/info/refs?service=git-upload-pack` requests. See
|
`$GIT_URL/info/refs?service=git-upload-pack` requests. See
|
||||||
"Smart Clients" in link:technical/http-protocol.html[the HTTP
|
"Smart Clients" in linkgit:gitprotocol-http[5] and "HTTP
|
||||||
transfer protocols] documentation and "HTTP Transport" in
|
Transport" in in the linkgit:gitprotocol-v2[5]
|
||||||
link:technical/protocol-v2.html[the Git Wire Protocol, Version
|
documentation. Also understood by
|
||||||
2] documentation. Also understood by
|
|
||||||
linkgit:git-receive-pack[1].
|
linkgit:git-receive-pack[1].
|
||||||
|
|
||||||
<directory>::
|
<directory>::
|
||||||
|
@ -339,6 +339,23 @@ The following documentation pages are guides about Git concepts.
|
|||||||
|
|
||||||
include::cmds-guide.txt[]
|
include::cmds-guide.txt[]
|
||||||
|
|
||||||
|
Repository, command and file interfaces
|
||||||
|
---------------------------------------
|
||||||
|
|
||||||
|
This documentation discusses repository and command interfaces which
|
||||||
|
users are expected to interact with directly. See `--user-formats` in
|
||||||
|
linkgit:git-help[1] for more details on the critera.
|
||||||
|
|
||||||
|
include::cmds-userinterfaces.txt[]
|
||||||
|
|
||||||
|
File formats, protocols and other developer interfaces
|
||||||
|
------------------------------------------------------
|
||||||
|
|
||||||
|
This documentation discusses file formats, over-the-wire protocols and
|
||||||
|
other git developer interfaces. See `--developer-interfaces` in
|
||||||
|
linkgit:git-help[1].
|
||||||
|
|
||||||
|
include::cmds-developerinterfaces.txt[]
|
||||||
|
|
||||||
Configuration Mechanism
|
Configuration Mechanism
|
||||||
-----------------------
|
-----------------------
|
||||||
|
@ -1,11 +1,33 @@
|
|||||||
= Git bundle v2 format
|
gitformat-bundle(5)
|
||||||
|
===================
|
||||||
|
|
||||||
The Git bundle format is a format that represents both refs and Git objects.
|
NAME
|
||||||
|
----
|
||||||
|
gitformat-bundle - The bundle file format
|
||||||
|
|
||||||
== Format
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
*.bundle
|
||||||
|
*.bdl
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The Git bundle format is a format that represents both refs and Git
|
||||||
|
objects. A bundle is a header in a format similar to
|
||||||
|
linkgit:git-show-ref[1] followed by a pack in *.pack format.
|
||||||
|
|
||||||
|
The format is created and read by the linkgit:git-bundle[1] command,
|
||||||
|
and supported by e.g. linkgit:git-fetch[1] and linkgit:git-clone[1].
|
||||||
|
|
||||||
|
|
||||||
|
FORMAT
|
||||||
|
------
|
||||||
|
|
||||||
We will use ABNF notation to define the Git bundle format. See
|
We will use ABNF notation to define the Git bundle format. See
|
||||||
protocol-common.txt for the details.
|
linkgit:gitprotocol-common[5] for the details.
|
||||||
|
|
||||||
A v2 bundle looks like this:
|
A v2 bundle looks like this:
|
||||||
|
|
||||||
@ -36,7 +58,9 @@ value = *(%01-09 / %0b-FF)
|
|||||||
pack = ... ; packfile
|
pack = ... ; packfile
|
||||||
----
|
----
|
||||||
|
|
||||||
== Semantics
|
|
||||||
|
SEMANTICS
|
||||||
|
---------
|
||||||
|
|
||||||
A Git bundle consists of several parts.
|
A Git bundle consists of several parts.
|
||||||
|
|
||||||
@ -62,13 +86,15 @@ In the bundle format, there can be a comment following a prerequisite obj-id.
|
|||||||
This is a comment and it has no specific meaning. The writer of the bundle MAY
|
This is a comment and it has no specific meaning. The writer of the bundle MAY
|
||||||
put any string here. The reader of the bundle MUST ignore the comment.
|
put any string here. The reader of the bundle MUST ignore the comment.
|
||||||
|
|
||||||
=== Note on the shallow clone and a Git bundle
|
Note on the shallow clone and a Git bundle
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Note that the prerequisites does not represent a shallow-clone boundary. The
|
Note that the prerequisites does not represent a shallow-clone boundary. The
|
||||||
semantics of the prerequisites and the shallow-clone boundaries are different,
|
semantics of the prerequisites and the shallow-clone boundaries are different,
|
||||||
and the Git bundle v2 format cannot represent a shallow clone repository.
|
and the Git bundle v2 format cannot represent a shallow clone repository.
|
||||||
|
|
||||||
== Capabilities
|
CAPABILITIES
|
||||||
|
------------
|
||||||
|
|
||||||
Because there is no opportunity for negotiation, unknown capabilities cause 'git
|
Because there is no opportunity for negotiation, unknown capabilities cause 'git
|
||||||
bundle' to abort.
|
bundle' to abort.
|
||||||
@ -79,3 +105,7 @@ bundle' to abort.
|
|||||||
* `filter` specifies an object filter as in the `--filter` option in
|
* `filter` specifies an object filter as in the `--filter` option in
|
||||||
linkgit:git-rev-list[1]. The resulting pack-file must be marked as a
|
linkgit:git-rev-list[1]. The resulting pack-file must be marked as a
|
||||||
`.promisor` pack-file after it is unbundled.
|
`.promisor` pack-file after it is unbundled.
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,12 +1,25 @@
|
|||||||
Chunk-based file formats
|
gitformat-chunk(5)
|
||||||
========================
|
==================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitformat-chunk - Chunk-based file formats
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
|
||||||
|
Used by linkgit:gitformat-commit-graph[5] and the "MIDX" format (see
|
||||||
|
the pack format documentation in linkgit:gitformat-pack[5]).
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
Some file formats in Git use a common concept of "chunks" to describe
|
Some file formats in Git use a common concept of "chunks" to describe
|
||||||
sections of the file. This allows structured access to a large file by
|
sections of the file. This allows structured access to a large file by
|
||||||
scanning a small "table of contents" for the remaining data. This common
|
scanning a small "table of contents" for the remaining data. This common
|
||||||
format is used by the `commit-graph` and `multi-pack-index` files. See
|
format is used by the `commit-graph` and `multi-pack-index` files. See
|
||||||
link:technical/pack-format.html[the `multi-pack-index` format] and
|
the `multi-pack-index` format in linkgit:gitformat-pack[5] and
|
||||||
link:technical/commit-graph-format.html[the `commit-graph` format] for
|
the `commit-graph` format in linkgit:gitformat-commit-graph[5] for
|
||||||
how they use the chunks to describe structured data.
|
how they use the chunks to describe structured data.
|
||||||
|
|
||||||
A chunk-based file format begins with some header information custom to
|
A chunk-based file format begins with some header information custom to
|
||||||
@ -108,9 +121,13 @@ for future formats:
|
|||||||
* *commit-graph:* see `write_commit_graph_file()` and `parse_commit_graph()`
|
* *commit-graph:* see `write_commit_graph_file()` and `parse_commit_graph()`
|
||||||
in `commit-graph.c` for how the chunk-format API is used to write and
|
in `commit-graph.c` for how the chunk-format API is used to write and
|
||||||
parse the commit-graph file format documented in
|
parse the commit-graph file format documented in
|
||||||
link:technical/commit-graph-format.html[the commit-graph file format].
|
the commit-graph file format in linkgit:gitformat-commit-graph[5].
|
||||||
|
|
||||||
* *multi-pack-index:* see `write_midx_internal()` and `load_multi_pack_index()`
|
* *multi-pack-index:* see `write_midx_internal()` and `load_multi_pack_index()`
|
||||||
in `midx.c` for how the chunk-format API is used to write and
|
in `midx.c` for how the chunk-format API is used to write and
|
||||||
parse the multi-pack-index file format documented in
|
parse the multi-pack-index file format documented in
|
||||||
link:technical/pack-format.html[the multi-pack-index file format].
|
the multi-pack-index file format section of linkgit:gitformat-pack[5].
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,5 +1,18 @@
|
|||||||
Git commit graph format
|
gitformat-commit-graph(5)
|
||||||
=======================
|
=========================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitformat-commit-graph - Git commit graph format
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
$GIT_DIR/objects/info/commit-graph
|
||||||
|
$GIT_DIR/objects/info/commit-graphs/*
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
The Git commit graph stores a list of commit OIDs and some associated
|
The Git commit graph stores a list of commit OIDs and some associated
|
||||||
metadata, including:
|
metadata, including:
|
||||||
@ -30,7 +43,7 @@ and hash type.
|
|||||||
|
|
||||||
All multi-byte numbers are in network byte order.
|
All multi-byte numbers are in network byte order.
|
||||||
|
|
||||||
HEADER:
|
=== HEADER:
|
||||||
|
|
||||||
4-byte signature:
|
4-byte signature:
|
||||||
The signature is: {'C', 'G', 'P', 'H'}
|
The signature is: {'C', 'G', 'P', 'H'}
|
||||||
@ -52,7 +65,7 @@ HEADER:
|
|||||||
We infer the length (H*B) of the Base Graphs chunk
|
We infer the length (H*B) of the Base Graphs chunk
|
||||||
from this value.
|
from this value.
|
||||||
|
|
||||||
CHUNK LOOKUP:
|
=== CHUNK LOOKUP:
|
||||||
|
|
||||||
(C + 1) * 12 bytes listing the table of contents for the chunks:
|
(C + 1) * 12 bytes listing the table of contents for the chunks:
|
||||||
First 4 bytes describe the chunk id. Value 0 is a terminating label.
|
First 4 bytes describe the chunk id. Value 0 is a terminating label.
|
||||||
@ -62,23 +75,23 @@ CHUNK LOOKUP:
|
|||||||
ID appears at most once.
|
ID appears at most once.
|
||||||
|
|
||||||
The CHUNK LOOKUP matches the table of contents from
|
The CHUNK LOOKUP matches the table of contents from
|
||||||
link:technical/chunk-format.html[the chunk-based file format].
|
the chunk-based file format, see linkgit:gitformat-chunk[5]
|
||||||
|
|
||||||
The remaining data in the body is described one chunk at a time, and
|
The remaining data in the body is described one chunk at a time, and
|
||||||
these chunks may be given in any order. Chunks are required unless
|
these chunks may be given in any order. Chunks are required unless
|
||||||
otherwise specified.
|
otherwise specified.
|
||||||
|
|
||||||
CHUNK DATA:
|
=== CHUNK DATA:
|
||||||
|
|
||||||
OID Fanout (ID: {'O', 'I', 'D', 'F'}) (256 * 4 bytes)
|
==== OID Fanout (ID: {'O', 'I', 'D', 'F'}) (256 * 4 bytes)
|
||||||
The ith entry, F[i], stores the number of OIDs with first
|
The ith entry, F[i], stores the number of OIDs with first
|
||||||
byte at most i. Thus F[255] stores the total
|
byte at most i. Thus F[255] stores the total
|
||||||
number of commits (N).
|
number of commits (N).
|
||||||
|
|
||||||
OID Lookup (ID: {'O', 'I', 'D', 'L'}) (N * H bytes)
|
==== OID Lookup (ID: {'O', 'I', 'D', 'L'}) (N * H bytes)
|
||||||
The OIDs for all commits in the graph, sorted in ascending order.
|
The OIDs for all commits in the graph, sorted in ascending order.
|
||||||
|
|
||||||
Commit Data (ID: {'C', 'D', 'A', 'T' }) (N * (H + 16) bytes)
|
==== Commit Data (ID: {'C', 'D', 'A', 'T' }) (N * (H + 16) bytes)
|
||||||
* The first H bytes are for the OID of the root tree.
|
* The first H bytes are for the OID of the root tree.
|
||||||
* The next 8 bytes are for the positions of the first two parents
|
* The next 8 bytes are for the positions of the first two parents
|
||||||
of the ith commit. Stores value 0x70000000 if no parent in that
|
of the ith commit. Stores value 0x70000000 if no parent in that
|
||||||
@ -93,7 +106,7 @@ CHUNK DATA:
|
|||||||
2 bits of the lowest byte, storing the 33rd and 34th bit of the
|
2 bits of the lowest byte, storing the 33rd and 34th bit of the
|
||||||
commit time.
|
commit time.
|
||||||
|
|
||||||
Generation Data (ID: {'G', 'D', 'A', '2' }) (N * 4 bytes) [Optional]
|
==== Generation Data (ID: {'G', 'D', 'A', '2' }) (N * 4 bytes) [Optional]
|
||||||
* This list of 4-byte values store corrected commit date offsets for the
|
* This list of 4-byte values store corrected commit date offsets for the
|
||||||
commits, arranged in the same order as commit data chunk.
|
commits, arranged in the same order as commit data chunk.
|
||||||
* If the corrected commit date offset cannot be stored within 31 bits,
|
* If the corrected commit date offset cannot be stored within 31 bits,
|
||||||
@ -104,7 +117,7 @@ CHUNK DATA:
|
|||||||
by compatible versions of Git and in case of split commit-graph chains,
|
by compatible versions of Git and in case of split commit-graph chains,
|
||||||
the topmost layer also has Generation Data chunk.
|
the topmost layer also has Generation Data chunk.
|
||||||
|
|
||||||
Generation Data Overflow (ID: {'G', 'D', 'O', '2' }) [Optional]
|
==== Generation Data Overflow (ID: {'G', 'D', 'O', '2' }) [Optional]
|
||||||
* This list of 8-byte values stores the corrected commit date offsets
|
* This list of 8-byte values stores the corrected commit date offsets
|
||||||
for commits with corrected commit date offsets that cannot be
|
for commits with corrected commit date offsets that cannot be
|
||||||
stored within 31 bits.
|
stored within 31 bits.
|
||||||
@ -112,7 +125,7 @@ CHUNK DATA:
|
|||||||
chunk is present and atleast one corrected commit date offset cannot
|
chunk is present and atleast one corrected commit date offset cannot
|
||||||
be stored within 31 bits.
|
be stored within 31 bits.
|
||||||
|
|
||||||
Extra Edge List (ID: {'E', 'D', 'G', 'E'}) [Optional]
|
==== Extra Edge List (ID: {'E', 'D', 'G', 'E'}) [Optional]
|
||||||
This list of 4-byte values store the second through nth parents for
|
This list of 4-byte values store the second through nth parents for
|
||||||
all octopus merges. The second parent value in the commit data stores
|
all octopus merges. The second parent value in the commit data stores
|
||||||
an array position within this list along with the most-significant bit
|
an array position within this list along with the most-significant bit
|
||||||
@ -120,14 +133,14 @@ CHUNK DATA:
|
|||||||
positions for the parents until reaching a value with the most-significant
|
positions for the parents until reaching a value with the most-significant
|
||||||
bit on. The other bits correspond to the position of the last parent.
|
bit on. The other bits correspond to the position of the last parent.
|
||||||
|
|
||||||
Bloom Filter Index (ID: {'B', 'I', 'D', 'X'}) (N * 4 bytes) [Optional]
|
==== Bloom Filter Index (ID: {'B', 'I', 'D', 'X'}) (N * 4 bytes) [Optional]
|
||||||
* The ith entry, BIDX[i], stores the number of bytes in all Bloom filters
|
* The ith entry, BIDX[i], stores the number of bytes in all Bloom filters
|
||||||
from commit 0 to commit i (inclusive) in lexicographic order. The Bloom
|
from commit 0 to commit i (inclusive) in lexicographic order. The Bloom
|
||||||
filter for the i-th commit spans from BIDX[i-1] to BIDX[i] (plus header
|
filter for the i-th commit spans from BIDX[i-1] to BIDX[i] (plus header
|
||||||
length), where BIDX[-1] is 0.
|
length), where BIDX[-1] is 0.
|
||||||
* The BIDX chunk is ignored if the BDAT chunk is not present.
|
* The BIDX chunk is ignored if the BDAT chunk is not present.
|
||||||
|
|
||||||
Bloom Filter Data (ID: {'B', 'D', 'A', 'T'}) [Optional]
|
==== Bloom Filter Data (ID: {'B', 'D', 'A', 'T'}) [Optional]
|
||||||
* It starts with header consisting of three unsigned 32-bit integers:
|
* It starts with header consisting of three unsigned 32-bit integers:
|
||||||
- Version of the hash algorithm being used. We currently only support
|
- Version of the hash algorithm being used. We currently only support
|
||||||
value 1 which corresponds to the 32-bit version of the murmur3 hash
|
value 1 which corresponds to the 32-bit version of the murmur3 hash
|
||||||
@ -147,13 +160,13 @@ CHUNK DATA:
|
|||||||
of length one, with either all bits set to zero or one respectively.
|
of length one, with either all bits set to zero or one respectively.
|
||||||
* The BDAT chunk is present if and only if BIDX is present.
|
* The BDAT chunk is present if and only if BIDX is present.
|
||||||
|
|
||||||
Base Graphs List (ID: {'B', 'A', 'S', 'E'}) [Optional]
|
==== Base Graphs List (ID: {'B', 'A', 'S', 'E'}) [Optional]
|
||||||
This list of H-byte hashes describe a set of B commit-graph files that
|
This list of H-byte hashes describe a set of B commit-graph files that
|
||||||
form a commit-graph chain. The graph position for the ith commit in this
|
form a commit-graph chain. The graph position for the ith commit in this
|
||||||
file's OID Lookup chunk is equal to i plus the number of commits in all
|
file's OID Lookup chunk is equal to i plus the number of commits in all
|
||||||
base graphs. If B is non-zero, this chunk must exist.
|
base graphs. If B is non-zero, this chunk must exist.
|
||||||
|
|
||||||
TRAILER:
|
=== TRAILER:
|
||||||
|
|
||||||
H-byte HASH-checksum of all of the above.
|
H-byte HASH-checksum of all of the above.
|
||||||
|
|
||||||
@ -164,3 +177,7 @@ the number '2' in their chunk IDs because a previous version of Git wrote
|
|||||||
possibly erroneous data in these chunks with the IDs "GDAT" and "GDOV". By
|
possibly erroneous data in these chunks with the IDs "GDAT" and "GDOV". By
|
||||||
changing the IDs, newer versions of Git will silently ignore those older
|
changing the IDs, newer versions of Git will silently ignore those older
|
||||||
chunks and write the new information without trusting the incorrect data.
|
chunks and write the new information without trusting the incorrect data.
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,5 +1,19 @@
|
|||||||
|
gitformat-index(5)
|
||||||
|
==================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitformat-index - Git index format
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
$GIT_DIR/index
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
Git index format
|
Git index format
|
||||||
================
|
|
||||||
|
|
||||||
== The Git index file has the following format
|
== The Git index file has the following format
|
||||||
|
|
||||||
@ -125,7 +139,7 @@ Git index format
|
|||||||
entry is encoded as if the path name for the previous entry is an
|
entry is encoded as if the path name for the previous entry is an
|
||||||
empty string). At the beginning of an entry, an integer N in the
|
empty string). At the beginning of an entry, an integer N in the
|
||||||
variable width encoding (the same encoding as the offset is encoded
|
variable width encoding (the same encoding as the offset is encoded
|
||||||
for OFS_DELTA pack entries; see pack-format.txt) is stored, followed
|
for OFS_DELTA pack entries; see linkgit:gitformat-pack[5]) is stored, followed
|
||||||
by a NUL-terminated string S. Removing N bytes from the end of the
|
by a NUL-terminated string S. Removing N bytes from the end of the
|
||||||
path name for the previous entry, and replacing it with the string S
|
path name for the previous entry, and replacing it with the string S
|
||||||
yields the path name for this entry.
|
yields the path name for this entry.
|
||||||
@ -402,3 +416,7 @@ The remaining data of each directory block is grouped by type:
|
|||||||
with signature { 's', 'd', 'i', 'r' }. Like the split-index extension,
|
with signature { 's', 'd', 'i', 'r' }. Like the split-index extension,
|
||||||
tools should avoid interacting with a sparse index unless they understand
|
tools should avoid interacting with a sparse index unless they understand
|
||||||
this extension.
|
this extension.
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,5 +1,30 @@
|
|||||||
Git pack format
|
gitformat-pack(5)
|
||||||
===============
|
=================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitformat-pack - Git pack format
|
||||||
|
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
$GIT_DIR/objects/pack/pack-*.{pack,idx}
|
||||||
|
$GIT_DIR/objects/pack/pack-*.rev
|
||||||
|
$GIT_DIR/objects/pack/pack-*.mtimes
|
||||||
|
$GIT_DIR/objects/pack/multi-pack-index
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The Git pack format is now Git stores most of its primary repository
|
||||||
|
data. Over the lietime af a repository loose objects (if any) and
|
||||||
|
smaller packs are consolidated into larger pack(s). See
|
||||||
|
linkgit:git-gc[1] and linkgit:git-pack-objects[1].
|
||||||
|
|
||||||
|
The pack format is also used over-the-wire, see
|
||||||
|
e.g. linkgit:gitprotocol-v2[5], as well as being a part of
|
||||||
|
other container formats in the case of linkgit:gitformat-bundle[5].
|
||||||
|
|
||||||
== Checksums and object IDs
|
== Checksums and object IDs
|
||||||
|
|
||||||
@ -356,7 +381,7 @@ CHUNK LOOKUP:
|
|||||||
using the next chunk position if necessary.)
|
using the next chunk position if necessary.)
|
||||||
|
|
||||||
The CHUNK LOOKUP matches the table of contents from
|
The CHUNK LOOKUP matches the table of contents from
|
||||||
link:technical/chunk-format.html[the chunk-based file format].
|
the chunk-based file format, see linkgit:gitformat-chunk[5].
|
||||||
|
|
||||||
The remaining data in the body is described one chunk at a time, and
|
The remaining data in the body is described one chunk at a time, and
|
||||||
these chunks may be given in any order. Chunks are required unless
|
these chunks may be given in any order. Chunks are required unless
|
||||||
@ -482,3 +507,132 @@ packs arranged in MIDX order (with the preferred pack coming first).
|
|||||||
|
|
||||||
The MIDX's reverse index is stored in the optional 'RIDX' chunk within
|
The MIDX's reverse index is stored in the optional 'RIDX' chunk within
|
||||||
the MIDX itself.
|
the MIDX itself.
|
||||||
|
|
||||||
|
== cruft packs
|
||||||
|
|
||||||
|
The cruft packs feature offer an alternative to Git's traditional mechanism of
|
||||||
|
removing unreachable objects. This document provides an overview of Git's
|
||||||
|
pruning mechanism, and how a cruft pack can be used instead to accomplish the
|
||||||
|
same.
|
||||||
|
|
||||||
|
=== Background
|
||||||
|
|
||||||
|
To remove unreachable objects from your repository, Git offers `git repack -Ad`
|
||||||
|
(see linkgit:git-repack[1]). Quoting from the documentation:
|
||||||
|
|
||||||
|
----
|
||||||
|
[...] unreachable objects in a previous pack become loose, unpacked objects,
|
||||||
|
instead of being left in the old pack. [...] loose unreachable objects will be
|
||||||
|
pruned according to normal expiry rules with the next 'git gc' invocation.
|
||||||
|
----
|
||||||
|
|
||||||
|
Unreachable objects aren't removed immediately, since doing so could race with
|
||||||
|
an incoming push which may reference an object which is about to be deleted.
|
||||||
|
Instead, those unreachable objects are stored as loose objects and stay that way
|
||||||
|
until they are older than the expiration window, at which point they are removed
|
||||||
|
by linkgit:git-prune[1].
|
||||||
|
|
||||||
|
Git must store these unreachable objects loose in order to keep track of their
|
||||||
|
per-object mtimes. If these unreachable objects were written into one big pack,
|
||||||
|
then either freshening that pack (because an object contained within it was
|
||||||
|
re-written) or creating a new pack of unreachable objects would cause the pack's
|
||||||
|
mtime to get updated, and the objects within it would never leave the expiration
|
||||||
|
window. Instead, objects are stored loose in order to keep track of the
|
||||||
|
individual object mtimes and avoid a situation where all cruft objects are
|
||||||
|
freshened at once.
|
||||||
|
|
||||||
|
This can lead to undesirable situations when a repository contains many
|
||||||
|
unreachable objects which have not yet left the grace period. Having large
|
||||||
|
directories in the shards of `.git/objects` can lead to decreased performance in
|
||||||
|
the repository. But given enough unreachable objects, this can lead to inode
|
||||||
|
starvation and degrade the performance of the whole system. Since we
|
||||||
|
can never pack those objects, these repositories often take up a large amount of
|
||||||
|
disk space, since we can only zlib compress them, but not store them in delta
|
||||||
|
chains.
|
||||||
|
|
||||||
|
=== Cruft packs
|
||||||
|
|
||||||
|
A cruft pack eliminates the need for storing unreachable objects in a loose
|
||||||
|
state by including the per-object mtimes in a separate file alongside a single
|
||||||
|
pack containing all loose objects.
|
||||||
|
|
||||||
|
A cruft pack is written by `git repack --cruft` when generating a new pack.
|
||||||
|
linkgit:git-pack-objects[1]'s `--cruft` option. Note that `git repack --cruft`
|
||||||
|
is a classic all-into-one repack, meaning that everything in the resulting pack is
|
||||||
|
reachable, and everything else is unreachable. Once written, the `--cruft`
|
||||||
|
option instructs `git repack` to generate another pack containing only objects
|
||||||
|
not packed in the previous step (which equates to packing all unreachable
|
||||||
|
objects together). This progresses as follows:
|
||||||
|
|
||||||
|
1. Enumerate every object, marking any object which is (a) not contained in a
|
||||||
|
kept-pack, and (b) whose mtime is within the grace period as a traversal
|
||||||
|
tip.
|
||||||
|
|
||||||
|
2. Perform a reachability traversal based on the tips gathered in the previous
|
||||||
|
step, adding every object along the way to the pack.
|
||||||
|
|
||||||
|
3. Write the pack out, along with a `.mtimes` file that records the per-object
|
||||||
|
timestamps.
|
||||||
|
|
||||||
|
This mode is invoked internally by linkgit:git-repack[1] when instructed to
|
||||||
|
write a cruft pack. Crucially, the set of in-core kept packs is exactly the set
|
||||||
|
of packs which will not be deleted by the repack; in other words, they contain
|
||||||
|
all of the repository's reachable objects.
|
||||||
|
|
||||||
|
When a repository already has a cruft pack, `git repack --cruft` typically only
|
||||||
|
adds objects to it. An exception to this is when `git repack` is given the
|
||||||
|
`--cruft-expiration` option, which allows the generated cruft pack to omit
|
||||||
|
expired objects instead of waiting for linkgit:git-gc[1] to expire those objects
|
||||||
|
later on.
|
||||||
|
|
||||||
|
It is linkgit:git-gc[1] that is typically responsible for removing expired
|
||||||
|
unreachable objects.
|
||||||
|
|
||||||
|
=== Caution for mixed-version environments
|
||||||
|
|
||||||
|
Repositories that have cruft packs in them will continue to work with any older
|
||||||
|
version of Git. Note, however, that previous versions of Git which do not
|
||||||
|
understand the `.mtimes` file will use the cruft pack's mtime as the mtime for
|
||||||
|
all of the objects in it. In other words, do not expect older (pre-cruft pack)
|
||||||
|
versions of Git to interpret or even read the contents of the `.mtimes` file.
|
||||||
|
|
||||||
|
Note that having mixed versions of Git GC-ing the same repository can lead to
|
||||||
|
unreachable objects never being completely pruned. This can happen under the
|
||||||
|
following circumstances:
|
||||||
|
|
||||||
|
- An older version of Git running GC explodes the contents of an existing
|
||||||
|
cruft pack loose, using the cruft pack's mtime.
|
||||||
|
- A newer version running GC collects those loose objects into a cruft pack,
|
||||||
|
where the .mtime file reflects the loose object's actual mtimes, but the
|
||||||
|
cruft pack mtime is "now".
|
||||||
|
|
||||||
|
Repeating this process will lead to unreachable objects not getting pruned as a
|
||||||
|
result of repeatedly resetting the objects' mtimes to the present time.
|
||||||
|
|
||||||
|
If you are GC-ing repositories in a mixed version environment, consider omitting
|
||||||
|
the `--cruft` option when using linkgit:git-repack[1] and linkgit:git-gc[1], and
|
||||||
|
leaving the `gc.cruftPacks` configuration unset until all writers understand
|
||||||
|
cruft packs.
|
||||||
|
|
||||||
|
=== Alternatives
|
||||||
|
|
||||||
|
Notable alternatives to this design include:
|
||||||
|
|
||||||
|
- The location of the per-object mtime data, and
|
||||||
|
- Storing unreachable objects in multiple cruft packs.
|
||||||
|
|
||||||
|
On the location of mtime data, a new auxiliary file tied to the pack was chosen
|
||||||
|
to avoid complicating the `.idx` format. If the `.idx` format were ever to gain
|
||||||
|
support for optional chunks of data, it may make sense to consolidate the
|
||||||
|
`.mtimes` format into the `.idx` itself.
|
||||||
|
|
||||||
|
Storing unreachable objects among multiple cruft packs (e.g., creating a new
|
||||||
|
cruft pack during each repacking operation including only unreachable objects
|
||||||
|
which aren't already stored in an earlier cruft pack) is significantly more
|
||||||
|
complicated to construct, and so aren't pursued here. The obvious drawback to
|
||||||
|
the current implementation is that the entire cruft pack must be re-written from
|
||||||
|
scratch.
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,7 +1,18 @@
|
|||||||
Git signature format
|
gitformat-signature(5)
|
||||||
====================
|
======================
|
||||||
|
|
||||||
== Overview
|
NAME
|
||||||
|
----
|
||||||
|
gitformat-signature - Git cryptographic signature formats
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
<[tag|commit] object header(s)>
|
||||||
|
<over-the-wire protocol>
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
Git uses cryptographic signatures in various places, currently objects (tags,
|
Git uses cryptographic signatures in various places, currently objects (tags,
|
||||||
commits, mergetags) and transactions (pushes). In every case, the command which
|
commits, mergetags) and transactions (pushes). In every case, the command which
|
||||||
@ -200,3 +211,7 @@ Date: Wed Jun 15 09:13:29 2016 +0000
|
|||||||
# gpg: There is no indication that the signature belongs to the owner.
|
# gpg: There is no indication that the signature belongs to the owner.
|
||||||
# Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189
|
# Primary key fingerprint: D4BE 2231 1AD3 131E 5EDA 29A4 6109 2E85 B722 7189
|
||||||
----
|
----
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,8 +1,20 @@
|
|||||||
Git Protocol Capabilities
|
gitprotocol-capabilities(5)
|
||||||
=========================
|
===========================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitprotocol-capabilities - Protocol v0 and v1 capabilities
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
<over-the-wire-protocol>
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
NOTE: this document describes capabilities for versions 0 and 1 of the pack
|
NOTE: this document describes capabilities for versions 0 and 1 of the pack
|
||||||
protocol. For version 2, please refer to the link:protocol-v2.html[protocol-v2]
|
protocol. For version 2, please refer to the linkgit:gitprotocol-v2[5]
|
||||||
doc.
|
doc.
|
||||||
|
|
||||||
Servers SHOULD support all capabilities defined in this document.
|
Servers SHOULD support all capabilities defined in this document.
|
||||||
@ -77,7 +89,7 @@ interleaved with S-R-Q.
|
|||||||
multi_ack_detailed
|
multi_ack_detailed
|
||||||
------------------
|
------------------
|
||||||
This is an extension of multi_ack that permits client to better
|
This is an extension of multi_ack that permits client to better
|
||||||
understand the server's in-memory state. See pack-protocol.txt,
|
understand the server's in-memory state. See linkgit:gitprotocol-pack[5],
|
||||||
section "Packfile Negotiation" for more information.
|
section "Packfile Negotiation" for more information.
|
||||||
|
|
||||||
no-done
|
no-done
|
||||||
@ -281,7 +293,7 @@ a packfile upload and reference update. If the pushing client requests
|
|||||||
this capability, after unpacking and updating references the server
|
this capability, after unpacking and updating references the server
|
||||||
will respond with whether the packfile unpacked successfully and if
|
will respond with whether the packfile unpacked successfully and if
|
||||||
each reference was updated successfully. If any of those were not
|
each reference was updated successfully. If any of those were not
|
||||||
successful, it will send back an error message. See pack-protocol.txt
|
successful, it will send back an error message. See linkgit:gitprotocol-pack[5]
|
||||||
for example messages.
|
for example messages.
|
||||||
|
|
||||||
report-status-v2
|
report-status-v2
|
||||||
@ -292,7 +304,7 @@ adding new "option" directives in order to support reference rewritten by
|
|||||||
the "proc-receive" hook. The "proc-receive" hook may handle a command
|
the "proc-receive" hook. The "proc-receive" hook may handle a command
|
||||||
for a pseudo-reference which may create or update a reference with
|
for a pseudo-reference which may create or update a reference with
|
||||||
different name, new-oid, and old-oid. While the capability
|
different name, new-oid, and old-oid. While the capability
|
||||||
'report-status' cannot report for such case. See pack-protocol.txt
|
'report-status' cannot report for such case. See linkgit:gitprotocol-pack[5]
|
||||||
for details.
|
for details.
|
||||||
|
|
||||||
delete-refs
|
delete-refs
|
||||||
@ -378,3 +390,7 @@ packet-line, and must not contain non-printable or whitespace characters. The
|
|||||||
current implementation uses trace2 session IDs (see
|
current implementation uses trace2 session IDs (see
|
||||||
link:api-trace2.html[api-trace2] for details), but this may change and users of
|
link:api-trace2.html[api-trace2] for details), but this may change and users of
|
||||||
the session ID should not rely on this fact.
|
the session ID should not rely on this fact.
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,5 +1,20 @@
|
|||||||
Documentation Common to Pack and Http Protocols
|
gitprotocol-common(5)
|
||||||
===============================================
|
=====================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitprotocol-common - Things common to various protocols
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
<over-the-wire-protocol>
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This document sets defines things common to various over-the-wire
|
||||||
|
protocols and file formats used in Git.
|
||||||
|
|
||||||
ABNF Notation
|
ABNF Notation
|
||||||
-------------
|
-------------
|
||||||
@ -97,3 +112,7 @@ Examples (as C-style strings):
|
|||||||
"000bfoobar\n" "foobar\n"
|
"000bfoobar\n" "foobar\n"
|
||||||
"0004" ""
|
"0004" ""
|
||||||
----
|
----
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,5 +1,19 @@
|
|||||||
HTTP transfer protocols
|
gitprotocol-http(5)
|
||||||
=======================
|
===================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitprotocol-http - Git HTTP-based protocols
|
||||||
|
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
<over-the-wire-protocol>
|
||||||
|
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
Git supports two HTTP based transfer protocols. A "dumb" protocol
|
Git supports two HTTP based transfer protocols. A "dumb" protocol
|
||||||
which requires only a standard HTTP server on the server end of the
|
which requires only a standard HTTP server on the server end of the
|
||||||
@ -222,7 +236,7 @@ smart server reply:
|
|||||||
S: 0000
|
S: 0000
|
||||||
|
|
||||||
The client may send Extra Parameters (see
|
The client may send Extra Parameters (see
|
||||||
Documentation/technical/pack-protocol.txt) as a colon-separated string
|
linkgit:gitprotocol-pack[5]) as a colon-separated string
|
||||||
in the Git-Protocol HTTP header.
|
in the Git-Protocol HTTP header.
|
||||||
|
|
||||||
Uses the `--http-backend-info-refs` option to
|
Uses the `--http-backend-info-refs` option to
|
||||||
@ -512,11 +526,18 @@ the id obtained through ref discovery as old_id.
|
|||||||
|
|
||||||
TODO: Document this further.
|
TODO: Document this further.
|
||||||
|
|
||||||
|
REFERENCES
|
||||||
References
|
|
||||||
----------
|
----------
|
||||||
|
|
||||||
http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)]
|
http://www.ietf.org/rfc/rfc1738.txt[RFC 1738: Uniform Resource Locators (URL)]
|
||||||
http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1]
|
http://www.ietf.org/rfc/rfc2616.txt[RFC 2616: Hypertext Transfer Protocol -- HTTP/1.1]
|
||||||
link:technical/pack-protocol.html
|
|
||||||
link:technical/protocol-capabilities.html
|
SEE ALSO
|
||||||
|
--------
|
||||||
|
|
||||||
|
linkgit:gitprotocol-pack[5]
|
||||||
|
linkgit:gitprotocol-capabilities[5]
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,11 +1,23 @@
|
|||||||
Packfile transfer protocols
|
gitprotocol-pack(5)
|
||||||
===========================
|
===================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitprotocol-pack - How packs are transferred over-the-wire
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
<over-the-wire-protocol>
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
Git supports transferring data in packfiles over the ssh://, git://, http:// and
|
Git supports transferring data in packfiles over the ssh://, git://, http:// and
|
||||||
file:// transports. There exist two sets of protocols, one for pushing
|
file:// transports. There exist two sets of protocols, one for pushing
|
||||||
data from a client to a server and another for fetching data from a
|
data from a client to a server and another for fetching data from a
|
||||||
server to a client. The three transports (ssh, git, file) use the same
|
server to a client. The three transports (ssh, git, file) use the same
|
||||||
protocol to transfer data. http is documented in http-protocol.txt.
|
protocol to transfer data. http is documented in linkgit:gitprotocol-http[5].
|
||||||
|
|
||||||
The processes invoked in the canonical Git implementation are 'upload-pack'
|
The processes invoked in the canonical Git implementation are 'upload-pack'
|
||||||
on the server side and 'fetch-pack' on the client side for fetching data;
|
on the server side and 'fetch-pack' on the client side for fetching data;
|
||||||
@ -18,7 +30,7 @@ pkt-line Format
|
|||||||
---------------
|
---------------
|
||||||
|
|
||||||
The descriptions below build on the pkt-line format described in
|
The descriptions below build on the pkt-line format described in
|
||||||
protocol-common.txt. When the grammar indicate `PKT-LINE(...)`, unless
|
linkgit:gitprotocol-common[5]. When the grammar indicate `PKT-LINE(...)`, unless
|
||||||
otherwise noted the usual pkt-line LF rules apply: the sender SHOULD
|
otherwise noted the usual pkt-line LF rules apply: the sender SHOULD
|
||||||
include a LF, but the receiver MUST NOT complain if it is not present.
|
include a LF, but the receiver MUST NOT complain if it is not present.
|
||||||
|
|
||||||
@ -60,7 +72,7 @@ Each Extra Parameter takes the form of `<key>=<value>` or `<key>`.
|
|||||||
|
|
||||||
Servers that receive any such Extra Parameters MUST ignore all
|
Servers that receive any such Extra Parameters MUST ignore all
|
||||||
unrecognized keys. Currently, the only Extra Parameter recognized is
|
unrecognized keys. Currently, the only Extra Parameter recognized is
|
||||||
"version" with a value of '1' or '2'. See protocol-v2.txt for more
|
"version" with a value of '1' or '2'. See linkgit:gitprotocol-v2[5] for more
|
||||||
information on protocol version 2.
|
information on protocol version 2.
|
||||||
|
|
||||||
Git Transport
|
Git Transport
|
||||||
@ -455,7 +467,7 @@ Now that the client and server have finished negotiation about what
|
|||||||
the minimal amount of data that needs to be sent to the client is, the server
|
the minimal amount of data that needs to be sent to the client is, the server
|
||||||
will construct and send the required data in packfile format.
|
will construct and send the required data in packfile format.
|
||||||
|
|
||||||
See pack-format.txt for what the packfile itself actually looks like.
|
See linkgit:gitformat-pack[5] for what the packfile itself actually looks like.
|
||||||
|
|
||||||
If 'side-band' or 'side-band-64k' capabilities have been specified by
|
If 'side-band' or 'side-band-64k' capabilities have been specified by
|
||||||
the client, the server will send the packfile data multiplexed.
|
the client, the server will send the packfile data multiplexed.
|
||||||
@ -707,3 +719,7 @@ An example client/server communication might look like this:
|
|||||||
S: 0018ok refs/heads/debug\n
|
S: 0018ok refs/heads/debug\n
|
||||||
S: 002ang refs/heads/master non-fast-forward\n
|
S: 002ang refs/heads/master non-fast-forward\n
|
||||||
----
|
----
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -1,5 +1,17 @@
|
|||||||
Git Wire Protocol, Version 2
|
gitprotocol-v2(5)
|
||||||
============================
|
=================
|
||||||
|
|
||||||
|
NAME
|
||||||
|
----
|
||||||
|
gitprotocol-v2 - Git Wire Protocol, Version 2
|
||||||
|
|
||||||
|
SYNOPSIS
|
||||||
|
--------
|
||||||
|
[verse]
|
||||||
|
<over-the-wire-protocol>
|
||||||
|
|
||||||
|
DESCRIPTION
|
||||||
|
-----------
|
||||||
|
|
||||||
This document presents a specification for a version 2 of Git's wire
|
This document presents a specification for a version 2 of Git's wire
|
||||||
protocol. Protocol v2 will improve upon v1 in the following ways:
|
protocol. Protocol v2 will improve upon v1 in the following ways:
|
||||||
@ -26,8 +38,7 @@ Packet-Line Framing
|
|||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
All communication is done using packet-line framing, just as in v1. See
|
All communication is done using packet-line framing, just as in v1. See
|
||||||
`Documentation/technical/pack-protocol.txt` and
|
linkgit:gitprotocol-pack[5] and linkgit:gitprotocol-common[5] for more information.
|
||||||
`Documentation/technical/protocol-common.txt` for more information.
|
|
||||||
|
|
||||||
In protocol v2 these special packets will have the following semantics:
|
In protocol v2 these special packets will have the following semantics:
|
||||||
|
|
||||||
@ -42,7 +53,7 @@ Initial Client Request
|
|||||||
In general a client can request to speak protocol v2 by sending
|
In general a client can request to speak protocol v2 by sending
|
||||||
`version=2` through the respective side-channel for the transport being
|
`version=2` through the respective side-channel for the transport being
|
||||||
used which inevitably sets `GIT_PROTOCOL`. More information can be
|
used which inevitably sets `GIT_PROTOCOL`. More information can be
|
||||||
found in `pack-protocol.txt` and `http-protocol.txt`, as well as the
|
found in linkgit:gitprotocol-pack[5] and linkgit:gitprotocol-http[5], as well as the
|
||||||
`GIT_PROTOCOL` definition in `git.txt`. In all cases the
|
`GIT_PROTOCOL` definition in `git.txt`. In all cases the
|
||||||
response from the server is the capability advertisement.
|
response from the server is the capability advertisement.
|
||||||
|
|
||||||
@ -66,7 +77,7 @@ HTTP Transport
|
|||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
|
|
||||||
When using the http:// or https:// transport a client makes a "smart"
|
When using the http:// or https:// transport a client makes a "smart"
|
||||||
info/refs request as described in `http-protocol.txt` and requests that
|
info/refs request as described in linkgit:gitprotocol-http[5] and requests that
|
||||||
v2 be used by supplying "version=2" in the `Git-Protocol` header.
|
v2 be used by supplying "version=2" in the `Git-Protocol` header.
|
||||||
|
|
||||||
C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
|
C: GET $GIT_URL/info/refs?service=git-upload-pack HTTP/1.0
|
||||||
@ -566,3 +577,7 @@ and associated requested information, each separated by a single space.
|
|||||||
attr = "size"
|
attr = "size"
|
||||||
|
|
||||||
obj-info = obj-id SP obj-size
|
obj-info = obj-id SP obj-size
|
||||||
|
|
||||||
|
GIT
|
||||||
|
---
|
||||||
|
Part of the linkgit:git[1] suite
|
@ -68,7 +68,7 @@ Note that the "object" file isn't fit for feeding straight to zlib; it
|
|||||||
has the git packed object header, which is variable-length. We want to
|
has the git packed object header, which is variable-length. We want to
|
||||||
strip that off so we can start playing with the zlib data directly. You
|
strip that off so we can start playing with the zlib data directly. You
|
||||||
can either work your way through it manually (the format is described in
|
can either work your way through it manually (the format is described in
|
||||||
link:../technical/pack-format.html[Documentation/technical/pack-format.txt]),
|
linkgit:gitformat-pack[5]),
|
||||||
or you can walk through it in a debugger. I did the latter, creating a
|
or you can walk through it in a debugger. I did the latter, creating a
|
||||||
valid pack like:
|
valid pack like:
|
||||||
|
|
||||||
|
@ -32,6 +32,9 @@ my %SECTIONS;
|
|||||||
'SEE ALSO' => {
|
'SEE ALSO' => {
|
||||||
order => $order++,
|
order => $order++,
|
||||||
},
|
},
|
||||||
|
'FILE FORMAT' => {
|
||||||
|
order => $order++,
|
||||||
|
},
|
||||||
'GIT' => {
|
'GIT' => {
|
||||||
required => 1,
|
required => 1,
|
||||||
order => $order++,
|
order => $order++,
|
||||||
|
@ -78,7 +78,7 @@ client and an optional response message from the server. Both the
|
|||||||
client and server messages are unlimited in length and are terminated
|
client and server messages are unlimited in length and are terminated
|
||||||
with a flush packet.
|
with a flush packet.
|
||||||
|
|
||||||
The pkt-line routines (Documentation/technical/protocol-common.txt)
|
The pkt-line routines (linkgit:gitprotocol-common[5])
|
||||||
are used to simplify buffer management during message generation,
|
are used to simplify buffer management during message generation,
|
||||||
transmission, and reception. A flush packet is used to mark the end
|
transmission, and reception. A flush packet is used to mark the end
|
||||||
of the message. This allows the sender to incrementally generate and
|
of the message. This allows the sender to incrementally generate and
|
||||||
|
@ -1,123 +0,0 @@
|
|||||||
= Cruft packs
|
|
||||||
|
|
||||||
The cruft packs feature offer an alternative to Git's traditional mechanism of
|
|
||||||
removing unreachable objects. This document provides an overview of Git's
|
|
||||||
pruning mechanism, and how a cruft pack can be used instead to accomplish the
|
|
||||||
same.
|
|
||||||
|
|
||||||
== Background
|
|
||||||
|
|
||||||
To remove unreachable objects from your repository, Git offers `git repack -Ad`
|
|
||||||
(see linkgit:git-repack[1]). Quoting from the documentation:
|
|
||||||
|
|
||||||
[quote]
|
|
||||||
[...] unreachable objects in a previous pack become loose, unpacked objects,
|
|
||||||
instead of being left in the old pack. [...] loose unreachable objects will be
|
|
||||||
pruned according to normal expiry rules with the next 'git gc' invocation.
|
|
||||||
|
|
||||||
Unreachable objects aren't removed immediately, since doing so could race with
|
|
||||||
an incoming push which may reference an object which is about to be deleted.
|
|
||||||
Instead, those unreachable objects are stored as loose objects and stay that way
|
|
||||||
until they are older than the expiration window, at which point they are removed
|
|
||||||
by linkgit:git-prune[1].
|
|
||||||
|
|
||||||
Git must store these unreachable objects loose in order to keep track of their
|
|
||||||
per-object mtimes. If these unreachable objects were written into one big pack,
|
|
||||||
then either freshening that pack (because an object contained within it was
|
|
||||||
re-written) or creating a new pack of unreachable objects would cause the pack's
|
|
||||||
mtime to get updated, and the objects within it would never leave the expiration
|
|
||||||
window. Instead, objects are stored loose in order to keep track of the
|
|
||||||
individual object mtimes and avoid a situation where all cruft objects are
|
|
||||||
freshened at once.
|
|
||||||
|
|
||||||
This can lead to undesirable situations when a repository contains many
|
|
||||||
unreachable objects which have not yet left the grace period. Having large
|
|
||||||
directories in the shards of `.git/objects` can lead to decreased performance in
|
|
||||||
the repository. But given enough unreachable objects, this can lead to inode
|
|
||||||
starvation and degrade the performance of the whole system. Since we
|
|
||||||
can never pack those objects, these repositories often take up a large amount of
|
|
||||||
disk space, since we can only zlib compress them, but not store them in delta
|
|
||||||
chains.
|
|
||||||
|
|
||||||
== Cruft packs
|
|
||||||
|
|
||||||
A cruft pack eliminates the need for storing unreachable objects in a loose
|
|
||||||
state by including the per-object mtimes in a separate file alongside a single
|
|
||||||
pack containing all loose objects.
|
|
||||||
|
|
||||||
A cruft pack is written by `git repack --cruft` when generating a new pack.
|
|
||||||
linkgit:git-pack-objects[1]'s `--cruft` option. Note that `git repack --cruft`
|
|
||||||
is a classic all-into-one repack, meaning that everything in the resulting pack is
|
|
||||||
reachable, and everything else is unreachable. Once written, the `--cruft`
|
|
||||||
option instructs `git repack` to generate another pack containing only objects
|
|
||||||
not packed in the previous step (which equates to packing all unreachable
|
|
||||||
objects together). This progresses as follows:
|
|
||||||
|
|
||||||
1. Enumerate every object, marking any object which is (a) not contained in a
|
|
||||||
kept-pack, and (b) whose mtime is within the grace period as a traversal
|
|
||||||
tip.
|
|
||||||
|
|
||||||
2. Perform a reachability traversal based on the tips gathered in the previous
|
|
||||||
step, adding every object along the way to the pack.
|
|
||||||
|
|
||||||
3. Write the pack out, along with a `.mtimes` file that records the per-object
|
|
||||||
timestamps.
|
|
||||||
|
|
||||||
This mode is invoked internally by linkgit:git-repack[1] when instructed to
|
|
||||||
write a cruft pack. Crucially, the set of in-core kept packs is exactly the set
|
|
||||||
of packs which will not be deleted by the repack; in other words, they contain
|
|
||||||
all of the repository's reachable objects.
|
|
||||||
|
|
||||||
When a repository already has a cruft pack, `git repack --cruft` typically only
|
|
||||||
adds objects to it. An exception to this is when `git repack` is given the
|
|
||||||
`--cruft-expiration` option, which allows the generated cruft pack to omit
|
|
||||||
expired objects instead of waiting for linkgit:git-gc[1] to expire those objects
|
|
||||||
later on.
|
|
||||||
|
|
||||||
It is linkgit:git-gc[1] that is typically responsible for removing expired
|
|
||||||
unreachable objects.
|
|
||||||
|
|
||||||
== Caution for mixed-version environments
|
|
||||||
|
|
||||||
Repositories that have cruft packs in them will continue to work with any older
|
|
||||||
version of Git. Note, however, that previous versions of Git which do not
|
|
||||||
understand the `.mtimes` file will use the cruft pack's mtime as the mtime for
|
|
||||||
all of the objects in it. In other words, do not expect older (pre-cruft pack)
|
|
||||||
versions of Git to interpret or even read the contents of the `.mtimes` file.
|
|
||||||
|
|
||||||
Note that having mixed versions of Git GC-ing the same repository can lead to
|
|
||||||
unreachable objects never being completely pruned. This can happen under the
|
|
||||||
following circumstances:
|
|
||||||
|
|
||||||
- An older version of Git running GC explodes the contents of an existing
|
|
||||||
cruft pack loose, using the cruft pack's mtime.
|
|
||||||
- A newer version running GC collects those loose objects into a cruft pack,
|
|
||||||
where the .mtime file reflects the loose object's actual mtimes, but the
|
|
||||||
cruft pack mtime is "now".
|
|
||||||
|
|
||||||
Repeating this process will lead to unreachable objects not getting pruned as a
|
|
||||||
result of repeatedly resetting the objects' mtimes to the present time.
|
|
||||||
|
|
||||||
If you are GC-ing repositories in a mixed version environment, consider omitting
|
|
||||||
the `--cruft` option when using linkgit:git-repack[1] and linkgit:git-gc[1], and
|
|
||||||
leaving the `gc.cruftPacks` configuration unset until all writers understand
|
|
||||||
cruft packs.
|
|
||||||
|
|
||||||
== Alternatives
|
|
||||||
|
|
||||||
Notable alternatives to this design include:
|
|
||||||
|
|
||||||
- The location of the per-object mtime data, and
|
|
||||||
- Storing unreachable objects in multiple cruft packs.
|
|
||||||
|
|
||||||
On the location of mtime data, a new auxiliary file tied to the pack was chosen
|
|
||||||
to avoid complicating the `.idx` format. If the `.idx` format were ever to gain
|
|
||||||
support for optional chunks of data, it may make sense to consolidate the
|
|
||||||
`.mtimes` format into the `.idx` itself.
|
|
||||||
|
|
||||||
Storing unreachable objects among multiple cruft packs (e.g., creating a new
|
|
||||||
cruft pack during each repacking operation including only unreachable objects
|
|
||||||
which aren't already stored in an earlier cruft pack) is significantly more
|
|
||||||
complicated to construct, and so aren't pursued here. The obvious drawback to
|
|
||||||
the current implementation is that the entire cruft pack must be re-written from
|
|
||||||
scratch.
|
|
@ -205,7 +205,7 @@ SHA-1 content.
|
|||||||
Object storage
|
Object storage
|
||||||
~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~
|
||||||
Loose objects use zlib compression and packed objects use the packed
|
Loose objects use zlib compression and packed objects use the packed
|
||||||
format described in Documentation/technical/pack-format.txt, just like
|
format described in linkgit:gitformat-pack[5], just like
|
||||||
today. The content that is compressed and stored uses SHA-256 content
|
today. The content that is compressed and stored uses SHA-256 content
|
||||||
instead of SHA-1 content.
|
instead of SHA-1 content.
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ Long-running process protocol
|
|||||||
|
|
||||||
This protocol is used when Git needs to communicate with an external
|
This protocol is used when Git needs to communicate with an external
|
||||||
process throughout the entire life of a single Git command. All
|
process throughout the entire life of a single Git command. All
|
||||||
communication is in pkt-line format (see technical/protocol-common.txt)
|
communication is in pkt-line format (see linkgit:gitprotocol-common[5])
|
||||||
over standard input and standard output.
|
over standard input and standard output.
|
||||||
|
|
||||||
Handshake
|
Handshake
|
||||||
|
@ -18,7 +18,7 @@ a `packfile-uris` argument, the server MAY send a `packfile-uris` section
|
|||||||
directly before the `packfile` section (right after `wanted-refs` if it is
|
directly before the `packfile` section (right after `wanted-refs` if it is
|
||||||
sent) containing URIs of any of the given protocols. The URIs point to
|
sent) containing URIs of any of the given protocols. The URIs point to
|
||||||
packfiles that use only features that the client has declared that it supports
|
packfiles that use only features that the client has declared that it supports
|
||||||
(e.g. ofs-delta and thin-pack). See protocol-v2.txt for the documentation of
|
(e.g. ofs-delta and thin-pack). See linkgit:gitprotocol-v2[5] for the documentation of
|
||||||
this section.
|
this section.
|
||||||
|
|
||||||
Clients should then download and index all the given URIs (in addition to
|
Clients should then download and index all the given URIs (in addition to
|
||||||
|
@ -79,7 +79,7 @@ Design Details
|
|||||||
upload-pack negotiation.
|
upload-pack negotiation.
|
||||||
+
|
+
|
||||||
This uses the existing capability discovery mechanism.
|
This uses the existing capability discovery mechanism.
|
||||||
See "filter" in Documentation/technical/pack-protocol.txt.
|
See "filter" in linkgit:gitprotocol-pack[5].
|
||||||
|
|
||||||
- Clients pass a "filter-spec" to clone and fetch which is passed to the
|
- Clients pass a "filter-spec" to clone and fetch which is passed to the
|
||||||
server to request filtering during packfile construction.
|
server to request filtering during packfile construction.
|
||||||
|
@ -3133,7 +3133,7 @@ those "loose" objects.
|
|||||||
You can save space and make Git faster by moving these loose objects in
|
You can save space and make Git faster by moving these loose objects in
|
||||||
to a "pack file", which stores a group of objects in an efficient
|
to a "pack file", which stores a group of objects in an efficient
|
||||||
compressed format; the details of how pack files are formatted can be
|
compressed format; the details of how pack files are formatted can be
|
||||||
found in link:technical/pack-format.html[pack format].
|
found in link:gitformat-pack[5].
|
||||||
|
|
||||||
To put the loose objects into a pack, just run git repack:
|
To put the loose objects into a pack, just run git repack:
|
||||||
|
|
||||||
|
1
Makefile
1
Makefile
@ -3531,6 +3531,7 @@ check-docs::
|
|||||||
sed -e '1,/^### command list/d' \
|
sed -e '1,/^### command list/d' \
|
||||||
-e '/^#/d' \
|
-e '/^#/d' \
|
||||||
-e '/guide$$/d' \
|
-e '/guide$$/d' \
|
||||||
|
-e '/interfaces$$/d' \
|
||||||
-e 's/[ ].*//' \
|
-e 's/[ ].*//' \
|
||||||
-e 's/^/listed /' command-list.txt; \
|
-e 's/^/listed /' command-list.txt; \
|
||||||
$(MAKE) -C Documentation print-man1 | \
|
$(MAKE) -C Documentation print-man1 | \
|
||||||
|
@ -43,6 +43,8 @@ static enum help_action {
|
|||||||
HELP_ACTION_ALL = 1,
|
HELP_ACTION_ALL = 1,
|
||||||
HELP_ACTION_GUIDES,
|
HELP_ACTION_GUIDES,
|
||||||
HELP_ACTION_CONFIG,
|
HELP_ACTION_CONFIG,
|
||||||
|
HELP_ACTION_USER_INTERFACES,
|
||||||
|
HELP_ACTION_DEVELOPER_INTERFACES,
|
||||||
HELP_ACTION_CONFIG_FOR_COMPLETION,
|
HELP_ACTION_CONFIG_FOR_COMPLETION,
|
||||||
HELP_ACTION_CONFIG_SECTIONS_FOR_COMPLETION,
|
HELP_ACTION_CONFIG_SECTIONS_FOR_COMPLETION,
|
||||||
} cmd_mode;
|
} cmd_mode;
|
||||||
@ -69,6 +71,12 @@ static struct option builtin_help_options[] = {
|
|||||||
|
|
||||||
OPT_CMDMODE('g', "guides", &cmd_mode, N_("print list of useful guides"),
|
OPT_CMDMODE('g', "guides", &cmd_mode, N_("print list of useful guides"),
|
||||||
HELP_ACTION_GUIDES),
|
HELP_ACTION_GUIDES),
|
||||||
|
OPT_CMDMODE(0, "user-interfaces", &cmd_mode,
|
||||||
|
N_("print list of user-facing repository, command and file interfaces"),
|
||||||
|
HELP_ACTION_USER_INTERFACES),
|
||||||
|
OPT_CMDMODE(0, "developer-interfaces", &cmd_mode,
|
||||||
|
N_("print list of file formats, protocols and other developer interfaces"),
|
||||||
|
HELP_ACTION_DEVELOPER_INTERFACES),
|
||||||
OPT_CMDMODE('c', "config", &cmd_mode, N_("print all configuration variable names"),
|
OPT_CMDMODE('c', "config", &cmd_mode, N_("print all configuration variable names"),
|
||||||
HELP_ACTION_CONFIG),
|
HELP_ACTION_CONFIG),
|
||||||
OPT_CMDMODE_F(0, "config-for-completion", &cmd_mode, "",
|
OPT_CMDMODE_F(0, "config-for-completion", &cmd_mode, "",
|
||||||
@ -81,9 +89,11 @@ static struct option builtin_help_options[] = {
|
|||||||
|
|
||||||
static const char * const builtin_help_usage[] = {
|
static const char * const builtin_help_usage[] = {
|
||||||
"git help [-a|--all] [--[no-]verbose]] [--[no-]external-commands] [--[no-]aliases]",
|
"git help [-a|--all] [--[no-]verbose]] [--[no-]external-commands] [--[no-]aliases]",
|
||||||
N_("git help [[-i|--info] [-m|--man] [-w|--web]] [<command>]"),
|
N_("git help [[-i|--info] [-m|--man] [-w|--web]] [<command>|<doc>]"),
|
||||||
"git help [-g|--guides]",
|
"git help [-g|--guides]",
|
||||||
"git help [-c|--config]",
|
"git help [-c|--config]",
|
||||||
|
"git help [--user-interfaces]",
|
||||||
|
"git help [--developer-interfaces]",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -654,6 +664,14 @@ int cmd_help(int argc, const char **argv, const char *prefix)
|
|||||||
opt_mode_usage(argc, "--config-for-completion", help_format);
|
opt_mode_usage(argc, "--config-for-completion", help_format);
|
||||||
list_config_help(SHOW_CONFIG_VARS);
|
list_config_help(SHOW_CONFIG_VARS);
|
||||||
return 0;
|
return 0;
|
||||||
|
case HELP_ACTION_USER_INTERFACES:
|
||||||
|
opt_mode_usage(argc, "--user-interfaces", help_format);
|
||||||
|
list_user_interfaces_help();
|
||||||
|
return 0;
|
||||||
|
case HELP_ACTION_DEVELOPER_INTERFACES:
|
||||||
|
opt_mode_usage(argc, "--developer-interfaces", help_format);
|
||||||
|
list_developer_interfaces_help();
|
||||||
|
return 0;
|
||||||
case HELP_ACTION_CONFIG_SECTIONS_FOR_COMPLETION:
|
case HELP_ACTION_CONFIG_SECTIONS_FOR_COMPLETION:
|
||||||
opt_mode_usage(argc, "--config-sections-for-completion",
|
opt_mode_usage(argc, "--config-sections-for-completion",
|
||||||
help_format);
|
help_format);
|
||||||
|
3
cache.h
3
cache.h
@ -475,8 +475,7 @@ extern struct index_state the_index;
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Values in this enum (except those outside the 3 bit range) are part
|
* Values in this enum (except those outside the 3 bit range) are part
|
||||||
* of pack file format. See Documentation/technical/pack-format.txt
|
* of pack file format. See gitformat-pack(5) for more information.
|
||||||
* for more information.
|
|
||||||
*/
|
*/
|
||||||
enum object_type {
|
enum object_type {
|
||||||
OBJ_BAD = -1,
|
OBJ_BAD = -1,
|
||||||
|
@ -43,6 +43,15 @@
|
|||||||
# specified here, which can only have "guide" attribute and nothing
|
# specified here, which can only have "guide" attribute and nothing
|
||||||
# else.
|
# else.
|
||||||
#
|
#
|
||||||
|
# User-facing repository, command and file interfaces such as
|
||||||
|
# documentation for the .gitmodules, .mailmap etc. files lives in man
|
||||||
|
# sections 5 and 7. These entries can only have the "userinterfaces"
|
||||||
|
# attribute and nothing else.
|
||||||
|
#
|
||||||
|
# Git's file formats and protocols, such as documentation for the
|
||||||
|
# *.bundle format lives in man section 5. These entries can only have
|
||||||
|
# the "developerinterfaces" attribute and nothing else.
|
||||||
|
#
|
||||||
### command list (do not change this line)
|
### command list (do not change this line)
|
||||||
# command name category [category] [category]
|
# command name category [category] [category]
|
||||||
git-add mainporcelain worktree
|
git-add mainporcelain worktree
|
||||||
@ -192,24 +201,35 @@ git-verify-tag ancillaryinterrogators
|
|||||||
git-whatchanged ancillaryinterrogators complete
|
git-whatchanged ancillaryinterrogators complete
|
||||||
git-worktree mainporcelain
|
git-worktree mainporcelain
|
||||||
git-write-tree plumbingmanipulators
|
git-write-tree plumbingmanipulators
|
||||||
gitattributes guide
|
gitattributes userinterfaces
|
||||||
gitcli guide
|
gitcli userinterfaces
|
||||||
gitcore-tutorial guide
|
gitcore-tutorial guide
|
||||||
gitcredentials guide
|
gitcredentials guide
|
||||||
gitcvs-migration guide
|
gitcvs-migration guide
|
||||||
gitdiffcore guide
|
gitdiffcore guide
|
||||||
giteveryday guide
|
giteveryday guide
|
||||||
gitfaq guide
|
gitfaq guide
|
||||||
|
gitformat-bundle developerinterfaces
|
||||||
|
gitformat-chunk developerinterfaces
|
||||||
|
gitformat-commit-graph developerinterfaces
|
||||||
|
gitformat-index developerinterfaces
|
||||||
|
gitformat-pack developerinterfaces
|
||||||
|
gitformat-signature developerinterfaces
|
||||||
gitglossary guide
|
gitglossary guide
|
||||||
githooks guide
|
githooks userinterfaces
|
||||||
gitignore guide
|
gitignore userinterfaces
|
||||||
gitk mainporcelain
|
gitk mainporcelain
|
||||||
gitmailmap guide
|
gitmailmap userinterfaces
|
||||||
gitmodules guide
|
gitmodules userinterfaces
|
||||||
gitnamespaces guide
|
gitnamespaces guide
|
||||||
|
gitprotocol-capabilities developerinterfaces
|
||||||
|
gitprotocol-common developerinterfaces
|
||||||
|
gitprotocol-http developerinterfaces
|
||||||
|
gitprotocol-pack developerinterfaces
|
||||||
|
gitprotocol-v2 developerinterfaces
|
||||||
gitremote-helpers guide
|
gitremote-helpers guide
|
||||||
gitrepository-layout guide
|
gitrepository-layout userinterfaces
|
||||||
gitrevisions guide
|
gitrevisions userinterfaces
|
||||||
gitsubmodules guide
|
gitsubmodules guide
|
||||||
gittutorial guide
|
gittutorial guide
|
||||||
gittutorial-2 guide
|
gittutorial-2 guide
|
||||||
|
39
help.c
39
help.c
@ -38,19 +38,30 @@ static struct category_description main_categories[] = {
|
|||||||
{ CAT_plumbinginterrogators, N_("Low-level Commands / Interrogators") },
|
{ CAT_plumbinginterrogators, N_("Low-level Commands / Interrogators") },
|
||||||
{ CAT_synchingrepositories, N_("Low-level Commands / Syncing Repositories") },
|
{ CAT_synchingrepositories, N_("Low-level Commands / Syncing Repositories") },
|
||||||
{ CAT_purehelpers, N_("Low-level Commands / Internal Helpers") },
|
{ CAT_purehelpers, N_("Low-level Commands / Internal Helpers") },
|
||||||
|
{ CAT_userinterfaces, N_("User-facing repository, command and file interfaces") },
|
||||||
|
{ CAT_developerinterfaces, N_("Developer-facing file file formats, protocols and interfaces") },
|
||||||
{ 0, NULL }
|
{ 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char *drop_prefix(const char *name, uint32_t category)
|
static const char *drop_prefix(const char *name, uint32_t category)
|
||||||
{
|
{
|
||||||
const char *new_name;
|
const char *new_name;
|
||||||
|
const char *prefix;
|
||||||
|
|
||||||
if (skip_prefix(name, "git-", &new_name))
|
switch (category) {
|
||||||
return new_name;
|
case CAT_guide:
|
||||||
if (category == CAT_guide && skip_prefix(name, "git", &new_name))
|
case CAT_userinterfaces:
|
||||||
|
case CAT_developerinterfaces:
|
||||||
|
prefix = "git";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
prefix = "git-";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (skip_prefix(name, prefix, &new_name))
|
||||||
return new_name;
|
return new_name;
|
||||||
|
|
||||||
return name;
|
return name;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void extract_cmds(struct cmdname_help **p_cmds, uint32_t mask)
|
static void extract_cmds(struct cmdname_help **p_cmds, uint32_t mask)
|
||||||
@ -426,6 +437,26 @@ void list_guides_help(void)
|
|||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void list_user_interfaces_help(void)
|
||||||
|
{
|
||||||
|
struct category_description catdesc[] = {
|
||||||
|
{ CAT_userinterfaces, N_("User-facing repository, command and file interfaces:") },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
print_cmd_by_category(catdesc, NULL);
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
void list_developer_interfaces_help(void)
|
||||||
|
{
|
||||||
|
struct category_description catdesc[] = {
|
||||||
|
{ CAT_developerinterfaces, N_("File formats, protocols and other developer interfaces:") },
|
||||||
|
{ 0, NULL }
|
||||||
|
};
|
||||||
|
print_cmd_by_category(catdesc, NULL);
|
||||||
|
putchar('\n');
|
||||||
|
}
|
||||||
|
|
||||||
static int get_alias(const char *var, const char *value, void *data)
|
static int get_alias(const char *var, const char *value, void *data)
|
||||||
{
|
{
|
||||||
struct string_list *list = data;
|
struct string_list *list = data;
|
||||||
|
2
help.h
2
help.h
@ -22,6 +22,8 @@ static inline void mput_char(char c, unsigned int num)
|
|||||||
void list_common_cmds_help(void);
|
void list_common_cmds_help(void);
|
||||||
void list_all_cmds_help(int show_external_commands, int show_aliases);
|
void list_all_cmds_help(int show_external_commands, int show_aliases);
|
||||||
void list_guides_help(void);
|
void list_guides_help(void);
|
||||||
|
void list_user_interfaces_help(void);
|
||||||
|
void list_developer_interfaces_help(void);
|
||||||
|
|
||||||
void list_all_main_cmds(struct string_list *list);
|
void list_all_main_cmds(struct string_list *list);
|
||||||
void list_all_other_cmds(struct string_list *list);
|
void list_all_other_cmds(struct string_list *list);
|
||||||
|
@ -22,7 +22,7 @@
|
|||||||
*
|
*
|
||||||
* - pack position refers to an object's position within a non-existent pack
|
* - pack position refers to an object's position within a non-existent pack
|
||||||
* described by the MIDX. The pack structure is described in
|
* described by the MIDX. The pack structure is described in
|
||||||
* Documentation/technical/pack-format.txt.
|
* gitformat-pack(5).
|
||||||
*
|
*
|
||||||
* It is effectively a concatanation of all packs in the MIDX (ordered by
|
* It is effectively a concatanation of all packs in the MIDX (ordered by
|
||||||
* their numeric ID within the MIDX) in their original order within each
|
* their numeric ID within the MIDX) in their original order within each
|
||||||
|
@ -69,7 +69,7 @@ int valid_remote_name(const char *name);
|
|||||||
struct strvec;
|
struct strvec;
|
||||||
/*
|
/*
|
||||||
* Determine what <prefix> values to pass to the peer in ref-prefix lines
|
* Determine what <prefix> values to pass to the peer in ref-prefix lines
|
||||||
* (see Documentation/technical/protocol-v2.txt).
|
* (see linkgit:gitprotocol-v2[5]).
|
||||||
*/
|
*/
|
||||||
void refspec_ref_prefixes(const struct refspec *rs,
|
void refspec_ref_prefixes(const struct refspec *rs,
|
||||||
struct strvec *ref_prefixes);
|
struct strvec *ref_prefixes);
|
||||||
|
@ -44,6 +44,8 @@ test_expect_success 'invalid usage' '
|
|||||||
test_expect_code 129 git help -g add &&
|
test_expect_code 129 git help -g add &&
|
||||||
test_expect_code 129 git help -a -g &&
|
test_expect_code 129 git help -a -g &&
|
||||||
|
|
||||||
|
test_expect_code 129 git help --user-interfaces add &&
|
||||||
|
|
||||||
test_expect_code 129 git help -g -c &&
|
test_expect_code 129 git help -g -c &&
|
||||||
test_expect_code 129 git help --config-for-completion add &&
|
test_expect_code 129 git help --config-for-completion add &&
|
||||||
test_expect_code 129 git help --config-sections-for-completion add
|
test_expect_code 129 git help --config-sections-for-completion add
|
||||||
@ -104,9 +106,9 @@ test_expect_success 'git help' '
|
|||||||
test_i18ngrep "^ commit " help.output &&
|
test_i18ngrep "^ commit " help.output &&
|
||||||
test_i18ngrep "^ fetch " help.output
|
test_i18ngrep "^ fetch " help.output
|
||||||
'
|
'
|
||||||
|
|
||||||
test_expect_success 'git help -g' '
|
test_expect_success 'git help -g' '
|
||||||
git help -g >help.output &&
|
git help -g >help.output &&
|
||||||
test_i18ngrep "^ attributes " help.output &&
|
|
||||||
test_i18ngrep "^ everyday " help.output &&
|
test_i18ngrep "^ everyday " help.output &&
|
||||||
test_i18ngrep "^ tutorial " help.output
|
test_i18ngrep "^ tutorial " help.output
|
||||||
'
|
'
|
||||||
@ -127,6 +129,12 @@ test_expect_success 'git help succeeds without git.html' '
|
|||||||
test_cmp expect test-browser.log
|
test_cmp expect test-browser.log
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'git help --user-interfaces' '
|
||||||
|
git help --user-interfaces >help.output &&
|
||||||
|
grep "^ attributes " help.output &&
|
||||||
|
grep "^ mailmap " help.output
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'git help -c' '
|
test_expect_success 'git help -c' '
|
||||||
git help -c >help.output &&
|
git help -c >help.output &&
|
||||||
cat >expect <<-\EOF &&
|
cat >expect <<-\EOF &&
|
||||||
@ -220,6 +228,10 @@ test_expect_success "'git help -a' section spacing" '
|
|||||||
Low-level Commands / Syncing Repositories
|
Low-level Commands / Syncing Repositories
|
||||||
|
|
||||||
Low-level Commands / Internal Helpers
|
Low-level Commands / Internal Helpers
|
||||||
|
|
||||||
|
User-facing repository, command and file interfaces
|
||||||
|
|
||||||
|
Developer-facing file file formats, protocols and interfaces
|
||||||
EOF
|
EOF
|
||||||
test_cmp expect actual
|
test_cmp expect actual
|
||||||
'
|
'
|
||||||
|
@ -181,8 +181,8 @@ test_expect_success 'no-op half-auth fetch does not require a password' '
|
|||||||
# This is not possible with protocol v2, since both objects and refs
|
# This is not possible with protocol v2, since both objects and refs
|
||||||
# are obtained from the "git-upload-pack" path. A solution to this is
|
# are obtained from the "git-upload-pack" path. A solution to this is
|
||||||
# to teach the server and client to be able to inline ls-refs requests
|
# to teach the server and client to be able to inline ls-refs requests
|
||||||
# as an Extra Parameter (see pack-protocol.txt), so that "info/refs"
|
# as an Extra Parameter (see "git help gitformat-pack-protocol"), so that
|
||||||
# can serve refs, just like it does in protocol v0.
|
# "info/refs" can serve refs, just like it does in protocol v0.
|
||||||
GIT_TEST_PROTOCOL_VERSION=0 git --git-dir=half-auth fetch &&
|
GIT_TEST_PROTOCOL_VERSION=0 git --git-dir=half-auth fetch &&
|
||||||
expect_askpass none
|
expect_askpass none
|
||||||
'
|
'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user