あなたが今これに参加している場合のために、私は今日それを経験しました、そしてこれがどこに立っているかを要約できます。これをまだ試していない場合は、ここでいくつかの詳細が役立つ場合があります。
@Omid Ariyanのアプローチが最良の方法だと思います。コミット前およびチェックアウト後のスクリプトを追加します。Omidと同じように正確に名前を付けることを忘れないでください。また、実行可能にすることを忘れないでください。これらのいずれかを忘れた場合、それらは効果がなく、何も起こらないのではないかと疑問に思って何度も "git commit"を実行します:)また、Webブラウザーからカットアンドペーストする場合は、引用符とチェックマークに注意してください変更されました。
(git commitを実行して)pre-commitスクリプトを1回実行すると、ファイル.permissionsが作成されます。リポジトリに追加できますが、プリコミットスクリプトの最後に何度も追加する必要はないと思います。でも、害はないと思います(希望)。
Omidのスクリプトでは、ディレクトリ名とファイル名にスペースが含まれていることについて、いくつかの小さな問題があります。ここではスペースが問題で、IFSの修正で問題が発生しました。参考までに、このpre-commitスクリプトは私にとっては正しく機能しました。
#!/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リポジトリの最上位にあります。ファイルごとに1行あります。これが私の例の先頭です。
$ 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
このアプローチに関するコメントで、投稿者の1人が、同じユーザー名でのみ機能すること、そしてそれは技術的には真実であるが、それを修正することは非常に簡単であると不平を言っています。チェックアウト後のスクリプトには2つのアクションがあります。
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
だから私は最初のものだけを残している、それが私が必要なすべてです。Webサーバー上の私のユーザー名は確かに異なりますが、より重要なのは、rootでない限り、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
その解決策を確認しています。これはうまくいくようですが、私は1つのケースでのみテストしました
#!/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
許可情報は一度に1行なので、IFSを$に設定し、改行だけが新しいものとして表示されるようにしました。
IFS環境変数を元の状態に戻すことは非常に重要であると読みました。$を唯一のセパレーターのままにしておくと、シェルセッションがうまくいかない理由がわかります。