Git có trả về mã lỗi trả lại cụ thể không?


86

Như lỗi hợp nhất hoặc lỗi cơ sở lại. Nó có một mã lỗi duy nhất không?

Câu trả lời:


56

Tôi đã thiết lập một bài kiểm tra để thất bại. Đây là những gì tôi nhận được:

$ git merge newbranch
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.

$ echo $?
1

Git trả về 0khi nó kết hợp chính xác, như mong đợi.


2
Rắc rối là, tài liệu cho git merge(tại 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html ) chỉ đề cập đến trạng thái trả lại ở một nơi (nếu bạn sử dụng "- -ff-only "và nó không thể thực hiện cam kết tua đi nhanh, nó trả về khác 0 - nó không nói rõ ràng những gì được trả về nếu tất cả hoạt động hoặc nếu có xung đột hợp nhất.
Matt Curtis

9
@Matt: Các lệnh Git rất, rất tốt khi trả về số 0 cho thành công và khác 0 (thường là 1) nếu không. Bạn luôn có thể xâu chuỗi các lệnh với nhau một cách an toàn với &&; đó là cách các thử nghiệm của họ được triển khai.
Cascabel

17
Git không tốt cho việc trả về các mã thoát nhất quán và hợp lý. Ví dụ: thực hiện git commit mà không có thay đổi nào sẽ thoát với mã 1, nhưng heck, nó không phải là lỗi.
pfalcon

3
Từ nhận xét trong mã nguồn của builtin / merge.c: "Phần phụ trợ thoát ra với 1 khi xung đột còn lại được giải quyết, với 2 khi nó không xử lý kết hợp nhất định."
Mike

git rebasecùng một hành vi?
osexp2003

60

Trong ngắn hạn, không. Bạn sẽ thấy mã thoát 1 cho các lỗi và 0 cho thành công.

Từ việc phân tích nhanh nguồn, có một số mã 127 và 128 được mong đợi cho các mục đích cụ thể của chúng (không tìm thấy lệnh, lỗi đã được báo cáo) và một số mã bất thường ở một vài chỗ, nhưng đối với lỗi chạy máy, đó là tất cả exit(1).


3
Điều này gây khó chịu thêm cho việc gỡ lỗi các hook cam kết của bạn. Điểm của việc thậm chí có mã thoát trong git hook của bạn là gì nếu một cam kết không thành công sẽ luôn trả về 1 thay vì mã thoát hook của bạn.
Novice C

* Ứng dụng nix trả về trạng thái 0 để thành công hoàn toàn. Các mã trạng thái khác được xác định bởi ứng dụng. Có 255 mã khác mà ý nghĩa phụ thuộc vào ứng dụng. Xem các mantrang của họ để biết chi tiết.
shawnhcorey 29/1018

3
@shawnhcorey Vấn đề là git không ghi lại các mã lỗi nonzero của nó.
Ian Kemp

13

Chạy git statustrên repo không phải git trả về 128, không phải 1, điều này rất hữu ích trong việc nhanh chóng xác định xem repo git có tồn tại hay không.


6

Lỗi 128, không có thông báo lỗi từ git, có thể là lỗi chung cho "sự cố không mong muốn".

Tôi nhận được điều này trên các hoạt động cần sửa đổi tệp dưới .git (ví dụ: " git checkout -- myfile" để hoàn nguyên tệp đã sửa đổi) bởi một người dùng khác. (Trong trường hợp của tôi " chmod -R og+w .git" đã sửa nó; tự nhiên, đừng làm vậy trừ khi bạn hiểu các tác động bảo mật đối với trường hợp của mình!)


6

git push --delete origin a_remote_tag_name

Điều này trả về 256 nếu thẻ không tồn tại bằng cách sử dụng phiên bản git 1.8.3.1

Sẽ rất tuyệt nếu có một danh sách tổng hợp các mã trả lại cụ thể được trả về bởi mỗi lệnh và những gì chúng chỉ ra. Điều này cũng có thể giúp ngăn việc thay đổi ý nghĩa mã trả về (mà các tập lệnh tự động hóa có thể dựa vào).


2

Git 2.24 (Q4 2019) minh họa cách gitcác lệnh trả về mã.

Xem cam kết 50094ca , cam kết c1a6f21 , cam kết 854b5cb , cam kết dd2b6b6 , cam kết 6bd26f5 , cam kết c6ec6da , cam kết f2e2fa8 , cam kết 460609c , cam kết 92014b6 , cam kết 0ab74e9 , cam kết cb46c40 , cam kết b562a54 (ngày 27 tháng 8 năm 2019) và cam kết ngày 20 tháng 8 năm 2019 bởi Denton Liu ( Denton-L) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 1c6fc94 , ngày 30 tháng 9 năm 2019)

t4014: ngừng mất mã trả về của lệnh git

Hiện tại, có hai cách khiến mã trả về của lệnh Git bị mất.

Cách đầu tiên là khi một lệnh ở phía trên của một đường ống. Trong một đường ống, chỉ mã trả về của lệnh cuối cùng được sử dụng. Vì vậy, tất cả các lệnh khác sẽ có mã trả lại của chúng bị che.
Viết lại các đường ống để không có lệnh Git ngược dòng.

Một cách khác là khi một lệnh nằm trong một vỏ con không được gán .
Mã trả về sẽ bị mất theo lệnh xung quanh.
Viết lại các trường hợp này sao cho các lệnh Git xuất ra một tệp và các lệnh xung quanh chỉ gọi các hộp con bằng các lệnh không phải Git.

Vì vậy, thay vì viết:

git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"

Kiểu:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
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.