-->

Git的更改默认的umask时更新文件(Git change default umask when

2019-06-26 10:35发布

我有一个Git的一个问题。 我搜索在谷歌的解决方案,并在StackOverflow上却没有什么帮助。

问题是,每一次更新的Git工作目录中的某些文件(当我结帐分公司或我分支合并等),然后将文件权限被改变,使得“写给组”标志被添加。 而我的Apache显示“错误500”的文件,如果它是可写的分组。

例如:我有一个index.php文件。 权限是 “-rwxr-XR-X”。 当前(活动)分支是主。 此文件是在分支“研制”改变。 我执行“git的结帐发展”和index.php文件获取权限“-rwxrwxr-X”(写给组添加)。 和我的网站停止工作。 例如Apache不允许在PHP文件这个标志(我不知道为什么,但我不能改变这一点)。

每次当我执行“混帐结账开发”我也需要执行“文件模式GW的index.php”。 我不喜欢执行两个指令(有时我忘了执行这个和我的网站不工作)。

我能做些什么来解决这个问题? 我觉得这是值得的umask有关。 我做了一些技巧我在网络上找到的,但没有任何工程。

谢谢。

Answer 1:

这是一种危险的允许文件执行的二进制文件。 无论如何,我解决了umask设置的问题。 我的post-receive脚本的样子:

!/bin/sh
umask 002
GIT_WORK_TREE=/var/www/site git checkout -f

因此, file permission S设定到664directory permissions设置为775 ,这适合我。

PS在设定的umask .profile文件git用户没有效果,我不明白为什么,请注释掉如果你知道为什么会这样。



Answer 2:

快速回答是放在你的这个shell功能~/.profile 。 说明如下。

git(){(umask 0022; command git "$@")}

一个的umask是一个过程的性质。 它是从父进程继承,可以从里面以后被改变。 改变的umask命令通常被命名的umask了。

Git有没有配置选项来设置它的umask,它被执行之后,在没有改变其的umask。 你必须从外部设定的Git的umask,让它从父进程(通常是一个shell)继承。

嗯,你好像不喜欢这个想法,除了混帐东西已经改变的umask。 因此,让我们在执行时的改变,它只是git

当shell执行一条线,它需要上线的第一个字,并试图找到这个名称的函数。 只有当没有,它会尝试在该名称的命令PATH 。 我上面写的功能被命名为git ,因此任何直接调用git现在执行它代替的git命令。

函数执行子外壳,改变其的umask并执行该git从子外壳内部命令。 Git的完成其工作后,子shell也退出和原壳实例仍会有原来的umask。

然而,该功能还展示了如何绕过本身。 如果你打电话git通过command git ,甚至/usr/bin/git ,该函数将不会被调用。 对于任何像样的使用,这是不够好,虽然。



Answer 3:

使用回迁Xenial 4.x版本的Linux内核退房时回购通过NFS安装在Ubuntu 14.04(忠实的)主目录我刚刚打了这个问题。 Git的克隆到本地目录的罚款。 更奇:第二个的Ubuntu 14.04服务器没有在同一个安装目录中表现出了同样的问题。

很多打探后,我能看到使用strace的那个混帐叫open()系统调用创建的选项O_CREAT,O_WRONLY和O_EXCL和0666模式下的每个文件,但在以后的SYSCAL是一个FSTAT()反对该文件,并告诉我这是模式0700。 在我的情况下,问题只影响了回购某些文件。 尽管显示了大多数文件模式0644“git的LS-指数”,其中一些人被正确地和其他未创建; 虽然它一直是这对克隆错误的权限相同的文件。

我注意到,有两个系统之间的内核版本的差异,然后发现了以下错误: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1654288

升级内核4.4.0-98(从4.4.0-59)固定这对我来说。 我查了一些主机仍然使用3.x版本的Linux内核和这些没有问题。



Answer 4:

使用挂钩更改文件模式下,它已经经过内容时发生在结帐解决了这个问题之后。 执行挂钩时,您已经有损坏的文件模式在文件系统中。 如果请求到达时正好结账和钩执行之间,服务器将与500错误回应。 但是,你可能有兴趣在此解决方案呢。

你需要一个post-checkout挂机运行chmod gw上的所有必要的文件。 钩是.git/hooks/post-checkout ,应当是可执行和获取当前HEAD作为第二个参数($ 2壳)。 挂钩看起来是这样的:

#!/bin/bash
git ls-files -z --with-tree="$2" | xargs -0 chmod g-w --

当钩没有得到文件列表检出,这可能是最好的实现成为可能。 它改变了所有的文件在当前的模式HEAD



文章来源: Git change default umask when update file