Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
How to automatically prepend git commit with a branch name
#!/bin/bash
# This way you can customize which branches should be skipped when
# prepending commit message.
if [ -z "$BRANCHES_TO_SKIP" ]; then
BRANCHES_TO_SKIP=(master develop test)
fi
BRANCH_NAME=$(git symbolic-ref --short HEAD)
BRANCH_NAME="${BRANCH_NAME##*/}"
BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$")
BRANCH_IN_COMMIT=$(grep -c "\[$BRANCH_NAME\]" $1)
if [ -n "$BRANCH_NAME" ] && ! [[ $BRANCH_EXCLUDED -eq 1 ]] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then
sed -i.bak -e "1s/^/[$BRANCH_NAME] /" $1
fi
@automagiq
Copy link

automagiq commented Aug 29, 2019

that is nice.

@vaso123
Copy link

vaso123 commented Sep 29, 2019

Thank you!

@crookse
Copy link

crookse commented Nov 13, 2019

great work!

@guillermocb
Copy link

guillermocb commented Nov 19, 2019

Thanks, very helpful :)

@tolribeiro
Copy link

tolribeiro commented Jan 27, 2020

Rename .git/hooks/prepare-commit-msg.sample to prepare-commit-msg, paste the script and make the file executable.

For instance with branchARQ-653
$ git commit -m"Fixed bug"
will result with commit "[ARQ-653] Fixed bug"

More elaborated way with the reasoning behind this can be found on my old and dusty blog http://blog.bartoszmajsak.com/blog/2012/11/07/lazy-developers-toolbox-number-1-prepend-git-commit-messages/

Very informative, thanks for that! though I'd suggest that you elaborate a bit on what "making the file executable" means, since not everybody knows. :)

@johncmunson
Copy link

johncmunson commented Feb 20, 2020

@bartoszmajsak I used this as inspiration to create a githook that prepends commit messages with a Jira ticket number (or some other pattern) if it is present in the branch name. I think this may be more practical for a lot of teams than using the entire branch name.
https://gist.github.com/johncmunson/ca02a8027a923a7f4b2f662c67d6528c

@bartoszmajsak
Copy link
Author

bartoszmajsak commented Feb 21, 2020

Wow, I'm amazed this little thing lives its own life. Thanks for all the comments and I'm super glad you found it useful. I guess it's time to update my blog with the suggestions :)

thank-you

@Demwunz
Copy link

Demwunz commented May 22, 2020

This is awesome.
Can anyone suggest a way to get this working with husky?

@johncmunson
Copy link

johncmunson commented May 22, 2020

@Demwunz I haven’t tried it out yet, but you might give this a try. Let us know how it goes 👍
https://github.com/bk201-/jira-prepare-commit-msg

@Demwunz
Copy link

Demwunz commented May 22, 2020

@johncmunson, thanks, we're working with Jira now, so I'll just go ahead and use that!

@jankuss96
Copy link

jankuss96 commented Feb 1, 2021

Thanks for the nice script. Does anyone know how to prevent pepending the commit msg if I do a rebase?

@TiredFalcon
Copy link

TiredFalcon commented Sep 10, 2021

Does anyone here uses GitKraken? I tried to use this hook but it isn't appending the branch name to the commit when commiting from GitKraken.

I just tried this now. It works perfectly on command line, but on GitKraken the commit message becomes somehow empty.

@LenKIM
Copy link

LenKIM commented Oct 14, 2021

It's pretty awesome, I check It working, but I got some issues

image

I don't know why like this warnning show me.

  1 #!/usr/bin/env bash
  2
  3 if [ -z "$BRANCHES_TO_SKIP" ]; then
  4   BRANCHES_TO_SKIP=(master develop release hotfix)
  5 fi
  6
  7 PROJECT_ID=MAT
  8 BRANCH_NAME=$(git symbolic-ref --short HEAD)
  9 BRANCH_NAME="${BRANCH_NAME##*/}"
 10 JIRA_ID=`echo $BRANCH_NAME | egrep -o "$PROJECT_ID-[0-9]+"`
 11
 12 BRANCH_EXCLUDED=$(printf "%s\n" "${BRANCHES_TO_SKIP[@]}" | grep -c "^$BRANCH_NAME$")
 13
 14 COMMIT_MSG_HEAD=$(head $1 -n 1)
 15 BRANCH_IN_COMMIT=$(grep -c $COMMIT_MSG_HEAD)
 16
 17 if [ -n $JIRA_ID ] && ! [[ $BRANCH_EXCLUDED -eq 1 ]] && ! [[ $BRANCH_IN_COMMIT -ge 1 ]]; then
 18   sed -i.bak -e "1s/^/[$JIRA_ID] /" $1
 19 fi

@CB0rghi
Copy link

CB0rghi commented Nov 10, 2021

Would it be possible to use sed to replace a variable of a commit.template instead of adding at the beginning/end of the commit message?

E.g:

Description:

Ticket: $BRANCH_NAME

@samarnayak
Copy link

samarnayak commented Sep 16, 2022

bartoszmajsak

Do you have a script that will work on windows machines?

@bartoszmajsak
Copy link
Author

bartoszmajsak commented Oct 27, 2022

@samarnayak where do you want to run it? Under Powershell?

Alternatively, under WSL or (even) Cygwin things should work fine. But I have to admit I haven't tried it myself.

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