Подтвердить что ты не робот

Локальный захват после нажатия git?

Я посмотрел githooks manpage, но если я не упустил что-то, я не вижу возможности для локального, пост-push git крючки. Я хотел бы иметь тот, который обновляет api docs на моем веб-сервере (для которого у меня уже есть script) после того, как я нажму главную ветвь на репозиторий GitHub. Конечно, я мог бы просто написать свой собственный script, который сочетает в себе push git и api docs, но это кажется несколько неэлегантным.

4b9b3361

Ответ 1

Из Git 1.8.2 перед операцией push происходит новый крючок: предварительный толчок. Если script возвращает значение, отличное от 0, операция push будет отменена.

Упоминание в примечаниях к выпуску: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167

Пример: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

Ответ 2

Другим решением этой проблемы является наличие оболочки для git push, которая выполняет сценарии .git/hooks/pre-push и .git/hooks/post-push до и после вызова git push. Возможная оболочка может выглядеть так:

#!/bin/sh

GIT_DIR_="$(git rev-parse --git-dir)"
BRANCH="$(git rev-parse --symbolic --abbrev-ref $(git symbolic-ref HEAD))"

PRE_PUSH="$GIT_DIR_/hooks/pre-push"
POST_PUSH="$GIT_DIR_/hooks/post-push"

test -x "$PRE_PUSH" &&
    exec "$PRE_PUSH" "$BRANCH" "[email protected]"

git push "[email protected]"

test $? -eq 0 && test -x "$POST_PUSH" &&
    exec "$POST_PUSH" "$BRANCH" "[email protected]"

Сохраненный как git-push-wh где-то в вашем PATH, он может быть вызван как git push-wh, если вы хотите нажать на крючки.

Ответ 3

Этот тип крюка не поддерживается Git. Он выходит за рамки допустимых причин для Git hook  как указано Git сопровождающим.

Вступительное замечание в вышеупомянутом связанном сообщении говорит почти непосредственно к вашему делу:

Мне особенно не нравятся крючки, которые действовать после начала операции локально и действовать исключительно на локальных данных. Возможно, потому, что я все еще считаю Git инструментальные блоки, подходящие для более высокий уровень скриптинга больше, чем другой люди делают.

P.S. Подсказка "Single Push"

  • Слишком много предостережений для полного объяснения, но если вы можете понять все это, вы должны иметь дело с деталями.

Дополнительный pushurl для локального репо с хранилищем объектов "alternates" может дать вам небольшой накладной способ локального выполнения push-hook. Но действительно, усилие намного больше, чем git push upstream && update-web-server (возможно, в псевдониме оболочки, Git alias или script).

Ответ 4

Недавно я столкнулся с той же проблемой. Мне нужен крючок, чтобы толчок из моего подмодуля git зафиксировал новую ссылку подмодуля в "суперпроекте".

Как сказал Крис, лучший способ - просто использовать псевдоним git, например:

$ git config alias.xpush '!git push $1 $2 && update-server.sh'
# (remember the backslash before the ! if your shell requires it)

Это добавляет следующее в ваш файл .git/config:

[alias]
  xpush = !git push $1 $2 && update-server.sh

Итак, если вы наберете:

$ git xpush

ваши изменения будут перенесены, а затем будет выполнен update-server.sh.

Ответ 5

Я использую для этого функцию:

current_branch() {
    local ref=$(git symbolic-ref HEAD 2> /dev/null) || return
    echo ${ref#refs/heads/}
}

gp() {
    local post_push="$(git rev-parse --git-dir)/hooks/post-push"
    git push "[email protected]" && {
        [[ -x "$post_push" ]] && "$post_push" "$(current_branch)" "[email protected]"
    }
}
compdef _git gp=git-push

Часть compdef предназначена для ZSH.