git如何显示预提交钩子的不同索引?

时间:2014-01-02 23:51:30

标签: git shell unix vagrant githooks

将您的.git/hooks/pre-commit更改为以下内容:

#!/bin/bash
git status
sleep 10000

更改某个文件,但不要使用git add暂存。然后运行git commit -a

您应该看到类似的内容:

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   somefile.txt

然后它会等待sleep来电。在此期间,打开另一个shell窗口并运行git status。你应该看到:

# On branch master
# 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:   somefile.txt

不同的git调用正在看到一个不同的索引,预呈现钩子看到索引,因为它将根据是否使用-a / - all调用commit来提交,但是相同的git命令其他炮弹不受影响。

我的问题是我有一个脚本,当它作为预提交挂钩安装时,看到索引就像git在另一个shell 中运行一样,而不是看到预先提交挂钩的索引是应该看。我想让它看到'预提交索引',或者至少理解它在不同的shell中看起来有什么不同。

该脚本执行某些操作(使用vagrant),其中不会将其视为具有相同的父PID或环境,并且可能与此相关。


更新:可能与index vs index.lock有关?

1 个答案:

答案 0 :(得分:2)

git commit -a将修改索引,可以拒绝。在我看来,在命令完成之前,其尚未验证的索引修改不能显示给任何其他执行命令。我第一次尝试说服git你作为钩子的一部分而不是作为其他执行命令的一部分运行,那就是从GIT_开始导出每个变量(export ${!GIT_*})。