GIT에서 파일에 chmod 권한을 추가하는 방법은 무엇입니까?


182

.sh 파일을 git commit하고 싶지만 다른 서버에서 동일한 파일을 체크 아웃 할 때 실행 가능하게 만들고 싶습니다.

파일을 체크 아웃하는 서버에서 해당 파일을 수동으로 chmod u + x하지 않고 그렇게 할 수 있습니까?

답변:


291

공식 문서 에 따르면 update-index하위 명령을 사용하여 추적 된 파일에서 "실행 가능"플래그를 설정하거나 제거 할 수 있습니다 .

플래그를 설정하려면 다음 명령을 사용하십시오.

git update-index --chmod=+x path/to/file

제거하려면 다음을 사용하십시오.

git update-index --chmod=-x path/to/file

후드

이것은 일반적인 유닉스 파일 권한 시스템처럼 보이지만 실제로는 그렇지 않습니다. Git은 내부 저장소에있는 각 파일에 대해 특별한 "모드"를 유지합니다.

  • 100644 일반 파일
  • 100755 실행 가능한 것들

옵션 ls-file과 함께 부속 명령 을 사용하여이를 시각화 할 수 있습니다 --stage.

$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh

기본적으로 저장소에 파일을 추가하면 Git은 파일 시스템 속성을 존중하고 그에 따라 올바른 파일 모드를 설정하려고 시도합니다. core.fileModeoption을 false 로 설정 하여 이를 비활성화 할 수 있습니다 .

git config core.fileMode false

문제 해결

Git 파일 모드가 설정되지 않았지만 파일에 올바른 파일 시스템 플래그가있는 경우 모드를 제거하고 다시 설정하십시오.

git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file

보너스

Git 2.9부터는 파일을 스테이징하고 하나의 명령으로 플래그를 설정할 수 있습니다.

git add --chmod=+x path/to/file

다른 서버에서 test.sh, git commit 및 push 및 checkout을 수행하면 해당 파일의 권한은 다음과 같습니다. -rw-rw-r-- 1 명의 사용자 사용자 12 12 월 5 일 11:42 test.sh
Henley Chiu

방금 저장소 중 하나에서 테스트를 수행했으며 예상대로 작동합니다. Windows에서 제공된 명령을 사용하여 파일에 대한 권한을 설정했습니다. 내 서버 (데비안) 중 하나에서 파일은 이전에 -rw-r--r-- 권한을 가졌으며 이제는 -rwxr-xr-x로 설정되었습니다. 로컬 및 원격 컴퓨터에서 어떤 git 버전을 사용합니까?
Antwane

내 로컬의 git 버전 1.9.5, 체크 아웃을 수행하는 서버의 git 1.7.1.
Henley Chiu

git 1.7.10으로 다른 (이전) 서버에서 복제하려고 시도했지만 여전히 잘 작동하며 파일에 x 권한이 있습니다. 어떤 시점에서 실수를했거나 원격 서버에서 복제 한 사용자와
Ant

실행 권한 만 변경 (설정 또는 해제) 할 수 있습니다. Git은 다른 권한 (예 : 읽기 또는 쓰기 권한)을 추적하지 않습니다.
Dan Anderson

25

Antwane의 대답 은 맞습니다. 이것은 주석이어야하지만 주석에는 공간이 충분하지 않으며 형식을 지정할 수 없습니다. :-) Git에서 파일 권한은 1 또는 (맞춤법 ( 및 ; 부분은 "일반 파일"을 의미) 으로 기록 됩니다 .644755100644100755100

diff --git a/path b/path
new file mode 100644

전자 (644)는 파일이 실행 가능 하지 않아야하고 후자는 파일이 실행 가능 해야 함을 의미합니다 . 파일 시스템 내에서 실제 파일 모드로 전환되는 방법은 다소 OS에 따라 다릅니다. 유닉스 계열 시스템에서 비트는 umask일반적으로 022"group"및 "other"에서 002쓰기 권한을 제거 하거나 "other"에서만 쓰기 권한을 제거 하는 설정을 통해 전달됩니다 . 077개인 정보 보호에 특히 관심이 있고 "그룹"및 "기타"둘 다에서 읽기, 쓰기 및 실행 권한을 제거하려는 경우 에도 해당 될 수 있습니다 .


1 초기 버전의 Git은 그룹 권한을 저장하므로 일부 리포지토리에는 모드가있는 트리 항목이 664있습니다. 현대의 Git은 변경되지 않지만 어떤 객체도 변경할 수 없기 때문에 오래된 권한 비트는 여전히 오래된 트리 객체에 유지됩니다.

0644 또는 0755 만 저장하도록 변경되었습니다. 한 것은 e44794706eeb57f2로 , Git v0.99 이전이며 2005 년 4 월 16 일자입니다.


"초기 버전의 Git"어떤 버전이 영향을 받는지 아십니까?
user5359531

2
커밋 이전의 @ user5359531 버전 e44794706eeb57f2ee38ed1604821aa38b8ad9d2, 즉 Git 버전 0.99 이전.
torek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.