gpt4 book ai didi

laravel - 防止 git 在 git pull 时覆盖文件所有者

转载 作者:行者123 更新时间:2023-12-03 21:13:14 25 4
gpt4 key购买 nike

我在这里看到了一些类似的问题,但给出的解决方案似乎都没有奏效......想知道它们是否已经过时,或者这种情况有些不同......所以我想开辟一个新线程谈论它。

我遇到了一个令人沮丧的问题,每次我执行 git pull ,它将所有者更改为 pull 者的用户。然后发生的是该站点显示以下错误:
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:实现更新后 Hook - 我添加了一个更新后 Hook 来自动更新文件权限/所有权。这是脚本(请注意,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

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

祝一切顺利,

吉尔

最佳答案

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

您需要启用以下钩子(Hook):

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

  • 如果您确定只使用 git pull , post-merge钩子(Hook)就够了。
    启用这两个钩子(Hook)可以保证你总是调用钩子(Hook)而不需要额外的费用。

    钩子(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 中的所有文件和目录.
    我已经从您的帖子中复制了值,最终将其更改为您的需要。

    要启用钩子(Hook),您应该:
  • 创建一个名为 post-merge 的文件使用上面的脚本
  • 将其移入目录.git/hook/您的 repo
  • chmod +x post-merge 给它可执行权限

  • 最终对 post-checkout 重复这些步骤钩子(Hook),它需要等于 post-merge钩。

    注意执行 sudo git pull如果您的用户不是 root .目标目录中的所有文件和目录都归 www-data 所有,您需要执行 git pull具有 super 用户权限的命令,否则命令将失败。

    关于laravel - 防止 git 在 git pull 时覆盖文件所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62412563/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com