คุณสามารถหลอก Git เพื่อแก้ไขช่องว่างให้กับคุณได้โดยหลอก Git ให้จัดการกับการเปลี่ยนแปลงของคุณเป็นแพทช์ ตรงกันข้ามกับโซลูชัน "การผูกมัดล่วงหน้า" โซลูชันเหล่านี้จะเพิ่มคำสั่งการแก้ไขช่องว่างให้กับ Git
ใช่มันเป็นแฮ็ค
โซลูชั่นที่แข็งแกร่ง
นามแฝง Git ต่อไปนี้จะนำมาจาก
ฉัน~/.gitconfig
โดย "strong" ฉันหมายถึงนามแฝงเหล่านี้ทำงานโดยไม่มีข้อผิดพลาดทำสิ่งที่ถูกต้องไม่ว่าต้นไม้หรือดัชนีจะสกปรก อย่างไรก็ตามมันจะไม่ทำงานหากการโต้ตอบgit rebase -i
นั้นกำลังดำเนินการอยู่ ดูของฉัน~/.gitconfig
สำหรับการตรวจสอบเพิ่มเติมหากคุณสนใจเกี่ยวกับกรณีมุมนี้ที่git add -e
เคล็ดลับที่อธิบายในตอนท้ายควรจะทำงาน
หากคุณต้องการเรียกใช้โดยตรงในเชลล์โดยไม่ต้องสร้างนามแฝง Git เพียงแค่คัดลอกและวางทุกอย่างระหว่างเครื่องหมายคำพูดคู่ (สมมติว่าเชลล์ของคุณเหมือน Bash)
แก้ไขดัชนี แต่ไม่ใช่ต้นไม้
fixws
นามแฝง Git ต่อไปนี้แก้ไขข้อผิดพลาดช่องว่างทั้งหมดในดัชนีถ้ามี แต่ไม่ได้แตะที่ต้นไม้:
# Logic:
#
# The 'git stash save' fails if the tree is clean (instead of
# creating an empty stash :P). So, we only 'stash' and 'pop' if
# the tree is dirty.
#
# The 'git rebase --whitespace=fix HEAD~' throws away the commit
# if it's empty, and adding '--keep-empty' prevents the whitespace
# from being fixed. So, we first check that the index is dirty.
#
# Also:
# - '(! git diff-index --quiet --cached HEAD)' is true (zero) if
# the index is dirty
# - '(! git diff-files --quiet .)' is true if the tree is dirty
#
# The 'rebase --whitespace=fix' trick is from here:
# https://stackoverflow.com/a/19156679/470844
fixws = !"\
if (! git diff-files --quiet .) && \
(! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git stash save FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~ && \
git stash pop && \
git reset --soft HEAD~ ; \
elif (! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git rebase --whitespace=fix HEAD~ && \
git reset --soft HEAD~ ; \
fi"
แนวคิดคือการเรียกใช้git fixws
ก่อนgit commit
ถ้าคุณมีข้อผิดพลาดช่องว่างในดัชนี
แก้ไขดัชนีและต้นไม้
fixws-global-tree-and-index
นามแฝง Git ต่อไปนี้แก้ไขข้อผิดพลาดช่องว่างทั้งหมดในดัชนีและต้นไม้ถ้ามี:
# The different cases are:
# - dirty tree and dirty index
# - dirty tree and clean index
# - clean tree and dirty index
#
# We have to consider separate cases because the 'git rebase
# --whitespace=fix' is not compatible with empty commits (adding
# '--keep-empty' makes Git not fix the whitespace :P).
fixws-global-tree-and-index = !"\
if (! git diff-files --quiet .) && \
(! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git add -u :/ && \
git commit -m FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~2 && \
git reset HEAD~ && \
git reset --soft HEAD~ ; \
elif (! git diff-files --quiet .) ; then \
git add -u :/ && \
git commit -m FIXWS_SAVE_TREE && \
git rebase --whitespace=fix HEAD~ && \
git reset HEAD~ ; \
elif (! git diff-index --quiet --cached HEAD) ; then \
git commit -m FIXWS_SAVE_INDEX && \
git rebase --whitespace=fix HEAD~ && \
git reset --soft HEAD~ ; \
fi"
หากต้องการแก้ไขช่องว่างในไฟล์ที่ไม่มีเวอร์ชันให้ทำ
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
โซลูชันที่เรียบง่าย แต่ไม่แข็งแกร่ง
เวอร์ชันเหล่านี้ง่ายต่อการคัดลอกและวาง แต่ไม่ได้ทำสิ่งที่ถูกต้องหากไม่พบเงื่อนไขด้านข้าง
แก้ไขรากต้นไม้ย่อยที่ไดเรกทอรีปัจจุบัน (แต่รีเซ็ตดัชนีหากยังไม่ว่าง)
การใช้git add -e
เพื่อ "แก้ไข" แพตช์ด้วยตัวแก้ไขข้อมูลประจำตัว:
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
แก้ไขและเก็บรักษาดัชนี (แต่ล้มเหลวหากต้นไม้สกปรกหรือดัชนีว่างเปล่า)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
แก้ไขแผนผังและดัชนี (แต่จะรีเซ็ตดัชนีหากไม่มีข้อมูลว่างเปล่า)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
คำอธิบายของexport GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
เคล็ดลับ
ก่อนที่ฉันจะเรียนรู้เกี่ยวกับgit rebase --whitespace=fix
เคล็ดลับจากคำตอบนี้ฉันใช้git add
เคล็ดลับที่ซับซ้อนกว่านี้ทุกที่
ถ้าเราทำด้วยตนเอง:
ตั้งค่าapply.whitespace
เป็นfix
(คุณจะต้องทำสิ่งนี้เพียงครั้งเดียว):
git config apply.whitespace fix
นี้จะบอก Git เพื่อแก้ไขช่องว่างในแพทช์
โน้มน้าวให้ Git ปฏิบัติต่อการเปลี่ยนแปลงของคุณในรูปแบบแพตช์ :
git add -up .
กดa+ enterเพื่อเลือกการเปลี่ยนแปลงทั้งหมดสำหรับแต่ละไฟล์ คุณจะได้รับคำเตือนเกี่ยวกับ Git แก้ไขข้อผิดพลาดของช่องว่าง
( git -c color.ui=auto diff
ณ จุดนี้แสดงให้เห็นว่าการเปลี่ยนแปลงที่ไม่ได้จัดทำดัชนีของคุณเป็นข้อผิดพลาดของช่องว่าง)
ลบข้อผิดพลาดของช่องว่างออกจากสำเนาการทำงานของคุณ:
git checkout .
นำการเปลี่ยนแปลงกลับมา (ถ้าคุณยังไม่พร้อมที่จะยอมรับ):
git reset
GIT_EDITOR=:
วิธีการที่จะใช้:
เป็นบรรณาธิการและเป็นคำสั่ง
:
เป็นตัวตน