web-dev-qa-db-ja.com

Gitリモート/共有プリコミットフック

リモートとしての1つの公式リポジトリと、そこからクローン化された複数のローカルリポジトリを使用して、事前コミットフックをそのメインリポジトリでスクリプト化し、そのすべてのクローンに適用できますか?

66
Samer Buna

フックは複製されないため、そうは思いません。
そのフックスクリプト自体がバージョン管理されていて、クローンサーバーの(シンボリックリンク)にリンクしている場合があります(OSがそのリンク機能をサポートしている場合)。

または、フックがクローンの作成に使用される git template directory の一部である場合(クローンリポジトリに存在が保証されるだけで、実際に使用および実行されることを保証しません)。

しかし、コミットを強制する「中心的な」方法はないと思います。


Jefromiがコメントでさらに明確に説明しているように(強調鉱山):

リポジトリで配布されるフックを強制することは、gitリポジトリの概念に反するものだと思います。
私のクローンは私のリポジトリです。フックを実行するかどうかの選択など、好きな方法でgitを使用できるはずです。
(そしてセキュリティの観点から、それは本当に恐ろしいことです-特定のgitコマンドを実行するたびに特定のスクリプトを実行するように強制する能力を誰も持つべきではありません。)

私はそのコメントに同意し、特定のレポジトリでローカルに適用されたルールを実施する方法を見てきました。
たとえば、中央リポジトリに直接プッシュするのではなく、特定のルールに従っている場合にのみコミットを受け入れるQAリポジトリに最初にプッシュします。存在する場合、QAリポジトリはコミットを中央リポジトリにプッシュします。

先ほど言及したものから直接派生した別の図は、「 Gitとのサーバーレス継続的統合 」であり、プッシュする前に機能するlocallyプライベートビルドを実施する方法ですどこでも。

49
VonC

人々のローカルリポジトリでpre-commitフックをforcedすることはできませんが、中央リポジトリではpre-receiveフックを実行できます。

F. exコミットメッセージが特定のルール(trac統合など)に準拠していることを確認する必要があったため、次のpre-receiveフックを使用しました。これは、中央リポジトリにプッシュされるすべてのコミットメッセージをチェックし、ウェルフォーム。

#!/ bin/sh 
読みながらrev_old rev_new ref 
 do 
 MALFORMED = "$(git rev-list --oneline $ rev_old .. $ rev_new | egrep -v '#[0-9] +' | awk '{print $ 1}') "
 if [x" $ MALFORMED "!= x] 
 then 
 echo $ MALFORMED 
 exit 1 
 fi 
 done 
 
のコミットメッセージ

詳細については、f.exを参照してください https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks

8
Jens Timmerman

はいといいえ。

JavaScriptを記述している場合、これを行う最良の方法はハスキーを使用することです。ハスキーには、githookを設定および管理するpostInstallスクリプトがあります。その後、package.jsonまたはハスキードットファイルでプリコミットおよびプリプッシュスクリプトを構成できます。

これを使用して、任意のスクリプトを実行できます。通常、yarn lintyarn testを事前にプッシュします。


JavaScriptを使用していない場合、またはHuskyを使用できない場合は、コミットフックをデベロッパーマシンにクローンしてレポにチェックインできますが、デベロッパーに強制的に実行させることはできません。

フックをチェックインするには、リポジトリのどこかにhooksディレクトリを作成します。次に、通常の.git/hooksディレクトリの代わりにそこにフックを配置します。これは、実施できる部分です。

他の部分は、開発者の善意に依存します。 hooksフォルダーをhooksPathとして設定するには、各開発者が次を実行する必要があります。

git config core.hooksPath hooks

これで、hooksフォルダー内のすべてのフックが期待どおりに実行されます。

7
superluminary

事前コミットフックをそのメインリポジトリでスクリプト化し、そのすべてのクローンに適用できますか?

githooks(5)から:

事前コミット
このフックはgit commitによって呼び出され、
 --no-verifyオプションでバイパスできます。

フックは簡単にバイパスできるため、質問に対する答えは「いいえ」のようです。

また、.git/hooksディレクトリは複製されていないため、クライアントにプッシュするメカニズムはないようです。

7
bstpierre

ビルドシステムが関連付けられているgitリポジトリにソースコードがあると仮定すると、ビルドシステムを構成して、プリコミットフックをセットアップできます。つまり、バージョン管理されているプリコミットフックを移動またはリンクします。

まだ試していません。より良い解決策を求めてグーグル検索をしながらここに来ました。

2
Andrew Wagner

新しいファイルを作成します:pre-commit-hook.sh

#!/usr/bin/env bash
CHANGES=$(git whatchanged ..Origin)

if [ ! -z "${CHANGES}" ]; then
    echo "There are changes in remote repository. Please pull from remote branch first."
    exit 1;
fi

exit 0;

そして、これが私がGitにコミットする方法です:

bash pre-commit-hook.sh && git commit -m "<Commit message>"
0
Vishrant