Cập nhật tháng 3 năm 2015
Như tôi đã đề cập trong "What is this Git warning message when pushing changes to a remote repository?", bạn thực sự có thể đẩy trực tiếp đến một repo phi trần bây giờ (Git 2.3.0+, tháng 2 năm 2015) với:
git config receive.denyCurrentBranch updateInstead
cập nhật cây làm việc cho phù hợp, nhưng từ chối làm như vậy nếu có bất kỳ thay đổi không bị giam.
Điều đó sẽ cho phép bạn tránh bất kỳ móc hậu sau khi nhận.
(Original câu trả lời: Tháng 10 năm 2010)
Các GitFAQ khuyến cáo cho non-bare repo sau bản cập nhật này móc:
(nó có thể cung cấp cho bạn đầu mối nhiều như những gì đang thực sự xảy ra trong việc thực hiện móc. Lưu ý đây là một cái móc hậu cập nhật, không phải là một hậu nhận)
#!/bin/sh
#
# This hook does two things:
#
# 1. update the "info" files that allow the list of references to be
# queries over dumb transports such as http
#
# 2. if this repository looks like it is a non-bare repository, and
# the checked-out branch is pushed to, then update the working copy.
# This makes "push" function somewhat similarly to darcs and bzr.
#
# To enable this hook, make this file executable by "chmod +x post-update".
git-update-server-info
is_bare=$(git-config --get --bool core.bare)
if [ -z "$is_bare" ]
then
# for compatibility's sake, guess
git_dir_full=$(cd $GIT_DIR; pwd)
case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac
fi
update_wc() {
ref=$1
echo "Push to checked out branch $ref" >&2
if [ ! -f $GIT_DIR/logs/HEAD ]
then
echo "E:push to non-bare repository requires a HEAD reflog" >&2
exit 1
fi
if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null)
then
wc_dirty=0
else
echo "W:unstaged changes found in working copy" >&2
wc_dirty=1
desc="working copy"
fi
if git diff-index --cached [email protected]{1} >/dev/null
then
index_dirty=0
else
echo "W:uncommitted, staged changes found" >&2
index_dirty=1
if [ -n "$desc" ]
then
desc="$desc and index"
else
desc="index"
fi
fi
if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ]
then
new=$(git rev-parse HEAD)
echo "W:stashing dirty $desc - see git-stash(1)" >&2
(trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT
git-update-ref --no-deref HEAD [email protected]{1}
cd $GIT_WORK_TREE
git stash save "dirty $desc before update to $new";
git-symbolic-ref HEAD "$ref"
)
fi
# eye candy - show the WC updates :)
echo "Updating working copy" >&2
(cd $GIT_WORK_TREE
git-diff-index -R --name-status HEAD >&2
git-reset --hard HEAD)
}
if [ "$is_bare" = "false" ]
then
active_branch=`git-symbolic-ref HEAD`
export GIT_DIR=$(cd $GIT_DIR; pwd)
GIT_WORK_TREE=${GIT_WORK_TREE-..}
for ref
do
if [ "$ref" = "$active_branch" ]
then
update_wc $ref
fi
done
fi
để làm việc này, bạn vẫn sẽ cần phải đặc biệt cho phép đẩy thay đổi đối với chi nhánh hiện tại bằng cách sử dụng một trong hai trên e của các thiết lập cấu hình:
git config receive.denyCurrentBranch ignore
hoặc
git config receive.denyCurrentBranch warn
@VonC: Phần quan trọng nhất trong [câu trả lời của bạn] (http://stackoverflow.com/ các câu hỏi/3838727/git-post-receive-hook-cho-trang web-dàn/3838796 # 3838796) được viết chủ yếu bằng ngôn ngữ 'bash', trong khi downvoter có thể đã khẳng định bản địa của mình;) – takeshin