การแยกเอาท์พุทของ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
น่าจะเป็นทางออกที่ดีที่สุด