Повторное использование 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.cssall.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/...

должен работать и безопасен (вам не всегда нужно экспортировать переменные среды, но обычно это не наносит вреда:))