laravelgitgithooksgit-pullfile-ownership

Prevent git from overwriting file owner upon git pull


I've seen a handful of similar questions on here, but none of the solutions given seem to be working... wondering if they're outdated, or this case is somehow different...so I wanted to open up a new thread to talk about it.

I've run into a frustrating problem where, every time I perform and git pull, it changes the owner to the pull-er's user. What happens then is that the site shows the following error:

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

which can only be fixed by running chown www-data on the changed file.

This will become an issue when more people begin to work on the site, or when important files are change (default template/header/footer..), and the site goes blank until chown is run.


Site details

Laravel, wordpress, ubuntu 18, armor hosting

Git repo stored in custom theme


I've tried a few solutions, but none seem to work, (perhaps because they're implemented incorrectly..)

Solutions I've tried

1: set filemode to false - I set filemode to false, locally and globally, on my local machine and the server in question. I've tried changing the case to "fileMode" too.

2: implement post-update hook - I added a post update hook to automatically update the file permissions/ownership. Here's the script (note that the git repo is in the custom theme):

#!/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

Let me know if there is anything else worth trying, or if you notice an issue with my code...

All the best,

Jill


Solution

  • You are pretty close to the correct solution.

    You need to enable the following hooks:

    If you are sure to only use git pull, the post-merge hook is enough.
    Enabling both hooks guarantee you the hook is always called at not extra cost.

    The content of the hook should be like:

    #!/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 "---"
    

    The script will reset the ownership to OWNER of all files and directory inside REPO_DIR.
    I have copied the values from your post, eventually change it to your needs.

    To enable the hook you should:

    Repeat eventually these steps for the post-checkout hook, that needs to be equal to the post-merge hook.

    Pay attention to perform a sudo git pull if your user is not root. All the files and directories in the target directory are owned by www-data, you need to perform the git pull command with a superuser privilege or the command will fail.