1. ホーム
  2. git

[解決済み] 複雑なGitブランチ名がすべてのGitコマンドを破壊した

2022-03-16 18:52:44

質問

からのブランチを作成しようとしていました。 master を次のコマンドで実行します。

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

を実行したところ、Git が突然応答しなくなりました。私は、エスケープされていない () が、どうやら原因らしい。現在では、どんなGitコマンドを実行しようとしても、同じエラーが発生します。

git:176: command not found: _of_ProductSearchQuery

の後に数字が入ります。 git コマンドを入力するたびに増えていく。

何が起こったのか、どなたか説明してください。また、どうすれば元に戻るのでしょうか?そのブランチを削除したいのですが、どうすればいいのでしょうか?

解決方法を教えてください。

問題点

<ブロッククオート

何が起こったか説明できる人はいますか?[...] そのブランチを削除できるようにしたいのですが、Git が動いてくれません。

実行することによって

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

をzshで実行します。 ブランチを作成していない . その代わり、誤って3つの シェル関数 という git , branch および SSLOC-201_Implement___str__ であり,パラメータを無視し,ボディが _of_ProductSearchQuery . という zsh 組み込みのコマンドを実行することで、これが実際に起こったことであることを自分で確認できます。 functions これは、既存のシェル関数をすべてリストアップするものである。

$ functions                                                     
SSLOC-201_Implement___str__ () {
    _of_ProductSearchQuery
}
branch () {
    _of_ProductSearchQuery
}
git () {
    _of_ProductSearchQuery
}

残念ながら、他の2つのシェル関数は問題ないのですが。 git"というシェル関数は、現在では 善意の git コマンド!

$ which git
git () {
    _of_ProductSearchQuery
}
# but the real "git" is a binary file that lives in /usr/local/bin/git (or some similar path)

したがって、その後、エラーが発生することになります。

command not found: _of_ProductSearchQuery

Git コマンドを実行しようとするたびに、例えば git log , git status というコマンドは存在しない。 _of_ProductSearchQuery が存在します)。

サイドノート

[...] 同じエラーが発生します。

git:176: command not found: _of_ProductSearchQuery

(の後に数字が入る)。 git コマンドを入力するたびに増えていく)

その数値は、単純に HISTCMD を保持する環境変数です。

<ブロッククオート

[対話型シェルにおける現在の履歴のイベント番号、言い換えれば、このコマンドによって $HISTCMD が読み込まれます。

をご覧ください。 zshマニュアル をご覧ください。

解決方法

<ブロッククオート

また、どうすれば元に戻るのでしょうか?

問題のあるシェル関数を削除してください(ついでに誤って作成した他の2つの関数も)。

unset -f git
unset -f branch SSLOC-201_Implement___str__

そうすれば、すべてうまくいくはずです。

もし unset も影になるのですか!

良い質問 ! を参照してください。 Wumpus W. Wumbleyの素晴らしいコメント を以下に紹介します。


ブランチネーミングのヒント

特殊なシェル文字を避ける

コメントで指摘されているように、Git のブランチ名では括弧は有効な文字です。

$ git branch 'foo()bar'
$ git branch
  foo()bar
* master
$ git checkout 'foo()bar'
Switched to branch 'foo()bar'

しかし、このような名前を引用する必要性 いちいち をコマンドライン引数として使用する場合、参照名に括弧を使用しないことを納得させる必要があります。より一般的には、このような驚きを防ぐために、シェルで特別な意味を持つ文字は(できるだけ)避けた方がよいでしょう。

シンプルなブランチ名を使用する

ブランチ名はとにかく短く、甘くする必要があります。長い説明文は

SSLOC-201_Implement___str__()_of_ProductSearchQuery

は、ブランチ名ではなく、コミットメッセージに含まれます。