Git 在更新文件时更改默认的 umask

标签 git permissions umask

我对 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/

相关文章:

c# - 使用 c# 创建 SQL Server 备份文件 (.bak) 到任何位置

java - 如何从Java获取当前的umask值?

c - C 中的 UMASK 函数

git - Visual Studio Tools for Git 无法提交

git - 如何从 Git/Github 图表中删除旧提交?

c# - 使用预定义的用户名和密码以管理员身份运行应用程序

linux - 在哪里可以设置系统帐户的umask?

git - 为什么Github不自动更新两个PR之间的文件比较?

git - GIT 引用是否总是不区分大小写?

android - 我不在 list 文件中使用联系人权限。但我在应用程序信息屏幕上获得了联系许可