Когда вы отправляете в (общий) git-репозиторий, он не обновляет рабочие файлы этого репозитория. В основном потому, что рабочие файлы могут быть грязными, и в этом случае вам придется объединяться - и для этого вам необходим полный доступ к оболочке, что может быть не так в общем случае.
Если вы хотите, чтобы где-нибудь был извлечен последний «мастер» общего репо, вы можете договориться об этом, написав хук после обновления. Ниже я приведу пример, который я использую, чтобы проверить подкаталог «ui» и сделать его доступным для Apache.
Однако я скажу, что я думаю, что ваш процесс может быть улучшен. Разработчикам, как правило, нужны персональные серверы, на которых они могли бы протестировать, прежде чем отправлять их в общую точку: в противном случае это общее хранилище, вероятно, будет ужасно ненадежным. Подумайте, если я настаиваю на том, чтобы оно изменилось, и оно не сработало, это мое изменение, которое сломало его, или побочный эффект кого-то другого?
ОК, я использую это как ловушку после обновления:
#!/bin/sh
# Should be run from a Git repository, with a set of refs to update from on the command line.
# This is the post-update hook convention.
info() {
echo "post-update: $@"
}
die() {
echo "post-update: $@" >&2
exit 1
}
output_dir=..
for refname in "$@"; do
case $refname in
refs/heads/master)
new_tree_id=$(git rev-parse $refname:ui)
new_dir="$output_dir/tree-$new_tree_id"
if [ ! -d "$new_dir" ]; then
info "Checking out UI"
mkdir "$new_dir"
git archive --format=tar $new_tree_id | ( cd $new_dir && tar xf - )
fi
prev_link_target=$(readlink $output_dir/current)
if [ -n "$prev_link_target" -a "$prev_link_target" = "tree-$new_tree_id" ]; then
info "UI unchanged"
else
rm -f $output_dir/current
ln -snf "tree-$new_tree_id" "$output_dir/current"
info "UI updated"
title=$(git show --quiet --pretty="format:%s" "$refname" | \
sed -e 's/[^A-Za-z][^A-Za-z]*/_/g')
date=$(git show --quiet --pretty="format:%ci" "$refname" | \
sed -e 's/\([0-9]*\)-\([0-9]*\)-\([0-9]*\) \([0-9]*\):\([0-9]*\):\([0-9]*\) +0000/\1\2\3T\4\5\6Z/')
ln -s "tree-$new_tree_id" "$output_dir/${date}__${title}"
fi
;;
esac
done
Как уже упоминалось, это просто проверяет подкаталог "ui". Это бит ": ui", устанавливающий new_tree_id. Просто извлеките «: ui» (или измените на «^ {tree}»), чтобы проверить все.
Оформление заказа происходит в каталоге, содержащем git-репо, управляемый output_dir. Предполагается, что скрипт будет запущен внутри git-репозитория (который, в свою очередь, ожидается пустым): он не очень чистый.
Оформления оформляются в каталоги «tree-XXXX», и «текущая» символическая ссылка может указывать на самую последнюю. Это делает переход от одного к другому атомарным, хотя вряд ли это займет так много времени, что это имеет значение. Это также означает, что можно повторно использовать старые файлы. И это также означает, что он жует дисковое пространство, когда вы продолжаете выдвигать ревизии ...