Git이 파일 모드 (chmod) 변경을 무시하도록하려면 어떻게해야합니까?


2308

chmod개발 중에 파일 모드 를 777로 변경해야하지만 기본 리포지토리에서 변경해서는 안되는 프로젝트가 있습니다 .

Git chmod -R 777 .은 모든 파일을 가져 와서 변경된 것으로 표시합니다. 파일에 대한 Git 무시 모드 변경을 만드는 방법이 있습니까?


17
이것은 Windows의 git과 Windows의 Ubuntu의 Bash를 사용할 때 유용합니다
Elazar

4
특정 호출에 대한 권한 변경을 무시 git diff하고 Git 구성 파일을 변경하지 않으려는 사람 git diff -G.Zed의 답변을 여기 에서 사용할 수 있습니다 .
sampablokuper

답변:


3819

시험:

git config core.fileMode false

에서 자식-설정 (1) :

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

-c플래그는 일회성 명령에 대해이 옵션을 설정할 수 있습니다 :

git -c core.fileMode=false diff

그리고 --global플래그는 로그인 한 사용자의 기본 동작이됩니다.

git config --global core.fileMode false

전역 설정의 변경 사항은 기존 리포지토리에 적용되지 않습니다. 또한, git clonegit init명시 적으로 설정 core.fileModetrue논의로 환매 특약 설정에서 클론에 오버라이드 (override) 로컬 힘내 글로벌 core.fileMode의 거짓

경고

core.fileMode모범 사례가 아니며주의해서 사용해야합니다. 이 설정은 실행 가능한 비트 모드에만 적용되며 읽기 / 쓰기 비트에는 적용되지 않습니다. 대부분의 경우 chmod -R 777, 모든 파일을 실행 가능하게 만드는 것과 같은 작업을 수행했기 때문에이 설정이 필요하다고 생각합니다 . 그러나 대부분의 프로젝트에서 대부분의 파일은 보안상의 이유로 필요하지 않으며 실행 가능하지 않아야합니다 .

이러한 상황을 해결하는 올바른 방법은 다음과 같이 폴더 및 파일 권한을 개별적으로 처리하는 것입니다.

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

그렇게 core.fileMode하면 매우 드문 환경을 제외하고는 을 사용할 필요가 없습니다 .


203
그렇게 git config --global core.filemode false하면 모든 repos에 대해이 작업을 한 번만 수행하면됩니다.
그렉

13
내가 대신 파일 모드의 대한 fileMode해야하는 경우 고정 할 때까지이 나를 위해 일을하지 않았다
티 쉬마

8
@ tishma : Git 구성 섹션과 변수 이름은 설명서에 따라 대소 문자를 구분하지 않습니다. CONFIGURATION FILE 섹션을 참조하십시오 . 위의 방법이 효과가 없다면 다른 이유로 인한 것입니다.
Greg Hewgill

11
@donquixote : git config명령은 설정을 올바른 구성 파일에 작성합니다 ( .git/config현재 리포지토리의 ~/.gitconfig경우 또는와 함께 사용하는 경우 --global).
Greg Hewgill

8
@ zx1986 : 중요하지 않습니다. 에서 자식 설정 : "변수 이름은 대소 문자를 구별하지 않는다 ..."
그렉 Hewgill

277

작업 트리에서 모드 변경 취소 :

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

또는 mingw-git에서

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

42
OS X Lion에서는 불법적 인 주장이므로 필요하지 않은 -d'\n'부분은 생략하십시오 xargs.
파스칼

9
"chmod :`+ x '뒤에 피연산자가 없음"에 대한 오류를 무시할 수 있습니다
Casey Watson

5
이것이 최신입니까? 나는 mingw에서 'chmod : too arguments'를
얻는다

7
@Pascal @pimlottc -d는 분리 문자를 공백 대신 개행 문자로 지정합니다. BSD xargs에는 해당 옵션이 없지만 대신 출력을 파이프 tr '\n' '\0'한 다음 -0arg를 xargs로 사용하여 NUL을 구분 기호로 사용할 수 있습니다.
Mark Aufflick

10
멋지다, tr일했다! OSX의 전체 명령은 다음과 같습니다.git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
K.-Michael Aye

135

모든 리포지토리에이 옵션을 설정하려면 해당 --global옵션을 사용하십시오 .

git config --global core.filemode false

이것이 작동하지 않으면 아마도 최신 버전의 git을 사용하고 있으므로 --add옵션을 사용해보십시오 .

git config --add --global core.filemode false

--global 옵션없이 실행하고 작업 디렉토리가 저장소가 아닌 경우

error: could not lock config file .git/config: No such file or directory

5
나중에 GIT 사용하는 것 같은데 --add같이,git config --add --global core.filemode false
mgaert

14
repo의 로컬 구성에 이미 filemode = true가있는 경우 로컬 구성이 전역 구성을 대체하므로 전역 구성을 변경해도 도움이되지 않습니다. 머신의 각
리포지토리

3
참고 사항 : syedrakib의 경고 로이 답변을 업데이트하십시오! 내가 그것을 발견하기 전에 모든 것이 미쳤다고 느꼈다.
jerclarke

88

만약

git config --global core.filemode false

작동하지 않으면 수동으로 수행하십시오.

cd into yourLovelyProject folder

.git 폴더로 cd :

cd .git

구성 파일을 편집하십시오.

nano config

참을 거짓으로 바꾸다

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

저장, 종료, 상위 폴더로 이동 :

cd ..

자식을 다시 초기화

git init

끝났습니다!


11
편집하는 대신 프로젝트의 루트에 .git/config있는 간단한 git config core.fileMode false것으로 충분합니다. 구성 파일을 편집하는 경우 전역 지시문이 선택되도록 지시문을 완전히 제거하는 것이 좋습니다.
Felix

6
-1 git config --global이 작동하지 않으면 시스템 수준에서 권한을 가지고 있지 않다는 것을 의미합니다. global옵션을 제거 하면 .git / config를 수동으로 편집하는 것과 정확히 동일한 기능을 수행합니다.
CharlesB

@CharlesB 부정확-답변은 옵션을 프로젝트에 직접 넣어 프로젝트별로 만들면 해결 방법을 제공했습니다. 이것은 앞으로 만들거나 체크 아웃하는 다른 자식 프로젝트에서는 작동하지 않지만 현재 작업중 인 프로젝트에서는 작동합니다. (분명히 명확하게 ~/.gitconfig하고 ~/project/.git/config)
ddavison

이것이 실행되면 git init파일 모드를 다시 true로 설정해야합니까?
Jordan

53

Greg Hewgill 답변에 추가 ( core.fileMode구성 변수 사용) :

당신은 사용할 수 --chmod=(-|+)x의 옵션 자식 갱신 인덱스 -a 커밋 자식 "당신이"커밋 힘내 "사용하는 경우가 뽑힐 것 곳에서, 인덱스에 실행 권한을 변경 ("자식 추가 "낮은 수준의 버전) (그리고 ").


2
이것은 별도의 답변으로 추가되지 않고 Greg Hewgill의 답변으로 편집되었으므로 하나의 명확한 표현으로 하나의 최고의 답변을 만듭니다.
Greg

6
@Greg : 자신의 답변이 아닌 것을 편집하기에 충분한 포인트가 있어야합니다. 당시 권한을 수정하기에 충분하지 않은 것 같습니다.
Jakub Narębski 2016 년

1
@Jakub 나는 당신이 지금 충분히 평판이 좋다고 생각합니다.
Alex Hall

38

전역 적으로 구성 할 수 있습니다.

git config --global core.filemode false

위의 방법으로 문제가 해결되지 않으면 로컬 구성이 전역 구성보다 우선하기 때문일 수 있습니다.

글로벌 구성을 적용하려면 로컬 구성을 제거하십시오.

git config --unset core.filemode

또는 로컬 구성을 올바른 값으로 변경할 수 있습니다.

git config core.filemode false


4
주요 답변이 도움이되지 않으면 시도하십시오. 당신이 그것을 수정하지 않고 해당 지역의 설정을 확인하려면, 확인 git config -l(- 로컬 및 글로벌 모두 목록 현재 설정)
르지 Bociurko

23

chmod 명령을 이미 사용한 경우 파일의 차이점을 확인하면 이전 파일 모드와 현재 파일 모드가 다음과 같이 표시됩니다.

새로운 모드 : 755

구 모드 : 644

아래 명령을 사용하여 모든 파일의 이전 모드 설정

sudo chmod 644 .

이제 명령을 사용하거나 수동으로 구성 파일에서 core.fileMode를 false로 설정하십시오.

git config core.fileMode false

그런 다음 chmod 명령을 적용하여 다음과 같은 모든 파일의 권한을 변경하십시오.

sudo chmod 755 .

다시 core.fileMode를 true로 설정하십시오.

git config core.fileMode true

모범 사례를 위해 core.fileMode를 항상 false로 유지하지 마십시오.


전체 프로젝트 (개발, 스테이징 및 프로덕션)가 755 여야한다고 말씀하십니까?
Daniel

@Daniel Feb : 아니오. 필요한 파일의 모드 만 변경하십시오.
Kishor Vitekar

For best practises don't Keep core.fileMode false always무슨 뜻인지 설명해야합니다.
bg17aw

For best practises don't Keep core.fileMode false always.일부 파일 시스템 (예 : FAT)은 파일 권한을 지원하지 않으므로 OS는 기본값을보고합니다 (어쨌든 내 시스템에서는 766). 이 경우 core.filemode불필요하고 의도하지 않은 권한 변경으로 커밋 기록을
부풀리고

또한 왜 파마를 전혀 바꾸지 않습니까? 설정 core.filemode=false하면 git은 실행 비트 변경을 무시하므로 로컬 권한을 변경할 필요가 없습니다. 색인에 권한 변경 사항을 이미 추가하지 않은 경우을 git add끈 후 필요한 단계가 누락 됩니다 core.filemode.
KevinOrr

18

~ / .gitconfig에서 다음 별칭을 정의하면 git 명령 당 fileMode를 쉽게 일시적으로 비활성화 할 수 있습니다.

[alias]
nfm = "!f(){ git -c core.fileMode=false $@; };f"

이 별칭이 git 명령에 접두사로 지정되면 파일 모드 변경 사항에 그렇지 않은 명령이 표시되지 않습니다. 예를 들면 다음과 같습니다.

git nfm status

14

구성 파일에서 파일 모드를 반복적으로 설정하려면 (하위 모듈 포함) : find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'


4
해당 줄이 구성 파일에 없으면 작동하지 않습니다. 하위 모듈에 대해 변경하려면 다음을 시도하십시오.git submodule foreach git config core.fileMode false
courtlandj

4

간단한 해결책 :

이 히트 간단한 명령을 (프로젝트 폴더 는 원래 변경 사항을 제거하지 않습니다) 에만 것입니다 ... 변경 제거 했다 수행 하면 변경하면서 프로젝트 폴더 권한을

명령은 다음과 같습니다.

자식 설정 core.fileMode false

이 모든 불필요한 파일이 수정되는 이유 : 권장 sudo chmod -R 777 ./yourProjectFolder를 사용하여 프로젝트 폴더 권한을 변경했기 때문입니다 .

변경 사항을 언제 확인합니까? git diff filename 을 사용하는 동안 아래와 같이 발견했습니다.

old mode 100644
new mode 100755

1

이것은 나를 위해 작동합니다 :

find . -type f -exec chmod a-x {} \;

또는 운영 체제에 따라 반대로

find . -type f -exec chmod a+x {} \;

1
이것은 파일의 권한을 변경하지만 git이 파일의 파일 권한을 무시하지 않도록합니다.
domdambrogia

글쎄, 당신이 맞아, git ignore thing을 해결하지 못한다.
Martin Volek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.