Git: Хук после обновления, который запускает скрипт, которому нужен доступ ко всем файлам в хранилище - PullRequest
2 голосов
/ 13 октября 2009

В настоящий момент я сталкиваюсь с некоторой дилеммой: мне нужен скрипт, который запускается при обновлении удаленного репозитория (т. Е. Всякий раз, когда кто-то запускает git push), который собирает пакеты из файлов в репозитории. Эти пакеты затем помещаются в каталог на git-сервере, который предоставляется клиентам через HTTP для дальнейшего использования.

Проблема в том, что я не уверен, как получить доступ к файлам в хранилище в хуке после обновления.

Если кто-то может дать какое-то понимание, это будет очень ценно.

Ответы [ 2 ]

3 голосов
/ 13 октября 2009

Прежде всего, вы можете захотеть использовать хук post-receive вместо пост-обновления. Согласно справочной странице githooks (5) , пост-получение заменяет пост-обновление.

Тем не менее, ваш скрипт-ловушка выполняется в подкаталоге .git / hooks, так что если вы выполните простую

cd ..

ваш скрипт находится в рабочем дереве репозитория git. Например, вот небольшой скрипт, который гарантирует, что рабочее дерево удаленного репозитория git обновляется всякий раз, когда вы отправляете в репозиторий:

#!/bin/sh
export GIT_DIR=
cd ..
echo "Resetting working tree..."
git reset --hard
echo "Finished resetting working tree."

Обратите внимание, что вам нужно отключить переменную среды GIT_DIR; он устанавливается автоматически, и до тех пор, пока он установлен, все команды git будут выполняться в этом каталоге - независимо от того, куда вы перешли.

1 голос
/ 15 октября 2009

Если ваш удаленный репозиторий является чистым общим репо, то копии файлов нет. Вы можете изменить это, и тогда вам просто нужно будет выполнить автоматическую проверку.

если ваши файлы упаковываются, лучше всего иметь репозиторий в отдельном каталоге

Я использую следующее для точной цели, которую вы назвали

вот блог, который показал мне, как его настроить http://toroid.org/ams/git-website-howto

вот мои сокращенные заметки ниже

создайте каталог вне репозитория и поместите туда рабочее дерево, затем сделайте его больше не пустым репозиторием, чтобы была копия файлов, затем запустите перед запуском сценария упаковки

            # create the repo with files that live in a seperate folder
            cd /share/proj/all/$1/repo
            git --bare init --shared
            git config core.worktree ../actual
            git config core.bare false
            git config receive.denycurrentbranch ignore
            # add a hook to checkout the repo into the files directory automatically on push
            echo "#!/bin/sh" > hooks/post-receive
            echo "git checkout -f" >> hooks/post-receive
            chmod +x hooks/post-receive
...