Gitフックとサーバー側のgit機能は初めてです。クライアント側のgitでコードをコミットしてプッシュし、アプリケーションライフサイクル管理(ALM)ツールを使用してgitマージを行います。私はgitフックを作成して、リポジトリ内の新規/変更されたファイルに対していくつかのテストを実行しようとしています。 pre-commit
のようなクライアントサイドフックを記述してテストできます
-no-verify
オプションを使用してクライアント側の検証をスキップする変更があるため、マスターにマージする前にファイルを検証するためにサーバー側のgitフックを追加する必要があります。いくつかのgitフックチュートリアルを実行すると、pre-Push
フックがサーバー側フックになります。プレプッシュフックを作成しようとしましたが、クライアント側で動作しています。これで、--no-verify
オプションを使用してユーザーが変更をプッシュしようとしたときに、サーバーサイドフックとして強制的にファイルを検証する方法を説明できます(クライアントでは制御しないでください) 。
私の大きな質問は、ローカルブランチ/リポジトリからgit Push
を実行したときにサーバーフックがどのようにトリガーされるかです。
フックの作成:
Pre-commitと呼ばれるフックを作成し、それをいくつかのフォルダーgit_hooks/pre-Push
および.git/hooks/pre-Push
に配置しました。これで、私のプッシュ前スクリプトのシンボリックリンクが作成されました。したがって、git Push
を実行すると、スクリプトのシンボリックリンクである.git/hooks/pre-Pushがトリガーされますgit_hooks/pre-Push
編集:
pre-Push
とpre-receive
の両方のフックがgit Push
コマンドでトリガーされるのと同じだと思いましたが、pre-Push
はクライアント側でのみ機能し、pre-recieve
はサーバー側で機能します。 pre-receive
フックを作成してマスターブランチにプッシュしました。今、私がgit Push
を実行すると、このエラーが発生します。フックを生成できません/事前受信:そのようなファイルやディレクトリはありません。
WindowsとLinuxプラットフォームの両方でこれを試しています。 Windowsではこのエラーが発生しますが、Linuxではトリガーされません。両方のプラットフォームのマスターブランチにpre-receive
フックを配置しました。
Server side hooks のドキュメントセクションを調べてください。
Gitプッシュプロセスのさまざまな段階に対応できる3つのフックがあります。
サーバーにプッシュすると、pre-receive
フックがトリガーされます。次に、update
フックをプッシュしたブランチごとにトリガーされます。これらのフックがエラーなしで終了すると、パッチが適用され、post-receive
フックがトリガーされます
より詳細な [〜#〜] doc [〜#〜] about pre-receive
フック:
このフックは、gitプッシュに反応してリポジトリ内の参照を更新するときにgit-receive-packによって呼び出されます。リモートリポジトリでrefの更新を開始する直前に、事前受信フックが呼び出されます。その終了ステータスは、更新の成功または失敗を決定します。
[〜#〜]更新[〜#〜]
pre-receive
サーバー側フックをセットアップするには、スクリプトをサーバーの.git/hooks
ディレクトリに配置する必要があります。 pre-receive
という名前を付けます。以上です。
リポジトリにhooks
ディレクトリを作成してコミットしないでください。 pre-receive
スクリプトはリポジトリの外にあります
[〜#〜]更新[〜#〜]
ここにスクリプト例があります:
#!/bin/bash
# check each branch being pushed
echo "pre-receive HOOK"
while read old_sha new_sha refname
do
if git diff "$old_sha" "$new_sha" | grep -qE '^\+(<<<<<<<|>>>>>>>)'; then
echo "Saw a conflict marker in $(basename "$refname")."
git diff "$old_sha" "$new_sha" | grep -nE '^\+(<<<<<<<|>>>>>>>)'
exit 1
fi
if git diff "$old_sha" "$new_sha" | grep -qE '^\+.*\s+$'; then
echo "Saw whitespaces at EOL."
git diff "$old_sha" "$new_sha" | grep -nE '^\+.*\s+$'
exit 1
fi
done
exit 0