То, что вы пытаетесь сделать вручную, это то, для чего предназначены инструменты, такие как Capistrano, и они сделают это лучше (например, ваша версия не является атомарной, поэтому на вашем сайте есть сочетание старых/новых файлов для в то время как capistrano проверит ваше дерево в каталоге, а затем укажет на него символическую ссылку, которая является атомарной).
Если вы остаетесь с «git checkout», тогда «git checkout development» проверит ветку разработки, поэтому вы хотите выполнить эту команду, когда получите обновление ref для разработки. Сценарий будет идти по линии:
#!/bin/sh
while read old new refname
do
case "$refname" in
refs/heads/master)
git --work-tree=/var/www/mywebsite.com --git-dir=/var/repo/mywebsite.com.git checkout -f
;;
refs/heads/development)
git --work-tree=/var/www/mywebsite.com.dev --git-dir=/var/repo/mywebsite.com.git checkout -f refs/heads/development
;;
esac
done
Теперь мы можем улучшить сценарий несколькими способами:
На самом деле, так как крюк получает новое значение реф, вы даже не требуется имя филиала и может использовать вместо него $ new (более надежный, если в ближайшее время будет доступно несколько обновлений обновления).
Для повышения эффективности мы можем сохранить один индексный файл на кассу (так что неизмененные файлы не должны быть на самом деле извлеченным)
--git-Dir варианта можно опустить, так как мы проверка из текущего каталога (крюк выполняется в репозитории).
Усовершенствованный сценарий:
#!/bin/sh
while read old new refname
do
case "$refname" in
refs/heads/master)
GIT_INDEX_FILE="$PWD"/index.master git --work-tree=/tmp/www/mywebsite.com checkout -f $new
;;
refs/heads/development)
GIT_INDEX_FILE="$PWD"/index.development git --work-tree=/tmp/www/mywebsite.com.dev checkout -f $new
;;
esac
done
На схожую тему, вы можете также посмотреть на новое значение updateInstead
для receive.denyCurrentBranch
введенного в Git 2.3. См. Например раздел «Push to deploy» на странице https://github.com/blog/1957-git-2-3-has-been-released
Как выглядит ваш «пост-прием»? Он должен считывать строки со стандартного ввода, которые описывают каждую ветвь (ref, фактически), которая была нажата на удаленный, и используя каждую строку для создания соответствующего вызова 'git checkout'. – chepner
Возможно, с 'git archive'? – twalberg