ZSH 别名在打开新终端窗口时抛出错误

ZSH 别名在打开新终端窗口时抛出错误

我一直在 zsh 中使用 iTerm2,使用以下别名时每次打开新的 iTerm2 窗口或选项卡时都会出现错误。

alias clear-git-branches="git fetch -p && for branch in `git branch -vv | grep ': gone]' | awk '{print $1}'`; do git branch -D $branch; done"

我收到的错误是:

fatal: not a git repository (or any of the parent directories): .git

由于它抛出与目录不是 git 存储库相关的错误,我猜测它的引号存在一些问题。我尝试更改它,但得到了相同的错误。

我使用这个命令来清除没有上游的本地分支。

答案1

正如 Kamil 指出的那样,由于您使用的是双引号而不是单引号,因此命令的某些部分会被解析,别名会被加载(即当您在终端中打开选项卡或窗口时)。当您在终端
中运行它时,它看起来没问题,因为所有内容都会立即执行。

将所有内容放在单引号中可以解决问题,但会引入内部单引号的问题。我建议将其重写为函数。在这种情况下,您可以像使用别名一样使用它。

clear-git-branches() {
git fetch -p && \
for branch in $(git branch -vv | awk '/: gone]/{print $1}'); 
  do git branch -D "${branch}"; 
done
}

答案2

我在我的 中遇到了类似或相同的问题.zshrc

# use gcm to checkout master or main
alias gcm="git checkout $(git remote show origin | grep 'HEAD branch' | sed 's/.*: //') && git pull"

打开一个新的 iTerm2 窗口或终端窗口,或者重新加载环境后,我得到:

source ~/.zshrc
fatal: not a git repository (or any of the parent directories): .git

注释掉这一行可以解决该问题:

# alias gcm="git checkout $(git remote show origin | grep 'HEAD branch' | sed 's/.*: //') && git pull"

重写后;交换双引号和单引号:

alias gcm='git checkout $(git remote show origin | grep "HEAD branch" | sed "s/.*: //") && git pull'

错误消失了。

相关内容