Anda dapat menipu Git agar memperbaiki ruang kosong untuk Anda, dengan menipu Git agar memperlakukan perubahan Anda sebagai tambalan. Berbeda dengan solusi "pre-commit hook", solusi ini menambahkan perintah memperbaiki spasi putih ke Git.
Ya, ini adalah retasan.
Solusi yang kuat
Alias Git berikut diambil dari
saya~/.gitconfig
.
Dengan "robust", maksud saya, alias ini berjalan tanpa kesalahan, melakukan hal yang benar, terlepas dari apakah pohon atau indeksnya kotor. Namun, mereka tidak berfungsi jika interaktif git rebase -i
sudah berlangsung; lihat saya~/.gitconfig
untuk pemeriksaan tambahan jika Anda peduli dengan kasing ini, di managit add -e
trik yang dijelaskan di bagian akhir harus berfungsi.
Jika Anda ingin menjalankannya langsung di shell, tanpa membuat alias Git, cukup salin dan tempel semua yang ada di antara tanda kutip ganda (dengan asumsi shell Anda mirip Bash).
Perbaiki indeks tetapi bukan pohonnya
fixws
Alias Git berikut memperbaiki semua kesalahan spasi putih dalam indeks, jika ada, tetapi tidak menyentuh hierarki:
# 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"
Idenya adalah untuk menjalankan git fixws
sebelumnya git commit
jika Anda memiliki kesalahan spasi putih dalam indeks.
Perbaiki indeks dan pohonnya
fixws-global-tree-and-index
Alias Git berikut memperbaiki semua kesalahan spasi putih dalam indeks dan struktur pohon, jika ada:
# 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"
Untuk juga memperbaiki spasi putih di file tidak berversi, lakukan
git add --intent-to-add <unversioned files> && git fixws-global-tree-and-index
Solusi sederhana tetapi tidak kuat
Versi ini lebih mudah untuk menyalin dan menempel, tetapi mereka tidak melakukan hal yang benar jika kondisi sisi mereka tidak terpenuhi.
Perbaiki sub-pohon yang di-root pada direktori saat ini (tetapi atur ulang indeks jika tidak kosong)
Menggunakan git add -e
untuk "mengedit" tambalan dengan editor identitas :
:
(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset
Perbaiki dan pertahankan indeks (tetapi gagal jika pohon kotor atau indeks kosong)
git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset --soft HEAD~
Perbaiki pohon dan indeks (tetapi reset indeks jika tidak kosong)
git add -u :/ && git commit -m TEMP && git rebase --whitespace=fix HEAD~ && git reset HEAD~
Penjelasan export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
triknya
Sebelum saya belajar git rebase --whitespace=fix
trik dari jawaban ini saya menggunakan git add
trik yang lebih rumit di mana-mana.
Jika kami melakukannya secara manual:
Setel apply.whitespace
ke fix
(Anda hanya perlu melakukan ini satu kali):
git config apply.whitespace fix
Ini memberitahu Git untuk memperbaiki spasi putih di patch .
Meyakinkan Git untuk memperlakukan perubahan Anda sebagai tambalan :
git add -up .
Tekan a+ enteruntuk memilih semua perubahan untuk setiap file. Anda akan mendapatkan peringatan tentang Git memperbaiki kesalahan spasi putih Anda.
( git -c color.ui=auto diff
pada titik ini mengungkapkan bahwa perubahan non-indeks Anda persis kesalahan spasi putih).
Hapus kesalahan spasi putih dari copy pekerjaan Anda:
git checkout .
Bawa kembali perubahan Anda (jika Anda belum siap untuk melakukannya):
git reset
The GIT_EDITOR=:
sarana untuk menggunakan :
sebagai editor, dan sebagai perintah
:
adalah identitas.