Git 使用 Intellij Idea 预提交挂钩行为
Git pre-commit hook behavior with Intellij Idea
我有一个带有预提交 git 钩子的 monorepo 项目,它会在 package.json
文件中修改版本。此挂钩使用以下脚本:
#!/usr/bin/env bash
set -e
# See if git detects any changes for the given directory
if [[ -z `git diff --cached --shortstat ./packages/` ]]; then
VERSION=`node -p -e "require('./packages//package.json').version"`
echo " has not changed, old version: $VERSION"
exit 0
fi
VERSION=$(cd packages/ && npm version patch --no-git-tag-version)
# Add package.json to staged
git add packages//package.json > /dev/null
echo " has changed, new version: ${VERSION//v}"
我更改了 backend
包中的一个文件 tsconfig.json
并通过 Idea UI 和 "Run git hooks option checked" 提交了它。我只检查 UI 对话框中的文件,但钩子也应该碰到 package.json。在 Idea 版本控制台中,我看到出现以下日志:
14:28:08.610: [myproject] git -c core.quotepath=false -c log.showSignature=false commit --only -F /private/var/folders/rf/mnfmp6xs2zjb50x0nqfrlftw0000gn/T/git-commit-msg-.txt -- packages/backend/tsconfig.json
[master c5ec828] Hooks test 24
2 files changed, 2 insertions(+), 2 deletions(-)
运行 git log -1 --stat
说 package.json 被钩子改变并被提交:
git log -1 --stat
commit c5ec8289afa8f15d7134b362992d4a91e31bda16 (HEAD -> master)
Author: doomsower <mail@gmail.com>
Date: Tue Feb 13 14:28:08 2018 +0300
Hooks test 24
packages/backend/package.json | 2 +-
packages/backend/tsconfig.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
packages/backend/package.json
版本被hook撞到了,是正确的。但是,当我 运行 git status
时,我看到以下内容:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: packages/backend/package.json
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: packages/backend/package.json
然后我 运行 git add packages/backend/package.json
然后 git status
returns:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
我不太明白这是怎么回事:
1) 根据日志,带有 --only
标志和 package.json
的想法 运行 git commit
未在命令行中指定,但已提交。怎么可能?
2) 好的,所以提交了 2 个文件并且 package.json
提交了版本号。怎么可能在那之后 git 工作树不干净,我必须 运行 git add
让它干净?
所以我认为这是您上述情况的事件时间表:
1. 您更改 tsconfig.json
并将其添加到 git 索引
2. 然后提交只有 tsconfig.json
的索引。在提交 运行 之前,您的钩子会修改 package.json
并将其添加到索引中。
3. 然后提交索引,指定只提交tsconfig.json
。通常这会使 package.json
保持上演状态但是(并且,完全公开,我在这里进行有根据的猜测)因为它被添加到钩子中 git 已经圆顶 一些提交-处理到文件。
4. 这使您的新 package.json
已提交,旧的 package.json
在索引中,新的在您的文件系统中。因此,将它添加回索引 取消了 更改,因为它现在与提交的历史匹配 - 提供干净的回购。
解决此问题的方法是从您的预提交中删除添加,并 运行 在您的 post-commit 挂钩中删除提交,如下所示:
git add package.json
git commit --amend -C HEAD --no-verify
使用 --no-verify
来防止 hooks 的无限循环
我有一个带有预提交 git 钩子的 monorepo 项目,它会在 package.json
文件中修改版本。此挂钩使用以下脚本:
#!/usr/bin/env bash
set -e
# See if git detects any changes for the given directory
if [[ -z `git diff --cached --shortstat ./packages/` ]]; then
VERSION=`node -p -e "require('./packages//package.json').version"`
echo " has not changed, old version: $VERSION"
exit 0
fi
VERSION=$(cd packages/ && npm version patch --no-git-tag-version)
# Add package.json to staged
git add packages//package.json > /dev/null
echo " has changed, new version: ${VERSION//v}"
我更改了 backend
包中的一个文件 tsconfig.json
并通过 Idea UI 和 "Run git hooks option checked" 提交了它。我只检查 UI 对话框中的文件,但钩子也应该碰到 package.json。在 Idea 版本控制台中,我看到出现以下日志:
14:28:08.610: [myproject] git -c core.quotepath=false -c log.showSignature=false commit --only -F /private/var/folders/rf/mnfmp6xs2zjb50x0nqfrlftw0000gn/T/git-commit-msg-.txt -- packages/backend/tsconfig.json
[master c5ec828] Hooks test 24
2 files changed, 2 insertions(+), 2 deletions(-)
运行 git log -1 --stat
说 package.json 被钩子改变并被提交:
git log -1 --stat
commit c5ec8289afa8f15d7134b362992d4a91e31bda16 (HEAD -> master)
Author: doomsower <mail@gmail.com>
Date: Tue Feb 13 14:28:08 2018 +0300
Hooks test 24
packages/backend/package.json | 2 +-
packages/backend/tsconfig.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
packages/backend/package.json
版本被hook撞到了,是正确的。但是,当我 运行 git status
时,我看到以下内容:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: packages/backend/package.json
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: packages/backend/package.json
然后我 运行 git add packages/backend/package.json
然后 git status
returns:
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
我不太明白这是怎么回事:
1) 根据日志,带有 --only
标志和 package.json
的想法 运行 git commit
未在命令行中指定,但已提交。怎么可能?
2) 好的,所以提交了 2 个文件并且 package.json
提交了版本号。怎么可能在那之后 git 工作树不干净,我必须 运行 git add
让它干净?
所以我认为这是您上述情况的事件时间表:
1. 您更改 tsconfig.json
并将其添加到 git 索引
2. 然后提交只有 tsconfig.json
的索引。在提交 运行 之前,您的钩子会修改 package.json
并将其添加到索引中。
3. 然后提交索引,指定只提交tsconfig.json
。通常这会使 package.json
保持上演状态但是(并且,完全公开,我在这里进行有根据的猜测)因为它被添加到钩子中 git 已经圆顶 一些提交-处理到文件。
4. 这使您的新 package.json
已提交,旧的 package.json
在索引中,新的在您的文件系统中。因此,将它添加回索引 取消了 更改,因为它现在与提交的历史匹配 - 提供干净的回购。
解决此问题的方法是从您的预提交中删除添加,并 运行 在您的 post-commit 挂钩中删除提交,如下所示:
git add package.json
git commit --amend -C HEAD --no-verify
使用 --no-verify
来防止 hooks 的无限循环