Apakah git mengembalikan kode kesalahan pengembalian tertentu?

87

Seperti kesalahan penggabungan, atau kesalahan basis ulang. Apakah ini memiliki kode kesalahan unik?

poymode.dll
sumber

Jawaban:

56

Saya menyiapkan tes untuk gagal. Inilah yang saya dapatkan:

$ 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 kembali 0jika digabungkan dengan benar, seperti yang diharapkan.

chrisaycock
sumber
2
Masalahnya, dokumen untuk git merge(di 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html ) hanya menyebutkan status pengembalian di satu tempat (jika Anda menggunakan "- -ff-only "dan tidak dapat melakukan komit maju-cepat, ia mengembalikan bukan nol - tidak secara eksplisit mengatakan apa yang dikembalikan jika semuanya berfungsi atau jika ada konflik penggabungan.
Matt Curtis
10
@Matt: Perintah Git sangat, sangat baik tentang mengembalikan nol untuk kesuksesan dan bukan nol (umumnya 1) sebaliknya. Anda selalu dapat merangkai perintah secara aman dengan &&; begitulah cara pengujian mereka diterapkan.
Cascabel
17
Git tidak baik untuk mengembalikan kode keluar yang konsisten dan masuk akal. Misalnya, melakukan git commit tanpa perubahan akan keluar dengan kode 1, tapi ini bukan kesalahan.
pfalcon
3
Dari komentar di kode sumber builtin / merge.c: "Backend keluar dengan 1 saat konflik dibiarkan diselesaikan, dengan 2 saat tidak menangani penggabungan yang diberikan sama sekali."
Mike
adalah git rebaseperilaku yang sama?
osexp2003
60

Singkatnya, tidak. Anda akan melihat kode keluar 1 untuk kesalahan, dan 0 untuk sukses.

Dari pemahaman cepat sumber, ada beberapa dari 127 dan 128 yang diharapkan untuk tujuan spesifik mereka (perintah tidak ditemukan, kesalahan sudah dilaporkan), dan beberapa kode yang tidak biasa di beberapa tempat, tetapi untuk kesalahan run of the mill, itu semua exit(1).

Bertingkat
sumber
3
Ini sangat mengganggu untuk men-debug hook komit Anda. Apa gunanya memiliki kode keluar di git hooks Anda jika komit gagal hanya akan selalu mengembalikan 1 alih-alih kode keluar hook Anda.
Novice C
* Aplikasi nix mengembalikan status 0 untuk sukses total. Kode status lainnya ditentukan oleh aplikasi. Ada 255 kode lain yang artinya bergantung pada aplikasi. Lihat manhalaman mereka untuk detailnya.
shawnhcorey
3
@shawnhcorey Masalahnya adalah git tidak mendokumentasikan kode kesalahan bukan nolnya.
Ian Kemp
13

Berjalan git statuspada repo non-git menghasilkan 128, bukan 1, yang berguna dalam menentukan dengan cepat apakah repo git ada atau tidak.

Gus Shortz
sumber
7

git push --delete origin a_remote_tag_name

Ini mengembalikan 256 jika tag tidak ada menggunakan versi git 1.8.3.1

Alangkah baiknya jika memiliki daftar gabungan kode pengembalian spesifik yang dikembalikan oleh setiap perintah dan apa yang ditunjukkannya. Ini juga dapat membantu mencegah perubahan arti kode yang dikembalikan (yang mungkin bergantung pada skrip otomatisasi).

manningr
sumber
6

Kesalahan 128, tanpa pesan kesalahan dari git, bisa menjadi penampung-semua untuk "masalah tak terduga".

Saya mendapatkan ini pada operasi yang diperlukan untuk mengubah file di bawah .git (misalnya " git checkout -- myfile" untuk mengembalikan file yang dimodifikasi) oleh pengguna lain. (Dalam kasus saya " chmod -R og+w .git" memperbaikinya; tentu saja, jangan lakukan itu kecuali Anda memahami implikasi keamanan untuk kasus Anda!)

Darren Cook
sumber
2

Git 2.24 (Q4 2019) does illustrate how git commands return code.

Lihat komit 50094ca , komit c1a6f21 , komit 854b5cb , komit dd2b6b6 , komit 6bd26f5 , komit c6ec6da , komit f2e2fa8 , komit 460609c , komit 92014b6 , komit 0ab74e9 , komit cb46c40 , komit b562a54 (27 Agustus 2019), dan melakukan fe49814 (20 Agustus 2019) oleh Denton Liu ( Denton-L) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit 1c6fc94 , 30 Sep 2019)

t4014: berhenti kehilangan kode kembali dari perintah git

Saat ini, ada dua cara di mana kode kembalian dari perintah Git hilang.

Cara pertama adalah saat perintah berada di hulu pipa. Dalam pipa, hanya kode yang dikembalikan dari perintah terakhir yang digunakan. Dengan demikian, semua perintah lain akan memiliki kode kembaliannya yang tertutup.
Tulis ulang pipa sehingga tidak ada perintah Git di bagian atas.

Cara lain adalah ketika perintah berada di subkulit non-penugasan .
Kode kembali akan hilang karena perintah di sekitarnya.
Tulis ulang instance ini sedemikian rupa sehingga perintah Git dikeluarkan ke file dan perintah di sekitarnya hanya memanggil subkulit dengan perintah non-Git.

Jadi daripada menulis:

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

Tipe:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
VonC
sumber