programing

git 내에서 파일 및 디렉터리가 수정된 경우 권한을 복원하는 방법은 무엇입니까?

oldcodes 2023. 5. 24. 22:22
반응형

git 내에서 파일 및 디렉터리가 수정된 경우 권한을 복원하는 방법은 무엇입니까?

저는 계산대가 있어요.모든 파일 권한이 git가 생각하는 권한과 다르므로 모두 수정된 것으로 표시됩니다.

파일의 내용을 건드리지 않고(권한을 수정하고 싶을 뿐) 모든 파일 권한을 git가 생각하는 git로 설정하려면 어떻게 해야 합니까?

Git는 파일 사용 권한을 추적하고 다음을 사용하여 패치를 생성할 때 사용 권한 변경 사항을 표시합니다.git diff -p그래서 우리가 필요한 것은:

  1. 역방향 패치 생성
  2. 사용 권한 변경 사항만 포함
  3. 작업 복사본에 패치를 적용합니다.

하나의 라이너로서:

git diff -p -R --no-ext-diff --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-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

...다음을 통해 호출할 수 있습니다.

git permission-reset

참고로, 만약 당신이 껍질을 벗긴다면.bash꼭 사용하세요'대신에"에 대한 인용구.!git그렇지 않으면 마지막으로 대체됩니다.git당신이 실행한 명령.

단순히 사용함으로써 그것을 지적하기 위한 Thx to @Mixological-Rgit diff거추장스러운 사람sed명령이 더 이상 필요하지 않습니다.

해라git config core.fileMode false

맨 페이지에서:

core.fileMode

false인 경우 인덱스와 작업 복사본 간의 실행 가능한 비트 차이는 무시되며 FAT와 같은 손상된 파일 시스템에 유용합니다.git-update-index(1)를 참조하십시오.

기본값은 true이지만 git-clone(1) 또는 git-init(1)이 core를 시도하고 설정합니다.저장소가 생성될 때 적절한 경우 fileMode false.

Git는 실행 가능한 스크립트 이외의 파일 권한을 저장하지 않습니다.git-cache-meta와 같은 것을 사용하여 파일 소유권 및 사용 권한을 저장해 보십시오.

Git는 755(실행 가능)와 644(실행 불가능)의 두 가지 모드만 저장할 수 있습니다.만약 당신의 파일이 444g이라면 그것은 644g을 저장할 것입니다.

git diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply

대부분의 경우 작동하지만 멜드와 같은 외부 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

내 상황에서 필요했습니다.

@muhque의 훌륭한 답변에 감사드립니다.이 경우 모든 변경 파일에 사용 권한이 변경되지 않아 명령이 작동하지 않습니다.

$ git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never
diff --git b/file1 a/file1
diff --git b/file2 a/file2
old mode 100755
new mode 100644
$ git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply
warning: file1 has type 100644, expected 100755

그러면 패치가 중지되고 파일은 그대로 유지됩니다.

일부 사람들이 유사한 문제를 가지고 있는 경우, 권한이 변경된 파일만 grep하도록 명령을 수정하여 이 문제를 해결했습니다.

grep -E "^old mode (100644|100755)" -B1 -A1

또는 깃 별칭의 경우.

git config --global --add alias.permission-reset '!git diff -p -R --no-ext-diff --no-color | grep -E "^old mode (100644|100755)" -B1 -A1 --color=never | git apply'

나는 이것이 오래되었다는 것을 알지만, 나는 구글에서 왔고 나는 답을 찾지 못했습니다.

당신이 유지하고 싶은 변화가 없다면 간단한 해결책이 있습니다.

git config core.fileMode true
git reset --hard HEAD

비슷한 문제가 발생했습니다. 서버의 모든 파일에 실행 파일 플래그를 추가했지만 권한이 깨진 파일 외에 로컬 수정 파일도 있었습니다.그러나 권한 Git 트랙은 실행 파일 플래그뿐이기 때문에 이 파이프라인이 문제를 해결했습니다.

git status | grep 'modified:' | awk '{print $3}' | xargs chmod a-x

상태를하고, " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 을 통해 경로를 합니다.awk실행 파일 플래그를 제거합니다.

git diff -pmuhqu의 답변에 사용된 것이 모든 불일치를 나타내지 않을 수 있습니다.

  • 내가 소유하지 않은 파일을 위해 Cygwin에서 이것을 보았습니다.
  • 모드 변경은 완전히 무시됩니다.core.filemode이라falseMSysGit는 다음과 같습니다.)

대신 이 코드는 메타데이터를 직접 읽습니다.

(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)

비생산 등급의 원라이너(마스크를 완전히 교체):

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) 에 있습니다.

또한 체크아웃 전/후 후크를 사용해 볼 수도 있습니다.

참조: Git 사용자 정의 - Git 후크

윈도우에서 합니다.git apply해결책은 저에게 효과가 없습니다. 제 해결책이 . 실행하기, 실행하기.chmod모든 파일에서 권한을 재설정합니다.

#!/bin/bash
IFS=$'\n'
for c in `git diff -p |sed -n '/diff --git/{N;s/diff --git//g;s/\n/ /g;s# a/.* b/##g;s/old mode //g;s/\(.*\) 100\(.*\)/chmod \2 \1/g;p}'`
do
        eval $c
done
unset IFS

가장 쉬운 방법은 권한을 다시 변경하는 것입니다.@kroger가 지적했듯이 git은 실행 가능한 비트만 추적합니다.그래서 아마 당신은 그냥 도망치기만 하면 될 것입니다.chmod -x filename고치기 위해 (또는)+x그게 필요하다면요

도구는 다음을 통해 권한을 처리할 수 있습니다.

etckeeper init -d /mydir

당신은 그것을 다른 dir들에 사용할 수 있습니다./etc.

패키지 관리자를 사용하여 설치하거나 위 링크에서 소스를 가져옵니다.

언급URL : https://stackoverflow.com/questions/2517339/how-to-restore-the-permissions-of-files-and-directories-within-git-if-they-have

반응형