git pull或git checkout 后保持权限不变
1. 起因
服务器上的项目,一般都是使用用户组www-data
或者www
来保证权限安全,不会使用root
的。但是git pull
下来的新文件或者修改的文件,则会把原有的文件的权限更改为644,用户组改为root。
如下图所示:
2. 危害
例如日志文件
,异步程序
,定时任务
,配置文件
之类的,由于最后运行用户的用户不对或者权限不够,可能会导致异常退出,文件无法读取,日志无法写入等等。所以,这个问题是值得引起我们重视的。
3. 解决办法
3.1. 手动解决
想法很简单,重新修改文件的权限。比如,回到站点上级目录,执行如下命令
chmod -R 755 www.guaosi.com/ # 修改项目内所有文件为755权限 chown -R www-data:www-data www.guaosi.com/ # 修改项目内所有文件的用户和用户组为www-data
只要不嫌累,每次git pull 或者 git checkout . 后退回上级目录执行一次,还是可以舒舒服服解决这个问题的.
3.2. git hook函数
接下来是这篇文章的重点了,我们可以使用git内置的钩子函数来解决这个问题.
先来看一下怎么操作:
3.2.1. git pull 操作
1.进入项目目录
cd www.guaosi.com
2.进入.git目录
cd .git/hooks/
3.新建post-merge文件
vim post-merge
4.写入钩子内容
#!/bin/sh pwd echo "This is post-merge hook" chmod -R 755 ./* && chown -R www-data:www-data ./*
5.给予运行权限
chmod +x post-merge
3.2.2. git checkout 操作
1.进入项目目录
cd www.guaosi.com
2.进入.git目录
cd .git/hooks/
3.新建post-checkout文件
vim post-checkout
4.写入钩子内容
#!/bin/sh pwd echo "This is post-checkout hook" chmod -R 755 ./* && chown -R www-data:www-data ./*
5.给予运行权限
chmod +x post-checkout
3.2.3. 原理
看了钩子内容应该大家都明白了,其实就是把手动运行的内容放入了钩子函数。在执行git pull
命令时,会自动调用post-merge
。在执行git checkout
时,会自动调用git checkout
.这样我们以后就不用再操心,怕遗忘权限有没有修改的问题了
转自:https://www.guaosi.com/2018/12/06/git-auto-change/