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