로컬 커밋을 원격 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
그렇다면이 경고를 피하려면 어떻게해야합니까? 감사.
답변
문서 에 대한 특별한 값으로 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) (가),
renameLimit
32767로 고정 하였다
단순히 다음 계산에서 정수 오버플로를 피하기왔다이 나타날 :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.
답변
git config merge.renameLimit 999999
merge.renameLimit 은 무엇을 의미 합니까 ?
병합 중에 이름 바꾸기 감지를 수행 할 때 고려할 파일 수입니다. 지정되지 않은 경우 기본값은 diff.renameLimit 값입니다 .