Saya menggunakan git dengan tim saya dan ingin menghapus perubahan spasi putih dari diff, log, merge, dll. Saya berasumsi bahwa cara termudah untuk melakukannya adalah dengan git secara otomatis menghapus trailing spasi putih (dan kesalahan spasi putih lainnya ) dari semua komitmen saat diterapkan.
Saya telah mencoba menambahkan berikut ini dengan ~/.gitconfig
file tetapi tidak melakukan apa-apa ketika saya komit. Mungkin ini dirancang untuk sesuatu yang berbeda. Apa solusinya?
[core]
whitespace = trailing-space,space-before-tab
[apply]
whitespace = fix
Saya menggunakan ruby kalau-kalau ada yang punya ide spesifik ruby. Pemformatan kode otomatis sebelum melakukan akan menjadi langkah berikutnya, tapi itu masalah yang sulit dan tidak benar-benar menyebabkan masalah besar.
git
whitespace
githooks
mloughran
sumber
sumber
Jawaban:
Pengaturan tersebut (
core.whitespace
danapply.whitespace
) tidak ada di sana untuk menghapus trailing spasi tetapi untuk:core.whitespace
: deteksi mereka, dan tampilkan kesalahanapply.whitespace
: dan menghapusnya, tetapi hanya selama patch, tidak "selalu secara otomatis"Saya percaya
git hook pre-commit
akan melakukan pekerjaan yang lebih baik untuk itu (termasuk menghapus spasi spasi tambahan)Perhatikan bahwa pada waktu tertentu Anda dapat memilih untuk tidak menjalankan
pre-commit
hook:git commit --no-verify .
cd .git/hooks/ ; chmod -x pre-commit
Peringatan: secara default,
pre-commit
skrip (seperti ini ), belum fitur "hapus trailing", tetapi fitur "peringatan" seperti:Namun Anda bisa membangun yang lebih baik
pre-commit
pengait yang, terutama ketika Anda mempertimbangkan bahwa:Misalnya, orang tua mengusulkan jawaban lain, sebuah
pre-commit
kait yang mendeteksi dan menghapus spasi putih.Karena kait itu mendapatkan nama file dari setiap file, saya akan merekomendasikan untuk berhati-hati untuk jenis file tertentu: Anda tidak ingin menghapus trailing spasi putih dalam
.md
file (penurunan harga)!sumber
apply.whitespace
, dengan menipu git agar memperlakukan perubahan copy pekerjaan Anda sebagai tambalan. Lihat jawaban saya di bawah ini ..editorconfig
file memiliki aturan khusus untuk itu.<br>
: github.com/FriendsOfPHP/PHP-CS-Fixer/issues/…core.whitespace
dengantrailing-space
dengangit config
tidak meningkatkan kesalahan saat melakukan digit
2.5.0.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:Idenya adalah untuk menjalankan
git fixws
sebelumnyagit 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:Untuk juga memperbaiki spasi putih di file tidak berversi, lakukan
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:
:Perbaiki dan pertahankan indeks (tetapi gagal jika pohon kotor atau indeks kosong)
Perbaiki pohon dan indeks (tetapi reset indeks jika tidak kosong)
Penjelasan
export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .
triknyaSebelum saya belajar
git rebase --whitespace=fix
trik dari jawaban ini saya menggunakangit add
trik yang lebih rumit di mana-mana.Jika kami melakukannya secara manual:
Setel
apply.whitespace
kefix
(Anda hanya perlu melakukan ini satu kali):Ini memberitahu Git untuk memperbaiki spasi putih di patch .
Meyakinkan Git untuk memperlakukan perubahan Anda sebagai tambalan :
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:
Bawa kembali perubahan Anda (jika Anda belum siap untuk melakukannya):
The
GIT_EDITOR=:
sarana untuk menggunakan:
sebagai editor, dan sebagai perintah:
adalah identitas.sumber
set VISUAL= && git add -ue . && git checkout .
Perhatikan '.
' digunakan dengangit add
: itu karena git1.8.3git commit
untuk menggunakan editor yang salah? Saya membungkusVISUAL=
bagian dalam subkulit dalam versi unix saya di atas untuk menghindari ini, tapi saya tidak tahu apakah DOS memiliki subkulit.core.editor
menetapkan maka mengeksporVISUAL
tidak berpengaruh karena pengaturan konfigurasi diutamakan perman git-var
. Untuk menimpanya, Anda harus mengeksporGIT_EDITOR=:
.fixws
untuk gagal dengan cepat jika Anda sudah dalam rebase interaktif karena jika tidak maka akan mati digit rebase --whitespace=fix
garis dan membuat Anda dalam keadaan aneh. Saya meminjam dari pertanyaan ini dan baru saja menambahkan kasus tambahan sebelum if:fixws = !"\ if test -d $(git rev-parse --git-dir)/rebase-merge ; then \ echo 'In rebase - cannot fixws' ; \ elif (! git diff-files --quiet .) && \ (! git diff-index --quiet --cached HEAD) ; then \ ...
Saya menemukan hook pre-commit git yang menghilangkan spasi spasi .
sumber
sed
Doa kedua (sed -r 's/:[0-9]+:.*//'
) dapat diganti dengancut -f1 -d:
. Ini harus bekerja sama pada platform berbasis Linux dan BSD.cut
tidak seaman yang keduased
: cut akan gagal dalam (sangat tidak mungkin) kasus nama file yang mengandung ":". Anda bisa menggunakanawk 'NF>2{NF-=2}1'
untuk amancore.autocrlf=true
, Anda mungkin ingin menambahkandos2unix -D "$FILE"
di dalam for loop, setelah sed. Jika tidak, itu akan mengubah semua CRLF menjadi LF dengan mengeluarkan hanya sed.git add
di dalam kait komit sepertinya cukup jahat bagi saya. Bagaimana jika Anda melakukan pementasan / pengabdian sebagian file? Anda tidak ingin file lengkap dilakukan di belakang Anda, bukan?Pada Mac OS (atau, kemungkinan, BSD apa saja), parameter perintah sed harus sedikit berbeda. Coba ini:
Simpan file ini sebagai
.git/hooks/pre-commit
- atau cari yang sudah ada di sana, dan rekatkan bagian bawah di suatu tempat di dalamnya. Dan ingat juga untukchmod a+x
itu.Atau untuk penggunaan global (melalui kait komit Git - pengaturan global ) Anda dapat memasukkannya
$GIT_PREFIX/git-core/templates/hooks
( di mana GIT_PREFIX adalah / usr atau / usr / lokal atau / usr / bagikan atau / opt / lokal / bagikan) dan jalankangit init
di dalam repo yang ada.Menurut
git help init
:sumber
git hash-object -w
dangit update-index
untuk (kembali) memasukkan file munged langsung ke dalam indeks. Seseorang yang sangat berani.Saya lebih suka menyerahkan tugas ini kepada editor favorit Anda.
Cukup atur perintah untuk menghapus spasi tambahan saat menyimpan.
sumber
(add-hook 'before-save-hook 'delete-trailing-whitespace)
ke.emacs
file Anda . Trik ruang putih EmacsMenggunakan atribut git, dan menyaring pengaturan dengan konfigurasi git
OK, ini adalah taktik baru untuk menyelesaikan masalah ini ... Pendekatan saya adalah tidak menggunakan kait, melainkan menggunakan filter dan atribut git. Apa yang ini memungkinkan Anda lakukan, adalah pengaturan, pada setiap mesin yang Anda kembangkan, seperangkat filter yang akan menghapus ruang ekstra ekstra putih dan garis kosong tambahan di akhir file sebelum membuatnya. Kemudian siapkan file .gitattributes yang menyatakan jenis file yang harus diterapkan filter. Filter memiliki dua fase,
clean
yang diterapkan saat menambahkan file ke indeks, dansmudge
yang diterapkan saat menambahkannya ke direktori yang berfungsi.Beri tahu git Anda untuk mencari file atribut global
Pertama, beri tahu konfigurasi global Anda untuk menggunakan file atribut global:
Buat filter global
Sekarang, buat filter:
Tambahkan sihir skrip sed
Akhirnya, letakkan
fixup-eol-eof
skrip di suatu tempat di jalur Anda, dan buat agar dapat dieksekusi. Script menggunakan sed untuk melakukan beberapa pengeditan dengan cepat (menghapus spasi dan kosong di akhir baris, dan baris kosong di luar file)fixup-eol-eof akan terlihat seperti ini:
intisari saya ini
Beri tahu git jenis file untuk menerapkan filter Anda yang baru dibuat
Terakhir, buat atau buka ~ / .gitattributes_global di editor favorit Anda dan tambahkan baris seperti:
Jadi jika kita ingin memperbaiki masalah spasi putih, untuk semua file sumber c kita, kita akan menambahkan baris yang terlihat seperti ini:
Diskusi filter
Filter memiliki dua fase, fase bersih yang diterapkan ketika ada hal-hal yang ditambahkan ke indeks atau diperiksa, dan fase noda ketika git memasukkan barang ke direktori kerja Anda. Di sini, noda kami hanya menjalankan konten melalui
cat
perintah yang seharusnya membuat mereka tidak berubah, dengan pengecualian mungkin menambahkan karakter baris baru tambahan jika tidak ada satu di akhir file. Perintah bersih adalah penyaringan spasi putih yang saya buat bersama dari catatan di http://sed.sourceforge.net/sed1line.txt . Tampaknya itu harus dimasukkan ke dalam skrip shell, saya tidak tahu bagaimana cara menyuntikkan perintah sed, termasuk sanitasi dari garis ekstra yang asing di akhir file langsung ke file git-config. (Kamu BISAmenyingkirkan trailing kosong, namun, tanpa perlu script sed terpisah, hanya mengaturfilter.fix-eol-eof
untuk sesuatu sepertised 's/[ \t]*$//' %f
mana\t
adalah tab yang sebenarnya, dengan menekan tab.)Requir = true menyebabkan kesalahan untuk dinaikkan jika terjadi kesalahan, untuk menjaga Anda keluar dari masalah.
Maafkan saya jika bahasa saya tentang git tidak tepat. Saya pikir saya memiliki pemahaman yang cukup baik tentang konsep-konsep tetapi saya masih belajar terminologi.
sumber
.git
folder daripada secara global, yang mungkin lebih masuk akal.Saya menulis kait pra-komit ini, yang hanya menghilangkan spasi putih dari garis yang telah Anda ubah / tambahkan, karena saran sebelumnya cenderung membuat komit yang tidak dapat dibaca jika file target memiliki terlalu banyak spasi pada spasi putih.
sumber
Silakan coba saya pre-komit kait , dapat otomatis mendeteksi trailing spasi dan menghapusnya . Terima kasih!
itu bisa bekerja di bawah
GitBash(windows), Mac OS X and Linux
!Foto:
sumber
git commit -no-verify
, ada saran?.md
file dan tidak menghapus spasi putih, daripada meminta pengguna akhir untuk menambahkan--no-verify
opsi padagit commit
.+
atau-
Ini versi ubuntu + mac os x yang kompatibel:
Selamat bersenang-senang
sumber
Sedang memikirkan hal ini hari ini. Inilah yang akhirnya saya lakukan untuk proyek java:
sumber
Untuk pengguna Teks Sublim .
Atur mengikuti dengan benar di pengaturan Anda -Pengguna konfigurasi.
"trim_trailing_white_space_on_save": true
sumber
*.md
(penurunan harga) file yang bergantung pada "" (trailing spasi ganda) untuk menandai yang sederhana<br />
, dan pengaturan itu tampaknya berlaku untuk semua file, termasuk yang saya tidak ingin menghapus spasi tambahan.for-loop untuk file menggunakan variabel $ IFS shell. dalam skrip yang diberikan, nama file dengan karakter di dalamnya yang juga ada dalam variabel $ IFS akan dilihat sebagai dua file berbeda di for-loop. Skrip ini memperbaikinya: pengubah mode multiline seperti yang diberikan sed-manual tampaknya tidak berfungsi secara default di kotak ubuntu saya, jadi saya mencari implementasi yang berbeda dan menemukan ini dengan label iterasi, pada dasarnya ia hanya akan memulai substitusi pada baris terakhir file jika saya sudah memahaminya dengan benar.
[1] pola sed-subsition: Bagaimana saya bisa mengganti baris baru (\ n) menggunakan sed? .
sumber
Ini tidak menghapus spasi putih secara otomatis sebelum komit, tetapi cukup mudah untuk memberikan efek. Saya menempatkan skrip perl berikut dalam file bernama git-wsf (git whitespace fix) dalam dir di $ PATH sehingga saya bisa:
git wsf | SH
dan menghapus semua spasi putih hanya dari baris file yang mendapat laporan sebagai diff.
sumber
Sedikit terlambat tetapi karena ini mungkin membantu seseorang di luar sana, ini dia.
Buka file dalam VIM. Untuk mengganti tab dengan spasi putih, ketikkan baris perintah vim berikut ini
Untuk menyingkirkan spasi putih tertinggal lainnya
Ini cukup banyak melakukannya untuk saya. Itu membosankan jika Anda memiliki banyak file untuk diedit. Tapi saya merasa lebih mudah daripada kait pre-commit dan bekerja dengan banyak editor.
sumber
sed -i 's|\t| |g' filenames
(spasi di posisi ganti). Perhatikan bahwa Anda dapat menggunakan find untuk mendapatkan nama file Anda. Jika Anda belum memikirkan cara mendapatkan cadangan itu, saya biasanya hanya mengkomit semuanya dan kemudian 'membatalkan' komit dengan soft reset kembali ke tempat saya; kadang-kadang saya menambahkan semuanya ke pohon tetapi tidak melakukan, dan kadang-kadang saya menggunakan simpanan / berlaku (bukan pop!). Jika saya merasa cemas, saya rsync seluruh pohon saya ke lokasi yang aman sebelum ikut campur ...Untuk menghapus spasi spasi di akhir baris dalam file dengan mudah, gunakan
ed
:sumber
Ini mungkin tidak akan secara langsung menyelesaikan masalah Anda, tetapi Anda mungkin ingin mengaturnya melalui git-config di ruang proyek Anda yang sebenarnya, yang mengedit ./.git/config sebagai kebalikan dari ~ / .gitconfig. Senang menjaga pengaturan konsisten di antara semua anggota proyek.
sumber