git 내에서 파일과 디렉토리의 권한을 수정 한 경우 어떻게 복원합니까?
자식 체크 아웃이 있습니다. 모든 파일 권한은 git이 생각 해야하는 것과 다르므로 모두 수정 된 것으로 표시됩니다.
파일의 내용을 건드리지 않고 (권한을 수정하고 싶습니다) 모든 파일 권한을 git가 생각하는 것으로 어떻게 설정합니까?
Git은 파일 권한을 추적하고를 사용하여 패치를 만들 때 권한 변경 사항을 노출합니다 git diff -p
. 따라서 필요한 것은 다음과 같습니다.
- 역패를 만들다
- 권한 변경 사항 만 포함
- 작업 복사본에 패치를 적용하십시오
원 라이너로 :
git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never \
| git apply
git 설정에 별칭으로 추가 할 수도 있습니다 ...
git config --global --add alias.permission-reset '!git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'
... 그리고 다음을 통해 호출 할 수 있습니다.
git permission-reset
shell is 인 경우 에 따옴표 대신 따옴표 bash
를 사용해야 합니다 . 그렇지 않으면 마지막으로 실행 한 명령으로 대체됩니다 .'
"
!git
git
단순히 -R
on을 사용 git diff
하여 번거로운 sed
명령이 더 이상 필요하지 않다는 점을 지적한 @Mixologic에 대한 것입니다 .
시험 git config core.fileMode false
참고 : core.fileMode
인 대소 문자를 구분합니다 !
로부터 git config
매뉴얼 페이지
core.fileMode
False이면 인덱스와 작업 복사본 간의 실행 비트 차이가 무시됩니다. FAT와 같은 손상된 파일 시스템에 유용합니다. git-update-index (1)을 참조하십시오 .
git-clone (1) 또는 git-init (1)이 리포지토리가 생성 될 때 적절한 경우 core.fileMode를 검사하여 false로 설정한다는 점을 제외하고 기본값은 true입니다.
Git은 실행 가능한 스크립트 이외의 파일 권한을 저장하지 않습니다. git-cache-meta 와 같은 것을 사용하여 파일 소유권과 권한을 저장하십시오.
Git은 755 (실행 가능)와 644 (실행 불가능)의 두 가지 모드 만 저장할 수 있습니다. 파일이 444 git이면 저장하면 644입니다.
git diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply
대부분의 경우 작동하지만 meld와 같은 외부 diff 도구가 설치되어 있으면 --no-ext-diff를 추가해야합니다
git diff --no-ext-diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply
내 상황에 필요했다
사전 / 사후 체크 아웃 후크를 시도하여 트릭을 수행 할 수도 있습니다.
참조 : Git 사용자 정의-Git Hooks
가장 쉬운 방법은 권한을 다시 변경하는 것입니다. @kroger가 지적했듯이 git은 실행 비트 만 추적합니다. 따라서 chmod -x filename
문제를 해결하기 위해 실행해야 할 수도 있습니다 (또는 +x
필요한 경우).
git diff -p
muhqu의 답변에 사용 된 모든 내용이 일치하지 않을 수 있습니다.
- Cygwin에서 내가 소유하지 않은 파일을 보았습니다.
- 경우 모드 변경이 완전히 무시되고
core.filemode
있다false
(MSysGit의 기본입니다)
이 코드는 대신 메타 데이터를 직접 읽습니다.
(set -o errexit pipefail nounset;
git ls-tree HEAD -z | while read -r -d $'\0' mask type blob path
do
if [ "$type" != "blob" ]; then continue; fi;
case "$mask" in
#do not touch other bits
100644) chmod a-x "$path";;
100755) chmod a+x "$path";;
*) echo "invalid: $mask $type $blob\t$path" >&2; false;;
esac
done)
비 생산 등급의 1 라이너 (마스크를 완전히 대체) :
git ls-tree HEAD | perl -ne '/^10(0\d{3}) blob \S+\t(.+)$/ && { system "chmod",$1,$2 || die }'
( '$'\ 0 ''에 대한 크레딧은 http://transnum.blogspot.ru/2008/11/bashs-read-built-in-supports-0-as.html 로 이동합니다. )
이 etckeeper
도구 는 다음과 같은 권한을 처리 할 수 있습니다.
etckeeper init -d /mydir
이외의 다른 디렉토리에 사용할 수 있습니다 /etc
.
패키지 관리자를 사용하여 설치하거나 위 링크에서 소스를 얻으십시오.
'Programing' 카테고리의 다른 글
Windows 용 Vim-파일을 저장하고 종료하려면 무엇을 입력해야합니까? (0) | 2020.04.02 |
---|---|
JWT와 OAuth 인증의 주요 차이점은 무엇입니까? (0) | 2020.04.02 |
폴더의 Subversion 컨트롤을 어떻게 제거합니까? (0) | 2020.04.02 |
Express에서 URL 매개 변수를 얻는 방법은 무엇입니까? (0) | 2020.04.02 |
BASIC 인증을 사용하여 웹 사이트에서 사용자를 로그 아웃하는 방법은 무엇입니까? (0) | 2020.04.02 |