Tên nhánh Git phức tạp đã phá vỡ tất cả các lệnh Git


338

Tôi đã cố gắng tạo một nhánh từ masterlệnh sau,

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

khi Git đột nhiên ngừng trả lời. Tôi nghi ngờ những người không được giải thoát ()là để đổ lỗi, bằng cách nào đó. Bây giờ, bất cứ khi nào tôi cố chạy bất kỳ lệnh Git nào, tôi đều gặp lỗi tương tự:

git:176: command not found: _of_ProductSearchQuery

với số sau khi gittăng mỗi lần tôi gõ lệnh.

Bất cứ ai có thể giải thích những gì đã xảy ra? Và làm thế nào để tôi trở lại bình thường? Tôi muốn xóa chi nhánh đó, nhưng làm thế nào tôi có thể làm điều đó?


8
Tôi đoán điều này có liên quan đến môi trường zsh của bạn vì tôi có thể chạy tạo chi nhánh trong vỏ bash của mình mà không có tác dụng phụ xấu (Lubfox 13.10), nhưng tôi thấy lỗi khi tôi chuyển sang zilla hoàn toàn của mình
Jonathan.Brink

27
Trong tương lai, trích dẫn những thứ có vẻ đáng ngờ. git branch "SSLOC-201_Implement___str__()_of_ProductSearchQuery"hoạt động tốt
Qix - MONICA ĐƯỢC PHÂN PHỐI

11
@Qix Tốt hơn để tránh các nhân vật có vấn đề hoàn toàn.
jub0bs

3
@Jubobs Chắc chắn, mặc dù tôi đã thấy một số công ty thực thi các tên chi nhánh kỳ lạ như thế này.
Qix - MONICA ĐƯỢC PHÂN PHỐI

1
@DwightSpencer Liên kết của bạn dành riêng cho Bash, nhưng câu hỏi này là dành riêng cho zsh. Vấn đề không thực sự xảy ra ở Bash.
jub0bs

Câu trả lời:


617

Vấn đề

Bất cứ ai có thể giải thích những gì đã xảy ra? [...] Tôi rất muốn có thể xóa chi nhánh đó, nhưng Git sẽ không làm việc cho tôi.

Bằng cách chạy

git branch SSLOC-201_Implement___str__()_of_ProductSearchQuery

trong zsh, bạn đã không tạo bất kỳ chi nhánh . Thay vào đó, bạn vô tình định nghĩa ba chức năng vỏ , được gọi là git, branchSSLOC-201_Implement___str__, mà bỏ qua các thông số của họ (nếu có) và có cơ thể là _of_ProductSearchQuery. Bạn có thể tự kiểm tra xem đây có thực sự là điều đã xảy ra hay không, bằng cách gọi lệnh zsh dựng sẵn được gọi functions, liệt kê tất cả các hàm shell hiện có:

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

Thật không may, mặc dù hai hàm shell khác không có vấn đề, nhưng hàm shell có tên "git" hiện che mờ lệnh 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)

Do đó, sau đó bạn sẽ nhận được lỗi

command not found: _of_ProductSearchQuery

bất cứ khi nào bạn cố gắng để chạy một lệnh Git, ví dụ như git log, git statusvv (giả sử, tất nhiên, điều đó không có lệnh gọi _of_ProductSearchQuerytồn tại).

Lưu ý bên

[...] Tôi nhận được lỗi tương tự:

git:176: command not found: _of_ProductSearchQuery

(với số sau khi gittăng mỗi lần tôi gõ lệnh)

Con số đó đơn giản tương ứng với giá trị của HISTCMD, một biến môi trường chứa

[t] anh ta số sự kiện lịch sử hiện tại trong một vỏ tương tác, nói cách khác, số sự kiện cho lệnh gây ra $HISTCMDđược đọc.

Xem hướng dẫn sử dụng zsh để biết thêm chi tiết.

Giải pháp

Và làm thế nào để tôi trở lại bình thường?

Đơn giản chỉ cần xóa chức năng shell có vấn đề (và hai cái khác bạn tạo ra một cách tình cờ, trong khi bạn đang ở đó):

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

Sau đó mọi thứ sẽ ổn thôi.

Điều gì nếu unsetbị che khuất?!

Câu hỏi hay ! Tôi giới thiệu bạn đến bình luận tuyệt vời của Wumpus W. Wumbley bên dưới.


Mẹo đặt tên chi nhánh

Tránh bất kỳ ký tự vỏ đặc biệt

Có, như đã chỉ ra trong các nhận xét, dấu ngoặc đơn là các ký tự hợp lệ trong tên nhánh Git; bạn chỉ cần trích dẫn tên một cách thích hợp, vd

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

Tuy nhiên, nhu cầu trích dẫn các tên như vậy mỗi lần khi được sử dụng làm đối số dòng lệnh sẽ thuyết phục bạn tránh dấu ngoặc đơn trong tên tham chiếu. Tổng quát hơn, bạn nên (càng nhiều càng tốt) tránh các nhân vật có ý nghĩa đặc biệt trong vỏ sò, để ngăn chặn những điều bất ngờ như thế này.

Sử dụng tên chi nhánh đơn giản

Bạn nên giữ tên chi nhánh của bạn ngắn và ngọt ngào. Mô tả dài như

SSLOC-201_Thực hiện ___ str __ () _ of_ ProducttSearchQuery

thuộc về thông điệp cam kết, không phải trong tên chi nhánh.


4
Không có gì trong đó chủ đề parens là bất hợp pháp. Git có vẻ thích nó chỉ tốt thôi. Switched to a new branch 'abcd-()-foo'
Qix - MONICA ĐƯỢC PHÂN PHỐI

1
Có vẻ tốt; chắc chắn không phải là một ý tưởng tuyệt vời để sử dụng chúng, nhưng chúng không hợp lệ về mặt kỹ thuật .
Qix - MONICA ĐƯỢC PHÂN PHỐI

12
Điều gì xảy ra nếu ai đó cũng đổ bóng unsetbằng cách tạo hàm shell được gọi như vậy? (điều này có thể không?)
Matteo Umili

2
@codroipo Hà! Đó là một điểm hay. Vâng, có thể, và trong trường hợp đó, có lẽ bạn nên khởi động lại zsh.
jub0bs

45
Bạn có thể sử dụng builtin unset. Nếu builtinunsetcả hai đều bị che khuất bởi các chức năng, thì unfunction. Nếu điều đó cũng đi unhash -f. Nếu tất cả bốn trong số đó đã biến mất, sau đó khởi động lại vỏ.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.