Skip to content

Instantly share code, notes, and snippets.

Last active November 5, 2023 21:30
Star You must be signed in to star a gist
What would you like to do?
git hook to run a command after `git pull` if a specified file was changed.In this example it's used to run `npm install` if package.json changed and `bower install` if `bower.json` changed.Run `chmod +x post-merge` to make it executable then put it into `.git/hooks/`.
#!/usr/bin/env bash
# MIT © Sindre Sorhus -
# git hook to run a command after `git pull` if a specified file was changed
# Run `chmod +x post-merge` to make it executable then put it into `.git/hooks/`.
changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"
check_run() {
echo "$changed_files" | grep --quiet "$1" && eval "$2"
# Example usage
# In this example it's used to run `npm install` if package.json changed
check_run package.json "npm install"
Copy link

First line missing a !; should be #!/usr/bin/env bash

Copy link

post-rewrite works for me. As side effect it is also executed on amend.

Copy link

Awesome! Thanks! It works like a charm.

Copy link

For package managers that use a lock file, eg. Composer, it would make sense to check if the lock file changed rather than the requirements file, right? In other words:

# Installing composer dependencies
check_run composer.lock "composer install"

Copy link

Thank you so much, it works like a charm although, I did a few changes on my fork.

Copy link

johntholland commented May 9, 2017

On my machine it is running npm install whether package.json is changed or not.

The way I am reproducing is by creating a new branch at the current commit and then checking it out. Therefore the files should be identical between the two branches.

Anyone have any ideas?

cross-posted with stackoverflow:

Copy link

rlafuente commented May 23, 2017

For cases where you are pushing to a bare repo and want to use this on a post-receive hook, instead of the line

changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"

one should use

changed_files="$(git diff --name-only HEAD^ HEAD)"

Thank you for an extremely useful snippet!

Copy link

This only deals with changed files right. Suppose I want to check any new files are generated when taking pull, how this solution works?

Copy link

oriy commented Aug 10, 2018

thanks for the wonderful solution
extended the script - added the option for conditionally execute the command according to git configuration

Copy link

samuelj90 commented Nov 22, 2018

@sindresorhus Thanks for the wonderful solution.
I would like to clarify that Is it possible to check and run npm install only if the change is in npm dependency ?
I think that will save some more time.

Copy link

drAlberT commented Feb 11, 2019


This hook doesn't work if you run pull with --rebase option. Do you know how to fix it? Thx!

+1 , same problem. Have you found out the solution?


take a look at .git/hooks/pre-rebase.sample and see if you can deduct how to do a post-rebase hook.

I've tried to write a post-rebase hook but it didn't work ...

post-rebase is not a valid git-hook

You have to implement a post-rewrite hook and check the first argument to be "rebase" (could be "amend" too as @belveryin already tasted).

Copy link

How do you run npm install if one of two matching criteria is found? e.g. I want to run npm install if one of two files is modified, but don't want to run npm install twice.

Copy link

ykrytsyn commented May 1, 2019

You should be able to run it as
check_run "file1\|file2" "npm install"

Probably, I also need to add '-e' parameter to the 'grep' function

Copy link


Copy link

Copy link

vickey-dev commented Mar 22, 2020

is there any way to show message like this, before & after hooks execution for npm i?
checking for dependency update...

if there is any update going to happen
installing dependency..

if there is no changes to dependency
no new dependency!

Copy link

This script works like a charm. Thanks for sharing.
Can someone please let me know what is happening inside the script? What does this script arguments mean?

Copy link

@ajaykumar97 can you help me implement it ? it looks like it is not running ;/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment