1つの公式リポジトリをリモートとして使用し、そこから複数のローカルリポジトリを複製した場合、そのメインリポジトリでpre-commitフックをスクリプト化して、そのすべてのクローンに適用できますか?
6 に答える
フックが複製されていないので、私はそうは思いません。
そのフックスクリプト自体がバージョン管理されている場合は、クローンサーバーの(シンボリックリンク)にリンクします(OSがそのリンク機能をサポートしている場合)。
または、フックがクローンの作成に使用されるgitテンプレートディレクトリの一部である場合(クローンリポジトリでの存在を保証するだけで、実際に使用および実行されることを保証するものではありません)。
しかし、コミットを強制するための「中心的な」方法はないと思います。
Jefromiがコメントでさらに明確に説明しているように(私の強調):
リポジトリにフックを強制的に分散させることは、gitリポジトリの考え方に反していると思います。
私のクローンは私のリポジトリです。フックを実行するかどうかの選択など、好きなようにgitを使用できるはずです。
(セキュリティの観点からすると、それは本当に恐ろしいことです。特定のgitコマンドを実行するたびに、特定のスクリプトを実行するように強制することはできません。)
私はそのコメントに同意し、特定の特殊なリポジトリでローカルに適用されるルールを適用する方法を見ただけです。
たとえば、中央リポジトリに直接プッシュするのではなく、特定のルールに従っている場合にのみコミットを受け入れるQAリポジトリに最初にプッシュします。含まれている場合、QAリポジトリはコミットを中央リポジトリにプッシュします。
私が今述べたことから直接派生した別の図は、 「 Gitとのサーバーレス継続的インテグレーション」です。これは、どこにでもプッシュする前に機能するローカルプライベートビルドを強制する方法です。
人々のローカルリポジトリにpre-commitフックを強制することはできませんが、中央リポジトリではpre-receiveフックを実行できます。
F. exコミットメッセージが特定のルール(trac統合など)に従っていることを確認する必要があったため、中央リポジトリにプッシュされているすべてのコミットメッセージをチェックし、そうでない場合はプッシュを拒否する次の受信前フックを使用しました歓迎された。
#!/ bin / sh rev_oldrev_newrefを読みながら 行う MALFORMED = "$(git rev-list --oneline $ rev_old .. $ rev_new | egrep -v'#[0-9] +'| awk'{print $ 1}')" if [x "$ MALFORMED"!= x] それから $MALFORMEDに無効なコミットメッセージをエコーします 出口1 fi 終わり
詳細については、f.exhttps://git-scm.com/book/en/v2/Customizing-Git-Git-Hooksを参照してください。
はいといいえ。
JavaScriptを作成している場合、これを行うための最良の方法はハスキーを使用することです。Huskyには、githookをセットアップおよび管理するpostInstallスクリプトがあります。次に、package.jsonまたはハスキードットファイルでprecommitおよびprepushスクリプトを構成できます。
これを使用して、任意のスクリプトを実行できます。私は通常yarn lint
、yarn test
準備します。
JavaScriptを使用していない場合、またはHuskyを使用できない場合は、コミットフックを開発者のマシンに複製してリポジトリにチェックインできますが、開発者に強制的に実行させることはできません。
フックをチェックインするにhooks
は、リポジトリのどこかにディレクトリを作成します。.git/hooks
次に、通常のディレクトリの代わりにフックを配置します。これはあなたが強制できる部分です。
他の部分は開発者の信用に依存します。hooksフォルダーをhooksPathとして設定するには、各開発者は以下を実行する必要があります。
git config core.hooksPath hooks
これで、hooksフォルダー内のすべてのフックが期待どおりに実行されます。
pre-commitフックをそのメインリポジトリでスクリプト化し、そのすべてのクローンに適用できますか?
差出人githooks(5)
:
事前コミット このフックはgitcommitによって呼び出され、次の方法でバイパスできます。 --no-verifyオプション。
フックは簡単にバイパスできるので、あなたの質問に対する答えは「いいえ」のようです。
また、.git / hooksディレクトリは複製されていないため、クライアントにプッシュするメカニズムはないようです。
ビルドシステムが関連付けられているソースコードがgitリポジトリにあると仮定すると、ビルドシステムを構成して、バージョン管理されているpre-commitフックを移動またはリンクすることでpre-commitフックを設定できます。
私はまだこれを試していません。より良い解決策を探しながらここに来ました。
新しいファイルを作成します。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>"