Saya memiliki editor teks saya untuk secara otomatis memangkas trailing whitespace saat menyimpan file, dan saya berkontribusi pada proyek open source yang memiliki masalah parah dengan trailing whitespace.
Setiap kali saya mencoba mengirimkan tambalan, saya harus terlebih dahulu mengabaikan semua perubahan hanya spasi putih, untuk memilih hanya informasi yang relevan. Bukan hanya itu, tetapi ketika saya menjalankan git rebase
saya biasanya mengalami beberapa masalah karena mereka.
Karena itu saya ingin dapat menambahkan hanya indeks perubahan non-spasi putih, dengan cara yang mirip git add -p
, tetapi tanpa harus mengambil semua perubahan sendiri.
Adakah yang tahu bagaimana melakukan ini?
EDIT: Saya tidak bisa mengubah cara kerja proyek, dan mereka memutuskan, setelah mendiskusikannya di milis, untuk mengabaikan ini.
sumber
git apply --ignore-whitespace
jika tambalan tidak akan berlaku untuk alasan yang jelas.git add -w
yang dilakukan ini.patch does not apply
danerror while searching for
... Ada ide?patch does not apply
kesalahan.git diff -U0 -w --no-color | git apply --cached --ignore-whitespace --unidiff-zero
. Ini tidak berisiko karena indeksnya sudah mutakhir, jadi ini adalah basis yang andal untuk tambalan.Ini bekerja untuk saya:
Jika Anda ingin menyimpannya, ini berfungsi
Saya tidak suka simpanan, tetapi saya telah menemukan bug di git + cygwin di mana saya kehilangan perubahan, jadi untuk memastikan bahwa barang-barang pergi ke reflog setidaknya saya mengatur yang berikut:
Pada dasarnya kami membuat diff yang tidak termasuk perubahan ruang, mengembalikan semua perubahan kami, dan kemudian menerapkan diff.
sumber
git stash
alih - alih checkout, untuk membuat cadangan perubahan Anda, setidaknya sampai diuji.Buat file tambalan yang hanya berisi perubahan nyata (tidak termasuk baris dengan hanya perubahan spasi putih), lalu bersihkan ruang kerja Anda dan terapkan file tambalan itu:
Tinjau perbedaan yang tersisa, lalu
add
dancommit
seperti biasa.Setara dengan Mercurial adalah dengan melakukan ini:
sumber
Jawaban terpilih tidak berfungsi dalam semua kasus, karena spasi putih dalam konteks tambalan menurut pengguna di komentar.
Saya merevisi perintah sebagai berikut:
Ini menghasilkan tambalan tanpa konteks. Seharusnya tidak menjadi masalah karena patch itu berumur pendek.
Alias yang sesuai, lagi revisi apa yang sudah disediakan oleh pengguna lain:
sumber
--ignore-space-change
alih-alih-w
.git diff -U0 --ignore-space-change --no-color | git apply --cached --unidiff-zero
--ignore-blank-lines
Anda akan menemukan potongan yang berbeda ditambal pada offset yang salah jika beberapa 'ruang putih' berubah yang Anda ingin abaikan adalah pemindahan / penambahan baris kosong.Tambahkan yang berikut ke Anda
.gitconfig
:Terima kasih atas jawaban @Colin Herbert untuk inspirasi.
Penjelasan Sintaks
Akhir
#
harus dikutip sehingga tidak diperlakukan sebagai komentar di dalam.gitconfig
, tetapi diteruskan dan diperlakukan sebagai komentar di dalam shell - itu dimasukkan di antara akhirgit apply
dan argumen yang disediakan pengguna yanggit
secara otomatis ditempatkan di akhir dari baris perintah. Argumen ini tidak diinginkan di sini - kami tidak ingingit apply
mengkonsumsinya, karena itu karakter komentar sebelumnya. Anda mungkin ingin menjalankan perintah iniGIT_TRACE=1 git anw
untuk melihat ini dalam tindakan.The
--
sinyal mengakhiri argumen dan memungkinkan untuk kasus bahwa Anda memiliki file bernama-w
atau sesuatu yang akan terlihat seperti sebuah saklar untukgit diff
.Kutipan ganda melarikan diri
$@
diperlukan untuk mempertahankan argumen kutipan yang disediakan pengguna. Jika"
karakter tidak lolos, itu akan dikonsumsi oleh.gitconfig
pengurai dan tidak mencapai shell.Catatan:
.gitconfig
alias parsing tidak mengakui tanda kutip tunggal sebagai sesuatu yang istimewa - yang hanya karakter khusus"
,\
,\n
, dan;
(di luar dari"
tali -quoted). Inilah sebabnya mengapa"
harus selalu diloloskan, bahkan jika itu tampak di dalam string yang dikutip tunggal (yang git benar-benar agnostik tentang).Ini penting, misalnya. jika Anda memiliki alias yang berguna untuk menjalankan
bash
perintah di root pohon kerja. Formulasi yang salah adalah:Sedangkan yang benar adalah:
sumber
Bagaimana dengan yang berikut:
Perintah di dalam backquotes mendapatkan nama-nama file yang memiliki perubahan non-spasi putih.
sumber
git add `git diff -w |grep '^+++' |cut -c7-`
jika submodula tidak digunakanAnda harus terlebih dahulu mempertimbangkan apakah spasi trailing disengaja. Banyak proyek, termasuk kernel Linux, Mozilla, Drupal, dan Kerberos (untuk beberapa nama dari halaman Wikipedia tentang gaya) melarang spasi spasi. Dari dokumentasi kernel Linux:
Dalam kasus Anda, masalahnya adalah sebaliknya: komit sebelumnya (dan mungkin yang sekarang) tidak mengikuti pedoman ini.
Saya berani bertaruh bahwa tidak ada yang benar-benar menginginkan spasi putih, dan memperbaiki masalah mungkin merupakan perubahan yang disambut baik. Pengguna lain mungkin juga mengalami masalah yang sama dengan Anda. Kemungkinan juga kontributor yang menambahkan spasi spasi tidak menyadari bahwa mereka melakukannya.
Daripada mencoba mengkonfigurasi ulang git untuk mengabaikan masalah, atau menonaktifkan fungsionalitas yang diinginkan di editor Anda, saya akan memulai dengan posting ke milis proyek menjelaskan masalah. Banyak editor (dan git itu sendiri) dapat dikonfigurasi untuk menangani spasi spasi tambahan.
sumber
Saya menemukan hook pre-commit git yang menghilangkan spasi spasi . Namun, jika Anda tidak bisa membuat orang lain menggunakan ini, maka itu mungkin bukan solusi yang valid.
sumber