Local executing hook after a git push?

前端 未结 5 571
南笙
南笙 2020-11-27 11:07

I\'ve looked at the githooks manpage but unless I\'m missing something I don\'t see an option for local, post-push git hooks. I\'d like to have one that updates the api doc

相关标签:
5条回答
  • 2020-11-27 11:30

    I'm using a function for this:

    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
    

    The compdef part is for ZSH.

    0 讨论(0)
  • 2020-11-27 11:38

    Another solution to this problem is to have a wrapper for git push that executes .git/hooks/pre-push and .git/hooks/post-push scripts before and after the git push call. A possible wrapper could look like this:

    #!/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" "$@"
    

    Saved as git-push-wh somewhere in your PATH, it can then be called as git push-wh if you want to push with hooks.

    0 讨论(0)
  • 2020-11-27 11:41

    I recently came across the same issue. I wanted a hook so that a push from my git submodule would commit the new submodule reference in the 'superproject'.

    As Chris mentioned, the best way is to just use a git alias, like this:

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

    This adds the following to your .git/config file:

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

    And so now, if you type:

    $ git xpush
    

    your changes will be pushed, and then update-server.sh will be executed.

    0 讨论(0)
  • 2020-11-27 11:43

    From Git 1.8.2 there is a new hook invoked before the push operation: pre-push If the script returns other than 0 the push operation will be cancelled.

    Mention in the release notes: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167

    Sample: https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample

    0 讨论(0)
  • 2020-11-27 11:47

    This type of hook is not supported by Git. It falls outside the valid reasons for a Git hook as given by Git's maintainer.

    The introductory remark in the above linked message speaks almost directly to your case:

    I do not particularly like hooks that act after an operation is initiated locally and act solely on local data. This is maybe because I still consider git tools building blocks suitable for higher level scripting more than other people do.

    P.S. A “Single Push” Hint

    • There are too many caveats for a full explanation, but if you can figure it all out you should be able to deal with the details.

    An extra pushurl to a local repo with an “alternates” objects store could give you a low overhead way to locally execute a push hook. But really, the effort is much more than git push upstream && update-web-server (maybe in a shell alias, git alias, or script).

    0 讨论(0)
提交回复
热议问题