Reputation: 6896
How can I push to a non-bare git repository, automatically add and commit any changes in the working tree, and then re-checkout the current branch to reflect the changes from that push?
I was thinking of something like this:
Add a hook on the remote (the non-bare repo) to run git add . && git commit -m "Automated commit" && git reset --hard
Are there any drawbacks to that method? Is there another way of doing this?
(Disclaimer: I know that this isn't the most ideal situation, but this is what we have at my company and I want to make it as streamlined as possible without needing everyone to completely change the way they do things)
Thanks!
Upvotes: 4
Views: 480
Reputation: 6896
After messing around I found a pretty good solution.
Pre-receive hook: Checks for any changes in working directory, adds/commits them, then alerts the user he/she needs to merge before pushing
#!/bin/sh
cd ../
unset GIT_DIR
CHANGED=$(git diff-index --name-only HEAD --)
if [ -n "$CHANGED" ]; then
git add -u .
git commit -m "Automated commit"
echo "There were uncommitted changes in the working directory...please pull them and push your changes again"
exit 1
fi
Post-receive hook: Force checks-out the current branch so changes will be shown in working directory. This will overwrite any changes in the working directory, but those will have already been added/committed/merged by the pre-receive hook.
#!/bin/sh
cd ../
unset GIT_DIR
branch=$(git branch | sed -n -e 's/^\* \(.*\)/\1/p')
git checkout -f $branch
echo "Update pushed to branch $branch and checked out in the website directory"
Upvotes: 1