เพิ่มสิ่งต่อไปนี้ในของคุณ.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เพื่อดูการดำเนินการนี้
--สัญญาณสิ้นสุดของการขัดแย้งและช่วยให้การกรณีที่คุณมีไฟล์ชื่อหรือสิ่งที่จะมีลักษณะเหมือนสวิทช์ไป-wgit diff
$@จำเป็นต้องใช้เครื่องหมายคำพูดคู่ที่หลบหนีเพื่อรักษาข้อโต้แย้งที่ผู้ใช้ระบุ หาก"ตัวละครไม่ได้หลบหนีมันจะถูกใช้โดย.gitconfigตัวแยกวิเคราะห์และไม่ถึงเชลล์
หมายเหตุ: .gitconfigนามแฝงแยกไม่รู้จักคำพูดเดียวเป็นอะไรเป็นพิเศษ - ตัวอักษรพิเศษเท่านั้นที่มี", \, \nและ;(ด้านนอกของ"สตริง -quoted) นี่คือเหตุผลที่"จะต้องมีการหลบหนีอยู่เสมอแม้ว่ามันจะดูเหมือนว่ามันอยู่ในสตริงที่ยกมาเดี่ยว (ซึ่งคอมไพล์ไม่เชื่อเรื่องพระเจ้าอย่างสมบูรณ์)
นี่เป็นสิ่งสำคัญเช่น หากคุณมีนามแฝงที่มีประโยชน์ในการรันbashคำสั่งในรูทของต้นไม้ทำงาน สูตรที่ไม่ถูกต้องคือ:
sh = !bash -c '"$@"' -
ในขณะที่หนึ่งที่ถูกต้องคือ:
sh = !bash -c '\"$@\"' -
               
              
git apply --ignore-whitespaceมิฉะนั้นโปรแกรมแก้ไขจะไม่ใช้ด้วยเหตุผลที่ชัดเจน