Как я могу разрешить компиляцию git для мастеринга, но предотвратить комманды без объединения?

У меня есть крюк pre-commit Git, который мешает мне совершать мастерство, если не переопределено, чтобы поощрять разработку на ветке.

Однако я хотел бы автоматически разрешить комманды слияния для овладения. Есть ли способ идентифицировать фиксацию слияния из моего крючка pre-commit script? script выглядит следующим образом:

#!/bin/bash

BRANCH=`git branch --color=never| grep '^*'|cut -c3-`

if [ "${BRANCH}D" == "masterD" -a "${GIT_COMMIT_TO_MASTER}D" != "trueD" ]
then
  echo "Commit directly to master is discouraged."
  echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit."
  exit 1
fi

SOLVED: Для тех, кто ищет вырезку и вставку, рабочая версия этого хука script:

#!/bin/bash

BRANCH=$(git rev-parse --abbrev-ref HEAD)

if [ "${BRANCH}" == "master" -a "${GIT_COMMIT_TO_MASTER}" != "true" ]
then
  if [ -e "${GIT_DIR}/MERGE_MODE" ]
  then
    echo "Merge to master is allowed."
    exit 0
  else
    echo "Commit directly to master is discouraged."
    echo "If you want to do this, please set GIT_COMMIT_TO_MASTER=true and then commit."
    exit 1
  fi
fi

Ответ 1

Я добавил несколько комментариев, но важно здесь, что в крюке с предварительной фиксацией коммит, который вы собираетесь тестировать, еще не существует, поэтому вы не можете считать своих родителей.

Вот что вы делаете:

  • Если вы используете git commit --amend для изменения фиксации слияния, крюк предварительной фиксации запускается как обычно, но он не может действительно обнаружить, что это происходит. Новый коммит будет слиянием, но вы не можете сказать.

  • Если вы используете обычный старый git commit для создания фиксации без объединения, файл MERGE_HEAD не будет существовать в каталоге git, и вы можете сказать, что это не собирается создавать слияние.

  • Если вы используете git commit, чтобы завершить конфликтное слияние, будет существовать файл MERGE_HEAD, и вы можете сказать, что это создаст фиксацию слияния.

  • Если вы используете git merge, и он успешно выполняется самостоятельно, он совершает новый коммит без использования привязки pre-commit, поэтому вы даже не вызываете его здесь.

Следовательно, если вы хотите разрешить git commit --amend при слиянии с пропуском, вы можете приблизиться к тому, что хотите: просто проверьте наличие $GIT_DIR/MERGE_HEAD, чтобы увидеть, является ли это git commit, который заканчивается от конфликта конфликта. (Использование $GIT_DIR - это трюк, чтобы сделать эту работу даже в том случае, если команды выполняются за пределами дерева git. git устанавливает $GIT_DIR, чтобы команды на крюке git работали правильно.)