Zsh

zsh 提示:檢查是否在 git 儲存庫中並且沒有被 git 忽略

  • January 10, 2021

在我的zshshell 中,我根據我是否在git儲存庫中動態更改提示。我正在使用以下 git 命令進行檢查:

if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1); then
...

現在我還想區分目前目錄是否被git. 所以我在我的if聲明中又添加了一張支票:

if $(git rev-parse --is-inside-work-tree >/dev/null 2>&1) && ! $(git check-ignore . >/dev/null 2>&1); then
...

這很好用,但我想知道是否可以將其簡化為一個git命令。由於提示在 every 上都會刷新ENTER,因此在一些速度較慢的機器上,它往往會顯著減慢 shell。

更新

@Stephen Kitt 接受的解決方案效果很好,但以下情況除外:

我正在跨文件系統使用儲存庫。假設 git 位於/.git(因為我想在 中跟踪我的配置文件/etc),但我也想在 中跟踪一些文件/var/foo,這是一個不同的分區/文件系統。

當我位於/並執行以下命令時,一切都按預期工作,並且我得到返回碼1(因為/var/foo正在被跟踪):

# git check-ignore -q /var/foo

但是,當我位於 中的任何地方時/var,相同的命令會失敗,並顯示錯誤程式碼128和以下錯誤消息:

# git check-ignore -q /var/foo
fatal: not a git repository (or any parent up to mount point /)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

但我認為這只是check-ignore命令的問題。否則 git 似乎可以在文件系統中正常工作。/var/foo我可以很好地跟踪文件。

如果沒有被跟踪,預期的行為應該是git check-ignore -q /var/foo返回1git check-ignore -q /var/bar返回。0

我該如何解決這個問題?

git check-ignore ..如果不在儲存庫中(或發生任何其他錯誤),則退出程式碼 128 將失敗git,並且僅當路徑未被忽略時退出程式碼為 1。所以你只能檢查後者:

git check-ignore -q . 2>/dev/null; if [ "$?" -ne "1" ]; then ... 

在 內部then,您正在處理.在 git 儲存庫中被忽略或不被忽略的情況。

要使這項工作跨越文件系統邊界,請設置GIT_DISCOVERY_ACROSS_FILESYSTEMtrue

GIT_DISCOVERY_ACROSS_FILESYSTEM=true git check-ignore -q . 2>/dev/null; if [ "$?" -ne "1" ]; then ...

引用自:https://unix.stackexchange.com/questions/627429