เพิ่มสิ่งต่อไปนี้ในของคุณ.gitconfig
:
anw = !git diff -U0 -w --no-color -- \"$@\" | git apply --cached --ignore-whitespace --unidiff-zero "#"
ขอบคุณ@Colin Herbertสำหรับคำตอบของแรงบันดาลใจ
คำอธิบายไวยากรณ์
สุดท้าย#
จะต้องยกมาดังนั้นจึงไม่ถือว่ามันเป็นความคิดเห็นภายใน.gitconfig
แต่แทนที่จะได้รับการส่งผ่านและจะถือว่าเป็นความคิดเห็นภายในเปลือก - มันจะถูกแทรกระหว่างปลายgit apply
และอาร์กิวเมนต์ที่ผู้ใช้กำหนดgit
โดยอัตโนมัติที่ สิ้นสุดบรรทัดคำสั่ง อาร์กิวเมนต์เหล่านี้ไม่ต้องการที่นี่ - เราไม่ต้องการที่git apply
จะบริโภคพวกเขาดังนั้นตัวละครความคิดเห็นก่อนหน้านี้ คุณอาจต้องการเรียกใช้คำสั่งนี้GIT_TRACE=1 git anw
เพื่อดูการดำเนินการนี้
--
สัญญาณสิ้นสุดของการขัดแย้งและช่วยให้การกรณีที่คุณมีไฟล์ชื่อหรือสิ่งที่จะมีลักษณะเหมือนสวิทช์ไป-w
git diff
$@
จำเป็นต้องใช้เครื่องหมายคำพูดคู่ที่หลบหนีเพื่อรักษาข้อโต้แย้งที่ผู้ใช้ระบุ หาก"
ตัวละครไม่ได้หลบหนีมันจะถูกใช้โดย.gitconfig
ตัวแยกวิเคราะห์และไม่ถึงเชลล์
หมายเหตุ: .gitconfig
นามแฝงแยกไม่รู้จักคำพูดเดียวเป็นอะไรเป็นพิเศษ - ตัวอักษรพิเศษเท่านั้นที่มี"
, \
, \n
และ;
(ด้านนอกของ"
สตริง -quoted) นี่คือเหตุผลที่"
จะต้องมีการหลบหนีอยู่เสมอแม้ว่ามันจะดูเหมือนว่ามันอยู่ในสตริงที่ยกมาเดี่ยว (ซึ่งคอมไพล์ไม่เชื่อเรื่องพระเจ้าอย่างสมบูรณ์)
นี่เป็นสิ่งสำคัญเช่น หากคุณมีนามแฝงที่มีประโยชน์ในการรันbash
คำสั่งในรูทของต้นไม้ทำงาน สูตรที่ไม่ถูกต้องคือ:
sh = !bash -c '"$@"' -
ในขณะที่หนึ่งที่ถูกต้องคือ:
sh = !bash -c '\"$@\"' -
git apply --ignore-whitespace
มิฉะนั้นโปรแกรมแก้ไขจะไม่ใช้ด้วยเหตุผลที่ชัดเจน