2012-09-21 3 views
4

필자는 기능 분기에서 큰 코드베이스의 이름을 바꾸거나 재구성하고 리팩토링하는 다소 힘든 과정을 겪었습니다. 그 과정에서, 나는 git가 이름을 인식 할 수 있도록 변경 사항이 거의없는 점진적인 체크 인을 수행했다. 그러나 이제는이 기능을 개발 브랜치에 병합 했으므로, Git은 이러한 이름을 "기억하지"않는 대신 제거/추가로 처리합니다. 다른 이름 변경 임계 값을 설정하는 것이 도움이되지 않는 것 같습니다.왜 병합 할 때 git가 이전에 이름을 변경했는지 인식하지 못합니까? 방향을 병합합니까?

이전 커밋에서 파일의 이름이 변경되었거나 이동되었다는 사실을 알지 않아야합니까?

편집 어떤 이상한 것은 내가 대신 그 반대의 제 기능을 지점에 dev에 병합 경우, 자식은 이름 변경을 인식하는 것으로 보인다는 것이다. 나는이 일을 끝내고, dev를 내 feature 브랜치 맨 위로 재설정했다. 이 경우 합병의 방향이 중요합니까? 실제로 추적하지 않습니다

+0

정말 좋은 답변입니다. 좋은 질문 이군요. –

+0

git이 기능 분기에서 이름을 인식합니까? – Dima

+0

재구성 된 파일의 원래 체크인에있었습니다. 그런 다음 코드 정리를 수행하면 해당 기능 분기의 파일 내용이 변경됩니다. – techphoria414

답변

2

git는 이름을 변경 -에 명시된대로, 이름 변경을 감지하는 '감지의 이름을 변경'알고리즘에 의존 Git FAQ :

힘내 예를 들어, 다른 워크 플로우의 많은 상호 운용 할 수있다 이름 변경 정보가 이 아닌 패치에서 일부 변경이 올 수 있습니다. 명시 적 이름 바꾸기 추적을 사용하면 패치 (만들기/삭제)로 한 것을 제외하고 정확히 동일한 작업을 수행 한 두 개의 트리를 병합 할 수 없으며 일부는 다른 발견 적 방법을 사용하여 수행했습니다.

두 번째 메모에서 추적 이름 바꾸기는 실제로 콘텐츠가 나무에서 움직이는 방식을 추적하는 특별한 경우입니다 ( ). 경우에 따라 기능을 추가하거나 다른 파일로 이동할 때 쿼리에 관심을 가질 수 있습니다. 필요한 경우에만 정보를 다시 만들 수있는 기능에 의존함으로써 Git은 더 유연한 방법으로 트리가 어떻게 변화하고 있는지 추적하는 것을 목표로합니다.

그러나 이것은 Git이 이름 바꾸기를 지원하지 않는다는 의미는 아닙니다. Git에있는 diff 기계는 자동으로 이름 바꾸기를 지원합니다. '-M'스위치를 사용하여 명령의 git-diff- * 패밀리로 전환합니다. 이름 바꾸기 감지 기계는 git-log (1)과 git-whatchanged (1)에 의해 사용됩니다. 예를 들어 'git log -M'은 커밋을 의 이름 바꾸기 정보와 함께 제공합니다. 힘내는 또한 의 제한된 형태의 이름 바꾸기를 지원합니다. 비난을 할당하는 두 가지 도구 인 git-blame (1)과 git-annotate (1)은 자동으로 이름 바꾸기 검색 코드를 사용하여 이름을 추적합니다.

아주 특별한 경우로, 'git log'버전 1.5.3 이상은 단일 경로가 주어 졌을 때 이름을 따를 수있는 '--follow'옵션을 가지고 있습니다. 당신이 리팩토링과 파일 이름을 변경 한 경우

따라서, 그 이전 파일과의 유사성은 매우 작을 것이다, 그 결과 status 또는 log 파일을 삭제 한 후 추가되었음을 나타낼 수 있습니다.

몇 가지 옵션을 감지 할 수도 리팩토링을 통해 이름을 변경 :

  • -M<n>

    는 이름 변경을 감지합니다. n을 지정하면 유사성 색인 (즉, 파일 크기와 비교하여 추가/삭제 크기가 )에 대한 임계 값입니다. 예를 들어, -M90 %는 파일의 90 % 이상이 변경되지 않은 경우 삭제/추가 쌍을 이름 바꾸기로 간주해야 함을 나타냅니다.

  • -w

    하면 공백

    의 양의 변화를 무시한다. 이것은 줄 끝의 공백을 무시하고 하나 이상의 공백 문자가있는 다른 모든 시퀀스를 동일하게 간주합니다.

  • -B<n>

    휴식의 쌍으로 완전히 재 변경 사항을 삭제하고 만들

    . 이 파일들이 변경 한 경우에도 소스의 이름을 변경으로 간주 될 수 있기 때문에

    -B

유용합니다; 예를 들어, foo.c의 90 %를 bar.c으로 이동했지만 foo.c에 일부 기능을 남기면 이름 변경을 감지합니다.

+0

그래서 내가 커밋의 히스토리를보고 있는데, 이름 변경이 발생했다는 것을 보여줄지라도, 커밋에 대한 이름을 다시 한번 "감지"하고 있습니다. – techphoria414

+0

예. 'git log -p'를 사용하는 동안'-M '을 사용하면 실제로 작동하는 것을 볼 수 있습니다 : 커밋의 모양은 실제로 선택한'n'에 따라 바뀝니다. – nneonneo

0

당신은 가능성이 자식 구성 설정의 파울 떨어지고있다 : merge.renameLimit이 설정은 (큰 코드베이스에 비해) 매우 낮은 디폴트로 당신은 너무 많은 파일을 병합하는 경우 두려움에, 이름 변경을 감지하려고 시도하지 않습니다

그것의 천천히. 한 방향으로 병합하는 것이 한도를 초과하고 다른 방향으로 병합하지 않는 것이 가능하므로 이상한 이름 바꾸기 감지 동작이 가능합니다.

git config merge.renameLimit 9999 

재 시도에 의해 제한을 높여 봅니다.

관련 문제