我对 Git 有疑问。我在 Google 和 StackOverflow 中搜索了解决方案,但没有任何帮助。
问题是每次 git 更新工作目录中的某些文件时(当我 checkout 分支或 merge 分支等时),文件权限都会更改,以便添加“可写组”标志。 如果文件可写到组,我的 apache 会显示该文件的“错误 500”。
例子: 我有一个文件 index.php。权限是“-rwxr-xr-x”。当前(事件)分支是主分支。这个文件在分支“develop”中被改变了。 我执行“git checkout develop”,文件 index.php 获得权限“-rwxrwxr-x”(添加了对组的可写权限)。我的网站停止工作。由于 apache 不允许在 php 文件中使用此标志(我不知道为什么,但我无法更改它)。
每次执行“git checkout develop”时,我还需要执行“chmod g-w index.php”。我不喜欢执行两个命令(有时我忘记执行这个命令,我的网站就无法运行)。
我该怎么做才能解决这个问题? 我认为这与umask有关。我做了一些在网上找到的技巧,但没有任何效果。
谢谢。
最佳答案
快速回答是将这个 shell 函数放在您的 ~/.profile
中。解释如下。
git(){(umask 0022; command git "$@")}
A umask是进程的属性。它是从父进程继承的,以后可以从内部更改。更改umask的命令通常也命名为umask。
Git 没有设置其 umask 的配置选项,它在执行后不会更改其 umask。你必须从外部设置 Git 的 umask,让它从父进程(通常是 shell)继承。
嗯,你似乎不喜欢除了 git 之外的任何东西都改变了 umask 的想法。因此,让我们在执行 git
时更改它。
当 shell 执行一行时,它会获取该行的第一个单词并尝试查找具有该名称的函数。仅当不存在时,它才会尝试在 PATH
中找到具有该名称的命令。我在上面编写的函数名为 git
,因此现在对 git
的任何直接调用都会执行它,而不是 git
命令。
该函数执行子 shell,更改其 umask 并从子 shell 内部执行 git
命令。 Git 完成工作后,子 shell 也会退出,原始 shell 实例仍将具有原始 umask。
但是,该函数还展示了如何绕过自身。如果你通过 command git
甚至 /usr/bin/git
调用 git
,函数将不会被调用。不过,对于任何像样的用途来说,这已经足够了。
关于Git 在更新文件时更改默认的 umask,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11574271/