コミットメッセージの事前フォーマットなど、すべて共有できる基本的なフックスクリプトをいくつか作成したいと思います。 Gitには、通常<project>/.git/hooks/
の下に保存されるフックスクリプトがあります。ただし、これらのスクリプトは、人々がクローンを作成するときに伝播されず、バージョン管理されません。
誰もが正しいフックスクリプトを取得できるようにする良い方法はありますか?これらのフックスクリプトがレポのバージョン管理されたスクリプトを指すようにすることはできますか?
理論的には、プロジェクトディレクトリにすべてのスクリプトを含むhooks
ディレクトリ(または任意の名前)を作成し、.git/hooks
でシンボリックリンクできます。もちろん、リポジトリを複製した各人は、これらのシンボリックリンクを設定する必要があります(ただし、実際に空想を得て、半自動で設定するためにクローン作成者が実行できる展開スクリプトを使用できます)。
* nixでシンボリックリンクを実行するために必要なことは、次のとおりです。
root="$(pwd)"
ln -s "$root/hooks" "$root/.git/hooks"
ln -sf
の内容を上書きする準備ができている場合は、.git/hooks
を使用します
Git 2.9 では、構成オプション core.hooksPath
はカスタムフックディレクトリを指定します。
フックをリポジトリのhooks
追跡ディレクトリに移動します。次に、リポジトリの各インスタンスを設定して、$GIT_DIR/hooks
の代わりに追跡されたhooks
を使用します。
git config core.hooksPath hooks
一般に、パスは絶対パスでも、フックが実行されるディレクトリ(通常は作業ツリーのルート。 man githooks
の説明セクションを参照)からの相対パスでもかまいません。
プロジェクトがJavaScriptプロジェクトであり、パッケージマネージャーとしてnpm
を使用する場合、 shared-git-hooks を使用してnpm install
にgithooksを適用できます。
git-hooks については、.git/hooks
invokeをプロジェクトディレクトリgithooks
の下のスクリプトにルーティングします。
また、コピーとシンボリックリンクフックをあらゆる場所で最小限に抑えることができる多くの機能があります。
最新のプログラミング言語のほとんど、またはむしろビルドツールは、gitフックを管理するプラグインをサポートしています。つまり、必要なのはpackage.json、pom.xmlなどを設定するだけで、チームの誰もがビルドファイルを変更しない限り準拠する以外の選択肢はありません。プラグインはコンテンツを.gitディレクトリに追加します。
例:
ビルド前およびビルド後のイベントを持つVisual Studioソリューション(およびプロジェクト)を使用しています。 「GitHookDeployer」という名前のプロジェクトを追加します。プロジェクトは、ビルド後イベントでファイルを自己修正します。そのファイルは、ビルドディレクトリにコピーするように設定されています。したがって、プロジェクトは毎回ビルドされ、スキップされることはありません。ビルドイベントでは、すべてのgitフックが適切に配置されていることも確認します。
もちろん、一部のプロジェクトには構築するものがないため、これは一般的なソリューションではないことに注意してください。
フックフォルダーを別のgitリポジトリにし、サブモジュールとしてリンクすることができます...定期的に変更されるメンバーとフックがたくさんある場合にのみ価値があると思います。
pre-commit のようなプリコミットフック管理にマネージドソリューションを使用できます。または、 Datree.io のようなサーバー側git-hooksの集中ソリューション。次のような組み込みポリシーがあります。
すべてのフックを置き換えるわけではありませんが、すべての開発者のコンピューター/レポにフックをインストールするという設定の地獄なしに、最も明白なもので開発者を助けるかもしれません。
免責事項:私はDatreesの創設者の一人です
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/ を参照してください
サンプルファイルに従う場合、フックは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)
このパラメーターは、トリガーされたフックをスクリプトに提供し、コード内で区別できます。どうして?たとえば、コミットとプッシュに対して同じチェックを実行したい場合があります。
そしてその後?
次に、次のような追加の機能が必要になる場合があります。
これはもっと簡単ですか?
はい、git-hooksの管理に役立つツールがいくつかあります。それぞれが異なる視点から問題に取り組むように調整されており、あなたまたはあなたのチームにとって最適なものを得るためにそれらすべてを理解する必要があるかもしれません。 GitHooks.com は、フックについての多くの読書と、今日利用可能ないくつかのツールを提供します。
今日の時点では、gitフックを管理するためのさまざまな戦略を備えた21のプロジェクトがリストされています。単一のフックに対してのみ行うもの、特定の言語に対して行うものなどがあります。
私が作成し、オープンソースプロジェクトとして無料で提供しているツールの1つは、 hooks4git と呼ばれます。これはPython(私が気に入っているため)で記述されていますが、上記のすべてのアイテムを.hooks4git.iniという単一の構成ファイルで処理することです。どんな言語でも.
Gitフックを使用することは絶対に素晴らしいことですが、それらの提供方法は通常、人々をそこから遠ざけます。
pre-commit
は、コミット前のフックでこれを簡単にします。任意のgitフックの管理に関するOPの質問には答えませんが、コード品質の目的で最も頻繁に使用されるのは事前コミットフックです。