如果您现在遇到这种情况,我今天刚刚经历过,可以总结一下它的位置。如果您还没有尝试过,这里的一些细节可能会有所帮助。
我认为@Omid Ariyan 的方法是最好的方法。添加 pre-commit 和 post-checkout 脚本。不要忘记完全按照 Omid 的方式命名它们,并且不要忘记使它们可执行。如果您忘记了其中任何一个,它们将不起作用,并且您一遍又一遍地运行“git commit”,想知道为什么没有任何反应:) 另外,如果您从 Web 浏览器中剪切并粘贴,请注意引号和勾号不是改变。
如果您运行一次预提交脚本(通过运行 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
在有关这种方法的 cmets 中,其中一位发帖人抱怨说它只能使用相同的用户名,这在技术上是正确的,但很容易修复它。请注意,结帐后脚本有 2 个动作部分,
# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE
所以我只保留第一个,这就是我所需要的。我在Web服务器上的用户名确实不一样,但更重要的是你不能运行chown,除非你是root。但是,可以运行“chgrp”。如何使用它很简单。
在这篇文章的第一个答案中,最被广泛接受的答案是,建议使用 git-cache-meta,这是一个与这里的 pre/post 钩子脚本所做的工作相同的脚本(解析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 会话可能会出错。