Git push to checkout?

You now how “push-to-deploy” (git 2.4, May 2015), which improves on “push-to-checkout” (Git 2.3, February 2015).

See “Deploy a project using Git push” for a concrete example.

In short, you can push directly to a checked out branch (with caveats).
See commit 4d7a5ce


Update: With Git 2.30 (Q1 2021), you now have a sample ‘push-to-checkout‘ hook, that performs the same as what the built-in default action does.

See commit e632c46 (15 Oct 2020) by Adam Spiers (aspiers).
(Merged by Junio C Hamano — gitster in commit df7f850, 02 Nov 2020)

hook: add sample template for push-to-checkout

Signed-off-by: Adam Spiers

The template is a more-or-less exact translation to shell of the C code for the default behaviour for git’s push-to-checkout hook defined in the push_to_deploy() function in builtin/receive-pack.c, to serve as a convenient starting point for modification.

It also contains relevant text extracted from the git-config(1) and githooks(5) man pages.

That is:

An example hook script to update a checked-out tree on a git push.

This hook is invoked by git-receive-pack when it reacts to git push and updates reference(s) in its repository, and when the push tries to update the branch that is currently checked out and the receive.denyCurrentBranch configuration variable is set to updateInstead.

By default, such a push is refused if the working tree and the index
of the remote repository has any difference from the currently
checked out commit; when both the working tree and the index match
the current commit, they are updated to match the newly pushed tip
of the branch.

This hook is to be used to override the default
behaviour; however the code below reimplements the default behaviour
as a starting point for convenient modification.

The hook receives the commit with which the tip of the current
branch is going to be updated:

commit=$1

It can exit with a non-zero status to refuse the push (when it does
so, it must not modify the index or the working tree).

die () {
   echo >&2 "$*"
   exit 1
}

Or it can make any necessary changes to the working tree and to the
index to bring them to the desired state when the tip of the current
branch is updated to the new commit, and exit with a zero status.

For example, the hook can simply run git read-tree -u -m HEAD "$1"
in order to emulate git fetch that is run in the reverse direction
with git push, as the two-tree form of git read-tree -u -m is
essentially the same as git switch or git checkout that switches
branches while keeping the local changes in the working tree that do
not interfere with the difference between the branches.

The below is a more-or-less exact translation to shell of the C code
for the default behaviour for git’s push-to-checkout hook defined in
the push_to_deploy() function in builtin/receive-pack.c.

Note that the hook will be executed from the repository directory,
not from the working tree, so if you want to perform operations on
the working tree, you will have to adapt your code accordingly, e.g.
by adding “cd ..” or using relative paths.

Leave a Comment