Peringatan tentang "variabel diff.renamelimit" saat melakukan git push

87

Saya mendorong komit lokal ke server git jarak jauh dan mendapatkan pesan peringatan berikut:

remote: warning: only found copies from modified paths due to too many files.
remote: warning: you may want to set your diff.renamelimit variable to at least 19824 and retry the command.

Tapi sebenarnya saya sudah menyetel diff.renamelimit ke 0 (menurut saya nol berarti tidak terbatas, kan?).

$ git config --list
...
diff.renamelimit=0

Jadi apa yang harus saya lakukan untuk menghindari peringatan ini? Terima kasih.

stid.smth
sumber

Jawaban:

67

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 logatau 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), renameLimititu 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 stdoutsebelum mencetak peringatan ganti nama

Output diff di-buffer dalam sebuah FILEobjek 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.
VonC
sumber
82
git config merge.renameLimit 999999

Apa merge.renameLimit berarti

Jumlah file yang perlu dipertimbangkan saat melakukan deteksi ganti nama selama penggabungan; jika tidak ditentukan, defaultnya adalah nilai diff.renameLimit .

sumber: https://git-scm.com/docs/git-merge

Serge Seletskyy
sumber
35
mengapa ini merge.renameLimitbukan diff.renameLimit?
pgpb.padilla
@ pgpb.padilla sangat mirip
Sandra K
4
git config diff.renameLimit 999999 (masukkan nomor Anda sendiri) berfungsi untuk saya.
elarcoiris
2
Apakah ada alasan mengapa seseorang mungkin tidak ingin memaksimalkan ini? Mengapa batasan itu ada? Hanya untuk menghemat CPU Anda dari penggabungan yang sangat besar?
electrovir
@ pgpb.padilla, peringatan saya mengatakan: peringatan: Anda mungkin ingin menyetel merge.renamelimitvariabel Anda ke setidaknya 1659 dan coba lagi perintahnya. Jadi, git config merge.renamelimit 10000sepertinya itu adalah perintah yang tepat untuk saya (Saya menetapkan batas menjadi 10.000 di sini). Setelah Anda mengaturnya, Anda dapat membaca kembali pengaturan Anda dengan git config merge.renamelimit.
Gabriel Staples