web-dev-qa-db-ja.com

git pushの後のローカル実行フック?

私は githooksのマンページ を見てきましたが、何かを見逃さない限り、ローカルのプッシュ後のgitフックのオプションは表示されません。 masterブランチをGitHubリポジトリにプッシュした後、Webサーバー(既にスクリプトを持っている)でAPIドキュメントを更新するものが欲しいです。もちろん、git Pushとapi docs runを組み合わせた独自のスクリプトを書くこともできますが、それはやや洗練されていないように感じます。

62
scotchi

Git 1.8.2から、プッシュ操作の前に呼び出される新しいフックがあります:pre-Pushスクリプトが0以外を返す場合、プッシュ操作はキャンセルされます。

リリースノートに記載: 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

11
Adrián Deccico

この問題の別の解決策は、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" "$@"

PATHのどこかにgit-Push-whとして保存すると、フックでプッシュしたい場合はgit Push-whとして呼び出すことができます。

49
Frank S. Thomas

このタイプのフックはGitではサポートされていません。 Gitフックの有効な理由 の外側にあります。これは、Gitのメンテナーによって指定されています。

上記のリンクされたメッセージの序文は、あなたのケースにほぼ直接語っています。

操作がローカルで開始された後に動作し、ローカルデータのみで動作するフックは特に好きではありません。これはおそらく、他の人よりも高レベルのスクリプトに適したgitツールのビルディングブロックを検討しているからかもしれません。

追伸「シングルプッシュ」ヒント

  • 完全な説明のためにはあまりにも多くの警告がありますが、すべてを理解できれば、詳細に対処できるはずです。

「代替」オブジェクトストアを持つローカルリポジトリへの余分なpushurlは、プッシュフックをローカルで実行するためのオーバーヘッドの少ない方法を提供します。しかし、実際には、努力はgit Push upstream && update-web-server(シェルエイリアス、gitエイリアス、またはスクリプト内にある可能性があります)。

36
Chris Johnsen

私は最近同じ問題に出くわしました。 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が実行されます。

33
ndbroadbent

私はこれに関数を使用しています:

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用です。

3
pschmitt