The dokumentasi tidak menyebutkan 0 sebagai nilai khusus untuk diff.renamelimit
.
Jadi, Anda harus menetapkan batas itu ke nilai yang direkomendasikan.
Atau Anda dapat mencoba menonaktifkan deteksi ganti nama sama sekali. ( git config diff.renames 0
)
Anda akan menemukan contoh serupa di entri blog ini " Confluence, git, rename, merge oh my ... ":
Seperti yang telah disebutkan, git mencoba mendeteksi penggantian nama file setelah fakta tersebut, misalnya saat menggunakan git log
atau git diff/merge
.
Ketika mencoba untuk mendeteksi penggantian nama, git membedakan antara penggantian nama yang tepat dan tidak tepat dengan yang pertama adalah mengganti nama tanpa mengubah konten file dan yang terakhir adalah penggantian nama yang mungkin termasuk perubahan pada konten file (misalnya mengganti nama / memindahkan Kelas Java).
Perbedaan ini penting karena algoritme untuk mendeteksi penggantian nama yang tepat adalah linier dan akan selalu dijalankan sedangkan algoritme untuk deteksi penggantian nama yang tidak tepat adalah kuadrat ( O(n^2)
) dan git tidak mencoba melakukan ini jika jumlah file yang diubah melebihi ambang tertentu (1000 kali default).
Karena jumlah file yang terpengaruh oleh reorganisasi baru-baru ini melebihi ambang batas ini, git menyerah begitu saja dan menyerahkan resolusi penggabungan kepada pengembang. Dalam kasus kami, kami dapat menghindari melakukan resolusi penggabungan manual dengan mengubah ambang batas
Catatan: Git 2.16 (Q1 2018) akan mengubah batas itu:
Secara historis, mesin diff untuk deteksi ganti nama memiliki batas hardcode 32k jalur; ini diangkat untuk memungkinkan pengguna bertukar siklus dengan hasil (mungkin) lebih mudah dibaca.
Lihat commit 8997355 (29 Nov 2017) oleh Jonathan Tan ( jhowtan
) .
Lihat commit 9268cf4 , commit 9f7e4bf , commit d6861d0 , commit b520abf (13 Nov 2017) oleh Elijah Newren ( newren
) .
(Digabung oleh Junio C Hamano - gitster
- di commit 6466854 , 19 Des 2017)
diff
: lepaskan penjepit diam renameLimit
Dalam komit 0024a54 (Perbaiki pemeriksaan batas deteksi ganti nama; Sept. 2007, Git v1.5.3.2), renameLimit
itu dijepit ke 32767.
Ini tampaknya hanya untuk menghindari overflow integer dalam perhitungan berikut:
num_create * num_src <= rename_limit * rename_limit
Meskipun ini juga dapat dilihat sebagai hard-code terikat pada jumlah waktu CPU, kami bersedia mengizinkan pengguna memberi tahu git untuk dihabiskan untuk menangani penggantian nama.
Batas atas mungkin masuk akal, tetapi sayangnya batas atas ini tidak dikomunikasikan kepada pengguna, atau didokumentasikan di mana pun.
Meskipun batas yang besar dapat memperlambat segalanya, kami memiliki pengguna yang akan sangat senang jika perubahan lima file kecil dipilih dengan benar meskipun mereka harus menentukan batas besar secara manual dan menunggu sepuluh menit hingga pengubahan nama terdeteksi.
Skrip dan alat yang ada yang menggunakan " -l0
" untuk terus bekerja, memperlakukan 0 sebagai nilai khusus yang menunjukkan bahwa batas penggantian nama adalah angka yang sangat besar.
Git 2.17 (K2 2018) tidak akan menampilkan pesan peringatan di tengah baris " git diff
" keluaran.
Lihat commit 4e056c9 (16 Jan 2018) oleh Nguyễn Thái Ngọc Duy ( pclouds
) .
(Digabung oleh Junio C Hamano - gitster
- di commit 17c8e0b , 13 Feb 2018)
diff.c
: siram stdout
sebelum mencetak peringatan ganti nama
Output diff di-buffer dalam sebuah FILE
objek dan masih bisa di-buffer sebagian ketika kita mencetak peringatan ini (langsung ke fd 2
).
Outputnya kacau seperti ini
worktree.c | 138 +-
worktree.h warning: inexact rename detection was skipped due to too many files.
| 12 +-
wrapper.c | 83 +-
Lebih buruk lagi jika peringatan dicetak setelah kode warna untuk bagian grafik sudah dicetak. Anda akan mendapatkan peringatan berwarna hijau atau merah.
Flush stdout dulu, jadi kita bisa mendapatkan sesuatu seperti ini:
xdiff/xutils.c | 42 +-
xdiff/xutils.h | 4 +-
1033 files changed, 150824 insertions(+), 69395 deletions(-)
warning: inexact rename detection was skipped due to too many files.
merge.renameLimit
bukandiff.renameLimit
?merge.renamelimit
variabel Anda ke setidaknya 1659 dan coba lagi perintahnya. Jadi,git config merge.renamelimit 10000
sepertinya itu adalah perintah yang tepat untuk saya (Saya menetapkan batas menjadi 10.000 di sini). Setelah Anda mengaturnya, Anda dapat membaca kembali pengaturan Anda dengangit config merge.renamelimit
.