У меня есть проект php, и когда я выхожу из другого репозитория, и файл composer.lock меняет, я должен запустить composer.phar install --dev
. Как git автоматически предупредит меня/спросит меня, хочу ли я запустить эту команду? Я полагаю, что какой-то крючок сделал бы трюк, но как я могу получить информацию о том, что изменилось до и после тяги в нем?
Как я могу автоматически предупредить, если какой-либо файл изменится?
Ответ 1
Это зависит от того, какую опцию вы используете при нажатии:
Нет опции: git fetch и git merge запущены
Вы можете написать собственный пост-merge git hook:
Этот крючок вызывается git merge, что происходит, когда в локальном репозитории выполняется притяжение git. Крючок принимает один параметр, флаг состояния, определяющий, было ли выполнено слияние слиянием сквоша. Этот крючок не может повлиять на результат слияния git и не выполняется, если слияние не удалось из-за конфликтов.
Этот крючок должен работать для вас (сохраните его как исполняемый файл .git/hooks/post-merge
):
#!/bin/sh
CHANGED=`git diff [email protected]{1} --stat -- $GIT_DIR/../composer.lock | wc -l`
if [ $CHANGED -gt 0 ];
then
echo "composer.lock has changed!"
composer.phar install --dev
fi
- rebase: git fetch и git выполняется перезагрузка
Вы можете написать собственный post-checkout git hook:
Этот крючок вызывается, когда выполняется проверка git после обновления рабочей строки. Крючок имеет три параметра: ref предыдущего HEAD, ref нового HEAD и флаг, указывающий, была ли проверка выводом ветки или проверка файла
Этот крючок должен работать для вас (сохранить его как исполняемый файл .git/hooks/post-checkout
):
#!/bin/sh
CHANGED=`git diff $1 $2 --stat -- $GIT_DIR/../composer.lock | wc -l`
if [ $CHANGED -gt 0 ];
then
echo "composer.lock has changed!"
composer.phar install --dev
fi
UPDATE
Ответ 2
Вот интересный смысл: https://gist.github.com/sindresorhus/7996717 Я принял его для вашего вопроса.
post-merge git hook выполняется при объединении ветвей или при выполнении git pull
.
post-merge hook (читать документы)
#/usr/bin/env bash
# MIT © Sindre Sorhus - sindresorhus.com
# forked by naXa! - naxa.by
# Git hook to run a command after `git merge` / `git pull` if a specified file was changed.
# Run `chmod +x post-merge` to make it executable then put it into `.git/hooks/`.
changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
check_run() {
echo "$changed_files" | egrep --quiet "$1" && echo "$2"
}
# In this example it used to print a warning if composer.lock has been changed
check_run composer.lock "Run `composer.phar install --dev`"
post-checkout git hook выполняется при переключении между ветвями или при выполнении git rebase
.
крюк после проверки (читать документы)
#/usr/bin/env bash
# MIT © Sindre Sorhus - sindresorhus.com
# forked by naXa! - naxa.by
# Git hook to run a command after `git checkout` if a specified file was changed.
# Run `chmod +x post-merge` to make it executable then put it into `.git/hooks/`.
# terminate gracefully on a file checkout (retrieving a file from the index)
# uncomment the below line if you don't want to run this hook on a file checkout (for example on git->revert in IntelliJ IDEA)
# [ $3 -eq 0 ] && { exit 0; }
changed_files="$(git diff-tree -r --name-only --no-commit-id $1 $2)"
check_run() {
echo "$changed_files" | egrep --quiet "$1" && echo "$2"
}
# In this example it used to print a warning if composer.lock has been changed
check_run composer.lock "Run `composer.phar install --dev`"
exit 0;
Вы можете заметить, что я изменил grep
на egrep
здесь. Это делается для того, чтобы выполнять поиск с помощью причудливого выражения. Например "file1.txt|file2.txt"
, где |
используется как оператор OR.