我有一个 php 项目,当我从另一个存储库中提取并且 composer.lock 文件被更改时,我应该运行composer.phar install --dev
. git 如何自动警告我/询问我是否要运行此命令?我想某种钩子可以解决问题,但是我怎样才能获得关于在拉入它之前和之后发生的变化的信息?
2 回答
这取决于您在拉动时使用的选项:
没有选项:运行 git fetch 和 git merge
您可以编写自己的合并后 git hook:
这个钩子由 git merge 调用,当在本地存储库上执行 git pull 时会发生这种情况。该钩子采用单个参数,一个状态标志,指定正在完成的合并是否是壁球合并。如果由于冲突导致合并失败,则此钩子不会影响 git merge 的结果并且不会执行。
这个钩子应该适合你(将它保存为可执行文件.git/hooks/post-merge
):
#!/bin/sh
CHANGED=`git diff HEAD@{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 rebase
您可以编写自己的结帐后 git hook:
在更新工作树后运行 git checkout 时会调用此挂钩。钩子有三个参数:前一个 HEAD 的 ref,新 HEAD 的 ref 和一个标志,指示检出是分支检出还是文件检出
这个钩子应该适合你(将它保存为可执行文件.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
更新
这是一个有趣的要点:https ://gist.github.com/sindresorhus/7996717我已经针对您的问题对其进行了调整。
合并分支或合并分支时执行合并后 git 钩子git pull
。
合并后挂钩(阅读文档)
#/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's used to print a warning if composer.lock has been changed
check_run composer.lock "Run `composer.phar install --dev`"
当您在分支之间切换或执行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's 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"
where|
用作 OR 运算符。