Git пост-обновление script не работает
После редактирования моего старого вопроса несколько раз я создаю новый, потому что это новый вопрос.
В .git/hooks/post-update
у меня есть:
echo "a" >> /home/pi/log
git update-server-info
git stash
git merge testing >> /home/pi/log
Сделать автоматическую проверку. Поэтому я запускаю клиент:
git push testing HEAD:testing
Теперь мой /home/pi/log
содержит:
a
Updating ae2f44b..04753a9
Fast-forward
application/views/main/index.php | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
Но файл не изменился!
$ git merge testing
Already up-to-date.
Если я удалю script, сделайте push и запустите git stash
, git merge testing
он будет работать.
Обновление
Для тестирования я изменил число в файле с 17 на 20. Я могу увидеть правильную версию файла, если я запустил
git show application/views/main/index.php
но
vim application/views/main/index.php
Все еще содержит старое число. Но git утверждает, что файл обновлен:
$ git merge testing
Already up-to-date.
Ответы
Ответ 1
Решение состоит в том, чтобы использовать post-receive
, как указал Алекс. Также вам нужно запустить unset GIT_DIR
в верхней части вашего script.
На сервере я создал вторую ветвь и переключился на нее:
$ git branch
master
* testing
Теперь мой .git/hooks/post-receive
выглядит следующим образом:
unset GIT_DIR
cd ..
git merge master
На клиенте я запускаю git push
.
Ответ 2
ИЗМЕНИТЬ
Похоже на это ваша проблема:
pre-receive
update
post-receive
post-update
Эти крючки могут запускаться либо в голом, либо в виде не-голого репозитория. В обоих случаев, текущий рабочий каталог будет git. Итак, если это это голый репозиторий под названием "/src/git/test.git/", который будет текущим рабочий каталог - если это не-голый репозиторий и верхний уровень рабочим деревом является "/home/mark/test/", затем текущий рабочий каталог будет "/home/mark/test/.git/".
В обоих случаях устанавливается следующая переменная среды: GIT_DIR
установлено значение '.
С рабочим деревом это неожиданно неудобно, как описано в Chris Джонсен отвечает, что я связан с ранее. Если задано только GIT_DIR
, тогда этот комментарий из справочной страницы git применяется:
Примечание. Если указаны --git-dir
или GIT_DIR
, но ни один из --work-tree,
GIT_WORK_TREE
и core.worktree
, текущий рабочий каталог рассматривается как верхний каталог вашего рабочего дерева.
Другими словами, ваше рабочее дерево также будет текущим каталогом ( ".git" ), который почти наверняка не является тем, что вы хотите.
Вы можете попробовать установить GIT_WORK_TREE=..
или GIT_WORK_TREE="$GIT_DIR/.."
внутри крюка
Но файл не изменился!
Скорее всего, так оно и было. Возможно, это было сделано только в виде лирификации, или были изменения в пробелах, которые игнорируются при просмотре различий, но они изменились. git знает, потому что сумма SHA1 содержимого файла изменилась.
Используете ли вы окна с обоих концов?
Windows имеет тенденцию конфликтовать с концами строк. Смотрите core.autocrlf и связанные с ним варианты:
Ответ 3
Вместо этого вы пытались использовать post-receive
? Возможно, что-то еще не закончилось в post-update
, и поэтому слияние не работает.
Также я думаю, вы должны попытаться включить git reset --hard
в script, чтобы статус git синхронизировался с файловой системой.