web-dev-qa-db-ja.com

複雑なGitブランチ名がすべてのGitコマンドを中断しました

次のコマンドでmasterからブランチを作成しようとしましたが、

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

gitが突然応答を停止したとき。エスケープされていない()のせいだと思われます。これで、Gitコマンドを実行しようとすると、同じエラーが表示されます。

git:176: command not found: _of_ProductSearchQuery

gitの後の数字は、コマンドを入力するたびに増加します。

誰が何が起こったのか説明できますか?そして、どのように通常に戻りますか?そのブランチを削除したいのですが、どうすればいいですか?

335
ruipacheco

問題

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

実行することにより

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

zshでは、ブランチを作成しませんでした。その代わりに、誤ってgitbranch、およびSSLOC-201_Implement___str__と呼ばれる3つのShell functionsを定義しました。これらはパラメーター(存在する場合)を無視し、本体は_of_ProductSearchQueryです。 functionsと呼ばれる組み込みのzshコマンドを呼び出すことで、これが実際に起こったことを自分で確認できます。

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

残念ながら、他の2つのシェル関数は問題ありませんが、「git」と呼ばれるシェル関数はbona fidegitコマンドを隠します!

$ 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 loggit statusなど(もちろん、_of_ProductSearchQueryと呼ばれるコマンドが存在しないと仮定)。

サイドノート

[...]同じエラーが表示されます。

git:176: command not found: _of_ProductSearchQuery

gitの後の数字は、コマンドを入力するたびに増加します)

その番号は、保持する環境変数であるHISTCMDの値に単に対応します。

[t]インタラクティブシェルの現在の履歴イベント番号、言い換えると、$HISTCMDの読み取りを引き起こしたコマンドのイベント番号。

詳細については、 zsh manual を参照してください。

溶液

そして、どのように通常に戻りますか?

問題のあるシェル関数(および誤って作成した他の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'

ただし、そのような名前を引用符で囲む必要があるevery single timeコマンドライン引数として使用する場合、参照名の括弧を避ける必要があります。より一般的には、このような驚きを防ぐために、シェルで特別な意味を持つ文字を(可能な限り)避けるべきです。

単純なブランチ名を使用する

とにかくブランチ名は短くて甘いものにしてください。のような長い説明

SSLOC-201_Implement ___ str __()_ of_ProductSearchQuery

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

613
jubobs