如果您现在就开始讨论这个问题,那么我今天已经讲完了,可以总结一下它的立场。如果您尚未尝试此操作,则此处的一些详细信息可能会有所帮助。
我认为@Omid Ariyan的方法是最好的方法。添加提交前和签出后脚本。不要忘记使用Omid的方式来命名它们,也不要忘记使它们具有可执行性。如果您忘记了它们中的任何一个,它们就没有效果,并且您一遍又一遍地运行“ git commit”,想知道为什么什么也没发生:)另外,如果您在网络浏览器中剪切粘贴,请注意不要使用引号和对勾改变了。
如果您一次运行预提交脚本(通过运行git 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
所以我只保留第一个,这就是我所需要的。我在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
我正在寻找解决方案。这似乎可行,但我仅在一种情况下进行了测试
#!/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环境变量恢复为原来的状态非常重要!您可以看到为什么如果将$保留为唯一的分隔符,那么shell会话可能会失败的原因。