3

我一直在研究检查存储库中更改以更新 PS1 提示的最快方法。由于不值得详述的原因,无法访问 __git_ps1() 宏,而且无论如何其他帖子都建议了各种命令,包括 __git_ps1() 中使用的命令。

原因:我正在通过 VPN 和 ssh 访问远程服务器上的存储库,远程存储库通过我与我们内部 git 服务器的连接返回。我猜(但真的不确定这是否属实)这可能是在新的一天建立新连接的原因,cd 到这个远程服务器上的 repo 可能会导致git ls-files -m需要 3 或 4 秒才能完成,并且在文件缓存有帮助后仍需要长达 1 秒的时间。

为了改善这一点,我发现git diff-index --quiet HEAD几乎是即时的,但第二天它开始返回“1”,即使实际上没有任何变化(非常缓慢的运行没有输出git status)。我发现这git update-index --refresh -q似乎可以解决问题(很快),并且如果实际上没有任何更改,也会返回“0”。

从我读过的内容来看,我认为从 PS1 提示符运行应该是安全的,但我知道这是一个“较低级别”的 git 命令,我可能无法理解所有含义。因此,需要明确的是,我目前有以下内容来检查更改,这似乎总是很快,但是一天后开始在干净的 repos 中输出“*”。

if git diff-index --quiet HEAD 2>/dev/null && [[ -z "$(git ls-files --others --exclude-standard --directory --no-empty-directory)" ]]
    then echo -n " "
    else echo -n " *"
fi

任何“git 大师”都可以看到将第一个测试更改为的问题git update-index --refresh -q吗?

4

1 回答 1

1

它应该可以工作,除非在Git LFS(大文件存储)中使用,正如这里所解释的,它可以触发活泼的时间戳。

这就是为什么在 Git 2.36(2022 年第二季度)中,“ git update-index --refreshman被教导更好地处理不雅的时间戳(就像“ git statusman已经做到的那样)。

请参阅Marc Strapetz ( ) 的提交 2ede073提交 9b71efd提交 0275e4d提交 ab6245b(2022 年 1 月 7 日(由Junio C Hamano 合并 -- --ee52b35 提交中,2022 年 2 月 5 日)mstrap
gitster

update-index: 刷新应该重写索引,以防有不雅的时间戳

签字人:Marc Strapetz

' git update-index --refresh' ( man )和 '--really-refresh' 应该在遇到 racy 时间戳时强制写入索引文件,就像 ' git status' ( man ) 已经做的那样。

请注意,调用 ' git update-index --refresh' 仍然不能保证之后不会有更多的时间戳(对于 ' git status' 也是如此): - 如果所有三个操作都在其中发生,则在触摸和添加文件后立即调用 ' git update-index --refresh' 可能仍然会留下不雅的时间戳racy-tolerance (通常为 1 秒,除非USE_NSEC已定义) -git update-index --refresh为设置在未来的时间戳调用 '' 将使它们变得活泼

为了保证这样的时间戳将被解析,需要等到系统时钟超过这些时间戳,然后才写入索引文件。
特别是对于未来的时间戳,这似乎不可行,因为可能会出现长时间的延迟/挂起。

于 2022-02-06T03:03:13.437 回答