git push를 수행 할 때 "diff.renamelimit 변수"에 대한 경고


86

로컬 커밋을 원격 git 서버에 푸시하고 다음과 같은 경고 메시지를 받았습니다.

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.

그러나 실제로 나는 이미 diff.renamelimit를 0으로 설정했습니다 (0은 무제한을 의미한다고 생각합니다.)

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

그렇다면이 경고를 피하려면 어떻게해야합니까? 감사.

답변:


67

문서 에 대한 특별한 값으로 0을 언급하지 않습니다 diff.renamelimit.
따라서이 제한을 권장 값으로 설정해야합니다.
또는 이름 변경 감지를 완전히 비활성화 할 수 있습니다. ( git config diff.renames 0)

이 블로그 게시물 " Confluence, git, rename, merge oh my ... " 에서 유사한 예제를 찾을 수 있습니다 .

이미 언급했듯이 git은 그 이후에 파일 이름 변경을 감지하려고합니다 (예 : git log또는 git diff/merge.
이름 바꾸기를 감지하려고 할 때 git은 정확한 이름과 부정확 한 이름을 구분합니다. 전자는 파일의 내용을 변경하지 않고 이름을 바꾸고 후자는 파일의 내용에 대한 변경 (예 : Java 클래스 이름 바꾸기 / 이동)을 포함 할 수있는 이름을 바꿉니다.
정확한 이름 변경을 감지하는 알고리즘은 선형이고 정확하지 않은 이름 변경 감지 알고리즘이 2 차 ( O(n^2))이고 변경된 파일 수가 특정 임계 값 (1000 x 1000)을 초과하는 경우 git은이를 수행하지 않기 때문에 이러한 구별이 중요 합니다. 기본).

최근 재구성의 영향을받는 파일 수가이 임계 값을 초과하면 git은 단순히 포기하고 병합 해결을 개발자에게 맡깁니다. 우리의 경우 임계 값을 변경하여 수동 병합 해결을 피할 수 있습니다.


참고 : Git 2.16 (2018 년 1 분기)은이 제한을 수정합니다.

역사적으로 이름 변경 감지를위한 diff 기계는 하드 코딩 된 32k 경로 제한이있었습니다. 이것은 사용자가 (아마도) 더 읽기 쉬운 결과로주기를 교환 할 수 있도록 해제되었습니다.

Jonathan Tan ( )의 commit 8997355 (2017 년 11 월 29 일)를 참조하십시오 . 참조 9268cf4 커밋 , 9f7e4bf 커밋 , d6861d0 커밋 , b520abf을 투입 하여 (2017년 11월 13일) 엘리야 Newren ( ) . (의해 병합 - Junio C 하마노 - 에서 6,466,854 커밋 2,017 19 십이)jhowtan
newren
gitster

diff: 무음 클램프 제거 renameLimit

에서는 0024a54 커밋 (바꾸기 검출 한계 검사 수정, 9 월 2007 힘내 v1.5.3.2) (가), renameLimit32767로 고정 하였다
단순히 다음 계산에서 정수 오버플로를 피하기왔다이 나타날 :

num_create * num_src <= rename_limit * rename_limit

CPU 시간의 양에 대한 하드 코딩 된 바운드로 볼 수도 있지만 사용자가 git에게 이름 바꾸기를 처리하는 데 소비하도록 할 수 있습니다.
상한은 의미가있을 수 있지만, 불행히도이 상한은 사용자에게 전달되지 않았고 어디에도 문서화되지 않았습니다.

제한이 크면 속도가 느려질 수 있지만, 수동으로 큰 제한을 지정하고 이름 변경이 감지 될 때까지 10 분을 기다려야하는 경우에도 작은 5 개의 파일 변경이 올바르게 선택되는 사용자가 있습니다.

-l0작업을 계속하기 위해 " "을 ( 를) 사용하는 기존 스크립트 및 도구는 0을 이름 바꾸기 제한이 매우 큰 숫자임을 나타내는 특수 값으로 처리합니다.


Git 2.17 (2018 년 2 분기)은 " git diff"출력 라인 중간에 경고 메시지를 표시하지 않습니다.

Nguyễn Thái Ngọc Duy ( )의 commit 4e056c9 (2018 년 1 월 16 일)를 참조하십시오 . (Merged by Junio ​​C Hamano -- in commit 17c8e0b , 13 Feb 2018)pclouds
gitster

diff.c: stdout이름 바꾸기 경고를 인쇄하기 전에 플러시

diff 출력은 FILE객체에 버퍼링되며 이러한 경고를 인쇄 할 때 부분적으로 버퍼링 될 수 있습니다 (직접 fd 2).
출력은 다음과 같이 엉망입니다.

 worktree.c                                   |   138 +-
 worktree.h        warning: inexact rename detection was skipped due to too many files.
                           |    12 +-
 wrapper.c                                    |    83 +-

그래프 부분의 색상 코드가 이미 인쇄 된 후 경고가 인쇄되면 악화됩니다. 녹색 또는 빨간색으로 경고가 표시됩니다.

먼저 stdout을 플러시하여 대신 다음과 같은 결과를 얻을 수 있습니다.

 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.

79
git config merge.renameLimit 999999

merge.renameLimit 은 무엇을 의미 합니까 ?

병합 중에 이름 바꾸기 감지를 수행 할 때 고려할 파일 수입니다. 지정되지 않은 경우 기본값은 diff.renameLimit 값입니다 .

출처 : https://git-scm.com/docs/git-merge


34
merge.renameLimit대신에 diff.renameLimit?
pgpb.padilla 2015

@ pgpb.padilla 매우 유사
Sandra K

4
git config diff.renameLimit 999999 (자신의 번호 입력)가 저에게 효과적이었습니다.
elarcoiris

1
누군가가 이것을 최대로 사용하고 싶지 않은 이유가 있습니까? 애초에 한계가 존재하는 이유는 무엇입니까? 엄청나게 큰 병합으로부터 CPU를 절약하기 위해?
electrovir
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.