web-dev-qa-db-ja.com

Gitフックスクリプトはリポジトリとともに管理できますか?

コミットメッセージの事前フォーマットなど、すべて共有できる基本的なフックスクリプトをいくつか作成したいと思います。 Gitには、通常<project>/.git/hooks/の下に保存されるフックスクリプトがあります。ただし、これらのスクリプトは、人々がクローンを作成するときに伝播されず、バージョン管理されません。

誰もが正しいフックスクリプトを取得できるようにする良い方法はありますか?これらのフックスクリプトがレポのバージョン管理されたスクリプトを指すようにすることはできますか?

281
Pat Notz

理論的には、プロジェクトディレクトリにすべてのスクリプトを含むhooksディレクトリ(または任意の名前)を作成し、.git/hooksでシンボリックリンクできます。もちろん、リポジトリを複製した各人は、これらのシンボリックリンクを設定する必要があります(ただし、実際に空想を得て、半自動で設定するためにクローン作成者が実行できる展開スクリプトを使用できます)。

* nixでシンボリックリンクを実行するために必要なことは、次のとおりです。

root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"

ln -sfの内容を上書きする準備ができている場合は、.git/hooksを使用します

134
mipadi

Git 2.9 では、構成オプション core.hooksPath はカスタムフックディレクトリを指定します。

フックをリポジトリのhooks追跡ディレクトリに移動します。次に、リポジトリの各インスタンスを設定して、$GIT_DIR/hooksの代わりに追跡されたhooksを使用します。

git config core.hooksPath hooks

一般に、パスは絶対パスでも、フックが実行されるディレクトリ(通常は作業ツリーのルート。 man githooks の説明セクションを参照)からの相対パスでもかまいません。

175
Max Shenfield

プロジェクトがJavaScriptプロジェクトであり、パッケージマネージャーとしてnpmを使用する場合、 shared-git-hooks を使用してnpm installにgithooksを適用できます。

12
kilianc

git-hooks については、.git/hooks invokeをプロジェクトディレクトリgithooksの下のスクリプトにルーティングします。

また、コピーとシンボリックリンクフックをあらゆる場所で最小限に抑えることができる多くの機能があります。

4
cattail

最新のプログラミング言語のほとんど、またはむしろビルドツールは、gitフックを管理するプラグインをサポートしています。つまり、必要なのはpackage.json、pom.xmlなどを設定するだけで、チームの誰もがビルドファイルを変更しない限り準拠する以外の選択肢はありません。プラグインはコンテンツを.gitディレクトリに追加します。

例:

https://github.com/olukyrich/githook-maven-plugin

https://www.npmjs.com/package/git-hooks

4
yuranos87

ビルド前およびビルド後のイベントを持つVisual Studioソリューション(およびプロジェクト)を使用しています。 「GitHookDeployer」という名前のプロジェクトを追加します。プロジェクトは、ビルド後イベントでファイルを自己修正します。そのファイルは、ビルドディレクトリにコピーするように設定されています。したがって、プロジェクトは毎回ビルドされ、スキップされることはありません。ビルドイベントでは、すべてのgitフックが適切に配置されていることも確認します。

もちろん、一部のプロジェクトには構築するものがないため、これは一般的なソリューションではないことに注意してください。

3
Mike de Klerk

フックフォルダーを別のgitリポジトリにし、サブモジュールとしてリンクすることができます...定期的に変更されるメンバーとフックがたくさんある場合にのみ価値があると思います。

1
Empus

pre-commit のようなプリコミットフック管理にマネージドソリューションを使用できます。または、 Datree.io のようなサーバー側git-hooksの集中ソリューション。次のような組み込みポリシーがあります。

  1. シークレットのマージ を検出して防止します。
  2. 適切な強制 Gitユーザー設定
  3. 強制 Jiraチケット統合 -プルリクエスト名/コミットメッセージにチケット番号を記載します。

すべてのフックを置き換えるわけではありませんが、すべての開発者のコ​​ンピューター/レポにフックをインストールするという設定の地獄なしに、最も明白なもので開発者を助けるかもしれません。

免責事項:私はDatreesの創設者の一人です

1
Shimon Tolts

Nodejsユーザーの場合、簡単な解決策はpackage.jsonを更新することです

{
  "name": "name",
  "version": "0.0.1",
  ......
  "scripts": {
    "preinstall": "git config core.hooksPath hooks", 

preinstallは前に実行されます

npmインストール

gitをリダイレクトして。\ hooks(または任意の名前)ディレクトリ内のフックを探します。このディレクトリは、ファイル名(.sampleを除く)と構造に関して。\。git\hooksを模倣する必要があります。

Mavenやその他のビルドツールにpreinstallと同等のものがあると想像してください。

また、すべてのプラットフォームで機能するはずです。

さらに情報が必要な場合は https://www.viget.com/articles/two-ways-to-share-git-hooks-with-your-team/ を参照してください

1
Shane Gannon

サンプルファイルに従う場合、フックはbashで書かれていることが理想的です。ただし、使用可能な任意の言語で作成し、実行可能フラグがあることを確認してください。

したがって、目標を達成するためにPythonまたはGoコードを記述し、それをhooksフォルダーの下に配置できます。動作しますが、リポジトリとともに管理されません。

2つのオプション

a)マルチスクリプト

ヘルプ内にフックをコーディングし、次のように完璧なスクリプトを呼び出すために、コードの小さな断片をフックに追加できます。

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/myprecommit.js

b)単一スクリプト

よりクールなオプションは、複数のスクリプトではなく、1つのスクリプトを追加してそれらをすべてルール化することです。したがって、hooks/mysuperhook.goを作成し、必要なすべてのフックをポイントします。

$ cat .git/hooks/pre-commit
#!/bin/bash
../../hooks/mysuperhook.go $(basename $0)

このパラメーターは、トリガーされたフックをスクリプトに提供し、コード内で区別できます。どうして?たとえば、コミットとプッシュに対して同じチェックを実行したい場合があります。

そしてその後?

次に、次のような追加の機能が必要になる場合があります。

  • フックを手動でトリガーして、コミットまたはプッシュの前でもすべてが正常かどうかを確認します。スクリプト(オプションaまたはb)を呼び出すだけでうまくいきます。
  • CIのフックをトリガーします。CIの同じチェックを書き換える必要はありません。たとえば、コミットトリガーとプッシュトリガーを呼び出すだけです。上記と同じで解決するはずです。
  • マークダウン検証ツールやYAML検証ツールなどの外部ツールを呼び出します。 syscallを作成でき、STDOUTおよびSTDERRを処理する必要があります。
  • すべての開発者がフックをインストールする簡単な方法を持っていることを確認してください。そのため、デフォルトのフックを正しいフックに置き換えるには、ニーススクリプトをリポジトリに追加する必要があります。
  • 開発およびマスターブランチへのコミットをブロックするチェックなど、いくつかのグローバルヘルパーがあり、すべてのリポジトリに追加する必要はありません。グローバルスクリプトを備えた別のリポジトリを作成することで解決できます。

これはもっと簡単ですか?

はい、git-hooksの管理に役立つツールがいくつかあります。それぞれが異なる視点から問題に取り組むように調整されており、あなたまたはあなたのチームにとって最適なものを得るためにそれらすべてを理解する必要があるかもしれません。 GitHooks.com は、フックについての多くの読書と、今日利用可能ないくつかのツールを提供します。

今日の時点では、gitフックを管理するためのさまざまな戦略を備えた21のプロジェクトがリストされています。単一のフックに対してのみ行うもの、特定の言語に対して行うものなどがあります。

私が作成し、オープンソースプロジェクトとして無料で提供しているツールの1つは、 hooks4git と呼ばれます。これはPython(私が気に入っているため)で記述されていますが、上記のすべてのアイテムを.hooks4git.iniという単一の構成ファイルで処理することです。どんな言語でも.

Gitフックを使用することは絶対に素晴らしいことですが、それらの提供方法は通常、人々をそこから遠ざけます。

0
Lovato

pre-commit は、コミット前のフックでこれを簡単にします。任意のgitフックの管理に関するOPの質問には答えませんが、コード品質の目的で最も頻繁に使用されるのは事前コミットフックです。

0
ericsoco