git ส่งคืนรหัสข้อผิดพลาดเฉพาะที่ส่งคืนหรือไม่


87

เช่นเดียวกับข้อผิดพลาดในการรวมหรือข้อผิดพลาด rebase มีรหัสข้อผิดพลาดที่ไม่ซ้ำกันหรือไม่?

คำตอบ:


56

ฉันตั้งค่าการทดสอบล้มเหลว นี่คือสิ่งที่ฉันได้รับ:

$ 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 จะส่งคืน0เมื่อรวมเข้าด้วยกันอย่างถูกต้องตามที่คาดไว้


2
ปัญหาคือเอกสารสำหรับgit merge(ที่ 1.7.4 - kernel.org/pub/software/scm/git/docs/v1.7.4/git-merge.html ) จะกล่าวถึงสถานะการส่งคืนในที่เดียวเท่านั้น (หากคุณใช้ "- -ff-only "และไม่สามารถทำการ fast-forward ได้ แต่จะส่งกลับไม่เป็นศูนย์ - ไม่ได้บอกอย่างชัดเจนว่าจะส่งคืนอะไรหากทุกอย่างทำงานหรือมีข้อขัดแย้งในการรวม
Matt Curtis

10
@Matt: คำสั่ง Git นั้นดีมากเกี่ยวกับการคืนศูนย์สำหรับความสำเร็จและไม่ใช่ศูนย์ (โดยทั่วไปคือ 1) คุณสามารถโยงคำสั่งร่วมกันได้อย่างปลอดภัยด้วย&&; นั่นคือวิธีดำเนินการทดสอบ
Cascabel

17
Git ไม่ดีในการส่งคืนรหัสทางออกที่สอดคล้องและสมเหตุสมผล ตัวอย่างเช่นการคอมมิตคอมมิตโดยไม่มีการเปลี่ยนแปลงจะออกด้วยโค้ด 1 แต่ก็ไม่ใช่ข้อผิดพลาด
pfalcon

3
จากความคิดเห็นในซอร์สโค้ดของ builtin / merge.c: "แบ็กเอนด์ออกด้วย 1 เมื่อความขัดแย้งถูกปล่อยให้แก้ไขโดย 2 เมื่อไม่จัดการกับการผสานที่กำหนดเลย"
Mike

เป็นgit rebaseพฤติกรรมเดียวกันได้หรือไม่
osexp2003

60

ในระยะสั้นไม่ คุณจะเห็นรหัสทางออก 1 สำหรับข้อผิดพลาดและ 0 สำหรับความสำเร็จ

จากการจับแหล่งที่มาอย่างรวดเร็วมี 127 และ 128 ที่คาดไว้สำหรับวัตถุประสงค์เฉพาะ (ไม่พบคำสั่งรายงานข้อผิดพลาดแล้ว) และรหัสผิดปกติบางส่วนในไม่กี่แห่ง แต่สำหรับข้อผิดพลาดในการทำงานของโรงสี ทั้งหมดexit(1).


3
นี่เป็นสิ่งที่น่ารำคาญเป็นพิเศษสำหรับการดีบักคอมมิต hooks ของคุณ อะไรคือจุดสำคัญของการมีรหัสออกใน git hooks ของคุณหากการกระทำที่ล้มเหลวจะส่งคืน 1 เสมอแทนที่จะเป็นรหัสออกจาก hook ของคุณ
สามเณร C

* แอพ nix คืนสถานะเป็น 0 เพื่อความสำเร็จที่สมบูรณ์ รหัสสถานะอื่น ๆ กำหนดโดยแอป มีรหัสอื่น ๆ 255 รหัสซึ่งความหมายขึ้นอยู่กับแอป ดูmanรายละเอียดในหน้าของพวกเขา
shawnhcorey

3
@shawnhcorey ปัญหาคือ git ไม่ได้บันทึกรหัสข้อผิดพลาดที่ไม่ใช่ศูนย์
Ian Kemp

13

การรันgit statusบน repo ที่ไม่ใช่ git จะคืนค่า 128 ไม่ใช่ 1 ซึ่งมีประโยชน์ในการพิจารณาอย่างรวดเร็วว่า git repo มีอยู่หรือไม่


7

git push --delete origin a_remote_tag_name

สิ่งนี้จะส่งคืน 256 หากไม่มีแท็กโดยใช้เวอร์ชัน git 1.8.3.1

จะเป็นการดีที่จะมีการรวมรายการโค้ดส่งคืนเฉพาะที่ส่งคืนโดยแต่ละคำสั่งและสิ่งที่ระบุ นอกจากนี้ยังอาจช่วยป้องกันการเปลี่ยนความหมายโค้ดส่งคืน (ซึ่งสคริปต์อัตโนมัติอาจต้องใช้)


6

ข้อผิดพลาด 128 ที่ไม่มีข้อความแสดงข้อผิดพลาดจากคอมไพล์อาจเป็นข้อผิดพลาดทั้งหมดสำหรับ "ปัญหาที่ไม่คาดคิด"

ฉันได้รับสิ่งนี้ในการดำเนินการที่จำเป็นในการแก้ไขไฟล์ภายใต้. git (เช่น " git checkout -- myfile" เพื่อเปลี่ยนไฟล์ที่แก้ไข) โดยผู้ใช้รายอื่น (ในกรณีของฉัน " chmod -R og+w .git" แก้ไขแล้วโดยธรรมชาติอย่าทำเช่นนั้นเว้นแต่คุณจะเข้าใจผลกระทบด้านความปลอดภัยสำหรับกรณีของคุณ!)


2

Git 2.24 (Q4 2019) แสดงให้เห็นว่าgitคำสั่งส่งคืนโค้ดอย่างไร

ดูกระทำ 50094ca , กระทำ c1a6f21 , กระทำ 854b5cb , กระทำ dd2b6b6 , กระทำ 6bd26f5 , กระทำ c6ec6da , กระทำ f2e2fa8 , กระทำ 460609c , กระทำ 92014b6 , กระทำ 0ab74e9 , กระทำ cb46c40 , กระทำ b562a54 (27 สิงหาคม 2019) และกระทำ fe49814 (20 สิงหาคม 2019) โดยDenton หลิว (Denton-L )
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 1c6fc94 , 30 ก.ย. 2019)

t4014: หยุดการสูญเสียรหัสส่งคืนของคำสั่ง git

ปัจจุบันมีสองวิธีที่รหัสส่งคืนของคำสั่ง Git หายไป

วิธีแรกคือเมื่อคำสั่งอยู่ในต้นน้ำของไปป์ ในไพพ์จะใช้โค้ดส่งคืนของคำสั่งสุดท้ายเท่านั้น ดังนั้นคำสั่งอื่น ๆ ทั้งหมดจะมีการปิดบังรหัสส่งคืน
เขียนไปป์ใหม่เพื่อให้ไม่มีคำสั่ง Git ที่อัปสตรีม

วิธีอื่น ๆ คือเมื่อคำสั่งอยู่ในsubshell ที่ไม่ได้รับมอบหมาย
รหัสส่งคืนจะสูญหายไปตามคำสั่งโดยรอบ
เขียนอินสแตนซ์ของสิ่งนี้ใหม่เพื่อให้คำสั่ง Git ส่งออกไปยังไฟล์และคำสั่งรอบ ๆ เรียกเฉพาะ subshells ด้วยคำสั่งที่ไม่ใช่ Git

ดังนั้นแทนที่จะเขียน:

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

ประเภท:

git cat-file commit rebuild-1 >actual &&
    grep "^Side .* with .* backslash-n" actual
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.