Here are suggested hooks for integration manager repository, in a composer based PHP project.
The IM has all the developer hooks, more the prepare-commit-msg to intercept unwanted merges.
Here are suggested hooks for integration manager repository, in a composer based PHP project.
The IM has all the developer hooks, more the prepare-commit-msg to intercept unwanted merges.
#!/usr/bin/env bash | |
# -------------------------------------------------------------# | |
# Avoid merge from remote branches other than master to master # | |
# -------------------------------------------------------------# | |
# Sergio Vaccaro <[email protected]> | |
# Translation in bash and customization from this ruby script: | |
# https://gist.github.com/mwise/69ec35b646b52d98050d#file-prepare-commit-msg | |
# This git hook will prevent merging remotes branches (pull) into local master | |
# Only remote/master can be pulled in master | |
# TODO: detect custom tracking branches | |
# Put this file in your local repo, in the .git/hooks folder | |
# and make sure it is executable. | |
# The name of the file *must* be "prepare-commit-msg" for Git to pick it up. | |
# Branch to protect | |
PROTECTED_BRANCH="master" | |
# Remote | |
REMOTE="" | |
# Check for merges | |
if [[ $2 != 'merge' ]]; then | |
# Not a merge | |
exit 0 | |
fi | |
# Current branch | |
CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) | |
# Check if in PROTECTED_BRANCH | |
if [[ "$CURRENT_BRANCH" != "$PROTECTED_BRANCH" ]]; then | |
# Not in PROTECTED_BRANCH: can proceed | |
exit 0 | |
fi | |
# Merging from | |
FROM_BRANCH=$(head -n 1 $1 | sed -e "s/^\s*Merge .*\?branch '\(.*\?\)'.*$/\1/") | |
# Check if the source is a local branch | |
if [[ -e ".git/refs/heads/${FROM_BRANCH}" ]]; then | |
# Merge from a local branch: can proceed | |
exit 0 | |
fi | |
# Check if merging from remote/PROTECTED_BRANCH | |
if [[ "${FROM_BRANCH%$PROTECTED_BRANCH}" != ${FROM_BRANCH} ]]; then | |
# Remote PROTECTED_BRANCH to local PROTECTED_BRANCH: can proceed | |
exit 0 | |
fi | |
echo "Merge from a remote branches other than ${PROTECTED_BRANCH} to ${PROTECTED_BRANCH}" | |
echo | |
echo "[POLICY] Forbidden cross merge" | |
echo " You are trying to merge from a remote branch to the local protected branch ${PROTECTED_BRANCH}." | |
echo " You can merge to ${PROTECTED_BRANCH} from local branches or from the ${PROTECTED_BRANCH} of the remote." | |
echo " The operation has been interrupted." | |
echo | |
echo " The merged content has been added to your working directory and to the index." | |
echo " You can:" | |
echo " - switch to another branch to continue" | |
echo " git checkout --track ${FROM_BRANCH}" | |
echo " - abort the operation" | |
echo " git reset --merge" | |
echo " - make a manual commit (discouraged)" | |
echo " git commit" | |
echo | |
echo "The following message is generated by git and is discouraged." | |
exit 1 |