Как я могу добавить свой хук перед фиксацией в существующий репозиторий git

У меня есть хук перед фиксацией, и я хочу добавить его в репозиторий, чтобы, проверив его, мои коллеги сразу же установили его на место.
Однако, если я попытаюсь добавить его (находясь в корневом каталоге моего проекта), Я получаю следующий результат:

$ git add  .git/hooks/pre-commit
error: Invalid path '.git/hooks/pre-commit'
error: unable to add .git/hooks/pre-commit to index

Любая идея, если эта работа и как достичь моей цели?


person Calamity Jane    schedule 18.09.2015    source источник


Ответы (3)


проверить это мои коллеги имеют его мгновенно на месте

Сентябрь. 2015: это невозможно: хук можно поместить в систему управления версиями (вы просто копируете скрипт в свой репозиторий git), но он не может быть «автоматически на месте» (активен) при клонировании/выдаче: это было бы быть слишком опасным, в зависимости от того, что на самом деле делает ловушка. а>"

Вам все равно нужно будет активировать его, добавив символическую ссылку (даже в Windows) в хук перед фиксацией, присутствующий в репозитории git.

Обновление от декабря 2016 г.: в OP Calamity Jane упоминается в комментариях:

Я уже решил в проектах symfony2 (и с другими, это тоже должно работать), чтобы он был частью composer.json.
Так что, если коллега делает composer install или composer update, он автоматически помещается в нужное место.

"scripts": { "dev-install": [ "bash setup_phpcs.sh" ] }, 

Итак, на dev автоматически вызывается setup_phpcs.sh, который копирует хук из папки в репозитории в нужное место.
А поскольку хук является частью репозитория, его можно легко обновлять и распространять.

Как отметил Hi-Angel в комментарии:

Я понял: в Emacs есть директория build-aux с хуками, и при запуске autogen.sh все хуки копируются оттуда.

person VonC    schedule 18.09.2015
comment
С другим репозиторием я использую символическую ссылку на центральный репозиторий, в результате чего половина моих коллег не использует хук. Но если так не получится, то у меня будет как с другим моим репозиторием, и я тоже могу понять, почему это нежелательно. - person Calamity Jane; 18.09.2015
comment
Спасибо за ответ почему, это то, что я хотел знать о @VonC. - person Droogans; 17.11.2015
comment
Кстати, я уже решил это в проектах symfony2 (и с другими это также должно работать), чтобы он был частью composer.json. Поэтому, если коллега выполняет установку или обновление композитора, он автоматически помещается в нужное место. scripts: { dev-install: [ bash setup_phpcs.sh ] }, поэтому автоматически вызывается dev setup_phpcs.sh, который копирует хук из папки в репозитории в нужное место. А поскольку хук является частью репозитория, его можно легко обновлять и распространять. - person Calamity Jane; 19.12.2016
comment
@CalamityJane Хорошо! Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 19.12.2016
comment
Но когда я клонирую, например. Проекты Emacs, в нем есть хуки, значит, каким-то образом им удалось их добавить. - person Hi-Angel; 21.04.2019
comment
@Hi-Angel Я полагаю, что magit добавляет эти хуки: редактор/коммит/ - person VonC; 21.04.2019
comment
Спасибо, я понял: в Emacs есть build-aux директория с хуками, и при запуске autogen.sh все хуки копируются оттуда. - person Hi-Angel; 21.04.2019
comment
@ Привет-Ангел Хорошо заметил. Я включил ваш комментарий в ответ для большей наглядности. - person VonC; 21.04.2019

Если ваш репозиторий представляет собой приложение npm, вы можете добавить эту замечательную библиотеку в качестве зависимости: husky

package.json

...
"devDependencies": {
    ...
    "husky": ">=4"
},
"husky": {
    "hooks": {
        "pre-commit": "npm test"
    }
}

pre-commit может быть практически любой командой: если она заканчивается кодом выхода 0, фиксация проходит успешно, иначе фиксация прерывается.

person Klesun    schedule 18.12.2020

к вашему сведению, в 2019 году также есть такой вариант:

требуется этот пакет: "brainmaestro/composer-git-hooks"

и добавьте следующие строки в ваш composer.yaml

"extra": {
    "hooks": {
        "commit-msg": [
            "regex=\"^([A-Z]{2,4}-[0-9]{1,4}|(no-ticket|NO-TICKET)):[\\s]*.{10,}\"",
            "file=`cat $1`",
            "if ! [[ $file =~ $regex ]]; then",
            "  echo \"ERROR - Commit message is wrong or too short. E.g. XXX-33: Description or no-ticket : Description\"",
            "  exit 1",
            "fi"
        ],
        "pre-commit": [
            "git status --porcelain | grep -e '^ [AM]\\(.*\\).php$' | cut -c 3- | while read line; do",
            "ROOT=`php -r \"echo __DIR__;\"`",
            "bin/php-cs-fixer fix -nq --config=$ROOT/.php_cs \"$line\";",
            "bin/phpcbf --standard=PSR2 --encoding=utf-8 -n -p \"$line\";",
            "git add \"$line\";",
            "done",
            "echo committing on branch $(git rev-parse --abbrev-ref HEAD)"
        ]
    }
}

Это пример, который работает для меня. Что он в основном делает, так это:

Каждый раз, когда вы запускаете «установку композитора» или «обновление композитора», проверяются хуки в .git/hooks. Если крючки уже на месте, ничего не происходит. Если они отсутствуют, то строки сверху разбираются на хуки с шебангом в начале. Затем они выполняются каждый раз, когда кто-то запускает хук.

Если у вас нет больших сценариев, это IMO лучшее решение, чем копирование сценариев.

Примечание: если вы измените строки в composer.json для хуков, вы должны сначала удалить соответствующий хук, прежде чем запускать «установку композитора», иначе ничего не изменится.

person Calamity Jane    schedule 12.12.2019
comment
О, черт, я совсем забыл, что только разработчики php используют git... - person Klesun; 18.12.2020
comment
Вы правы, я должен был добавить, что это для php, хотя использование композитора подразумевает это;) - person Calamity Jane; 19.12.2020