Git: Hooks run “npm install” on checkout

When working on a project you usually install various packages from npm.
Of course these packages are maintained and updated, adding more features and security fixes, and stability patches.

One person on your team should run npm outdated once per week to see what all has been updated and test if you can integrate the packages into your project.
Thus the package.json is updated and causes a grand problem for all other developers on the project. If a package has major breaking changes the code will need to be adjusted, however that code will not run on the other develoepers environment. The other developers working on the project they have to run npm update to install the missing / outdated packages in their environment.

The solution to this problem are “git hooks”, essentially git can execute code on specific events, like before commiting your code, or pre push etc.
git hooks. For my use case I would like to run npm update after a developer checks out from the git repository, this is the event “post-checkout”.

Native Git Hooks

To create a git hook you need to add a file in your project called .git/hooks/post-checkout (On linux add the executable bit with chmod +x)

You will test this and say, yes this works as intended – lets commit it to the repository. – Now you will discover that you cannot commit files in .git to the repository.
In fact git does not allow you to do this, due to security concerns as git hooks can execute any shell script.

The work around for this issue is to simply add it into a folder called git-hooks/ and tell the developers to copy the file when they set up their dev environment.

Husky

As always if there is a Problem for development with javascript there is a npm package to solve the problem.
Husky uses the package.json to define the scripts that are executed via git hooks.
Simply Install Husky
npm install husky -D

Then edit the package.json:

The Husky solution would also allow you to execute your own js file, maybe also doing some cleanup of files or running tests etc.

Posted by happyneal