-
-
Save sindresorhus/7996717 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash | |
# MIT © Sindre Sorhus - sindresorhus.com | |
# 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" |
post-rewrite works for me. As side effect it is also executed on amend.
http://stackoverflow.com/questions/21307744/git-post-rebase-hook
Awesome! Thanks! It works like a charm.
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"
Thank you so much, it works like a charm although, I did a few changes on my fork.
https://gist.github.com/betorobson/23e5914b51e844bac5eaa6032d6f3f88
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: http://stackoverflow.com/questions/43876375/optional-githook-behaving-as-non-optional
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!
This only deals with changed files right. Suppose I want to check any new files are generated when taking pull, how this solution works?
thanks for the wonderful solution
extended the script - added the option for conditionally execute the command according to git configuration
https://gist.github.com/oriy/e8b58a6a471d371129b1d0b430510375
@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.
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).
See https://git-scm.com/docs/githooks#_post_rewrite
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.
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
Thanks!
there is this too https://github.com/jonathantneal/post-npm-install
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!
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?
@ajaykumar97 can you help me implement it ? it looks like it is not running ;/
First line missing a
!
; should be#!/usr/bin/env bash