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 синхронизировался с файловой системой.