Question
Answer and Explanation
The commit_editmsg
hook in Git is a server-side hook that allows you to inspect or modify commit messages after the user has typed them, but before the commit is actually recorded. This hook is useful for enforcing commit message standards, adding headers, or running checks. Here's how to use it:
1. Location:
- The commit-msg
hook script should be located in the .git/hooks/
directory of your Git repository.
2. Script Creation:
- Create a new file named commit-msg
in the .git/hooks/
directory. You can use any scripting language you are comfortable with, such as bash, Python, or Perl.
3. Make it Executable:
- Ensure that your script is executable: chmod +x .git/hooks/commit-msg
.
4. Accessing the Commit Message:
- The commit message is passed to the commit-msg
script as the first argument ($1
in bash). You can read the content of the message from this file.
5. Example Script (Bash):
#!/bin/sh
MESSAGE_FILE="$1"
if ! grep -q "^[A-Z]+-[0-9]+:" "$MESSAGE_FILE"; then
echo "ERROR: Commit message must start with a ticket ID (e.g., PROJECT-123: Your message)." >&2
exit 1
fi
exit 0
- This example checks if the commit message starts with a ticket ID (like "PROJECT-123: "). If not, it prints an error and prevents the commit.
6. Modifying the Message (Example with adding a line):
#!/bin/sh
MESSAGE_FILE="$1"
echo "Signed-off-by: User Name
exit 0
- This example will append "Signed-off-by..." line to the commit message.
7. Important Considerations:
- Server hooks are typically deployed on the server-side repositories and executed during push operations if configured on the server. This hook is not run on a local machine unless explicitly copied locally to .git/hooks.
- Keep your script simple and fast, as long-running scripts can block commit operations.
- Use the exit 0
command to allow the commit to proceed, or exit 1
to reject it.
By following these steps, you can effectively use the commit-msg
hook to enforce specific requirements on commit messages and maintain high consistency within your project.