Create a gist now

Instantly share code, notes, and snippets.

Embed
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 - 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"
@GianlucaGuarini

This comment has been minimized.

Show comment
Hide comment

It works like a charm but I had to fork it https://tourmongolian.mn/?product=GianlucaGuarini/8001627

@therealklanni

This comment has been minimized.

Show comment
Hide comment
@therealklanni

therealklanni Jun 20, 2014

curl -O https://gist.githubusercontent.com/sindresorhus/7996717/raw/4ec63bc6f8c0f1e227faeb78eddc01a788ef0595/post-merge && chmod +x post-merge && mv post-merge .git/hooks/
curl -O https://gist.githubusercontent.com/sindresorhus/7996717/raw/4ec63bc6f8c0f1e227faeb78eddc01a788ef0595/post-merge && chmod +x post-merge && mv post-merge .git/hooks/
@MoOx

This comment has been minimized.

Show comment
Hide comment
@MoOx

MoOx Jun 24, 2014

How can we share a git hook with the team ?

MoOx commented Jun 24, 2014

How can we share a git hook with the team ?

@yangg

This comment has been minimized.

Show comment
Hide comment
@yangg

yangg Sep 4, 2014

Failed to run in windows, fix it by add a ! sign , #!/usr/bin/env bash

yangg commented Sep 4, 2014

Failed to run in windows, fix it by add a ! sign , #!/usr/bin/env bash

@robertcasanova

This comment has been minimized.

Show comment
Hide comment
@robertcasanova

robertcasanova Apr 27, 2015

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

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

@danielcgold

This comment has been minimized.

Show comment
Hide comment
@danielcgold

danielcgold Apr 29, 2015

I forked this to work with changes to .scss and .sass file changes. https://tourmongolian.mn/?product=danielcgold/6de270807fc01c793c9a

I forked this to work with changes to .scss and .sass file changes. https://tourmongolian.mn/?product=danielcgold/6de270807fc01c793c9a

@mariusGundersen

This comment has been minimized.

Show comment
Hide comment

It seems like [email protected]{1} should be used instead of ORIG_HEAD. Forked here: https://tourmongolian.mn/?product=mariusGundersen/8a4383f74a46ababc1de

@aaronroberson

This comment has been minimized.

Show comment
Hide comment
@aaronroberson

aaronroberson Jun 3, 2015

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

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

@gtramontina

This comment has been minimized.

Show comment
Hide comment
@gtramontina

gtramontina Jun 18, 2015

@MoOx (and anyone interested): If you're using npm : https://github.com/gtramontina/ghooks

@MoOx (and anyone interested): If you're using npm : https://github.com/gtramontina/ghooks

@DimeZilla

This comment has been minimized.

Show comment
Hide comment
@DimeZilla

DimeZilla Aug 13, 2015

@sindresorhus this is awesome! thank you!

@sindresorhus this is awesome! thank you!

@Satys

This comment has been minimized.

Show comment
Hide comment
@Satys

Satys Aug 18, 2015

Does post-merge run when there are conflicts during pull?

Satys commented Aug 18, 2015

Does post-merge run when there are conflicts during pull?

@slattery

This comment has been minimized.

Show comment
Hide comment
@slattery

slattery Aug 19, 2015

@Satys.

No, it won't run. "This hook cannot affect the outcome of git merge and is not executed, if the merge failed due to conflicts."

@Satys.

No, it won't run. "This hook cannot affect the outcome of git merge and is not executed, if the merge failed due to conflicts."

@PunKeel

This comment has been minimized.

Show comment
Hide comment

PunKeel commented Sep 4, 2015

❤️

@icamys

This comment has been minimized.

Show comment
Hide comment
@icamys

icamys Apr 14, 2016

I would add these checks too:

# Updating git submodules
check_run .gitmodules "git submodule init && git submodule update"

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

# For those who use gulp
check_run web/assets "gulp --production"

icamys commented Apr 14, 2016

I would add these checks too:

# Updating git submodules
check_run .gitmodules "git submodule init && git submodule update"

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

# For those who use gulp
check_run web/assets "gulp --production"
@wzpan

This comment has been minimized.

Show comment
Hide comment
@wzpan

wzpan Apr 18, 2016

@robertcasanova

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?

@aaronroberson

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 ...

wzpan commented Apr 18, 2016

@robertcasanova

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?

@aaronroberson

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 ...

@tkalfigo

This comment has been minimized.

Show comment
Hide comment
@tkalfigo

tkalfigo May 20, 2016

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

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

@belveryin

This comment has been minimized.

Show comment
Hide comment
@belveryin

belveryin May 20, 2016

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

http://stackoverflow.com/questions/21307744/git-post-rebase-hook

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

http://stackoverflow.com/questions/21307744/git-post-rebase-hook

@jplagostena

This comment has been minimized.

Show comment
Hide comment
@jplagostena

jplagostena Jun 14, 2016

Awesome! Thanks! It works like a charm.

Awesome! Thanks! It works like a charm.

@marcvangend

This comment has been minimized.

Show comment
Hide comment
@marcvangend

marcvangend Jul 18, 2016

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"

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"
@betorobson

This comment has been minimized.

Show comment
Hide comment
@betorobson

betorobson Feb 20, 2017

Thank you so much, it works like a charm although, I did a few changes on my fork.
https://tourmongolian.mn/?product=betorobson/23e5914b51e844bac5eaa6032d6f3f88

Thank you so much, it works like a charm although, I did a few changes on my fork.
https://tourmongolian.mn/?product=betorobson/23e5914b51e844bac5eaa6032d6f3f88

@jth41

This comment has been minimized.

Show comment
Hide comment
@jth41

jth41 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: http://stackoverflow.com/questions/43876375/optional-githook-behaving-as-non-optional

jth41 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: http://stackoverflow.com/questions/43876375/optional-githook-behaving-as-non-optional

@rlafuente

This comment has been minimized.

Show comment
Hide comment
@rlafuente

rlafuente 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!

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!

@anoobbava

This comment has been minimized.

Show comment
Hide comment
@anoobbava

anoobbava Nov 17, 2017

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

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

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