Git의 비 단계적 변경에서 "old mode 100755 new mode 100644"라는 파일을 어떻게 제거합니까?


723

어떤 이유로 든, 처음으로 git 프로젝트의 저장소에서 가져 왔을 때 작업 복사본에 상당한 변경 사항이 없지만 내 unstaged changes영역 에 계속 나타나는 많은 파일이 있습니다.

Windows XP에서 Git Gui를 사용하고 있으며 파일을 살펴보면 변경된 내용을 볼 수 있습니다. 내가 보는 것은 :

old mode 100755  
new mode 100644  

누구나 이것이 무엇을 의미하는지 알고 있습니까?

준비되지 않은 변경 사항 목록에서 이러한 파일을 가져 오려면 어떻게해야합니까? (최근에 편집하고 커밋하려는 파일을 선택하기 위해 100 개의 파일을 통과해야한다는 것은 매우 성가신 일입니다).

답변:


1284

그것은 나에게 유닉스 파일 권한 모드처럼 보입니다 ( 755= rwxr-xr-x, 644= rw-r--r--). 이전 모드에는 + x (실행 가능) 플래그가 포함되어 있지만 새 모드는 그렇지 않습니다.

이 msysgit 문제의 응답 은 문제를 제거하기 위해 core.filemode를 false로 설정하도록 제안합니다.

git config core.filemode false

132
+1. 이것은 git이 체크 아웃 된 파일에 실행 비트를 올바르게 설정할 수 있다고 생각하지만 그렇게하려고 시도하면 작동하지 않거나 적어도 읽을 수있는 방식으로 작동하지 않습니다. 그런 다음 해당 파일의 상태를 다시 읽으면 실행 비트가 의도적으로 설정되지 않은 것처럼 보입니다. core.filemode를 false로 설정하면 git에게 파일 시스템의 실행 가능한 비트 변경 사항을 무시하여 변경 사항으로 보지 않도록합니다. 실행 가능한 비트 변경을 준비해야하는 경우 수동으로 수행해야 git update-index --chmod=(+|-)x <path>합니다.
CB Bailey

7
나와 같이 모드 변경이 중요한 경우 core.filemode를 false로 설정하고 실제 코드 변경 사항을 커밋 한 다음 core.filemode를 true로 설정하면 git이 파일 변경 내용을 보존합니다.
Michael T. Smith

8
나는 같은 문제가 있지만 SSH git cmd 라인을 통해 동일한 git repro를 사용하고 Windows의 매핑 된 드라이브에서 Git Extensions를 사용했기 때문에 발생했습니다! . . 해결책은 동일하다. "config"[core] filemode = false에 추가됨
Ian Vaughan

2
생명의 은인이었습니다. 감사합니다! 공용 폴더에서 복제 된 저장소를 공유하고 파일에 대한 권한을 변경 한 후 OSX에서이 문제가 발생했습니다.
Thiago Ganzarolli

8
@robsch git config --global ...글로벌 구성 파일에서 옵션을 설정하는 데 사용할 수 있습니다 .
Amber

98

core.filemodefalse로 설정 하면 작동하지만의 설정이의 설정 ~/.gitconfig으로 재정의되지 않아야 .git/config합니다.


3
거기에 있었어요. 슬프게도 나는 문제를 스스로 해결 한 후에 만 ​​당신의 의견을 찾았습니다. 여전히 +1!
David Schmitt

1
다른 사용자가이 프로젝트를 복제하는 경우 Windows에있는 경우 실제로 ~/.gitconfig파일에 변경 사항을 적용하는 것이 가장 좋습니다 !
Ian Vaughan

Windows Powershell을 확인하려는 경우 git config --list --show-origin | sls filemode또는 Linux에서 git config --list --show-origin | grep filemode. 조정이 필요한 위치를 보여줍니다.
Frank Fu

니가 끝냈어!! 잘 했어.

27

오래된 하드 드라이브에서 작업 파일로 git repo를 두 번 복사 할 때이 문제가 발생했습니다. 문제는 소유자와 권한이 이전 드라이브 / 시스템에서 새 드라이브 / 시스템으로 변경 되었기 때문입니다. 길고 짧은 것은 다음 명령을 실행하여 문제를 해결하십시오 ( 이 수퍼 유저 답변 덕분에 ).

sudo chmod -R -x . # remove the executable bit from all files

이전 명령은 실제로 git diff가보고 한 차이점을 해결하지만 디렉토리를 나열하는 기능을 취소하므로 ls ./실패합니다 ls: .: Permission denied. 이를 해결하려면 다음을 수행하십시오.

sudo chmod -R +X . # add the executable bit only for directories

나쁜 소식은 .sh스크립트 와 같이 실행 가능하게 유지할 파일이 있으면 파일 을 되돌려 야한다는 것입니다. 각 파일에 대해 다음 명령을 사용하여이를 수행 할 수 있습니다.

chmod +x ./build.sh # where build.sh is the file you want to make executable again

2
고마워, 나에게 많은 도움이되었습니다! 또한 git config core.filemode로 설정되어 있는지 확인해야 합니다 true. 그렇지 않으면 권한 변경이 감지되지 않습니다. 또한 모든 변경 후에 git 인덱스를 새로 고쳐서 가져와야했습니다.
pat-s

이 솔루션은 영향을받는 종속성에 대해 걱정되는 경우 가장 안전합니다.
Jin

9

일반적으로 Windows와 Linux / Unix 시스템간에 저장소가 복제 될 때 발생합니다.

git에게 파일 모드 변경을 무시하도록 지시하십시오. 여러 가지 방법이 있습니다.

  1. 현재 리포지토리에만 구성 :

    git config core.filemode false
    
  2. 글로벌 구성 :

    git config --global core.filemode false
    
  3. ~ / .gitconfig에 추가하십시오.

    [core]
         filemode = false
    

그중 하나를 선택하십시오.


git이이 옵션을 true로 설정하여 repo를 생성하기 때문에 전역 설정이 작동하지 않습니다 (Linux에서 repo를 만들었습니다)
Herrgott

4

디렉토리의 일부 권한을 변경 한 것 같습니다. 복원하기 위해 다음 단계를 수행했습니다.

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .

3

git reset --hard HEAD를 시도하여 리포를 예상 기본 상태로 재설정 할 수 있습니다.


8
git가 풀 후 실행 비트를 올바르게 / 일관 적으로 설정할 수 없다면 리셋 후에 더 이상 공정하지 않을 것입니다.
CB Bailey

2
나는 일부 프로젝트를 USB 드라이브 (fat32)로 옮겼고 다시 우분투 머신 (ext4)으로 돌아 갔고 속성이 변경된 여러 파일로 끝났습니다. git reset --hard HEAD나를 위해 완벽하게 일했습니다. 감사합니다
cirovladimir

7
-1. OP는 "최근 편집 한 파일을 선택하여 커밋하고 싶다"고 말합니다. 이렇게하면 편집 내용도 제거됩니다.
whitfin

9
-1 git에서이 명령을 제안하는 것은 "rm -rf ./ 만 가능합니다. 의도하지 않은 결과는 없을 것"이라고 말하는 것과 비슷합니다.
Kzqai 2016 년

1
아니요, 이것은 도움이되지 않으며 이것이 문제입니다. 당신은 재설정하고 청소하고 여전히 자식 상태는 모드 변경을 보여줍니다. 이것은 Windows git의 심각한 문제이며 파일 모드를 무시하여 해결하는 것이 아니라 수정해야한다고 생각합니다.
vezenkov


1

이것은 풀을 가져 왔을 때 모든 파일이 원격 저장소에서 실행 가능한 경우에 발생합니다. 다시 실행 가능하게하면 모든 것이 다시 정상으로 설정됩니다.

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

다음을 수행해야 할 수도 있습니다.

chmod -x <file> // Removes execute bit

대신, 실행 파일로 설정되지 않았고 위 작업으로 인해 변경된 파일의 경우. 이를 수행하는 더 좋은 방법이 있지만 이것은 매우 빠르고 더러운 수정입니다.


1

다음 명령을 사용하여 파일 모드를 다시 변경할 수 있습니다. git add --chmod=+x -- filename 그런 다음 지점에 커밋하십시오.


0

변경 된 권한을 가진 하나의 성가신 파일 만 가지고있었습니다. 개별적으로 롤백하기 위해 방금 수동으로 삭제 rm <file>한 다음 체크 아웃을 수행하여 새로운 사본을 가져 왔습니다 .

운 좋게도 아직 무대에 오르지 않았습니다.

내가 달리기 git reset -- <file>전에 달릴 수 있었다면git checkout -- <file>


0

지점을 마스터와 비교할 때이 문제가 발생했습니다. 내 분기가 마스터와 동일 할 것으로 예상되면 Git에서 하나의 '모드'오류를 반환했습니다. 파일을 삭제 한 다음 마스터를 다시 병합하여 수정했습니다.

먼저 diff를 실행했습니다.

git checkout my-branch
git diff master

이것은 다음을 반환했습니다.

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

그런 다음 수정하기 위해 다음을 실행했습니다.

rm bin/script.sh
git merge -X theirs master

그 후, git diffmy-branch와 master간에 차이가 없었습니다.

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