24

我有一个 php 项目,当我从另一个存储库中提取并且 composer.lock 文件被更改时,我应该运行composer.phar install --dev. git 如何自动警告我/询问我是否要运行此命令?我想某种钩子可以解决问题,但是我怎样才能获得关于在拉入它之前和之后发生的变化的信息?

4

2 回答 2

28

这取决于您在拉动时使用的选项:

没有选项:运行 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

更新

这是我个人的 git hooks 集

于 2013-05-31T08:54:53.937 回答
4

这是一个有趣的要点: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;

您可能会注意到我已更改grepegrep此处。这样做是为了能够使用花哨的表达式进行搜索。例如"file1.txt|file2.txt"where|用作 OR 运算符。

于 2016-01-16T09:44:56.130 回答