การแยกเอาท์พุทของgit statusเป็นความคิดที่ไม่ดีเพราะเอาท์พุทมีวัตถุประสงค์เพื่อให้มนุษย์อ่านได้ไม่ใช่เครื่องอ่านได้ ไม่มีการรับประกันว่าผลลัพธ์จะยังคงเหมือนเดิมใน Git รุ่นอนาคตหรือในสภาพแวดล้อมที่กำหนดค่าแตกต่างกัน
ความคิดเห็นของ UVVอยู่ในเส้นทางที่ถูกต้อง แต่น่าเสียดายที่โค้ดส่งคืนของgit statusไม่เปลี่ยนแปลงเมื่อมีการเปลี่ยนแปลงที่ไม่ได้รับการยอมรับ อย่างไรก็ตามมี--porcelainตัวเลือกซึ่งทำให้การgit status --porcelainจัดรูปแบบผลลัพธ์ในรูปแบบที่ง่ายต่อการแยกวิเคราะห์สำหรับสคริปต์และจะยังคงมีเสถียรภาพในเวอร์ชัน Git และไม่คำนึงถึงการกำหนดค่าของผู้ใช้
เราสามารถใช้เอาท์พุทเปล่าgit status --porcelainเป็นตัวบ่งชี้ว่าไม่มีการเปลี่ยนแปลงที่จะเกิดขึ้น:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
หากเราไม่สนใจเกี่ยวกับไฟล์ที่ไม่ได้ติดตามในไดเรกทอรีทำงานเราสามารถใช้--untracked-files=noตัวเลือกเพื่อเพิกเฉยต่อไฟล์เหล่านั้น:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
ในการทำให้สิ่งนี้มีความทนทานต่อสภาวะที่เป็นจริงซึ่งทำให้เกิดความgit statusล้มเหลวโดยไม่ต้องออกไปstdoutเราสามารถปรับแต่งการตรวจสอบไปที่:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
นอกจากนี้ยังเป็นที่น่าสังเกตว่าถึงแม้ว่าgit statusจะไม่ให้รหัสออกที่มีความหมายเมื่อไดเรกทอรีทำงานไม่สะอาดก็git diffมี--exit-codeตัวเลือกซึ่งทำให้มันทำงานคล้ายกับยูทิลิตีdiffซึ่งก็คือการออกจากสถานะ1เมื่อมีความแตกต่างและ0เมื่อไม่พบ
เมื่อใช้สิ่งนี้เราสามารถตรวจสอบการเปลี่ยนแปลงที่ไม่มีการจัดการด้วย:
git diff --exit-code
และเป็นฉาก แต่ไม่ได้ทำการเปลี่ยนแปลงด้วย:
git diff --cached --exit-code
แม้ว่าgit diffสามารถรายงานไฟล์ที่ไม่ได้ติดตามใน submodules ผ่านการขัดแย้งที่เหมาะสม--ignore-submodulesแต่น่าเสียดายที่ไม่มีรายงานว่าไฟล์ที่ไม่ได้ติดตามในไดเรกทอรีการทำงานจริง หากไฟล์ที่ไม่ได้ติดตามในไดเรกทอรีการทำงานมีความเกี่ยวข้องgit status --porcelainน่าจะเป็นทางออกที่ดีที่สุด