.git/hooks/push-to-checkout.sample
author Pascal Volk <user@localhost.localdomain.org>
Sun, 21 Nov 2021 22:04:40 +0000
changeset 762 0147c0a9ce2b
permissions -rwxr-xr-x
Added a README and the files of the empty vmm.git Simply `git pull` it.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
762
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     1
#!/bin/sh
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     2
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     3
# An example hook script to update a checked-out tree on a git push.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     4
#
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     5
# This hook is invoked by git-receive-pack(1) when it reacts to git
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     6
# push and updates reference(s) in its repository, and when the push
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     7
# tries to update the branch that is currently checked out and the
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     8
# receive.denyCurrentBranch configuration variable is set to
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
     9
# updateInstead.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    10
#
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    11
# By default, such a push is refused if the working tree and the index
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    12
# of the remote repository has any difference from the currently
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    13
# checked out commit; when both the working tree and the index match
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    14
# the current commit, they are updated to match the newly pushed tip
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    15
# of the branch. This hook is to be used to override the default
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    16
# behaviour; however the code below reimplements the default behaviour
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    17
# as a starting point for convenient modification.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    18
#
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    19
# The hook receives the commit with which the tip of the current
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    20
# branch is going to be updated:
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    21
commit=$1
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    22
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    23
# It can exit with a non-zero status to refuse the push (when it does
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    24
# so, it must not modify the index or the working tree).
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    25
die () {
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    26
	echo >&2 "$*"
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    27
	exit 1
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    28
}
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    29
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    30
# Or it can make any necessary changes to the working tree and to the
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    31
# index to bring them to the desired state when the tip of the current
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    32
# branch is updated to the new commit, and exit with a zero status.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    33
#
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    34
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    35
# in order to emulate git fetch that is run in the reverse direction
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    36
# with git push, as the two-tree form of git read-tree -u -m is
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    37
# essentially the same as git switch or git checkout that switches
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    38
# branches while keeping the local changes in the working tree that do
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    39
# not interfere with the difference between the branches.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    40
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    41
# The below is a more-or-less exact translation to shell of the C code
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    42
# for the default behaviour for git's push-to-checkout hook defined in
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    43
# the push_to_deploy() function in builtin/receive-pack.c.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    44
#
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    45
# Note that the hook will be executed from the repository directory,
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    46
# not from the working tree, so if you want to perform operations on
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    47
# the working tree, you will have to adapt your code accordingly, e.g.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    48
# by adding "cd .." or using relative paths.
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    49
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    50
if ! git update-index -q --ignore-submodules --refresh
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    51
then
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    52
	die "Up-to-date check failed"
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    53
fi
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    54
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    55
if ! git diff-files --quiet --ignore-submodules --
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    56
then
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    57
	die "Working directory has unstaged changes"
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    58
fi
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    59
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    60
# This is a rough translation of:
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    61
#
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    62
#   head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    63
if git cat-file -e HEAD 2>/dev/null
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    64
then
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    65
	head=HEAD
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    66
else
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    67
	head=$(git hash-object -t tree --stdin </dev/null)
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    68
fi
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    69
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    70
if ! git diff-index --quiet --cached --ignore-submodules $head --
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    71
then
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    72
	die "Working directory has staged changes"
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    73
fi
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    74
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    75
if ! git read-tree -u -m "$commit"
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    76
then
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    77
	die "Could not update working tree to new HEAD"
0147c0a9ce2b Added a README and the files of the empty vmm.git
Pascal Volk <user@localhost.localdomain.org>
parents:
diff changeset
    78
fi