私は githooksのマンページ を見てきましたが、何かを見逃さない限り、ローカルのプッシュ後のgitフックのオプションは表示されません。 masterブランチをGitHubリポジトリにプッシュした後、Webサーバー(既にスクリプトを持っている)でAPIドキュメントを更新するものが欲しいです。もちろん、git Pushとapi docs runを組み合わせた独自のスクリプトを書くこともできますが、それはやや洗練されていないように感じます。
Git 1.8.2から、プッシュ操作の前に呼び出される新しいフックがあります:pre-Pushスクリプトが0以外を返す場合、プッシュ操作はキャンセルされます。
リリースノートに記載: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt#L167
この問題の別の解決策は、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
として呼び出すことができます。
このタイプのフックはGitではサポートされていません。 Gitフックの有効な理由 の外側にあります。これは、Gitのメンテナーによって指定されています。
上記のリンクされたメッセージの序文は、あなたのケースにほぼ直接語っています。
操作がローカルで開始された後に動作し、ローカルデータのみで動作するフックは特に好きではありません。これはおそらく、他の人よりも高レベルのスクリプトに適したgitツールのビルディングブロックを検討しているからかもしれません。
「代替」オブジェクトストアを持つローカルリポジトリへの余分なpushurl
は、プッシュフックをローカルで実行するためのオーバーヘッドの少ない方法を提供します。しかし、実際には、努力はgit Push upstream && update-web-server
(シェルエイリアス、gitエイリアス、またはスクリプト内にある可能性があります)。
私は最近同じ問題に出くわしました。 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が実行されます。
私はこれに関数を使用しています:
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用です。