Git pushing to non-bare repo, save current worktree

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:

  • How to create GIT project on self-hosted Team Foundation Server 2012
  • GIT Split Repository directory preserving *move / renames* history
  • Error on git patch using git am
  • Django Private Project Git Repo - Open Source App Repo
  • Android Studio crashes on every git commit
  • git: better alternative to regularly pushing a rebased branch
  • 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)


  • You need the NDKr9 or later
  • Git - How to commit a local repository to a subfolder of another local repository?
  • How to create a secure git repository in the cloud?
  • How to copy the last commit as a new commit in Git?
  • Will tag referencing commits unreachable from any branch be lost?
  • git, SourceTree - How to merge interactively?
  • One Solution collect form web for “Git pushing to non-bare repo, save current worktree”

    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

    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

    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.

    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" 
    Git Baby is a git and github fan, let's start git clone.