Повторно используйте GIT_WORK_TREE в хуке post-receive для получения нескольких файлов - PullRequest
11 голосов
/ 09 июля 2011

Я использовал этот «учебник» для настройки среды DSP: http://toroid.org/ams/git-website-howto (Да, у меня нет буквы T).

Мой рабочий процесс очень прост:

  1. Развивайся локально ( D )
  2. Совершите несколько вещей
  3. Совершите больше вещей
  4. Push to Staging (и Github) ( S )
  5. Проверка нового кода на этапе
  6. Push to Production ( P )

Мой код содержит файлы CSS, которые уменьшены моим кодом и затем сохранены в 1 файле: all.css. Локально я отключил эту опцию, поэтому мне не нужно вручную удалять all.css каждый раз, когда я меняю свой CSS. И в Staging, и в Production они должны кэшироваться как можно скорее (поэтому создайте all.css из отдельных файлов CSS).

Проблема в том, что каждый раз, когда я нажимаю, мне нужно удалить all.cssall.js - та же самая история), чтобы увидеть изменения (и правильно проверить).

Из этого урока я сделал хук post-receive, который проверяет изменения в определенной папке (где Apache читает код).

Мой текущий post-receive крючок:

#!/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), но я не могу ... В следующей строке нет переменной $ 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

фатально: эта операция должна выполняться в рабочем дереве

GIT_WORK_TREE=/var/www/www.example.org
cd $GIT_WORK_TREE
git checkout -f

смертельно: не в git-хранилище (или в любом другом .....)

Полагаю, моя проблема в том, как работает Bash, так и в том, как работает GIT =)

Ответы [ 3 ]

27 голосов
/ 09 июля 2011

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

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

В этом случае, чтобы установить переменную в среде других команд, которые вы вызываете всценария, вам нужно экспортировать его, например, с 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.Таким образом, если вы измените каталог на вершину рабочего дерева, GIT_DIR будет указывать на этот каталог, а не на каталог .git!Вот несколько хороших правил: (а) что вы должны устанавливать только GIT_DIR и GIT_WORK_TREE вместе, и (б) если вы их установите, вы должны установить их оба на абсолютные пути.Итак, я думаю, что следующий хук будет работать в вашем случае:

#!/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
7 голосов
/ 08 мая 2012

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

#!/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

тогда вам не нужно экспортировать. Это прекрасно работает для меня.

1 голос
/ 09 июля 2011
GIT_WORK_TREE=....
export GIT_WORK_TREE
git ...
rm $GIT_WORK_TREE/...

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

...