14

SVNからGitに切り替えてからpre-commit、Subversionサーバーのフックを介してコーディング標準を適用する機能が失われました。

Gitを使用すると、クライアントに事前コミットフックのみがあり、これを強制することはできません。さらに悪いことに、開発者は3つの主要なオペレーティングシステムすべてを使用しているため、LinuxまたはOSXで機能するpre-commitフックはWindowsでは自動的に機能しません。

サーバーにフックを実装する方法がpre-receiveありますが、解決策は見た目ほど簡単ではありません。

開発者が20のコミットを行い、それらをプッシュしたいとします。私が知っているすべての事前コミットおよび事前受信フック(1、2 )は、単一のコミットをチェックするだけで、最終的に失敗し、プッシュを防ぎます。ここで、開発者は問題を修正し、別のコミットを実行して、もう一度プッシュしようとします。フックは単一のコミットをチェックするため、再び失敗します。

したがって、pre-receiveプッシュされるすべてのコミットで変更されたすべてのファイルのリストを生成し、現在の状態でのみphpcsを実行するフックが必要です。

そのようなフックスクリプトはすでに存在しますか?どこ?

編集:ファイルのリストを作成するスクリプトがあるようです-残念ながらPythonで作成されていますが、移植することはできます。私はまだPHPCSで事前に作成されたソリューションに興味があります:)

4

10 に答える 10

2

サーバー側のフックがプッシュを制御するのを待ちたくありません。

各開発者のブランチを非常に定期的にフェッチし、新しいコミットを監査して、コミットが事前定義された基準を満たさない場合に電子メールを送信する中間リポジトリを設定できます。

中央リポジトリに事前受信フックを設定することもできますが、少なくとも開発者は潜在的な問題をより早く認識します。

于 2011-05-25T07:08:27.030 に答える
2

私は良い「git-anese」を覗き見しませんが、Mercurialには、着信コミットのグループの「トップ」コミットを本質的にチェックする「changegroup」と呼ばれるフックオプションがあります。たぶん、コミュニティの誰かが同等のものがあるかどうかを教えてくれるでしょう。gitの「changegroup」の?

https://www.mercurial-scm.org/wiki/Hook#The_changegroup_hook

于 2011-05-27T13:54:20.410 に答える
2

ここに技術的な解決策はないと思いますが、本当に人を煩わせたい場合は、CIセットアップに統合phpcsして、問題マネージャーでチケットを開き始めてください。;-)

技術的な問題ではないので、それが最善のアイデアではないと思います。あなたの問題はコミット前またはコミット後のフックではありませんが、人々はそれを行わず、あなたは彼らを強制しなければならないと思います。

全体として、私はコーディング標準の重要性を理解しており、それも実施していますが、それには社会的要素(または側面)があります。

あなたと一緒に働いている人々は、(まだ)それ以上のことを知らないか、学ぶ気がないようです。したがって、彼らがそれ以上のことを知らない場合は、あなたは彼らと協力し、あなたの要件に従うように彼らに教えなければなりません。これには、規則が重要である理由を教えることも含まれ、最終的には、すべてが環境に配慮するまで機能が実行されないことを理解する必要があります。

多分それは彼らがそれを得るまでプロジェクト管理(私はあなただと思います)が問題を複数のタスクに分解することを必要とします:

  • 機能自体
  • phpcs
  • ドキュメンテーション
  • ユニットテスト

(順不同。;-))

彼らが学びたくない場合は、いつでももっと抜本的な対策を講じることができます。同様に、私はゆっくりと始めて、毎週の業績評価(1対1の状況)を行い、なぜ彼らがそれをしないのかを繰り返します。それが役に立たない場合-私はあなたが私のドリフトをキャッチすると思います。

于 2011-05-27T14:38:25.097 に答える
2

Drupalプロジェクトでは、最近Gitに移行し、同様の問題を検討しています。この場合、パッケージ化スクリプトが自動的にチェックインするため、モジュールのLICENSE.txtファイルをチェックインする必要はありません。何度か行ったり来たりした後、私たちが思いついたのは、悪いコミットを拒否しない受信フックでしたが、悪いコミットを検出するたびに(「悪い」の定義のために)、バグに重大なバグを自動的にファイルしますトラッカー。そうすれば、コードは引き続きコミットされますが、モジュールメンテナと適切なウェブマスターチームの両方に、何かが間違っているため修正する必要があることがすぐに通知されます。メールを送信したり、ツイートやその他の通知を簡単に送信したりすることもできます。

実際にはまだ実装していませんが、Git実装チームに時間があればすぐに取り組んでいる計画です。:-)

基本的に、言い換える以外に、あなたが説明する問題に対する良い解決策はありません。「検出可能な違反をブロックする」の代わりに、「検出可能な違反を報告する」になります。それがあなたにできる最善のことだと思います。

于 2011-05-28T03:36:36.830 に答える
2

jenkins + gerritを使用します:

http://alblue.bandlem.com/2011/02/gerrit-git-review-with-jenkins-ci.html

ビルドが失敗した場合、プッシュは拒否されます。

http://source.android.com/source/life-of-a-patch.html

ティラエル

于 2011-05-28T21:01:32.283 に答える
1

私はこのフックを使用しました:http: //criticallog.thornet.net/2011/06/02/running-php-linter-before-pushing-changes-to-a-git-repository/

phpcsでコードをテストするように変更しました。

いくつかのバグが含まれている可能性があり、drupalコード標準をハードコーディングしましたが、機能します。 http://pastebin.com/fEmN519B

于 2011-12-08T11:42:02.690 に答える
0

事前コミット/事前受信フックなどを使用して、この質問に直接答えることはできません。

私は別の方法でこれにアプローチします。CIサーバーを実行し(私はjenkinsを使用します)、phpcsとJenkinsのcheckstyleプラグインを実行します。

これにより、ビルドに失敗し、checkstyleレポートに基づいてコミッターに電子メールを送信できます。

オプションでしきい値を設定できるため、新しいスタイルの違反が最大5つある場合はビルドが不安定になりますが、コミットされたものが5つを超えると失敗します。

また、全体的なしきい値を設定できるため、プロジェクト全体で10を超える違反が発生すると失敗し、チームにメールが送信されます。

これは、上記のように中間サーバーである可能性があります。ビルド後のアクションには、別のgitリポジトリへのプッシュを含めることができます。

于 2011-05-27T10:01:52.743 に答える
0

gitラッパーを使用し(git-submodulesを目的に応じてより適切なものに置き換えるため)、マジックディレクトリからpre-commitフックを自動的に設定するという副作用があります。これはビジネス環境であるため、不満はありません(とにかくそれをオフにする方法があります)。

于 2011-05-28T21:04:44.360 に答える
0

私もこれを試しました。現在、コードは手元にありませんが、フックの1つ(事前受信ではなく、更新されたものだと思います)を使用して、新しい参照の一時的なチェックアウトを実行しました。更新する必要があるチェックアウトされたツリーを用意し、浅いクローンを作成するだけで、これを高速化できます。

これにより、ソースツリー全体にアクセスできるようになり、プッシュで変更されたファイルに対してCSを実行できるだけでなく、ユニットテストまたはスモークテストも実行できます。

また、コミットフックによってブロックされることほど迷惑なことはないため、これらのテストは最小限に抑える必要があるという他のコメントのいくつかにも同意します。CIサーバーまたはデプロイメントシステムでさらにチェックを行う必要があります。

于 2011-06-22T07:52:28.187 に答える
0

現在、コードとコミットメッセージの両方をチェックするpre-commitフックを採用しています。

開発者はでスキップできますが-n、スキップすることはめったになく、常に別の開発者がQAを行っているため、問題が発生します。

フックは、ファイルが壊れたことを認識し、壊れたPHPまたはJSがまったくコミットされないようにするために重要です。

https://github.com/netresearch/git-client-hooksでフックコードを見つけてください

git clone開発には中央サーバーを使用します。また、ユーザーまたはのときに自動的に使用される中央のgitリポジトリテンプレートを提供するため、gitフックは自動的にインストールされますgit init

于 2014-05-13T08:37:41.323 に答える