問題タブ [githooks]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
git - リモートのgitリポジトリにプッシュ時にマージコミットを拒否させる
私がやりたいこと:
マージコミットを中央リポジトリにプッシュすることを禁止したい。唯一の例外は、中央リポジトリに存在するブランチ間でマージが行われる場合です。これを中央リポジトリで実施したいと思います。
私がこれをしたい理由の説明:
注:この説明によって、私がやりたいことの道から外れてしまう場合は、説明を無視してください。もちろん、以下で説明する問題を解決する他の方法を聞いてうれしいですが、私が興味を持っている答えは、上記のようにやりたいことです。
いくつかの開発者が追跡するブランチを持つ中央のgitリポジトリがあります。各開発者は、その中央リポジトリのブランチ用にリモートを構成しています。
このプロジェクトの同期コミットポリシーに従うため、各開発者は、プッシュする前に、常に最新の作業をリモートブランチHEADの上にリベースする必要があります。マージコミットが中央リポジトリにプッシュされないようにすることで、このポリシーを適用したいと思います。唯一の例外は、中央リポジトリに存在するブランチ間でマージが行われる場合です。
簡単にするために、開発者のローカル追跡ブランチがリモートブランチとマージされることは望ましくありません。ただし、常にリモートブランチに基づいてリベースします。
branch.NAME.rebase = trueを設定することで、開発者のマシンにこれを部分的に適用しました。これは、開発者がgit pullを使用する場合の問題を回避するのに役立ちますが、中央リポジトリ側でこれを適用するソリューションが必要です。
非常に基本的な解決策は、「GITURLのブランチ'NAME'をマージする」というコメントでコミットを拒否することですが、コミットのすべての親が中央リポジトリのブランチパスに存在するかどうかをチェックするという方針に沿った何かがより興味深いでしょう。
提案?ソリューション?
編集:
これは私がこれまでに持っているものです:
厄介なのは、2人の親の祖先が1つのブランチに由来するかどうかを判断することです。また、refが更新される前にpre-receiveフックが呼び出されるため、プッシュにリモートに存在する2つのブランチのコミットが含まれている場合(これら2つのブランチ間のマージを含む)、ここでの解決策はわかりません。 。
git - Gitフック管理
プロジェクトでは、カスタム作成のGitフックを使用します。
フックはプロジェクトのリポジトリに保存され、変更された場合、新しいバージョンを取得するには、各ユーザーが自分の.git/hooksディレクトリにフックを手動でコピーする必要があります。これはかなり不便です。
これを改善する1つの方法は、.git/hooksをワークツリーへのシンボリックリンクにすることです。ただし、これは、各ブランチ(開発中のユーザーのローカル機能ブランチでさえ)に最新バージョンのフックが必要であることを意味します。これも便利ではありません。
どのように問題を解決しますか?
git - pre-commitフックを使用してコードをクリーンアップする
pre-commitフック中にソースファイルから開発コードをスクラブするのは良い形式ですか?
たとえば、xdebug_break()を呼び出すコードがあり、その関数の呼び出しを、その関数を含むすべてのファイルから削除してから、コードをリポジトリにコミットします。関数を呼び出す前に関数をチェックしたくないのは、そこで関数を呼び出すのは私だけだからです。
python - テストがパスした場合にのみ git でコミットする
私は最近 git を使い始め、単体テスト (Python のunittest
モジュールを使用) も始めました。コミットするたびにテストを実行し、合格した場合にのみコミットしたいと思います。
pre-commit
inを使用する必要があると推測/hooks
し、テストを実行することはできましたが、テストが失敗した場合にコミットを停止する方法を見つけることができないようです。でテストを実行しています。make test
これは実行中python3.1 foo.py --test
です。テストが成功したか失敗したかにかかわらず、別の終了条件が得られないように見えますが、間違った場所を探している可能性があります。
編集:これは私がここでやりたい珍しいことですか?私はそれが一般的な要件だと思っていたでしょう...
Edit2:人々がコメントを読むのが面倒な場合に備えて、問題はunittest.TextTestRunner
、テスト スイートが成功したかどうかに関係なく、ゼロ以外のステータスで終了しないことでした。それをキャッチするために、私はしました:
git - 現在および将来のすべてのリポジトリに git post-commit フックを適用する
Git post-commit フックを作成しましたが、正しく動作します。ただし、このフックを追加して、作業中の現在 (および将来) のすべての Git リポジトリに適用したいと考えています。~/.git/hooks/
プロジェクト ディレクトリの hooks ディレクトリではなく、自分のディレクトリにフックを追加しようとしましたが、うまくいかないようでした。
システム上のすべてのリポジトリに適用されるグローバル Git フックを作成する方法はありますか (各プロジェクト ディレクトリにコピーする必要はありません)。そうでない場合、今後の最善の解決策は何でしょうか? おそらく git-init テンプレートでしょうか?
git - 完全に機能するクロスプラットフォームのシバンラインのハックはありますか?
問題:どうやら.git / hooksディレクトリのスクリプトは、次のいずれかに一致するファイル名に依存しているようです。
など..。
Linuxボックスで実行可能で実行可能である限り、「shebang行」はファイルの実行方法を示すため、「ファイル拡張子」の概念は必要ありません。
問題は、Windowsボックスで実行したいスクリプトがある場合です。
質問: Windowsマシンで理解できるフックスクリプトを実行する方法はありますか?
git - Gitの受信後フックが機能しない
中央リポジトリでgitを使用しています(Gitosisを使用)。変更が中央リポジトリにプッシュされるたびに開発メーリングリストに電子メールを生成し、gitリポジトリのドキュメントフォルダーからドキュメントを生成するための受信後フックを作成しました。
したがって、〜git /にはディレクトリがあり、gitリポジトリのクローンを含む「a」と呼びます。受信後のフックは次のようになります。
電子メールスクリプトは機能していますが、ドキュメントの生成は機能していません。pull_log.logの内容は次のとおりです。
これは、上記のスクリプトの5行目の正しいディレクトリに変更されていないと思います。私が間違っている?どうすればこれを機能させることができますか?
編集:応答で提案されているように、受信後のフックを更新しました。スクリプトは次のようになります。
そして、gitpushから次の出力が得られます。
これ以上の助けはありますか?
ああ、スクリプトを自分で実行すると、機能します(hooks / post-receiveと言って実行します)
serverfaultのおかげで、問題を発見しました。基本的に、環境変数はフックの実行時GIT_DIR
にGIT_WORK_TREE
設定され、これらはgitpullに悪影響を及ぼします。変数を設定解除すると、問題が修正されます。
git - リモートで git pull をフックするにはどうすればよいですか?
リモートで git pull が発生したときにフックする方法はありますか (pre-receive または post-receive に似ています)。基本的に、プルがあるときにリモートが持っているものを何でもコミットできるようにしたいと考えています。
私の状況では、リモートでライブになっているものはすべて、git コミットなしで変更される可能性のある信頼できるソースです。プルするときに、ライブの最新情報を常に取得できるようにしたいと考えています。
git - gitフックを事前にプッシュしますか?
git push
ユーザーが変更をリモート リポジトリにプッシュしようとするたびに、圧縮可能なアセット内のコミットされていない変更をチェックし、中止git push
し、実行git commit
してから再度実行するように、圧縮スクリプトを実行したいと思いますgit push
。
gitフックのみを使用してそのようなことは可能ですか?
git - git init テンプレート、変更されたフックの置き換え
ローカルの git フックを常に更新しています。.git テンプレートを格納するリポジトリがあります。これは、フックの変更でリポジトリを更新するために、常に git init --template=../git-template を実行していることを意味します。
問題: git init --temp... を実行するたびに、更新されたフックに置き換えられる .git/hooks 内のフックを最初に削除する必要があります。これは面倒です。更新したいレポからこれらのフックを削除するスクリプトを作成できることはわかっていますが、この機能は既に git に組み込まれていますか?