Назад | Перейти на главную страницу

Не можете вызвать «git reset» внутри обработчика git post-update?

Я создал репозиторий git для своей веб-страницы (это простой HTML, созданный из разметки Пандок). Репозиторий будет обновляться только мной удаленно, и я успешно настроил его для работы с HTTPS.

Теперь это не пустой репозиторий - никто не будет обновлять репозиторий или рабочее дерево локально на сервере, поэтому я просто храню там рабочую копию и делаю ее доступной для публикации на веб-сервере.

Все отлично работает, но - Мне нужно, чтобы рабочее дерево автоматически обновлялось каждый раз, когда я отправляю изменения на сервер, поэтому я написал следующее post-update скрипт (в примере рабочее дерево находится в /path/git/me, а репозиторий в /path/git/me/.git):

#!/bin/bash

(cd /path/git/me/ && echo "running git reset --hard on `pwd`" && git reset --hard)

(cd /path/git/me/ && pandoc -s -o index.html index.md)

И когда я бегу git push, хук выполняется, но происходит что-то действительно странное:

Ниже приводится стенограмма толчка:

$ GIT_TRACE=1 git push
12:21:12:21:27.088581 run-command.c:347       trace: run_command: 'git-remote-https' 'origin' 'https://server.org/git/me'
Username for 'https://server.org': me
Password for 'https://me@server.org': 
12:21:32.624468 run-command.c:347       trace: run_command: 'send-pack' '--stateless-rpc' '--helper-status' '--thin' '--progress' 'https://server.org/git/me/' '--stdin'
12:21:32.627833 exec_cmd.c:128          trace: exec: 'git' 'send-pack' '--stateless-rpc' '--helper-status' '--thin' '--progress' 'https://server.org/git/me/' '--stdin'
12:21:32.633026 git.c:348               trace: built-in: git 'send-pack' '--stateless-rpc' '--helper-status' '--thin' '--progress' 'https://server.org/git/me/' '--stdin'
12:21:32.634024 run-command.c:347       trace: run_command: 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
12:21:32.634538 exec_cmd.c:128          trace: exec: 'git' 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
12:21:32.636701 git.c:348               trace: built-in: git 'pack-objects' '--all-progress-implied' '--revs' '--stdout' '--thin' '--delta-base-offset' '--progress'
Counting objects: 2, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 223 bytes | 0 bytes/s, done.
Total 2 (delta 1), reused 0 (delta 0)
remote: running git reset --hard on /path/git/me
remote: fatal: Not a git repository: '.'
To https://server.org/git/me
   93be2f2..9cc7a28  master -> master

Что я здесь сделал не так и как мне заставить ловушку запускать команды по назначению?

Я нашел проблему!

Во время выполнения хука переменные GIT_DIR и GIT_WORK_TREE установлены, и git проигнорирует текущий каталог. И кажется, что я могу явно передать каталоги в git:

git --git-dir /path/git/me/.git --work-tree /path/git/me/ reset --hard

Теперь все работает!