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/

posted on 2024-01-31 18:33  长不大的菜鸟  阅读(75)  评论(0编辑  收藏  举报

导航