Git 상태는 내용이 동일하더라도 파일이 변경된 것으로 표시합니다


195

다른 사람으로부터 git checkout을 받았으며 스테이지되지 않은 변경 사항을 로컬 저장소에 커밋하려고합니다. 그러나 내용이 정확히 동일하더라도 많은 (모든 경우는 아님) 파일이 수정 된 것으로 나타납니다 .

나는 이미 core.fileMode거짓으로 설정 core.autocrlf했고 성공하지 않고 거짓으로 설정 했습니다.

내가받은 Git 저장소는 Linux를 사용하는 동안 Windows를 사용하는 사람에게서 온 것입니다.

실제 변경 사항 을 커밋하려면 어떻게해야 합니까?

편집 : 출력 git config -l:

user.name=Aron Rotteveel
user.email=<removed>
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=auto
color.ui=true
color.pager=true
color.branch.current=yellow reverse
color.branch.local=yellow
color.branch.remote=green
color.diff.meta=yellow bold
color.diff.frag=magenta bold
color.diff.old=red bold
color.diff.new=green bold
color.status.added=yellow
color.status.changed=green
color.status.untracked=cyan
core.pager=less -FRSX
core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol
alias.co=checkout
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
core.autocrlf=false
remote.origin.url=<removed>
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

업데이트 : 임의의 예제 파일이 추가되었습니다. 이 파일은 평범한 텍스트이므로 포함하기가 가장 쉽습니다.

원본 파일은 https://gist.github.com/c3c5302430935155ef3d에 있습니다. Hexdumps는 파일이 다르다는 것을 분명히 나타내지 만, 이것을 일으키는 원인과 해결 방법에 대한 실마리는 없습니다.

헤드 버전 :

0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740d  HTML.SafeObject.
0000010: 0a54 5950 453a 2062 6f6f 6c0d 0a56 4552  .TYPE: bool..VER
0000020: 5349 4f4e 3a20 332e 312e 310d 0a44 4546  SION: 3.1.1..DEF
0000030: 4155 4c54 3a20 6661 6c73 650d 0a2d 2d44  AULT: false..--D
0000040: 4553 4352 4950 5449 4f4e 2d2d 0d0a 3c70  ESCRIPTION--..<p
0000050: 3e0d 0a20 2020 2057 6865 7468 6572 206f  >..    Whether o
0000060: 7220 6e6f 7420 746f 2070 6572 6d69 7420  r not to permit 
0000070: 6f62 6a65 6374 2074 6167 7320 696e 2064  object tags in d
0000080: 6f63 756d 656e 7473 2c20 7769 7468 2061  ocuments, with a
0000090: 206e 756d 6265 7220 6f66 2065 7874 7261   number of extra
00000a0: 0d0a 2020 2020 7365 6375 7269 7479 2066  ..    security f
00000b0: 6561 7475 7265 7320 6164 6465 6420 746f  eatures added to
00000c0: 2070 7265 7665 6e74 2073 6372 6970 7420   prevent script 
00000d0: 6578 6563 7574 696f 6e2e 2054 6869 7320  execution. This 
00000e0: 6973 2073 696d 696c 6172 2074 6f0d 0a20  is similar to.. 
00000f0: 2020 2077 6861 7420 7765 6273 6974 6573     what websites
0000100: 206c 696b 6520 4d79 5370 6163 6520 646f   like MySpace do
0000110: 2074 6f20 6f62 6a65 6374 2074 6167 732e   to object tags.
0000120: 2020 596f 7520 7368 6f75 6c64 2061 6c73    You should als
0000130: 6f20 656e 6162 6c65 0d0a 2020 2020 254f  o enable..    %O
0000140: 7574 7075 742e 466c 6173 6843 6f6d 7061  utput.FlashCompa
0000150: 7420 696e 206f 7264 6572 2074 6f20 6765  t in order to ge
0000160: 6e65 7261 7465 2049 6e74 6572 6e65 7420  nerate Internet 
0000170: 4578 706c 6f72 6572 0d0a 2020 2020 636f  Explorer..    co
0000180: 6d70 6174 6962 696c 6974 7920 636f 6465  mpatibility code
0000190: 2066 6f72 2079 6f75 7220 6f62 6a65 6374   for your object
00001a0: 2074 6167 732e 0d0a 3c2f 703e 0d0a 2d2d   tags...</p>..--
00001b0: 2320 7669 6d3a 2065 7420 7377 3d34 2073  # vim: et sw=4 s
00001c0: 7473 3d34 0d0a                           ts=4..

복사 한 버전 :

0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740a  HTML.SafeObject.
0000010: 5459 5045 3a20 626f 6f6c 0a56 4552 5349  TYPE: bool.VERSI
0000020: 4f4e 3a20 332e 312e 310a 4445 4641 554c  ON: 3.1.1.DEFAUL
0000030: 543a 2066 616c 7365 0a2d 2d44 4553 4352  T: false.--DESCR
0000040: 4950 5449 4f4e 2d2d 0a3c 703e 0a20 2020  IPTION--.<p>.   
0000050: 2057 6865 7468 6572 206f 7220 6e6f 7420   Whether or not 
0000060: 746f 2070 6572 6d69 7420 6f62 6a65 6374  to permit object
0000070: 2074 6167 7320 696e 2064 6f63 756d 656e   tags in documen
0000080: 7473 2c20 7769 7468 2061 206e 756d 6265  ts, with a numbe
0000090: 7220 6f66 2065 7874 7261 0a20 2020 2073  r of extra.    s
00000a0: 6563 7572 6974 7920 6665 6174 7572 6573  ecurity features
00000b0: 2061 6464 6564 2074 6f20 7072 6576 656e   added to preven
00000c0: 7420 7363 7269 7074 2065 7865 6375 7469  t script executi
00000d0: 6f6e 2e20 5468 6973 2069 7320 7369 6d69  on. This is simi
00000e0: 6c61 7220 746f 0a20 2020 2077 6861 7420  lar to.    what 
00000f0: 7765 6273 6974 6573 206c 696b 6520 4d79  websites like My
0000100: 5370 6163 6520 646f 2074 6f20 6f62 6a65  Space do to obje
0000110: 6374 2074 6167 732e 2020 596f 7520 7368  ct tags.  You sh
0000120: 6f75 6c64 2061 6c73 6f20 656e 6162 6c65  ould also enable
0000130: 0a20 2020 2025 4f75 7470 7574 2e46 6c61  .    %Output.Fla
0000140: 7368 436f 6d70 6174 2069 6e20 6f72 6465  shCompat in orde
0000150: 7220 746f 2067 656e 6572 6174 6520 496e  r to generate In
0000160: 7465 726e 6574 2045 7870 6c6f 7265 720a  ternet Explorer.
0000170: 2020 2020 636f 6d70 6174 6962 696c 6974      compatibilit
0000180: 7920 636f 6465 2066 6f72 2079 6f75 7220  y code for your 
0000190: 6f62 6a65 6374 2074 6167 732e 0a3c 2f70  object tags..</p
00001a0: 3e0a 2d2d 2320 7669 6d3a 2065 7420 7377  >.--# vim: et sw
00001b0: 3d34 2073 7473 3d34 0a                   =4 sts=4.

1
당신이있는 경우 core.filemode해제하거나 설정하려면를 true출력 다른 무엇입니까?
Mark Longair

도움이 될 다른 중요한 정보는 다음과 같습니다.git --version
Mark Longair

2
@AronRotteveel : 쉽습니다. 첫 번째 파일에는 CRLF 줄 끝 (창)이 있고 두 번째 LF (Unix)가 있습니다.
sehe

3
git 2.8 (2016 년 3 월)에서는 git ls-files --eoleol이 포함되어 있는지 빠르게 확인할 수 있습니다. 아래 답변을
VonC

Windows 사용자는 git config --global core.autocrlf true 를 실행 하여이 문제를 해결할 수 있습니다 .
Inyoka

답변:


62

업데이트 :이 질문에 대한 의견에 따라 문제가 해결되었습니다.

첫 번째 파일에는 CRLF 줄 끝 (windows)이 있고 두 번째 LF (Unix)가 있습니다. file(자식 \ USR \ 빈에서 사용 가능) 폴더의 유틸리티는 (은 중임을 보여줍니다 file a b같은 것을 회신 해 드리겠습니다 a: ASCII text, with CRLF line terminators b: ASCII text)

아래의 원래 답변 :


표시하는 diff 에는 하나의 다른 선 이 표시되지 않습니다 . .git / config (또는 더 나은 git config -l) 를 게시 할 수 있습니까?

공백이 무시 될 수도 있습니다.

당신은 비활성화하려고합니다 core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol;

또한

git show HEAD:myfile|md5sum
md5sum myfile

파일이 실제로 다른지 확인하는 데 사용될 수 있습니다. 외부 diff를 사용하면 효과가 있습니다.

git show HEAD:myfile > /tmp/myfile.HEAD

diff -u myfile /tmp/myfile.HEAD

# or if you prefer an interactive tool like e.g.:
vim -d myfile /tmp/myfile.HEAD

이상한 것은 두 파일의 md5sums를 다른하지만 내가 찾을 수 있다는 것입니다 어떠한 공백의 차이를. (이 경우라고 가정하지만 간단하게 볼 수는 없습니다). 어떤 도움이라도 환영합니다.
Aron Rotteveel

어딘가에 예제를 업로드하면됩니다 (gist.github.com이 이에 적합 함). 마지막 줄에는 줄 바꿈이 있거나 바이트 순서 표시 또는 비정규 UTF8 인코딩이 일반적이라고 가정합니다. 당신은 항상 바이너리 diff 를 xxd보거나 bdiff할 수 있습니다
sehe

팁 고마워. xdd나에게 새로운 것이었다. 훌륭한 도구! 예를 들어 게시물을 업데이트했습니다.
Aron Rotteveel

1
@AronRotteveel : 쉽습니다. 첫 번째 파일에는 CRLF 줄 끝 (Windows)이 있고 두 번째 LF (Unix)가 있습니다. 편집file유틸리티가 당신에게 보여줄 것입니다 ( file a b같은 응답을 할 것입니다 a: ASCII text, with CRLF line terminators b: ASCII text)
sehe

VIM에서 실제로 ^ M으로 표시되어서는 안됩니까? (보이지 않습니다). 분명히, 나는 당신을 믿지만, 실제로 당신이 이것을 어떻게 알아 차
렸는지에

135

다음 stpes를 사용 하여이 문제를 해결했습니다.

1) Git의 인덱스에서 모든 파일을 제거하십시오.

git rm --cached -r .

2) Git 인덱스를 다시 작성하여 모든 새로운 줄 끝을 가져옵니다.

git reset --hard

2 단계는 로컬 변경 사항을 제거 할 수 있습니다. 솔루션은 자식 사이트 https://help.github.com/articles/dealing-with-line-endings/ 에 설명 된 단계 중 일부였습니다


필자의 경우 일부 파일에 많은 메모를 한 다음 .git 폴더가없는 저장소를 새 컴퓨터에 복사했습니다. .git 패키지가 없다는 것을 깨달았을 때 돌아가서 검색하기에는 너무 늦었습니다. 1. 내 변경 3. 란 단계 영업의 게시물 하나를 사용하여 파일과 함께 바닐라 파일을 대체 전체의 repo 2의 새 복사본 밖으로 검사 : 나는 그래서 git rm --cached -r .대체되었다 4.이 내 변화를 개최 (및 기타 파일을 ) 그래서 나는 그들을 무대에서 풀었다. 이 시점에서 저의 레포는 정상으로 돌아 왔습니다.
코디

2
훌륭한. 고마워
rupi

6
당신이 할 경우 다른 변경 사항을 잃을 수 있으므로주의해야합니다.
Mohy Eldeen

Windows에서 우분투로 내 repo 폴더를 복사하여 붙여 넣은 후에이 문제가 발생했습니다. 로컬 변경은 없었지만 어떤 이유로 git은 모든 단일 파일이 변경되었다고 생각했습니다. 이 솔루션은이 문제를 해결했습니다.
Linek

88

파일 모드를 변경 했습니까? 나는 내 컴퓨터에서 그것을했고 로컬 dev 컴퓨터는 모든 파일에 777을 주었고 repo는 755를 가지고 모든 파일이 수정 된 것으로 표시했습니다. 나는 그랬고 git diff이전 모드와 새로운 모드가 다르다는 것을 보여주었습니다. 그것이 문제라면 당신은 쉽게 git config core.filemode false
건배에 의해 무시할 수 있습니다


2
Linux에서 git을 사용하는 Windows 파일 시스템의 저장소와 함께 Windows 10 lxss (예 : Ubuntu Bash)를 사용하면 줄 끝 문제라고 생각했습니다. 파일 모드가 다른 방식 일 수도 있다고 생각하지 않았습니다.
Matt L

로컬 O / S를 Ubuntu에서 Windows로 변경했을 때 도움이되었습니다. 건배
마크 Bucknell

@MattL과 itsandy 나는 보통 Git Bash를 사용하여 Win 10에서 개발하지만 오늘은 Mac에 있으며 git은 .gitignore파일이 변경되지 않았을 때 파일이 변경 되었다고 생각 합니다. 이 Mac에서는로 git config core.filemode응답합니다 true. 로 변경 false했지만 도움이되지 않았습니다.
Ryan

43

나는 같은 문제가 있었다. win-> lin copy 후 모든 파일을 수정했습니다.
나는 줄 끝을 고치기 위해 fromdos 를 사용한
다음

git add -uv 

변경 사항을 추가합니다.
3 개의 파일 (모두는 아님)을 추가했는데 실제로 수정되었습니다. 그 후 git status 는 3 개의 수정 된 파일 만 보여줍니다. git commitgit status로 모든 것이 정상입니다.


2
고마워, 이것이 내가 필요한 것입니다. 나는 md5sum을 비교하는 @sehe의 제안을 사용하여 파일이 동일한 지 확인했습니다 (제 경우에는 동일했습니다). 그 후 -u 플래그를 사용하면 변경 사항이있는 파일과 실제로 차이가없는 파일을 올바르게 필터링했습니다.
STW

감사합니다. 도움이되었습니다. npm i내 프로젝트의 루트에서 수행 한 후이 문제가 발생 했습니다. 어떻게 든 많은 파일이 다른 줄 끝을 얻었 으므로이 문제가 발생했습니다.
Server Khalilov

이것은 내가 기대했던 것입니다 ... 변경 사항이 남아 있고 휴식이 취소되었습니다
Deepak


24

필자의 경우 파일 권한 을 변경 한 후 파일이 수정 된 것으로 나타납니다 .

git이 권한 변경을 무시하도록하려면 다음을 수행하십시오.

# For the current repository
git config core.filemode false   

# Globally
git config --global core.filemode false

1
당신의 대답은 많은 시간을 절약했습니다. 감사!
Pavel_K

이 작업을 수행 한 후 원하는 변경 내용을 숨김 / 스테이징 하고 권한이 변경된 파일을 재설정 / 체크 아웃 한 다음 다시 활성화하는 것이 core.filemode좋습니다. :)
XtraSimplicity

한 랩톱에서 다른 랩톱으로 파일을 복사 한 후이 문제가 발생했습니다. 당신의 고정은 그것을 저장했습니다. 감사!
Sam

23

그러나 내용이 정확히 동일하더라도 많은 (전체는 아님) 파일이 수정 된 것으로 나타납니다.

git 2.8 (2016 년 3 월)을 사용하면 이러한 변경 사항이 eol 관련인지 신속하게 확인할 수 있습니다.

Torsten Bögershausen ( )의 커밋 a7630bd (2016 년 1 월 16 일)를 참조하십시오 . (가 합병 - Junio C 하마노 -05f1539 커밋 2016 03 이월)tboegi
gitster

ls-files: EOL 진단 기능 추가

크로스 플랫폼 환경에서 작업 할 때 사용자는 텍스트 파일이 저장소에 정규화되어 저장되어 있고 .gitattributes적절하게 설정 되어 있는지 확인할 수 있습니다 .

Git이 색인과 작업 트리 및 유효 텍스트 / EOL 속성에 줄 끝을 표시하게합니다.

줄 끝 ( " eolinfo")은 다음과 같이 표시됩니다.

"-text"        binary (or with bare CR) file
"none"         text file without any EOL
"lf"           text file with LF
"crlf"         text file with CRLF
"mixed"        text file with mixed line endings.

효과적인 text / eol 속성은 다음 중 하나입니다.

"", "-text", "text", "text=auto", "text eol=lf", "text eol=crlf"

git ls-files --eol 다음과 같은 출력을 제공합니다.

i/none   w/none   attr/text=auto      t/t5100/empty
i/-text  w/-text  attr/-text          t/test-binary-2.png
i/lf     w/lf     attr/text eol=lf    t/t5100/rfc2047-info-0007
i/lf     w/crlf   attr/text eol=crlf  doit.bat
i/mixed  w/mixed  attr/               locale/XX.po

표시되는 각 경로에 대해 인덱스 ( ' i') 및 작업 트리 ( ' w') 의 데이터에 어떤 eol 규칙이 사용 되는지, 어떤 속성이 유효한지 표시 합니다.


이것은 문제를 보여 주지만 해결하지는 않습니다.
Greeso

7

다음은 Windows에서 생성 된 프로젝트를 복제하는 동안 Linux에서 문제를 해결 한 방법입니다.

Linux에서 상황이 제대로 작동하려면 다음 설정이 있어야합니다. core.autocrlf = input

이것은 설정 방법입니다 : git config --global core.autocrlf input

그런 다음 github에서 프로젝트를 다시 복제하십시오.


이것은 Windows에서 Visual Studio를 사용하는 시나리오에서 나에게 도움이되었지만 명령 줄에서 WSL에서 커밋 및 추가 검사를 수행하고 있습니다. 명령 줄에서 모든 파일은 변경된 것으로 표시되었지만 Visual Studio에서는 일부 파일 만 변경되었습니다. .gitconfig 파일에 autoclrf = input을 추가하고 즉시 수정했습니다. 감사합니다!
빅 데이터 브라이언

5

힘내 자주 묻는 질문은 내가 전에이 건너 적이 있지만, 관련이있을 수 대답이있다 :

왜 git diff가 때때로 변경 사항이없는 파일을 나열합니까?

git diff 및 기타 git 작업은 디스크와 git의 색인에서 상태 (크기, 수정 시간 등)가 다른 파일을 보지 않아도 최적화되어 있습니다. 이것은 작은 변화에 대해 git diff를 매우 빠르게 만듭니다. 파일이 어떻게 든 닿았다면 git diff는 내용을보고 비교해야합니다. 실제로 변경이없는 경우에도 훨씬 느린 작업입니다. git diff는 파일이 최적으로 사용되지 않았다는 알림으로 파일을 나열합니다. git status를 실행하면 상태를 표시 할뿐만 아니라 변경되지 않은 파일 디스크의 상태로 인덱스를 업데이트하여 diff뿐만 아니라 후속 작업을 훨씬 빠르게 수행합니다. diff로 많은 파일을 나열하는 일반적인 경우는 perl -pi -e '...'와 같은 대량 편집 명령을 실행하는 것입니다.

당신에게 무엇을 git status보여줍니까?


git status수정 된 섹션에 파일 목록이 표시됩니다.
Aron Rotteveel

@Aron : 그 단서에 따라 내가 말하고 싶지만 : 85 %는 말한다 lineend 변환
sehe

4
와. 공식 git 문서 중 일부가 이해할 수없는 것을 상기시킵니다.
Mars

2

로컬 리포지토리와 작업 복사본을 다른 폴더 (Windows의 경우)에 복사 한 후 변경 된 것으로 계속 표시되는 4 개의 파일이 있었고 다른 답변에 나열된 모든 제안을 시도했습니다. 결국 나를 위해 고친 것은 로컬 지점을 삭제하고 원격에서 다시 다운로드하는 것이 었습니다. 필자의 경우 복제가 아닌 로컬 저장소를 복사하는 것과 관련이 있다고 생각합니다.


2

그래서 나는 여기서 거의 모든 것을 시도했고 내 모든 문제를 해결하는 하나의 솔루션을 추가하고 싶습니다. 내 문제는 줄 끝이나 실제 권한 또는 이와 비슷한 것이 아닙니다. Cygwin과 그와 함께 제공되는 모든 호스트를 설치했기 때문에 나에게 모르는 자체 버전의 git도 설치했기 때문입니다. 나는 이것이 사용자와 파일에 이상한 문제가 있다는 것을 알지 못했습니다. (펌 변경으로 인해) 변경 된 것으로 표시되었습니다.

Git을 최신 버전으로 업데이트해야한다고 생각했기 때문에이 사실을 알았지 만 실행 git --version하면 이전 버전 번호가 반환되었습니다. 그 이유를 찾은 후, 이전 버전 번호에서 실행되는 git 실행 파일이 들어있는 환경 경로에서 cygwin bin 디렉토리 루트를 찾았습니다. 그림을 이동.

TortoiseGit이 설치되어 있기 때문에 찾기가 어려웠습니다. 내 명령 줄 도구는 경로 대체로 인해 cygwin 버전을 사용하고 TortoiseGit은 Windows 버전을 사용하도록 구성되어 더 혼란 스럽습니다.

이것이 누군가를 돕기를 바랍니다.


1
잘 잡았습니다. +1. 그래서 stackoverflow.com/a/44351065/6309
VonC

나는 종종 설치 프로그램이 PATH를 설정하도록 한 다음 수동으로 확인합니다. 이전 설치에는 git 2.4.x (x86)가 있었고 git 2.13.x (x64)를 설치했습니다. x86 경로 참조를 제거하고 여전히 2.4를 얻었을 때 혼란을 상상할 수 있습니다! 그때 cygwin의 bin 디렉토리를 보았고 다음으로 볼만한 논리적 장소였습니다. 따라서 Cygwin bin 디렉토리가 먼저 나열되면 FWIW 설정 또는 PATH를 시각적으로 확인하면이 문제를 해결할 수 없습니다!
dudewad

1

귀하의 설정에서 유일하게 의심스러운 항목은 core.ignorecase입니다. 다음을 사용하여 설정을 해제 할 수 있습니다.

  git config --unset core.ignorecase

...에서 git status또는 의 출력 git diff이 다른지 확인하십시오.


1

.git / config에서 filemode = false를 설정하면 효과가 있습니다.

filemode = false

0

저에게는 2 개의 Linux VM이 모두 동일한 홈 파일 시스템에 매핑 되었기 때문입니다. 한 VM은 git-1.7.1을 실행 중이고 다른 VM은 git-2.14를 실행 중입니다.

git-1.7.1을 실행하는 VM은 항상 4 개의 파일이 변경된 것으로 표시합니다 (내용과 줄 끝이 동일하다고 생각하더라도).

g-2.14를 실행하는 VM에서 'git status'가 실행되면 두 VM 모두 리포지토리를 깨끗한 것으로보고하기 시작합니다. 'git status'는 부작용이 있습니다. 변경 불가능한 작업이 아닙니다. 그리고 git-1.7.1은 git-2 +와 같은 방식으로 세상을 이해하지 못합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.