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

У меня есть проект 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

Вот мой личный набор git hooks.

Ответ 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.