如何在不修改 .git/index 的情况下 运行 git 状态 - 例如 PROMPT_COMMAND

How to run git status without modifying .git/index - such as in a PROMPT_COMMAND

我有一个 PROMPT_COMMAND 使用 git 状态显示 git 分支信息,不幸的是,当调用 'git status' 时,它似乎正在修改 .git/index 文件。

这不好,因为如果您是 运行 对目标目录具有权限的用户(例如在共享文件系统上,或者如果您 运行 宁作为特权帐户) - 最终将该文件的所有权更改为您的用户,因为 git 似乎正在重新创建 .git/index 文件。

有什么方法可以 运行 'git status' 阻止它修改 .git/index 文件吗?

运行 git status 不修改索引文件。

$ ls -l .git/index
-rw-r--r-- 1 adelsbergerm 1049089 445386 Jul 11 15:07 .git/index

$ git status
On branch REDACTED
Your branch is ahead of 'origin/REDACTED' by 211 commits.
  (use "git push" to publish your local commits)
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:   REDACTED

no changes added to commit (use "git add" and/or "git commit -a")

$ ls -l .git/index
-rw-r--r-- 1 adelsbergerm 1049089 445386 Jul 11 15:07 .git/index

您关于修改文件会改变所有权的说法也值得怀疑。

我想你可能有一些OS没有人听说过读取文件会自动写入文件和写入文件会自动声明对文件的所有权,但除非这些似乎是观察错误,您需要在其他地方寻找问题。

如果您的 Git 版本至少为 2.15,运行 git --no-optional-locks status。请参阅 commit 27344d6a6c8056664966e11acf674e5da6dd7ee3,它添加了这个新选项。

否则,如果您能确保索引在运行宁git status之前是最新的,git status将不会再次更新它;但这有点棘手。或者,您可以暂时将索引设置为只读——但这会干扰其他 git 命令并行 运行——或者您可以将索引复制到一个临时的 运行 git statusGIT_INDEX_FILE 设置为临时文件的路径名,然后删除临时文件。最后一个很笨拙,但可以与历史 Git.

一起使用

(顺便说一下,我没有从 my own hand-rolled status-constructing bash prompt code 运行 git status,虽然这不是专门出于这个原因。相反,我 运行 一个明确的 git update-index,您可以以性能为代价忽略它,也许基于 $PWD。)