【问题标题】:How does git show the pre-commit hook a different index?git 如何将预提交挂钩显示为不同的索引?
【发布时间】:2014-01-20 13:27:30
【问题描述】:

将您的 .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 调用看到不同的索引,pre-commit 钩子会根据是否使用 -a/--all 调用提交来查看即将提交的索引,但相同的 git 命令在其他 shell 不受影响。

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

脚本做了一些事情(与 vagrant 一起),其中它不会被视为具有相同的父 PID 或环境,也许这是相关的。


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

【问题讨论】:

  • 还有什么有趣的,在一个shell中运行git commit -a,尝试进行一些其他更改并在另一个shell中运行git add,索引似乎没有被修改,大喊“.git /index.lock”文件存在。但是在一个 shell 中执行 git add; git commit -a,然后在另一个 shell 中 git add 工作正常(无锁定)。
  • 所以它可能使用 .git/index.lock 而不是 .git/index ,反之亦然。我不知道它是如何知道使用哪个或如何指定它以使用其中一个。

标签: git shell unix vagrant githooks


【解决方案1】:

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

【讨论】:

  • 秘密是 GIT_INDEX_FILE
  • 想详细说明一下? ;) 我如何导出该变量以及在哪里导出?
  • @archiehicox 这本身就是一个好问题。展示你所拥有的,参考这个来展示你想要做什么,然后人们就会有细节来帮助沟通。
  • 我有或多或少相同的问题,显然在这个答案中解决了。但是@ʞɔıu 的解决方案和评论还不够冗长,我无法理解:)
猜你喜欢
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-22
  • 1970-01-01
  • 2019-12-25
  • 2015-09-10
相关资源
最近更新 更多