laravel - 防止 git 在 git pull 时覆盖文件所有者
问题描述
我在这里看到了一些类似的问题,但是给出的解决方案似乎都没有奏效......想知道它们是否已经过时,或者这种情况有些不同......所以我想开辟一个新线程谈论它。
我遇到了一个令人沮丧的问题,每次我执行 andgit pull
时,它都会将所有者更改为 pull-er 的用户。然后发生的是该站点显示以下错误:
Warning: file_get_contents(/var/www/html/wp-content/themes/<my-theme>/resources/views/<changed-file>): failed to open stream: Permission denied in /var/www/html/wp-includes/class-wp-theme.php on line 1207
这只能通过chown www-data
在更改的文件上运行来修复。
当更多人开始在站点上工作时,或者当重要文件发生更改(默认模板/页眉/页脚..)时,这将成为一个问题,并且站点在运行 chown 之前变为空白。
网站详情
Laravel、wordpress、ubuntu 18、盔甲托管
存储在自定义主题中的 Git 存储库
我尝试了一些解决方案,但似乎都没有奏效,(可能是因为它们实施不正确..)
我尝试过的解决方案
1:将 filemode 设置为 false - 我在本地计算机和相关服务器上将 filemode 设置为 false,本地和全局。我也尝试将大小写更改为“fileMode”。
2:实现更新后挂钩 - 我添加了一个更新后挂钩来自动更新文件权限/所有权。这是脚本(请注意,git repo 在自定义主题中):
#!/bin/sh
# default owner user
OWNER="www-data:www-data"
# changed file permission
PERMISSION="664"
# web repository directory
REPO_DIR="/var/www/html/wp-content/themes/quorum-theme"
# remote repository
REMOTE_REPO="origin"
# public branch of the remote repository
REMOTE_REPO_BRANCH="master"
cd $REPO_DIR || exit
unset GIT_DIR
files="$(git diff-tree -r --name-only --no-commit-id HEAD@{1} HEAD)"
git merge FETCH_HEAD
for file in $files
do
sudo chown $OWNER $file
sudo chmod $PERMISSION $file
done
exec git-update-server-info
让我知道是否还有其他值得尝试的东西,或者如果您发现我的代码有问题...
一切顺利,
吉尔
解决方案
您非常接近正确的解决方案。
您需要启用以下钩子:
post-merge
, 成功后调用git pull
post-checkout
, 成功后调用git checkout
如果你确定只使用git pull
,那么post-merge
hook 就足够了。
启用这两个钩子可以保证你总是调用钩子而不需要额外的费用。
钩子的内容应该是这样的:
#!/bin/sh
# default owner user
OWNER="www-data:www-data"
# web repository directory
REPO_DIR="/var/www/html/wp-content/themes/quorum-theme"
echo
echo "---"
echo "--- Resetting ownership to ${OWNER} on ${REPO_DIR}"
sudo chown -R $OWNER $REPO_DIR
echo "--- Done"
echo "---"
OWNER
该脚本会将所有文件和目录的所有权重置为REPO_DIR
.
我已经从您的帖子中复制了值,最终将其更改为您的需要。
要启用钩子,您应该:
- 创建一个
post-merge
用上面的脚本 命名的文件 .git/hook/
将其移动到您 的存储库目录中- 给它可执行权限
chmod +x post-merge
最终对钩子重复这些步骤post-checkout
,这需要等于post-merge
钩子。
sudo git pull
如果您的用户不是,请注意执行 a root
。目标目录中的所有文件和目录都归 拥有www-data
,您需要以git pull
超级用户权限执行该命令,否则该命令将失败。
推荐阅读
- c# - Mailkit 是否支持发送匿名电子邮件?
- javascript - 应用程序的 indexOf() 无法正常工作
- javascript - 在以下代码中使用 asyn/await 的最佳方式
- google-chrome - 我可以在 chrome 浏览器 devtools 控制台中输入什么来触发/模拟事件?
- javascript - Safari 无法将 SVG 元素替换为:NoModificationAllowedError:无法修改对象
- docker - IntelliJ 中的 Docker 容器控制台编码
- java - 用于模式替换的 Java 正则表达式 - 特殊字符和大小写更改为空格
- python - 在 Django UpdateView 中覆盖 get() 方法会给出“str”没有属性获取错误
- angular - 反应形式的总和数组
- vba - 如何搜索字符串并突出显示相邻的单词?