Files
git/Documentation/git-http-fetch.adoc
Ted Nyman 5e855d9b42 http: avoid concurrent appends to partial packs
Pack requests stage downloads in a predictable partial-pack file so an
interrupted transfer can be resumed. Both packfile URI and ordinary dumb
HTTP requests use this staging path. Opening it in append mode forces
each write to the current end of the file, so concurrent responses can
append duplicate data and corrupt the pack.

Open the partial pack read-write without O_APPEND and seek once to its
current end. Each downloader then retains the offset matching the Range
it requested. Because the staging key must uniquely identify immutable
pack contents, overlapping responses write the same bytes at the same
offsets instead of extending the file with duplicate data.

Duplicate the staging descriptor for index-pack instead of reopening the
path after closing the stream. Another downloader may unlink the staging
path before indexing begins, but index-pack can still read the retained
descriptor.

Exercise resumed transfers and overlapping 200 and 206 responses, and
clarify the staging-key documentation.

Signed-off-by: Ted Nyman <tnyman@openai.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2026-07-27 12:57:20 -07:00

68 lines
1.9 KiB
Plaintext

git-http-fetch(1)
=================
NAME
----
git-http-fetch - Download from a remote Git repository via HTTP
SYNOPSIS
--------
[verse]
'git http-fetch' [-c] [-t] [-a] [-d] [-v] [-w <filename>] [--recover] [--stdin | --packfile=<hash> | <commit>] <URL>
DESCRIPTION
-----------
Downloads a remote Git repository via HTTP.
This command always gets all objects. Historically, there were three options
`-a`, `-c` and `-t` for choosing which objects to download. They are now
silently ignored.
OPTIONS
-------
commit-id::
Either the hash or the filename under [URL]/refs/ to
pull.
-a::
-c::
-t::
These options are ignored for historical reasons.
-v::
Report what is downloaded.
-w <filename>::
Writes the commit-id into the specified filename under $GIT_DIR/refs/<filename> on
the local end after the transfer is complete.
--stdin::
Instead of a commit id on the command line (which is not expected in this
case), 'git http-fetch' expects lines on stdin in the format
<commit-id>['\t'<filename-as-in--w>]
--packfile=<hash>::
For internal use only. Instead of a commit id on the command
line (which is not expected in
this case), 'git http-fetch' fetches the packfile directly at the given
URL and uses index-pack to generate corresponding .idx and .keep files.
The hash is used to determine the name of the temporary file. It need
not be the pack hash, but it must uniquely identify the pack contents
for resumption. The output of index-pack is printed to stdout. Requires
one or more --index-pack-arg options.
--index-pack-arg=<arg>::
For internal use only. The first instance specifies the command run on
the contents of the downloaded pack. Subsequent instances specify its
arguments.
--recover::
Verify that everything reachable from target is fetched. Used after
an earlier fetch is interrupted.
GIT
---
Part of the linkgit:git[1] suite