web-dev-qa-db-ja.com

サーバー側の事前受信フックを設定するにはどうすればよいですか?

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-Pushpre-receiveの両方のフックがgit Pushコマンドでトリガーされるのと同じだと思いましたが、pre-Pushはクライアント側でのみ機能し、pre-recieveはサーバー側で機能します。 pre-receiveフックを作成してマスターブランチにプッシュしました。今、私がgit Pushを実行すると、このエラーが発生します。フックを生成できません/事前受信:そのようなファイルやディレクトリはありません

WindowsLinuxプラットフォームの両方でこれを試しています。 Windowsではこのエラーが発生しますが、Linuxではトリガーされません。両方のプラットフォームのマスターブランチにpre-receiveフックを配置しました。

6
Techie

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
5
Eugen Konkov