ปรับปรุง : OP Daniel Daniel Stutzbachชี้ให้เห็นในความคิดเห็นที่คำสั่งง่ายๆนี้git diff-indexทำงานสำหรับเขา:
git update-index --refresh
git diff-index --quiet HEAD --
( nornagonกล่าวถึงในความคิดเห็นว่าหากมีไฟล์ที่ถูกแตะต้อง แต่มีเนื้อหาเหมือนในดัชนีคุณจะต้องเรียกใช้git update-index --refreshก่อนgit diff-indexมิฉะนั้นdiff-indexจะรายงานว่าต้นไม้สกปรกอย่างไม่ถูกต้อง)
จากนั้นคุณจะเห็น " วิธีตรวจสอบว่าคำสั่งประสบความสำเร็จหรือไม่ " ถ้าคุณใช้มันในสคริปต์ทุบตี:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
หมายเหตุ: ตามความเห็นของAnthony Sottile
git diff-index HEAD ...จะล้มเหลวในสาขาที่ไม่มีข้อผูกมัด (เช่นที่เก็บข้อมูลที่เริ่มต้นใหม่)
วิธีแก้ปัญหาหนึ่งที่ฉันพบคือgit diff-index $(git write-tree) ...
และharidsvจุดที่ออกในความคิดเห็นที่git diff-filesบนใหม่ไฟล์ไม่ได้ตรวจสอบว่ามันเป็น diff
ดูเหมือนว่าวิธีที่ปลอดภัยกว่านั้นจะรันgit addบนข้อมูลจำเพาะของไฟล์ก่อนจากนั้นใช้git diff-indexเพื่อดูว่ามีสิ่งใดที่เพิ่มเข้ากับดัชนีก่อนเรียกใช้git commitหรือไม่
git add ${file_args} && \
git diff-index --cached --quiet HEAD || git commit -m '${commit_msg}'
และ6502รายงานในความคิดเห็น:
ปัญหาอย่างหนึ่งที่ฉันเจอคือgit diff-indexจะบอกว่ามีความแตกต่างเมื่อแน่นอนไม่มีใครยกเว้นการประทับเวลาของไฟล์
การทำงานgit diffครั้งเดียวแก้ปัญหา (น่าแปลกใจgit diffจริงๆแล้วเปลี่ยนเนื้อหาของ sandbox ซึ่งหมายถึงที่นี่.git/index)
ปัญหาการประทับเวลาเหล่านี้ยังสามารถเกิดขึ้นได้ถ้าคอมไพล์จะทำงานในนักเทียบท่า
คำตอบเดิม:
"โปรแกรม" หมายถึงไม่เคยพึ่งพาคำสั่งพอร์ซเลน
พึ่งพาคำสั่งการวางท่อเสมอ
ดูเพิ่มเติม "การตรวจสอบดัชนีสกปรกหรือไฟล์ที่ไม่ได้ติดตามด้วย Git " เพื่อหาทางเลือกอื่น (เช่นgit status --porcelain)
คุณสามารถรับแรงบันดาลใจจาก " require_clean_work_treeฟังก์ชั่น " ใหม่ซึ่งเขียนขึ้นเมื่อเราพูด ;) (ต้นเดือนตุลาคม 2010)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}