Местные исполнительные крюк после настройки git'а?


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

5 58

5 ответов:

из Git 1.8.2 перед операцией push вызывается новый крюк:pre-push Если скрипт возвращает значение, отличное от 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

другое решение этой проблемы-иметь оболочку для 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" "$@"

git push "$@"

test $? -eq 0 && test -x "$POST_PUSH" &&
    exec "$POST_PUSH" "$BRANCH" "$@"

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

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

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

мне не особо нравятся крючки, которые действие после начала операции локально и действовать исключительно на локальных данных. Это может быть потому, что я все еще считаю строительные блоки инструментов ГИТ соответствующие для более высокий уровень сценариев больше, чем других люди так делают.

P. S. А "Одного Нажатия" Намек

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

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

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

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

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

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

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

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

$ git xpush

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

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

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 "$@" && {
        [[ -x "$post_push" ]] && "$post_push" "$(current_branch)" "$@"
    }
}
compdef _git gp=git-push

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