Zsh
zsh 提示:檢查是否在 git 儲存庫中並且沒有被 git 忽略
在我的
zsh
shell 中,我根據我是否在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
返回1
和git 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_FILESYSTEM
為true
:GIT_DISCOVERY_ACROSS_FILESYSTEM=true git check-ignore -q . 2>/dev/null; if [ "$?" -ne "1" ]; then ...