Git 如果特定文件发生更改,如何自动发出警告?

Git 如果特定文件发生更改,如何自动发出警告?,git,githooks,Git,Githooks,我有一个php项目,当我从另一个存储库中提取composer.lock文件时,我应该运行composer.phar安装--dev。git如何自动警告我/询问我是否要运行此命令?我想某种类型的钩子会起作用,但我如何才能只获得有关在拉入之前和之后发生了哪些变化的信息?这取决于拉入时使用的选项: 无选项:git fetch和git merge正在运行 你可以自己写: 这个钩子由git merge调用,在本地存储库上完成git拉取时会发生这种情况。钩子只接受一个参数,一个状态标志,指定正在进行的合并是否

我有一个php项目,当我从另一个存储库中提取composer.lock文件时,我应该运行
composer.phar安装--dev
。git如何自动警告我/询问我是否要运行此命令?我想某种类型的钩子会起作用,但我如何才能只获得有关在拉入之前和之后发生了哪些变化的信息?

这取决于拉入时使用的选项:

无选项:git fetch和git merge正在运行 你可以自己写:

这个钩子由git merge调用,在本地存储库上完成git拉取时会发生这种情况。钩子只接受一个参数,一个状态标志,指定正在进行的合并是否为挤压合并。这个钩子 如果合并因冲突而失败,则无法影响git合并的结果,并且不会执行

此钩子应该适合您(将其另存为可执行文件
.git/hooks/post merge
):

--rebase:运行git fetch和git rebase 你可以自己写:

在更新工作树后运行git签出时,将调用此钩子。钩子有三个参数:前一个头的ref、新头的ref和一个标志,指示签出是分支签出还是文件签出

此钩子应该适合您(将其另存为可执行文件
.git/hooks/post checkout
):

更新
这里是。

这里有一个有趣的要点:我根据你的问题改编了它

合并后的git钩子在合并分支或执行git pull时执行

合并后挂钩()

#/usr/bin/env bash
#麻省理工学院©Sindre Sorhus-sindresorhus.com
#被naXa分叉纳克萨比
#Git hook,如果指定的文件已更改,则在`Git merge`/`Git pull`之后运行命令。
#运行'chmod+x post merge'使其可执行,然后将其放入'.git/hooks/`。
changed_files=“$(git diff tree-r--仅名称--无提交id ORIG_HEAD)”
检查运行(){
echo“$changed_files”| egrep--安静“$1”和&echo“$2”
}
#在本例中,如果composer.lock已更改,它用于打印警告
选中运行composer.lock“运行`composer.phar安装--dev`”
签出后git钩子在分支之间切换或执行git rebase时执行

签出后挂钩()

#/usr/bin/env bash
#麻省理工学院©Sindre Sorhus-sindresorhus.com
#被naXa分叉纳克萨比
#Git hook,如果指定的文件已更改,则在“Git checkout”之后运行命令。
#运行'chmod+x post merge'使其可执行,然后将其放入'.git/hooks/`。
#在文件签出时正常终止(从索引中检索文件)
#如果您不想在文件签出时运行此钩子(例如在IntelliJ IDEA中的git->revert上),请取消对下面一行的注释
#[$3-eq 0]&&{exit 0;}
changed_files=“$(git diff tree-r--仅限名称--无提交id$1$2)”
检查运行(){
echo“$changed_files”| egrep--安静“$1”和&echo“$2”
}
#在本例中,如果composer.lock已更改,它用于打印警告
选中运行composer.lock“运行`composer.phar安装--dev`”
出口0;

您可能会注意到,我已将
grep
更改为
egrep
。这样做是为了能够使用奇特的表达式进行搜索。例如
“file1.txt | file2.txt”
,其中
|
用作OR运算符。

就像一个符咒!谢谢!你说的拉力是什么意思?因为简单获取不会更新本地分支。拉将,但仅当它正在跟踪分支时。只要您的操作涉及更新您的控制文件,签出后钩子就会工作。我建议通过执行类似于
git reset--hard HEAD~20
(通过多次提交倒回HEAD)的操作来测试它,然后
git pull--rebase
-如果控制文件发生更改,将调用hook并触发(我在本地测试了它)。我的意思是:从远程存储库中进行拉取。我用一个非常简单的脚本进行了测试,但它不起作用
git pull——重新基址
起作用。有一个
合并后挂钩
,但它的参数与
签出后挂钩
的参数不同。太糟糕了……事实上,当合并是非快进合并时,它可能是可用的:“HEAD^”是拉之前的提交,因此在这种情况下它应该可以工作。对快进有什么想法吗?很好!作为记录,我最后也使用了
git-diff-tree
。这是
#!/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
#!/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