Как использовать git hook pre-commit для остановки коммитов до master - PullRequest
9 голосов
/ 28 октября 2011

Я хочу остановить себя от случайной передачи чего-либо в основную ветку, если я не уверен.Поэтому я попробовал этот скрипт, чтобы определить, в какой ветке я нахожусь, но есть проблема.Когда я создаю новую ветку, git name-rev возвращает master, хотя я нахожусь в другой ветке

$ git branch
  ignore
  master
* set_support
$ git name-rev --name-only HEAD
master

Это мой скрипт.

#!/bin/sh
# Check to see if we are on master branch. Stop accidental commits
if [ "`git name-rev --name-only HEAD`" == "master" ]
then
   if [ -f i_want_to_commit_to_master ]
   then
      rm i_want_to_commit_to_master
      exit 0
   else
      echo "Cannot commit to master branch Adrian"
      echo "Remember to create file 'touch i_want_to_commit_to_master' to commit to master"
   fi
   exit 1
fi
exit 0

Для Марка: я перестроил git противпоследний стабильный тег и те же результаты.Работает только после принятия коммита в новую ветку.

$ mkdir gittest
$ cd gittest
$ git init
Initialized empty Git repository in /home/adrian/gittest/.git/
$ touch file1
$ git add file1
$ git commit
[master (root-commit) 7c56424] New file
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file1
$ git branch
* master
$ git checkout -b new_branch
Switched to a new branch 'new_branch'
$ git name-rev --name-only HEAD
master
$ git --version
git version 1.7.7.1
$ git branch
  master
* new_branch
$ touch file2
$ git add file2
$ git commit
[new_branch 1e038fb] new file
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 file2
$ git name-rev --name-only HEAD
new_branch

Ответы [ 2 ]

11 голосов
/ 28 октября 2011

Эта команда используется для поиска понятного имени коммита.Происходит то, что HEAD сначала разрешается в sha1 коммита, а затем определяется имя.Я предполагаю, что это произвольно выбирает master для имени, поскольку оно появляется первым в том, что встретит git log --decorate.

Я бы просто проанализировал вывод git branch в вашем тесте:

"`git branch | grep \* | cut -f2 -d' '` == "master"

или более прямой путь будет:

$(git symbolic-ref HEAD 2>/dev/null) == "refs/heads/master"
8 голосов
/ 13 ноября 2012

В качестве альтернативы вы можете использовать git rev-parse, как предложено в в этом ответе . Таким образом, выражение if будет:

"$(git rev-parse --abbrev-ref HEAD)" == "master"
...