Apakah mungkin untuk git merge
mengabaikan perbedaan garis akhir?
Mungkin saya mengajukan pertanyaan yang salah ... tetapi:
Saya mencoba uisng config.crlf input
tetapi segalanya menjadi agak berantakan dan di luar kendali, khususnya ketika saya menerapkannya setelah fakta .
Untuk satu hal, menerapkan konfigurasi ini setelah fakta tampaknya tidak mempengaruhi file yang dikomit ke repositori sebelum menerapkan opsi ini. Hal lain adalah bahwa tiba-tiba semua komitmen sekarang menghasilkan banyak pesan peringatan yang mengganggu tentang CRLF yang dikonversi ke LF.
Sejujurnya, saya tidak terlalu peduli apa yang digunakan untuk mengakhiri baris, saya pribadi lebih suka gaya Unix \n
, tapi apa pun itu. Yang saya pedulikan, adalah untuk git merge
menjadi sedikit lebih pintar dan mengabaikan perbedaan dalam garis akhir.
Terkadang saya memiliki dua file yang identik, tetapi git akan menandainya sebagai konflik (dan konflik adalah keseluruhan file) hanya karena mereka menggunakan karakter akhir baris yang berbeda.
Memperbarui:
Saya mengetahui bahwa git diff
menerima --ignore-space-at-eol
opsi, apakah mungkin untuk git merge
menggunakan opsi ini juga?
git config merge.renormalize true
Jawaban:
Pembaruan 2013:
Versi git terbaru mengotorisasi penggunaan gabungan dengan opsi
recursive
strategi dan strategi ( ):-X
Tetapi menggunakan "
-Xignore-space-change
" juga kemungkinanjakub.g juga berkomentar bahwa strategi ini juga bekerja dengan memetik ceri :
Ini bekerja lebih baik daripada
ignore-all-space
.Jawaban asli (Mei 2009)
Tambalan untuk mengabaikan gaya eol telah diusulkan pada Juni 2007 , tetapi itu hanya menyangkut
git diff --ignore-space-at-eol
, bukangit merge
.Pada saat itu, pertanyaan telah diajukan:
Julio C Hamano tidak terlalu antusias:
Gagasan umum, jika menyangkut
git merge
, adalah untuk bergantung pada alat gabungan pihak ketiga.Sebagai contoh, saya telah mengatur DiffMerge menjadi alat untuk Git merge, menetapkan seperangkat aturan yang memungkinkan alat gabungan tersebut mengabaikan eol untuk jenis file tertentu.
Setup pada Windows, dengan MSysGit1.6.3, baik untuk sesi DOS atau Git bash, dengan DiffMerge atau KDiff3:
c:\HOMEWARE\cmd
.merge.sh:
Perintah konfigurasi git:
git config di tingkat sistem:
Script DOS (catatan: perintah dos2unix berasal dari sini , dan digunakan untuk mensimulasikan gaya Unix eol-style. Perintah itu telah disalin dalam direktori yang disebutkan di awal jawaban ini.):
C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):
Pada titik ini (Memukul "kembali"), DiffMerge atau KDiff3 akan terbuka, dan Anda akan melihat sendiri baris mana yang sebenarnya digabung, dan baris mana yang diabaikan.
Peringatan : file hasil akan selalu dalam mode Windows eol (CRLF) dengan DiffMerge ...
KDiff3 menawarkan untuk menyimpan dengan satu atau lain cara.
sumber
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
(ini bekerja lebih baik daripadaignore-all-space
)Saya mencari jawaban yang sama dan saya menemukan ini
Jadi menjalankan perintah ini di repositori apa pun akan melakukan trik:
sumber
Setelah membaca https://stackoverflow.com/a/12194759/1441706 dan https://stackoverflow.com/a/14195253/1441706
bagi saya, perintah ini berhasil dengan sempurna:
sumber
Seperti dalam jawaban ini: https://stackoverflow.com/a/5262473/943928
Kamu bisa mencoba:
git merge -s recursive -Xignore-space-at-eol
sumber
Apa yang saya lakukan adalah membiarkan semuanya sebagai default (mis. Autocrlf = true), sentuh semua file (temukan. -Exec touch {} \;), biarkan git melihatnya sebagai 'dimodifikasi' dan komit kembali, dan selesai dengan itu. Kalau tidak, Anda akan selalu terganggu oleh pesan yang mengganggu atau perbedaan yang mengejutkan, atau harus mematikan semua fitur ruang putih git.
Anda akan kehilangan informasi kesalahan, tetapi lebih baik melakukannya lebih cepat daripada nanti :)
sumber
"git merge -Xrenormalize" bekerja seperti pesona.
sumber
Itu tidak terlihat seperti ini dapat dilakukan secara langsung tetapi posting ini menyarankan pekerjaan di sekitar.
http://osdir.com/ml/git/2009-02/msg02532.html
sumber
http://stahlforce.com/dev/index.php?tool=remcrlf
Saya sudah mencobanya, tetapi jika setelah baris terakhir dalam kode Anda Anda belum memiliki CRLF itu menambahkan dengan sendirinya LF dan file terlihat berubah di git. Selain itu berfungsi.
sumber
Tampaknya bagi saya sekarang bahwa cara terbaik adalah dengan menormalkan akhir baris pada kedua cabang (dan komit) sebelum menggabungkannya.
Saya googled "convert crlf ke lf" dan menemukan ini sebagai hasil pertama:
http://stahlforce.com/dev/index.php?tool=remcrlf
Saya mengunduhnya dan digunakan, sepertinya alat yang bagus.
Pastikan untuk menentukan direktori dan tipe file (misalnya .py) jika tidak, ia mungkin akan mencoba mengacaukan isi
.git
direktori!sumber
AFAICT, (saya belum mencobanya) yang bisa Anda gunakan
git diff
untuk membandingkan cabang yang ingin Anda gabungkan dengan leluhur yang sama, lalu terapkan hasilnyagit apply
. Kedua perintah memiliki--ignore-whitespace
opsi untuk mengabaikan kesalahan akhir baris dan spasi.Sayangnya, jika tambalan tidak berlaku bersih, seluruh operasi dibatalkan. Anda tidak dapat memperbaiki gabungan konflik. Ada
--reject
opsi untuk meninggalkan bakhil yang tidak dapat ditonton dalam.rej
file, yang membantu, tetapi tidak sama dengan memiliki konflik gabungan ditampilkan dalam satu file.sumber
Setelah membaca Atasi konflik gabungan: Paksa menimpa semua file
Saya akhirnya menyelesaikan versi masalah ini. Saya mencoba untuk menarik pembaruan dari repo hulu tetapi yang saya miliki saat ini mengalami masalah terkait CRLF dan tidak dapat bergabung sebagai hasilnya. Perlu dicatat bahwa saya tidak memiliki PERUBAHAN LOKAL yang perlu saya khawatirkan. Langkah-langkah berikut mengatasi masalah saya:
Sesuai instruksi github tentang sinkronisasi garpu ( https://help.github.com/articles/syncing-a-fork/ ):
git fetch upstream
git reset --hard upstream/master
Pemahaman git saya yang terbatas memberi tahu saya bahwa ini adalah melakukan apa yang saya inginkan - mengubah garpu saya (tanpa perubahan yang sebenarnya tidak dikomit) untuk mendapatkan semua perubahan yang dilakukan pada sumber hulu. Menurut halaman sumber, langkah ini biasanya tidak diperlukan, tetapi masalah CRLF mengharuskannya.
git merge upstream/master
git push
sumber
git reset --hard upstream/master
membuang cabang lokal Anda dan mengarahkannya keupstream/master
, membuatgit merge upstream/master
no-op?Namun saya menyarankan untuk menggunakan alat seperti sed untuk mencapai akhir baris yang benar, dan kemudian file diff. Saya menghabiskan beberapa jam di diffing proyek dengan berbagai akhir baris.
Cara terbaik adalah:
.git
direktori) ke direktori lain buat repositori di dalamnya, kemudian tambahkan file dan komit (harus ada di cabang master di repositori baru).dev
(git checkout -b dev
), komit file di cabang ini dan jalankan (jika proyek pertama adalah master):git diff master..dev --names-only
untuk melihat nama file yang diubah sajasumber