Merge branch 'jk/quarantine-received-objects'
Add finishing touches to a recent topic. * jk/quarantine-received-objects: refs: reject ref updates while GIT_QUARANTINE_PATH is set receive-pack: document user-visible quarantine effects receive-pack: drop tmp_objdir_env from run_update_hook
This commit is contained in:
commit
9f1384f711
@ -114,6 +114,8 @@ will be performed, and the update, post-receive and post-update
|
||||
hooks will not be invoked either. This can be useful to quickly
|
||||
bail out if the update is not to be supported.
|
||||
|
||||
See the notes on the quarantine environment below.
|
||||
|
||||
update Hook
|
||||
-----------
|
||||
Before each ref is updated, if $GIT_DIR/hooks/update file exists
|
||||
@ -214,6 +216,33 @@ if the repository is packed and is served via a dumb transport.
|
||||
exec git update-server-info
|
||||
|
||||
|
||||
Quarantine Environment
|
||||
----------------------
|
||||
|
||||
When `receive-pack` takes in objects, they are placed into a temporary
|
||||
"quarantine" directory within the `$GIT_DIR/objects` directory and
|
||||
migrated into the main object store only after the `pre-receive` hook
|
||||
has completed. If the push fails before then, the temporary directory is
|
||||
removed entirely.
|
||||
|
||||
This has a few user-visible effects and caveats:
|
||||
|
||||
1. Pushes which fail due to problems with the incoming pack, missing
|
||||
objects, or due to the `pre-receive` hook will not leave any
|
||||
on-disk data. This is usually helpful to prevent repeated failed
|
||||
pushes from filling up your disk, but can make debugging more
|
||||
challenging.
|
||||
|
||||
2. Any objects created by the `pre-receive` hook will be created in
|
||||
the quarantine directory (and migrated only if it succeeds).
|
||||
|
||||
3. The `pre-receive` hook MUST NOT update any refs to point to
|
||||
quarantined objects. Other programs accessing the repository will
|
||||
not be able to see the objects (and if the pre-receive hook fails,
|
||||
those refs would become corrupted). For safety, any ref updates
|
||||
from within `pre-receive` are automatically rejected.
|
||||
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkgit:git-send-pack[1], linkgit:gitnamespaces[7]
|
||||
|
@ -256,6 +256,9 @@ environment variables will not be set. If the client selects
|
||||
to use push options, but doesn't transmit any, the count variable
|
||||
will be set to zero, `GIT_PUSH_OPTION_COUNT=0`.
|
||||
|
||||
See the section on "Quarantine Environment" in
|
||||
linkgit:git-receive-pack[1] for some caveats.
|
||||
|
||||
[[update]]
|
||||
update
|
||||
~~~~~~
|
||||
|
@ -772,7 +772,6 @@ static int run_update_hook(struct command *cmd)
|
||||
proc.stdout_to_stderr = 1;
|
||||
proc.err = use_sideband ? -1 : 0;
|
||||
proc.argv = argv;
|
||||
proc.env = tmp_objdir_env(tmp_objdir);
|
||||
|
||||
code = start_command(&proc);
|
||||
if (code)
|
||||
|
6
refs.c
6
refs.c
@ -1643,6 +1643,12 @@ int ref_transaction_commit(struct ref_transaction *transaction,
|
||||
{
|
||||
struct ref_store *refs = transaction->ref_store;
|
||||
|
||||
if (getenv(GIT_QUARANTINE_ENVIRONMENT)) {
|
||||
strbuf_addstr(err,
|
||||
_("ref updates forbidden inside quarantine environment"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return refs->be->transaction_commit(refs, transaction, err);
|
||||
}
|
||||
|
||||
|
@ -58,4 +58,15 @@ test_expect_success 'push to repo path with path separator (colon)' '
|
||||
git push "$(pwd)/xxx${pathsep}yyy.git" HEAD
|
||||
'
|
||||
|
||||
test_expect_success 'updating a ref from quarantine is forbidden' '
|
||||
git init --bare update.git &&
|
||||
write_script update.git/hooks/pre-receive <<-\EOF &&
|
||||
read old new refname
|
||||
git update-ref refs/heads/unrelated $new
|
||||
exit 1
|
||||
EOF
|
||||
test_must_fail git push update.git HEAD &&
|
||||
git -C update.git fsck
|
||||
'
|
||||
|
||||
test_done
|
||||
|
Loading…
Reference in New Issue
Block a user