首页 > 解决方案 > 防止 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

让我知道是否还有其他值得尝试的东西,或者如果您发现我的代码有问题...

一切顺利,

吉尔

标签: laravelgitgithooksgit-pullfile-ownership

解决方案


您非常接近正确的解决方案。

您需要启用以下钩子:

  • post-merge, 成功后调用git pull
  • post-checkout, 成功后调用git checkout

如果你确定只使用git pull,那么post-mergehook 就足够了。
启用这两个钩子可以保证你总是调用钩子而不需要额外的费用。

钩子的内容应该是这样的:

#!/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超级用户权限执行该命令,否则该命令将失败。


推荐阅读