Повторное использование GIT_WORK_TREE в post-receive hook для rm нескольких файлов
Я использовал этот "учебник" для настройки среды DSP: http://toroid.org/ams/git-website-howto (Да, у меня нет T).
Мой рабочий процесс очень прост:
- Разработка локально (D)
- Сделайте несколько вещей
- Сделать больше вещей
- Push to Staging (и Github) (S)
- Проверить новый код на этапе
- Push to Production (P)
В моем коде содержатся файлы CSS, которые были уменьшены моим кодом, а затем сохранены в 1 файл: all.css
. Локально, я отключил этот параметр, поэтому мне не нужно вручную удалять all.css
все время, когда я меняю свой CSS. В разделе "Создание и производство" они должны кэшировать как можно скорее (поэтому создайте all.css
из отдельных файлов CSS).
Проблема возникает каждый раз, когда я нажимаю, мне нужно удалить all.css
(и all.js
- такую же точную историю), чтобы увидеть изменения (и правильно протестировать).
В учебнике я сделал крючок post-receive
, который проверяет изменения в определенной папке (где Apache читает код).
Мой текущий post-receive
hook:
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
Я хочу повторно использовать $GIT_WORK_TREE
, чтобы удалить два файла внутри $GIT_WORK_TREE
(будучи www/all.css
и www/all.js
), но я не могу... На следующей строке не существует var $GIT_WORK_TREE.
Итак, я изменил его на это, но мне это не нравится, особенно если я хочу сделать больше с ним в будущем:
#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
rm /var/www/www.example.org/www/all.css
rm /var/www/www.example.org/www/all.js
$GIT_WORK_TREE
НЕ используется повторно.
Вещи, которые я пробовал, которые не работают:
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
rm $GIT_WORK_TREE/www/all.css
rm $GIT_WORK_TREE/www/all.js
rm: файл не существует и т.д. (/www/all.css) ($GIT_WORK_TREE
пусто)
GIT_WORK_TREE=/var/www/www.example.org
git checkout -f
fatal: эта операция должна выполняться в дереве работ
GIT_WORK_TREE=/var/www/www.example.org
cd $GIT_WORK_TREE
git checkout -f
фатальный: не в репозитории git (или любой.....)
Я думаю, что моя проблема в том, как работает Bash, как с git works =)
Ответы
Ответ 1
Есть несколько проблем с тем, что вы пытаетесь на данный момент. Возможно, лучше всего объяснить, что неправильно с каждым примером, который вы пытались по очереди:
GIT_WORK_TREE=/var/www/www.example.org git checkout -f
rm $GIT_WORK_TREE/www/all.css
rm $GIT_WORK_TREE/www/all.js
Проблема заключается в том, что если вы определяете переменную непосредственно перед командой, переменная окружения устанавливается только в среде выполняемой команды - она не устанавливается в текущей оболочке. Вы можете легко проверить это:
$ FOO=bar sh -c 'echo $FOO'
bar
$ echo $FOO
$
Ваша следующая попытка:
GIT_WORK_TREE=/var/www/www.example.org
git checkout -f
В этом случае для того, чтобы переменная была установлена в среде других команд, которые вы вызываете в script, вам нужно экспортировать ее, например, с помощью export GIT_WORK_TREE=/var/www/www.example.org
вместо вашей первой строки.
Ваша последняя попытка:
GIT_WORK_TREE=/var/www/www.example.org
cd $GIT_WORK_TREE
git checkout -f
Это имеет ту же проблему, что и предыдущая попытка (т.е. вам нужно экспортировать GIT_WORK_TREE
), но также имеет более тонкую проблему. Как я описал в этот пост в блоге, GIT_DIR
установлен в .
(то есть текущий каталог) в post-receive
script Окружающая среда. Итак, если вы смените каталог на вершину рабочего дерева, GIT_DIR
укажет на этот каталог, а не на каталог .git
! Пара хороших эмпирических правил (а) заключается в том, что вы должны устанавливать только GIT_DIR
и GIT_WORK_TREE
вместе, и (b) если вы их установите, вы должны установить их как абсолютные пути. Итак, я думаю, что в вашем случае будет работать следующий крючок:
#!/bin/sh
export GIT_WORK_TREE=/var/www/www.example.org
export GIT_DIR=/var/www/www.example.org/.git
cd $GIT_WORK_TREE
git checkout -f
rm www/all.css
rm www/all.js
Ответ 2
почему бы не использовать переменную для пути?
#!/bin/sh
work_tree=/var/www/www.example.org
GIT_WORK_TREE=$work_tree git checkout -f
rm $work_tree/www/all.css
rm $work_tree/www/all.js
тогда вам не нужно экспортировать.
Это отлично работает для меня.
Ответ 3
GIT_WORK_TREE=....
export GIT_WORK_TREE
git ...
rm $GIT_WORK_TREE/...
должен работать и безопасен (вам не всегда нужно экспортировать переменные среды, но обычно это не наносит вреда:))