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


337

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

皆が正しいフックスクリプトを手に入れるのを助ける良い方法はありますか?これらのフックスクリプトにリポジトリ内のバージョン管理されたスクリプトをポイントさせるだけでよいですか?


5
いい質問ですね 私はより良い答えがあればいいのにと思います(@mipadiへの不満はなく、gitがより自動的な方法でこれを行う方法があったらいい
のに-git

同意します、@ lindes!しかし、おそらくこのフックの共有を意図的に制限しているのでしょうか?Windowsユーザーにとって事態は煩雑になると思います。
kristianlm

@kristianlm:時々乱雑になる可能性のあるさまざまな理由があります...そしてそこにそれを持っているのが良いときもあります。フックをコピーするオプションまたは何かがあったらいいのにと思います。私はいつかgit-coreコードをチェックアウトしてパッチを作成する必要があると思います。:)(または他の誰かがすることを希望...かで回避策でライブmipadiの答え、または何でも。)
lindes

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

回答:


144

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

* nixでシンボリックリンクを行うには、次のことを行うだけです。

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

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


38
これは自明ではなかったので、適切にシンボリックリンクする方法に関するリンクを含めます。stackoverflow.com
David T.

17
gitバージョン2.9には、core.hooksPath.gitの外部にあるファイルを設定してフックフォルダーにリンクするための設定オプションが追加されました。
アーロン・ラビノヴィッツ

216

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

hooksリポジトリ内の追跡されているディレクトリにフックを移動します。次に、次の代わりに追跡対象を使用するようにリポジトリの各インスタンスを構成します。hooks$GIT_DIR/hooks

git config core.hooksPath hooks

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


15
...および指すフックディレクトリは、別のフックリポジトリにすることができます;)
RenéLink

10
さて、git cloneを実行すると、この構成パラメーターは自動的に設定されますか?
鳴らす

4
原則として、git構成変数は、複製するリポジトリーでは設定できません。これは任意のコードの実行を防ぐためだと思います。git configは、フック、コミットメッセージのユーザー名、その他の重要な機能を介してコードの実行を制御します。
Max Shenfield 2016年

1
チームの誰かが別のブランチにgitチェックアウトした場合はどうなりますか?彼らは..すべての枝にそれを含める必要が
jokerster

1
それは本当だ。一方、新しいコミットでフックを更新する場合、そのコミットの上に構築されたブランチで作業するときに、クローンされたリポジトリは自動的にフックを取得します。どちらの方法にも長所と短所があります。
18

15

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


5
今、私は誰がそれらのがらくたを侵入的に追加されているかを知ってい.git/hooksます。
ジヴェンコア2018年

警告-Windowsはサポートされていません(git bashで管理者として実行されている場合を除く)。簡単な解決策は、「preinstall」を追加することです:「git config core.hooksPathフック」をpackage.jsonのスクリプトとして追加します。つまり、フックはgitスクリプトを含むフォルダーです。
シェーンギャノン

8

Nodejsのユーザー簡単な解決策は、更新にあるpackage.json

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

インストール前には、前に実行されます

npmインストール

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

Mavenと他のビルドツールにプレインストールと同等の機能があると想像してください。

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

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


5

git-hooksはどうですか、.git/hooksプロジェクトディレクトリの下のスクリプトに呼び出しをルーティングしますgithooks

コピーとシンボリックリンクのフックを最小限に抑える機能がたくさんあります。


5

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

例:

https://github.com/rudikershaw/git-build-hook

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

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


私はそれをプロジェクトで使用するために一般的な方法で達成しようとしたので、このツールを書きました:pypi.org/project/hooks4git
Lovato

3

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

もちろん、これは一般的なソリューションではないことに注意してください。プロジェクトによっては、ビルドするものがないからです。


2

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

  1. シークレットのマージを検出して防止するます。
  2. 適切なGitユーザー構成を適用する
  3. 強制のJIRAチケットの統合 -プル要求名に言及チケット番号を/コミットメッセージを。

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

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


1

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


1

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

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

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フックを使用することは本当に素晴らしいですが、それらが提供される方法は通常、人々をそこから遠ざけるだけです。


私は少し前に非常に短いバージョンを投稿しましたが、モデレーターに同意したように、これはその中に説明をもたらし、他の開発者を助けるために自分が書いたツールへの短いリンクをもたらします。
Lovato

1

Gradleユーザーの場合

これらのスクリプトは、gradleプロジェクトに非常に役立つことがわかりました。

build.gradle

apply from: rootProject.file('gradle/install-git-hooks.gradle')

gradle / install-git-hooks.gradle

tasks.create(name: 'gitExecutableHooks') {
    doLast {
        Runtime.getRuntime().exec("chmod -R +x .git/hooks/");
    }
}
task installGitHooks(type: Copy) {
    from new File(rootProject.rootDir, 'pre-commit')
    into { new File(rootProject.rootDir, '.git/hooks') }
}
gitExecutableHooks.dependsOn installGitHooks
clean.dependsOn gitExecutableHooks

事前コミット

.... your pre commit scripts goes here
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.