ชื่อสาขาที่ซับซ้อนของ Git นั้นยากต่อการใช้คำสั่ง Git ทั้งหมด


338

ฉันพยายามสร้างสาขาจากmasterคำสั่งต่อไปนี้

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

เมื่อ Git หยุดตอบสนองทันที ฉันสงสัยว่าคนที่ไม่หลบหนี()จะต้องถูกตำหนิ แต่อย่างใด ตอนนี้เมื่อใดก็ตามที่ฉันพยายามเรียกใช้คำสั่ง Git ฉันได้รับข้อผิดพลาดเดียวกัน:

git:176: command not found: _of_ProductSearchQuery

ด้วยจำนวนที่gitเพิ่มขึ้นทุกครั้งที่ฉันพิมพ์คำสั่ง

ทุกคนสามารถอธิบายสิ่งที่เกิดขึ้นได้ไหม แล้วฉันจะกลับมาเป็นปกติได้อย่างไร? ฉันต้องการลบสาขานั้น แต่ฉันจะทำอย่างไร


8
ฉันเดาว่านี่เกี่ยวข้องกับสภาพแวดล้อม zsh ของคุณเนื่องจากฉันสามารถเรียกใช้สร้างสาขาในเปลือก bash ของฉันโดยไม่มีผลข้างเคียง (lubuntu 13.10) แต่ฉันเห็นข้อผิดพลาดเมื่อฉันเปลี่ยนเป็น vanilla zsh โดยสิ้นเชิง
Jonathan.Brink

27
ในอนาคตเสนอราคาสิ่งที่ดูน่าสงสัย git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"ทำงานได้ดี
Qix - MONICA ถูกยกเลิก

11
@Qix ดีกว่าเพื่อหลีกเลี่ยงอักขระที่มีปัญหาโดยสิ้นเชิง
jub0bs

3
@Jubobs แน่นอนแม้ว่าฉันจะเห็น บริษัท บางแห่งบังคับใช้ชื่อสาขาแปลก ๆ เช่นนี้
Qix - MONICA ถูกยกเลิก

1
@DwightSpencer ลิงก์ของคุณเฉพาะ Bash แต่คำถามนี้เฉพาะ zsh ปัญหาไม่ได้เกิดขึ้นจริงใน Bash
jub0bs

คำตอบ:


617

ปัญหา

ทุกคนสามารถอธิบายสิ่งที่เกิดขึ้นได้ไหม [... ] ฉันชอบที่จะสามารถลบสาขานั้นได้ แต่ Git จะไม่ทำงานสำหรับฉัน

โดยการวิ่ง

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

ใน zsh, คุณไม่ได้สร้างทุกสาขา แต่คุณไม่ได้ตั้งใจที่กำหนดไว้สามฟังก์ชั่นเปลือกที่เรียกว่าgit, branchและSSLOC-201_Implement___str__ที่จะไม่แสดงพารามิเตอร์ของพวกเขา (ถ้ามี) _of_ProductSearchQueryและผู้ที่ร่างกาย คุณสามารถตรวจสอบด้วยตัวคุณเองว่านี่เป็นสิ่งที่เกิดขึ้นจริงโดยการเรียกใช้คำสั่ง builtin zsh functionsซึ่งจะแสดงรายการฟังก์ชันเชลล์ที่มีอยู่ทั้งหมด:

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

น่าเสียดายที่แม้ว่าฟังก์ชันเชลล์อีกสองฟังก์ชันนั้นไม่เป็นปัญหา แต่ฟังก์ชันเชลล์ที่เรียกว่า "git" จะแสดงคำสั่งbona fide 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ตัวแปรสภาพแวดล้อมที่เก็บไว้

[t] เขาหมายเลขเหตุการณ์ประวัติปัจจุบันในเชลล์แบบโต้ตอบในคำอื่น ๆ หมายเลขเหตุการณ์สำหรับคำสั่งที่ทำให้เกิด$HISTCMDการอ่าน

ดูคู่มือ zshสำหรับรายละเอียดเพิ่มเติม

สารละลาย

แล้วฉันจะกลับมาเป็นปกติได้อย่างไร?

เพียงลบฟังก์ชั่นเชลล์ที่มีปัญหา (และอีกสองอันที่คุณสร้างขึ้นโดยไม่ได้ตั้งใจขณะที่คุณอยู่ที่นั่น):

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
ไม่มีสิ่งใดในเธรดที่ระบุว่า parens ผิดกฎหมาย Git ดูเหมือนว่าจะสบายดี Switched to a new branch 'abcd-()-foo'
Qix - MONICA ถูกยกเลิก

1
ดูดี; แน่นอนไม่ใช่ความคิดที่ดีที่จะใช้พวกเขา แต่พวกเขาไม่ได้ใช้เทคนิคไม่ถูกต้อง
Qix - MONICA ถูกยกเลิก

12
จะเกิดอะไรขึ้นถ้าใครบางคนยังเงาunsetโดยการสร้างฟังก์ชั่นเชลล์ที่เรียกว่า? (เป็นไปได้หรือไม่)
Matteo Umili

2
@codroipo ฮา! นั่นเป็นจุดที่ดี ใช่เป็นไปได้และในกรณีนั้นคุณอาจเริ่มต้นใหม่zshได้ดีกว่า
jub0bs

45
builtin unsetคุณสามารถใช้ ถ้าbuiltinและมีทั้งถูกเงาโดยฟังก์ชั่นแล้วunset unfunctionถ้ามันหายไปเช่นunhash -fกัน ถ้าทั้งสี่ของเหล่านั้นจะหายไปแล้วรีสตาร์ทเปลือก
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.