Nama cabang Complex Git memecahkan semua perintah Git

338

Saya mencoba membuat cabang dari masterdengan perintah berikut,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

ketika Git tiba-tiba berhenti merespons. Saya menduga yang tidak melarikan diri ()yang harus disalahkan, entah bagaimana. Sekarang, setiap kali saya mencoba menjalankan perintah Git, saya mendapatkan kesalahan yang sama:

git:176: command not found: _of_ProductSearchQuery

dengan angka setelah gitbertambah setiap kali saya mengetikkan perintah.

Adakah yang bisa menjelaskan apa yang terjadi? Dan bagaimana cara saya kembali normal? Saya ingin menghapus cabang itu, tetapi bagaimana saya bisa melakukannya?

ruipacheco
sumber
8
Saya kira ini terkait dengan lingkungan zsh Anda karena saya dapat menjalankan buat cabang di bash shell saya tanpa efek samping yang buruk (lubuntu 13.10), tapi saya melihat kesalahan ketika saya beralih ke zsh vanilla yang benar-benar
Jonathan.
27
Di masa depan, kutip hal-hal yang terlihat mencurigakan. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"berfungsi dengan baik.
Qix - MONICA DISALAHKAN
11
@Qix Lebih baik untuk menghindari karakter yang bermasalah sama sekali.
jub0bs
3
@Jubobs Jelas, meskipun saya telah melihat perusahaan tertentu memberlakukan nama cabang aneh seperti ini.
Qix - MONICA DISALAHKAN
1
@DwightSpencer Tautan Anda khusus untuk Bash, tetapi pertanyaan ini khusus untuk zsh. Masalahnya sebenarnya tidak terjadi di Bash.
jub0bs

Jawaban:

617

Masalah

Adakah yang bisa menjelaskan apa yang terjadi? [...] Saya ingin menghapus cabang itu, tetapi Git tidak akan berfungsi untuk saya.

Dengan berlari

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

di zsh, Anda tidak membuat cabang apa pun . Sebaliknya, Anda secara tidak sengaja ditetapkan tiga fungsi shell , yang disebut git, branchdan SSLOC-201_Implement___str__, yang mengabaikan parameter mereka (jika ada) dan yang tubuhnya _of_ProductSearchQuery. Anda dapat memeriksa sendiri bahwa ini memang yang terjadi, dengan menjalankan perintah builtin zsh yang disebut functions, yang mencantumkan semua fungsi shell yang ada:

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

Sayangnya, meskipun dua fungsi shell lainnya tidak bermasalah, fungsi shell yang disebut "git" sekarang membayangi perintah bonafide 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)

Karena itu, Anda selanjutnya akan mendapatkan kesalahan

command not found: _of_ProductSearchQuery

setiap kali Anda mencoba menjalankan perintah Git, mis git log. git status, dll. (dengan asumsi, tentu saja, tidak ada perintah yang dipanggil _of_ProductSearchQueryada).

Catatan samping

[...] Saya mendapatkan kesalahan yang sama:

git:176: command not found: _of_ProductSearchQuery

(dengan angka setelah gitbertambah setiap kali saya mengetikkan perintah)

Angka itu hanya sesuai dengan nilai HISTCMD, variabel lingkungan yang berlaku

[t] ia nomor peristiwa sejarah saat ini di shell interaktif, dengan kata lain nomor acara untuk perintah yang menyebabkan $HISTCMDuntuk dibaca.

Lihat manual zsh untuk detail lebih lanjut.

Larutan

Dan bagaimana cara saya kembali normal?

Hapus saja fungsi shell yang bermasalah (dan dua lainnya yang Anda buat secara tidak sengaja, saat Anda melakukannya):

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

Maka semuanya harus baik-baik saja.

Bagaimana jika unsetdibayangi juga ?!

Pertanyaan bagus ! Saya merujuk Anda pada komentar luar biasa Wumpus W. Wumbley di bawah ini.


Kiat penamaan cabang

Hindari karakter shell khusus

Ya, sebagaimana ditunjukkan dalam komentar, tanda kurung adalah karakter yang valid dalam nama cabang Git; Anda hanya perlu mengutip namanya secara tepat, mis

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

Namun, kebutuhan untuk mengutip nama-nama tersebut setiap kali ketika digunakan sebagai argumen baris perintah harus meyakinkan Anda untuk menghindari tanda kurung dalam nama referensi. Secara umum, Anda harus (sebanyak mungkin) menghindari karakter yang memiliki arti khusus dalam shell, untuk mencegah kejutan seperti ini.

Gunakan nama cabang sederhana

Anda tetap harus menjaga nama cabang Anda pendek dan manis. Seperti deskripsi panjang

SSLOC-201_Implement ___ str __ () _ of_ProductSearchQuery

termasuk dalam pesan komit, bukan dalam nama cabang.

jub0bs
sumber
4
Tidak ada di utas yang menyatakan bahwa orangtua adalah ilegal. Git sepertinya sangat menyukainya. Switched to a new branch 'abcd-()-foo'
Qix - MONICA DISALAHKAN
1
Kelihatan bagus; jelas bukan ide bagus untuk menggunakannya, tetapi secara teknis mereka tidak valid.
Qix - MONICA DISEBUTKAN
12
Apa yang terjadi jika seseorang juga unsetmembuat bayangan dengan menciptakan fungsi shell yang disebut? (apakah ini mungkin?)
Matteo Umili
2
@codroipo Ha! Itu poin yang bagus. Ya, itu mungkin, dan, dalam hal ini, Anda mungkin lebih baik memulai kembali zsh.
jub0bs
45
Anda bisa menggunakannya builtin unset. Jika builtindan unsetkeduanya telah dibayangi oleh fungsi, maka unfunction. Jika itu hilang juga unhash -f,. Jika keempatnya hilang, lalu hidupkan kembali shell.