新しいターミナルウィンドウを開くと 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'

エラーは消えました。

関連情報