지금 당장이 문제를 겪고 계신다면, 저는 오늘 그것을 겪었고 이것이 어디에 있는지 요약 할 수 있습니다. 아직 시도하지 않았다면 여기에 몇 가지 세부 정보가 도움이 될 수 있습니다.
@Omid Ariyan의 접근 방식이 가장 좋은 방법이라고 생각합니다. 사전 커밋 및 사후 체크 아웃 스크립트를 추가합니다. Omid가하는 것과 정확히 같은 이름을 지정하는 것을 잊지 말고 실행 가능하게 만드는 것을 잊지 마십시오. 둘 중 하나를 잊어 버리면 효과가없고 "git commit"을 계속 실행하여 아무 일도 일어나지 않는 이유를 궁금해합니다. :) 또한 웹 브라우저에서 잘라내어 붙여 넣는 경우 따옴표와 틱이 표시되지 않도록주의하십시오. 변경.
git commit을 실행하여 pre-commit 스크립트를 한 번 실행하면 .permissions 파일이 생성됩니다. 저장소에 추가 할 수 있으며 사전 커밋 스크립트 끝에서 반복해서 추가 할 필요가 없다고 생각합니다. 그러나 그것은 아프지 않다고 생각합니다 (희망).
디렉토리 이름과 Omid 스크립트의 파일 이름에 공백이 있는지에 대한 몇 가지 문제가 있습니다. 공백은 여기서 문제가되었고 IFS 수정에 문제가있었습니다. 기록을 위해이 사전 커밋 스크립트가 제대로 작동했습니다.
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
# Clear the permissions database file
> $DATABASE
echo -n "Backing-up file permissions..."
IFSold=$IFS
IFS=$'\n'
for FILE in `git ls-files`
do
# Save the permissions of all the files in the index
echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Add the permissions database file to the index
git add $DATABASE
echo "OK"
자, 우리는 이것에서 무엇을 얻습니까?
.permissions 파일은 git repo의 최상위 수준에 있습니다. 파일 당 한 줄이 있으며 여기에 내 예제의 맨 위가 있습니다.
$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn
보시다시피, 우리는
filepath;perms;owner;group
이 접근 방식에 대한 의견에서 한 포스터는 동일한 사용자 이름으로 만 작동하며 기술적으로는 사실이지만 고치는 것은 매우 쉽다고 불평합니다. 체크 아웃 후 스크립트에는 2 개의 작업 부분이 있습니다.
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
그래서 나는 첫 번째 것만 유지하고 있습니다. 그게 내가 필요한 전부입니다. 웹 서버의 사용자 이름은 실제로 다르지만 더 중요한 것은 루트가 아니면 chown을 실행할 수 없다는 것입니다. 그러나 "chgrp"는 실행할 수 있습니다. 그것을 사용하는 방법은 충분히 알기 쉽습니다.
이 게시물의 첫 번째 답변, 가장 널리 받아 들여지는 답변에서 제안은 git-cache-meta, 여기의 사전 / 사후 후크 스크립트와 동일한 작업을 수행하는 스크립트를 사용하는 것입니다 (에서 출력 구문 분석 git ls-files
). . 이 스크립트는 이해하기 쉬우 며 git-cache-meta 코드는 좀 더 정교합니다. 경로에 git-cache-meta를 유지하고이를 사용하는 사전 커밋 및 사후 체크 아웃 스크립트를 작성할 수 있습니다.
파일 이름의 공백은 Omid의 두 스크립트 모두에서 문제입니다. 체크 아웃 후 스크립트에서 이와 같은 오류가 표시되면 파일 이름에 공백이 있음을 알 수 있습니다.
$ git checkout -- upload.sh
Restoring file permissions...chmod: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chmod: cannot access 'Notebook.onetoc2': No such file or directory
chown: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chown: cannot access 'Notebook.onetoc2': No such file or directory
나는 그것에 대한 해결책을 확인하고 있습니다. 작동하는 것처럼 보이지만 한 가지 경우에만 테스트했습니다.
#!/bin/bash
SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions
echo -n "Restoring file permissions..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
FILE=`echo $LINE | cut -d ";" -f 1`
PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
USER=`echo $LINE | cut -d ";" -f 3`
GROUP=`echo $LINE | cut -d ";" -f 4`
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"
exit 0
권한 정보는 한 번에 한 줄이므로 IFS를 $로 설정 했으므로 줄 바꿈 만 새로운 것으로 간주됩니다.
IFS 환경 변수를 원래대로 설정하는 것이 매우 중요하다는 것을 읽었습니다! $를 유일한 구분자로 남겨두면 쉘 세션이 왜 잘못 될 수 있는지 알 수 있습니다.