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


338

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

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

Gitが突然応答を停止したとき。()どういうわけか、私はエスケープされていないことが非難されているのではないかと思います。ここで、Gitコマンドを実行しようとすると、常に同じエラーが発生します。

git:176: command not found: _of_ProductSearchQuery

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

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


8
ノー悪い副作用(lubuntu 13.10)と私のbashシェルでブランチを作成、実行することができたように私はこれがあなたのzshの環境に関連していると思うだろうが、私は完全にバニラのzshに切り替えたとき、私は、エラーを見ています
ジョナサン

27
将来的には、疑わしいものを引用します。git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"正常に動作します。
Qix-モニカは2015

11
@Qix問題のある文字を完全に回避する方が良い。
jub0bs

3
@Jubobs確かに、私は特定の会社がこのように奇妙な支店名を強制するのを見てきました。
Qix-モニカは2015

1
@DwightSpencerあなたのリンクはBashに固有ですが、この質問はzsh固有です。問題は実際にはBashでは発生しません。
jub0bs

回答:


617

問題

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

実行することにより

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

zshでは、ブランチを作成していません。代わりに、誤って3つの定義されたシェル関数と呼ばれる、gitbranch、そしてSSLOC-201_Implement___str__体であるそれらのパラメータ(もしあれば)とを無視し、_of_ProductSearchQuery。これが実際に起こったことであることを確認するにはfunctions、と呼ばれる組み込みのzshコマンドを呼び出します。これにより、既存のすべてのシェル関数が一覧表示されます。

$ 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 loggit status(何のコマンドが呼び出されないことを、もちろん、と仮定すると、など_of_ProductSearchQueryが存在します)。

サイドノート

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

git:176: command not found: _of_ProductSearchQuery

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

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

[t]インタラクティブシェルの現在の履歴イベント番号、つまり、$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

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


4
そのスレッドでは、括弧が違法であることは何も述べられていません。Gitはそれを問題なく気に入ったようです。Switched to a new branch 'abcd-()-foo'
Qix-モニカは2015

1
いいね; 間違いなくそれらを使用するのは良い考えではありませんが、技術的に無効ではありません。
Qix-モニカは2015

12
unsetいわゆるシェル関数を作成して誰かがシャドウイングするとどうなりますか?(これは可能ですか?)
Matteo Umili 2015

2
@codroipoハ!それは良い点です。はい、可能です。その場合は、再起動することをお勧めしますzsh
jub0bs 2015

45
使用できますbuiltin unset。もしbuiltinunsetの両方、その後、機能の影にされていますunfunction。その者があまりにもなくなった場合は、unhash -f。これらの4つがすべてなくなった場合、シェルを再起動します。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.