Dalam proyek di mana beberapa file berisi ^ M sebagai pemisah baris baru. Diffing file-file ini tampaknya tidak mungkin, karena git-diff melihatnya sebagai seluruh file hanya satu baris.
Bagaimana seseorang berbeda dengan versi sebelumnya?
Apakah ada opsi seperti "memperlakukan ^ M sebagai baris baru saat berbeda"?
prompt> git-diff "HEAD^" -- MyFile.as
diff --git a/myproject/MyFile.as b/myproject/MyFile.as
index be78321..a393ba3 100644
--- a/myproject/MyFile.cpp
+++ b/myproject/MyFile.cpp
@@ -1 +1 @@
-<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
+<U+FEFF>import flash.events.MouseEvent;^Mimport mx.controls.*;^Mimport mx.utils.Delegate
\ No newline at end of file
prompt>
MEMPERBARUI:
sekarang saya telah menulis skrip Ruby yang memeriksa 10 revisi terbaru dan mengonversi CR ke LF.
require 'fileutils'
if ARGV.size != 3
puts "a git-path must be provided"
puts "a filename must be provided"
puts "a result-dir must be provided"
puts "example:"
puts "ruby gitcrdiff.rb project/dir1/dir2/dir3/ SomeFile.cpp tmp_somefile"
exit(1)
end
gitpath = ARGV[0]
filename = ARGV[1]
resultdir = ARGV[2]
unless FileTest.exist?(".git")
puts "this command must be run in the same dir as where .git resides"
exit(1)
end
if FileTest.exist?(resultdir)
puts "the result dir must not exist"
exit(1)
end
FileUtils.mkdir(resultdir)
10.times do |i|
revision = "^" * i
cmd = "git show HEAD#{revision}:#{gitpath}#{filename} | tr '\\r' '\\n' > #{resultdir}/#{filename}_rev#{i}"
puts cmd
system cmd
end
git diff -b
- Saya menunjukkan ini di stackoverflow.com/a/46265081/58794git diff --ignore-cr-at-eol
. Lihat jawaban saya di bawah ini .git diff -b
identik dengangit diff --ignore-space-change
.Jawaban:
GitHub menyarankan agar Anda hanya menggunakan \ n sebagai karakter baris baru dalam repo yang ditangani git. Ada opsi untuk melakukan konversi otomatis:
Tentu saja, ini dikatakan untuk mengkonversi crlf ke lf, sementara Anda ingin mengonversi crlf ke lf. Saya harap ini masih berfungsi ...
Dan kemudian konversikan file Anda:
core.autocrlf dijelaskan di halaman manual .
sumber
git config core.whitespace cr-at-eol
.warning: LF will be replaced by CRLF
bukanwarning: CRLF will be replaced by LF
, dan aku di Linux. Ada yang tahu kenapa? Saya ingin semua diakhiri dengan LF, bukan CRLF!git config --global core.autocrlf input
, lakukan langkah-langkah dalam jawaban ini (rm, tambah, komit), dan Anda akan mendapatkannyawarning: CRLF will be replaced by LF. The file will have its original line endings in your working directory.
. Hapus file (karena mereka memiliki CRLF asli, salah) dan checkout lagi dari komit terakhir "Perbaiki CRLF".Berkembang di Windows, saya mengalami masalah ini saat menggunakan
git tfs
. Saya memecahkannya dengan cara ini:Ini pada dasarnya memberitahu Git bahwa CR end-of-line bukan kesalahan. Akibatnya, mereka mengganggu
^M
karakter tidak lagi muncul di akhir baris dalamgit diff
,git show
dllTampaknya meninggalkan pengaturan lain apa adanya; misalnya, spasi tambahan di akhir baris masih menunjukkan kesalahan (disorot dengan warna merah) di diff.
(Jawaban lain menyinggung ini, tetapi di atas adalah persis bagaimana mengatur pengaturan. Untuk mengatur pengaturan hanya satu proyek, abaikan
--global
.)EDIT :
Setelah banyak kesusahan akhir baris, saya memiliki keberuntungan terbaik, ketika bekerja pada tim .NET, dengan pengaturan ini:
Jika Anda perlu menggunakan pengaturan spasi, Anda mungkin harus mengaktifkannya hanya berdasarkan per proyek jika Anda perlu berinteraksi dengan TFS. Hapus saja
--global
:Jika Anda perlu menghapus beberapa pengaturan inti. *, Cara termudah adalah dengan menjalankan perintah ini:
Ini membuka file .gitconfig global Anda dalam editor teks, dan Anda dapat dengan mudah menghapus baris yang ingin Anda hapus. (Atau Anda dapat menempatkan '#' di depan mereka untuk berkomentar.)
sumber
core.autocrlf
true
git config --global core.whitespace cr-at-eol
akan mematikan pengaturan lain yang default. Ada tiga default: blank-at-eol, blank-at-eof dan space-before-tab. Jadi untuk mengaktifkan cr-at-eol sambil menjaga yang lain Anda harus menggunakangit config --global core.whitespace blank-at-eol,blank-at-eof,space-before-tab,cr-at-eol
.cr-at-eol
menyingkirkan^M
di akhir baris dengangit diff
benar, tetapi GIT masih menunjukkan garis-garis itu berbeda, meskipun garis berakhir adalah satu-satunya perbedaan.Coba
git diff --ignore-space-at-eol
, ataugit diff --ignore-space-change
, ataugit diff --ignore-all-space
.sumber
autocrlf
pengaturan saya . Terima kasih!Lihat juga:
atau yang setara,
di mana
whitespace
didahului oleh karakter tab .sumber
git show
) berhenti menggangguku tentang^M
s pada baris yang diubah! :)git diff
masih menunjukkan ^ M karakter.git config --global core.whitespace cr-at-eol
(di mana - global adalah opsional jika Anda hanya ingin di repo Anda berada)[core]
sehingga saya dapat mengganticore.
awalan dengan karakter TAB.^M
digit diff
, bukan tentang bagaimana untuk tidak dimasukkan ke dalam ^ M di tempat pertama. Itu berarti jawaban perubahan yang diterimacore.autocrlf
bukan yang terbaik karena secara diam-diam mengubah file tanpa konfirmasi pengguna.Mengapa Anda mendapatkan ini
^M
di Andagit diff
?Dalam kasus saya, saya sedang mengerjakan proyek yang dikembangkan di Windows dan saya menggunakan OS X. Ketika saya mengubah beberapa kode, saya melihat
^M
di akhir baris yang saya tambahkangit diff
. Saya pikir^M
itu muncul karena mereka akhiran baris yang berbeda dari sisa file. Karena sisa file dikembangkan di Windows menggunakanCR
ujung baris, dan di OS X menggunakanLF
ujung garis.Rupanya, pengembang Windows tidak menggunakan opsi " Checkout Windows-style, komit ujung garis Unix-style " selama instalasi Git.
Jadi apa yang harus kita lakukan?
Anda dapat meminta pengguna Windows menginstal ulang git dan menggunakan opsi " Checkout Windows-style, commit Unix-style endings ". Inilah yang saya inginkan, karena saya melihat Windows sebagai pengecualian dalam karakter akhir barisnya dan Windows memperbaiki masalahnya sendiri dengan cara ini.
Jika Anda memilih opsi ini, Anda harus memperbaiki file saat ini (karena mereka masih menggunakan
CR
akhiran baris). Saya melakukan ini dengan mengikuti langkah-langkah ini:Hapus semua file dari repositori, tetapi tidak dari sistem file Anda.
Tambahkan
.gitattributes
file yang memberlakukan file tertentu untuk menggunakanLF
ujung baris sebagai. Masukkan ini ke dalam file:Ganti
.ext
dengan ekstensi file yang ingin Anda cocokkan.Tambahkan semua file lagi.
Ini akan menampilkan pesan seperti ini:
Anda dapat menghapus
.gitattributes
file kecuali jika Anda memiliki pengguna Windows yang keras kepala yang tidak ingin menggunakan opsi " Checkout Windows-style, commit Unix-style endings ".Komit dan dorong semuanya.
Hapus dan periksa file yang berlaku di semua sistem tempat mereka digunakan. Pada sistem Windows, pastikan mereka sekarang menggunakan opsi " Checkout Windows-style, commit Unix-style endings ". Anda juga harus melakukan ini pada sistem di mana Anda menjalankan tugas-tugas ini karena ketika Anda menambahkan file git berkata:
Anda dapat melakukan sesuatu seperti ini untuk menghapus file:
Dan kemudian ini untuk mendapatkan mereka kembali dengan ujung garis yang benar:
Tentu saja mengganti
.ext
dengan ekstensi yang Anda inginkan.Sekarang proyek Anda hanya menggunakan
LF
karakter untuk akhiran baris, danCR
karakter jahat tidak akan pernah kembali :).Pilihan lainnya adalah untuk menegakkan akhiran garis gaya windows. Anda juga dapat menggunakan
.gitattributes
file untuk ini.Info lebih lanjut: https://help.github.com/articles/dealing-with-line-endings/#platform-all
sumber
View
->Line Endings
dan klikUnix
.^M
? Apakah ini baris baru windows atau linux? Atau itu hanya baris "berbeda" dibandingkan dengan baris baru lainnya dalam file?git config --global core.autocrlf true
adalah berlebihan, dan anti-Windows / anti-CR
kampanye tampaknya bersinggungan dengan pertanyaan.Akan ada satu dengan Git 2.16 (Q1 2018), ketika keluarga "
diff
" perintah belajar untuk mengabaikan perbedaan dalam carriage return di akhir baris.Lihat komit e9282f0 (26 Okt 2017) oleh Junio C Hamano (
gitster
) .Dibantu-oleh: Johannes Schindelin (
dscho
) .(Digabung oleh Junio C Hamano -
gitster
- dalam komit 10f65c2 , 27 Nov 2017)sumber
git config --global core.autocrlf true
seperti dalam jawaban yang diterima, ini menjawab pertanyaan OP lebih langsung: 'Apakah ada opsi seperti "memperlakukan ^ M sebagai baris baru ketika berbeda"?'git version 2.20.1 (Apple Git-117)
tetapi menambahkan jawaban core.pager Jason Pyeron memperbaikinya. YMMV jelas.TL; DR
Ubah
core.pager
ke"tr -d '\r' | less -REX"
, bukan kode sumberIni sebabnya
Orang-orang sial yang ditampilkan adalah artefak pewarnaan dan pager. Ini disebabkan oleh
less -R
, opsi pager git default. (Pager default git adalahless -REX
)Hal pertama yang perlu diperhatikan adalah bahwa
git diff -b
tidak akan menampilkan perubahan dalam ruang putih (mis. \ R \ n vs \ n)mendirikan:
Tes cepat untuk membuat file unix dan mengubah akhir baris tidak akan menunjukkan perubahan dengan
git diff -b
:Kami mencatat bahwa memaksa pipa lebih sedikit tidak menunjukkan ^ M, tetapi memungkinkan warna dan
less -R
tidak:Perbaikan ditunjukkan dengan menggunakan pipa untuk menghapus \ r (^ M) dari output:
Alternatif yang tidak bijaksana adalah menggunakan
less -r
, karena akan melewati semua kode kontrol, bukan hanya kode warna.Jika Anda ingin mengedit file konfigurasi git Anda secara langsung, ini adalah entri untuk memperbarui / menambahkan:
sumber
\r\n
akhiran baris dan beberapa\n
akhiran baris (saya tidak tahu apakah itu relevan); Perbedaan dari yang pertama menunjukkan^M
dalam garis yang dimodifikasi (yaitu,+
garis).core.autocrlf
diatur ketrue
. Berlarigit config core.pager "tr -d '\r' | less -REX"
menyingkirkan sial^M
. Terima kasih!git diff -b
adalah apa yang saya cari, tetapi saya sangat menghargai penjelasan yang menyeluruh.[core]
dengan menambahkanpager = tr -d '\\r' | less -REX
adalah satu-satunya jawaban yang bekerja untuk saya. Terima kasih!Saya berjuang dengan masalah ini untuk waktu yang lama. Sejauh ini solusi termudah adalah tidak perlu khawatir tentang karakter ^ M dan hanya menggunakan alat diff visual yang dapat menangani mereka.
Alih-alih mengetik:
mencoba:
sumber
Dalam kasus saya, apa yang dilakukan perintah ini:
Sumber: https://public-inbox.org/git/[email protected]/T/
sumber
Seperti dicatat oleh VonC, ini sudah termasuk dalam git 2.16+. Sayangnya, nama opsi (
--ignore-cr-at-eol
) berbeda dari yang digunakan oleh GNU diff yang saya terbiasa (--strip-trailing-cr
).Ketika saya dihadapkan dengan masalah ini, solusi saya adalah untuk memanggil GNU diff daripada built-in diff git, karena git saya lebih tua dari 2,16. Saya melakukannya menggunakan baris perintah ini:
Itu memungkinkan penggunaan
--strip-trailing-cr
dan semua opsi GNU lainnya.Ada juga cara lain ini:
tetapi tidak menggunakan pengaturan pager yang sudah dikonfigurasi, itulah sebabnya saya lebih suka yang pertama.
sumber