Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

prevent `git` from pushing commits with given commit message

How to prevent git from pushing commits that contain given string in commit massage, e.g. "DO NOT PUSH" ?

Context/usecase:

My typical workflow is: I hack hack, splitting work into micro commits, once things work I rewrite history, changing order of commit to group them reasonably and later squashing into bigger meaningful pieces. Once work is ready, things are ready to push!

Now I would like git to prevent me from accidentally pushing into repository commits that are still in progress. I considered keeping "DO NOT PUSH" as part of commit message. How to make git automatically prevent me from pushing when it reaches such commit after git push?

(On for pre-receive hook solutions: let's consider github as example service, which AFAIK does not allow pre-recevie hooks, except in its "Enterprise" edition)

like image 887
Grzegorz Wierzowiecki Avatar asked Feb 05 '17 08:02

Grzegorz Wierzowiecki


People also ask

How do I stop git push accidental?

The trick to prevent accidentally pushing in-development changes to the wrong environment is to use the git command for changing remote's URL. By adding the --push flag to the command, only the push URL is manipulated.

Can you commit in git without providing a message?

git generally requires a non-empty message because providing a meaningful commit message is part of good development practice and good repository stewardship. The first line of the commit message is used all over the place within git; for more, read "A Note About Git Commit Messages".


1 Answers

You can use a pre-push hook, but that remains a local hook which can be bypassed.
See this pre-push example which does look at each commit message

# Check for foo commit
        commit=`git rev-list -n 1 --grep '^foo' "$range"`
        if [ -n "$commit" ]
        then
echo "ERROR: git pre-push hook found commit message starting with 'foo' in $local_ref"

But the best way remains a pre-receive hook on the server side though. That way, the policy is enforced for all contributors. This is not always possible (when you don't have direct access to the remote server like GitHub, BitBucket or GitLab.com)

like image 99
VonC Avatar answered Sep 29 '22 01:09

VonC