Git hook written on JavaScript As in many teams, me and my coworkers are putting ticket number into beginning of each commit message. If your branches are starting with ticket number it is easy to create prepare-commit-msg hook to automate this action, and since I'm a front-end deveoper, I decided to write it as a nodejs script. Look at what I came up with and tell me how to make it better if you will.

#.git/hooks/prepare-commit-msg

#!/usr/bin/env node

const fs = require('fs')
const { exec } = require('child_process')

const COMMIT_EDITMSG = process.argv[2]

exec('git symbolic-ref --short HEAD', (err, stdout) =&gt; {
    if (err) throw err

    fs.readFile(
        COMMIT_EDITMSG,
        'utf8',
        (err, message) =&gt; {
            if (err) throw err

            fs.writeFile(
                COMMIT_EDITMSG,
                `${stdout.replace(/(-|_).*/, '')} ${message}`.replace(/\n/, ''),
                err =&gt; {
                    if (err) throw err
                }
            )
        }
    )
})
Outwith the improved error handling as per the comments, another improvement on this be to write the hook using a more synchronous approach e.g.

#.git/hooks/prepare-commit-msg
#!/usr/bin/env node

const { readFileSync, writeFileSync } = require('fs')
const { execSync } = require('child_process')
const COMMIT_EDITMSG = process.argv[2];

const stdout = execSync('git symbolic-ref --short HEAD');
const message = readFileSync(COMMIT_EDITMSG, 'utf-8');
writeFileSync(COMMIT_EDITMSG, `${stdout.replace(/(-|_).*/, '')} ${message}`.replace(/\n/, ''));


This completely eliminates the need for callbacks and, naturally, if an error occurs the commit should be blocked - it's also a lot more succinct and easier to read.