กุญแจสำคัญในการ“ เขียนสคริปต์” Git ที่น่าเชื่อถือคือการใช้คำสั่ง 'การประปา'
นักพัฒนาใช้ความระมัดระวังเมื่อเปลี่ยนคำสั่งการวางท่อเพื่อให้แน่ใจว่ามีอินเทอร์เฟซที่เสถียรมาก (เช่นการรวมกันของสถานะพื้นที่เก็บข้อมูล, stdin, ตัวเลือกบรรทัดคำสั่ง, ข้อโต้แย้ง, ฯลฯ ) จะสร้างผลลัพธ์เดียวกันใน Git ทุกรุ่น มีตัวเลือก) รูปแบบเอาต์พุตใหม่ในคำสั่งการวางท่อสามารถนำเสนอผ่านตัวเลือกใหม่ แต่ไม่สามารถแนะนำปัญหาใด ๆ สำหรับโปรแกรมที่เขียนไปแล้วกับเวอร์ชันเก่า (พวกเขาจะไม่ใช้ตัวเลือกใหม่เนื่องจากไม่มีอยู่ (หรืออย่างน้อยก็คือ ไม่ได้ใช้) ในขณะที่เขียนสคริปต์)
น่าเสียดายที่คำสั่ง Git 'ทุกวัน' เป็นคำสั่ง 'เครื่องเคลือบ' ดังนั้นผู้ใช้ Git ส่วนใหญ่อาจไม่คุ้นเคยกับคำสั่งระบบท่อ ความแตกต่างระหว่างเครื่องลายครามและคำสั่งการประปาจะทำในหลักmanpage คอมไพล์ (ดูหัวข้อย่อยชื่อคำสั่งระดับสูง (พอร์ซเลน)และคำสั่งในระดับต่ำ (ประปา)
เพื่อหาข้อมูลเกี่ยวกับการเปลี่ยนแปลง uncomitted คุณอาจจะต้องgit diff-index
(ดัชนีเปรียบเทียบ (และอาจจะบิตของต้นไม้ที่ทำงาน) กับบางส่วน treeish อื่น ๆ (เช่นการติดตามHEAD
)) อาจจะgit diff-files
และอาจ (เทียบต้นไม้กับดัชนีการทำงาน) git ls-files
(แฟ้มรายการ; เช่นรายการที่ไม่ได้ติดตาม , ไฟล์ที่ไม่ได้รับสิทธิ)
(โปรดทราบว่าในคำสั่งด้านล่างHEAD --
จะใช้แทนHEAD
เพราะมิฉะนั้นคำสั่งล้มเหลวหากมีไฟล์ชื่อHEAD
)
ในการตรวจสอบว่าที่เก็บมีการเปลี่ยนแปลงแบบฉาก (ยังไม่ได้ทำ) ใช้สิ่งนี้
git diff-index --quiet --cached HEAD --
- หากออก
0
จากที่นั่นแสดงว่าไม่มีความแตกต่าง ( 1
หมายความว่ามีความแตกต่าง)
ในการตรวจสอบว่าต้นไม้ทำงานมีการเปลี่ยนแปลงที่สามารถจัดฉากได้หรือไม่:
git diff-files --quiet
- รหัสทางออกเหมือนกับ
git diff-index
( 0
== ไม่มีความแตกต่าง; 1
== ความแตกต่าง)
ในการตรวจสอบว่าการรวมกันของดัชนีและไฟล์ที่ถูกติดตามในแผนผังการทำงานมีการเปลี่ยนแปลงเกี่ยวกับHEAD
:
git diff-index --quiet HEAD --
- นี่คือการรวมกันของสองคนก่อนหน้านี้ ข้อแตกต่างที่สำคัญอย่างหนึ่งก็คือมันจะยังคงรายงาน“ ไม่แตกต่าง” หากคุณมีการเปลี่ยนแปลงแบบฉากที่คุณ“ เลิกทำ” ในแผนผังการทำงาน (กลับไปที่เนื้อหาที่มีอยู่
HEAD
) ในสถานการณ์เดียวกันนี้ทั้งสองคำสั่งที่แยกกันจะส่งคืนรายงานของ“ ความแตกต่างที่มีอยู่”
คุณยังกล่าวถึงไฟล์ที่ไม่ได้ติดตาม คุณอาจหมายถึง“ ไม่ได้ติดตามและไม่ได้รับการรับรอง” หรือคุณอาจหมายถึงเพียงแค่“ ไม่ได้ติดตาม” (รวมถึงไฟล์ที่ถูกละเว้น) ไม่ว่าจะด้วยวิธีใดgit ls-files
เป็นเครื่องมือสำหรับงาน:
สำหรับ“ untracked” (จะรวมไฟล์ที่ถูกละเว้นถ้ามี):
git ls-files --others
สำหรับ“ untracked และ unignored”:
git ls-files --exclude-standard --others
ความคิดแรกของฉันคือตรวจสอบว่าคำสั่งเหล่านี้มีเอาต์พุตหรือไม่:
test -z "$(git ls-files --others)"
- หากออก
0
จากด้วยจะไม่มีไฟล์ที่ไม่ได้ติดตาม หากออก1
จากด้วยจะมีไฟล์ที่ไม่ได้ติดตาม
มีโอกาสเล็กน้อยที่สิ่งนี้จะแปลการออกที่ผิดปกติจากgit ls-files
เป็นรายงาน "ไม่มีไฟล์ที่ไม่ได้ติดตาม" (ทั้งผลลัพธ์ในการออกที่ไม่ใช่ศูนย์ของคำสั่งด้านบน) รุ่นที่ทนทานกว่านี้เล็กน้อยอาจมีลักษณะเช่นนี้:
u="$(git ls-files --others)" && test -z "$u"
- แนวคิดนี้เหมือนกับคำสั่งก่อนหน้า แต่อนุญาตให้เกิดข้อผิดพลาดที่ไม่คาดคิดจาก
git ls-files
การเผยแพร่ ในกรณีนี้ทางออกที่ไม่เป็นศูนย์อาจหมายถึง“ มีไฟล์ที่ไม่ได้ติดตาม” หรืออาจหมายถึงข้อผิดพลาดเกิดขึ้น หากคุณต้องการผลลัพธ์ "ข้อผิดพลาด" รวมกับผลลัพธ์ "ไม่มีไฟล์ที่ไม่ได้ติดตาม" แทนให้ใช้test -n "$u"
(โดยที่การออก0
หมายถึง "ไฟล์ที่ไม่ได้ติดตาม" บางส่วนและไม่ใช่ศูนย์หมายถึงข้อผิดพลาดหรือ "ไม่มีไฟล์ที่ไม่ได้ติดตาม")
แนวคิดอื่นคือการใช้--error-unmatch
เพื่อทำให้เกิดการออกที่ไม่เป็นศูนย์เมื่อไม่มีไฟล์ที่ไม่ได้ติดตาม สิ่งนี้ยังมีความเสี่ยงของการทำให้“ ไม่มีไฟล์ที่ไม่ได้ติดตาม” (จบการทำงาน1
) ด้วย“ เกิดข้อผิดพลาด” (ออกจากไม่ใช่ศูนย์ แต่อาจเป็นไปได้128
) แต่การตรวจสอบรหัสออก0
กับ1
และไม่เป็นศูนย์น่าจะค่อนข้างแข็งแกร่ง:
git ls-files --others --error-unmatch . >/dev/null 2>&1; ec=$?
if test "$ec" = 0; then
echo some untracked files
elif test "$ec" = 1; then
echo no untracked files
else
echo error from ls-files
fi
ตัวอย่างใด ๆ ข้างต้นgit ls-files
สามารถทำได้--exclude-standard
หากคุณต้องการพิจารณาเฉพาะไฟล์ที่ไม่ได้ติดตามและไม่ได้รับการรับรอง