가능한 원인 # 1-라인 종료 정규화
이러한 상황이 발생할 수있는 상황 중 하나는 라인 엔딩에 대한 올바른 구성없이 해당 파일을 리포지토리에 체크인 한 경우 (1) 잘못된 라인 엔딩 또는 혼합 된 라인 엔딩으로 리포지토리에 파일을 생성 한 경우입니다. 확인하려면 git diff
줄 끝의 변경 사항 만 표시 되는지 확인 git diff | cat -v
하십시오 ( 기본적으로 표시되지 않을 수 있음 ^M
). 캐리지 리턴을 리터럴 문자 로 보십시오 .
결과적으로 누군가가 줄 끝을 정규화하기 .gitattributes
위해 core.autocrlf
설정을 추가 하거나 수정했습니다 (2). .gitattributes
또는 전역 구성을 기반으로 Git은 요청한 줄 끝 정규화를 적용하는 작업 복사본에 로컬 변경 사항을 적용했습니다. 불행히도, 어떤 이유로 git reset --hard
이러한 라인 정규화 변경을 취소하지 않습니다.
해결책
로컬 줄 끝이 재설정되는 해결 방법으로는 문제가 해결되지 않습니다. 파일이 git에 의해 "보일"때마다, 정규화를 다시 시도하여 동일한 문제가 발생합니다.
최선의 선택은 자식이 일치하도록 REPO의 모든 라인 엔딩 정상화에 원하는 정상화를 적용 할 수 있도록하는 것입니다 .gitattributes
참조 - 및 변경 사항을 커밋 자식 필터 - 분기 수정 라인 엔딩을 시도하지만, 운이없는 .
실제로 변경 사항을 수동으로 파일로 되돌리려 고하면 가장 쉬운 해결책은 수정 된 파일을 지우고 git에게 파일을 복원하도록 지시하는 것 같습니다.이 솔루션은 지속적으로 100 % 작동하지 않는 것으로 보입니다. 시간 ( 경고 : 수정 된 파일에 줄 끝 이외의 변경 사항이있는 경우 이것을 실행 하지 마십시오 !!)
git status --porcelain | grep "^ M" | cut -c4- | xargs rm
git checkout -- .
어떤 시점에서 저장소의 줄 끝을 정규화하지 않으면이 문제가 계속 발생합니다.
가능한 원인 # 2-대소 문자 구분
두 번째 가능한 원인은 Windows 또는 Mac OS / X에서 대소 문자를 구분하지 않기 때문입니다. 예를 들어, 저장소에 다음과 같은 경로가 있다고 가정하십시오.
/foo/bar
이제 Linux의 누군가가 /foo/Bar
(아마도 빌드 도구 또는 해당 디렉토리를 만든 것으로 인해) 파일을 커밋 하고 푸시합니다. Linux에서 이것은 실제로 두 개의 별도 디렉토리입니다.
/foo/bar/fileA
/foo/Bar/fileA
변경 될 수 있습니다 Windows 또는 Mac에서 출력이 REPO 확인 fileA
밖으로 윈도우 수표에 있기 때문에 각 리셋, 리셋 할 수없는, 자식 /foo/bar/fileA
윈도우의 경우를 구분하고 있기 때문에, 내용 덮어 쓰기 fileA
로를 /foo/Bar/fileA
"수정"하고 그 결과.
다른 경우는 저장소에 존재하는 개별 파일 일 수 있으며, 대소 문자를 구분하지 않는 파일 시스템에서 체크 아웃하면 겹칩니다. 예를 들면 다음과 같습니다.
/foo/bar/fileA
/foo/bar/filea
이러한 문제를 일으킬 수있는 다른 유사한 상황이있을 수 있습니다.
대소 문자를 구분하지 않는 파일 시스템의 git 은 실제로이 상황을 감지하고 유용한 경고 메시지를 표시하지만 현재는 그렇지 않습니다 (향후 변경 될 수 있습니다 -git.git 메일 링리스트 에서이 토론 및 관련 제안 패치 참조 ).
해결책
해결책은 git 인덱스의 파일 케이스와 Windows 파일 시스템의 케이스를 정렬하는 것입니다. 이것은 실제 상황을 보여주는 Linux 또는 Windows에서 매우 유용한 오픈 소스 유틸리티 Git-Unite을 사용하여 수행 할 수 있습니다 . Git-Unite은 필요한 경우 변경 사항을 git 인덱스에 적용하여 리포지토리에 커밋 할 수 있습니다.
(1)이 어떤없이, Windows를 사용하는 사람이 대부분이었다 .gitattributes
문제의 파일에 대한 정의 및 대한 기본 전역 설정을 사용하여 core.autocrlf
인 false
((2) 참조).
(2) http://adaptivepatchwork.com/2012/03/01/mind-the-end-of-your-line/
.
은 루트 디렉토리가 아닌 현재 디렉토리를 나타냅니다