HEAD がマスター リポジトリから最新であることを確認するための git precommit フック
-
10-10-2019 - |
質問
私はチームを古い CVS リポジトリから git を使用するように移行しています。私は、コミットがローカルで行われる (そしてプッシュされる) 前に、各ユーザーが最新のリポジトリを持っていることを確認するために、プリコミット フックを追加したいと考えていました。
たとえば、CVS では、変更を加えてコミットする前に、全員が「CVS UP」を実行します。強制的に変更を加えない限り変更をコミットできないようにしたいのですが、 git pull origin master
まず (余分なブランチは使用しません)
これを行う簡単な方法はありますか?助けてください:)
解決
SHA が git ls-remote origin HEAD
(リモートチップ) と git rev-parse HEAD
(現地のチップ)は等しいですか?
これを行うと、 多く Git の柔軟性 - それが以下であるかどうかを考えてください。 本当に やりたいこと。強さの一部 git pull
それは、たとえマスター コピーから分岐したものをコミットしたとしても、マスター コピーからプルすると変更をマージできるということです (そして、ほとんどの場合、プロセスは完全に自動です)。
あなたの目標が直線的なコミット履歴を持つことである場合 (これには独自のトレードオフがあります)、以下を参照することをお勧めします。 rebase
開発者にオリジン/マスターの背後で決してコミットしないように強制するのではなく、コマンドを使用します。
編集
実際、あなたがただやっているのであれば、 git pull
(リベースの代わりに) プルではマージ コミットが実行されるため、ヘッドを比較することはできません。代わりに、比較する必要があります git ls-remote origin HEAD
に git merge-base origin/HEAD HEAD
.
その他のコメント
Git を使用しているのに、余分なブランチをまったく使用していないのはなぜですか?これは、車を購入したものの、エンジンをまったく使用しない(代わりに、どこにでも押して移動する)ようなものです。支店は 安い Git を使用すると、セットアップが速く、マージもほとんど簡単に行えます。それらを活用しないと、自分自身に害を及ぼすことになります。
変更を加える前に全員が最新の状態にあることをなぜ気にするのでしょうか?これは CVS ではありません。競合解決はそれほどひどいものではありません。Git は何もしなくても競合の 95% を自動的に解決します。
git pull
変更を加える前か後かはあまり重要ではありません。プッシュする前にプルするだけで問題ありません。前の点に関連して:非早送りプッシュはデフォルトで拒否されるため、実際にはフックは必要ありません。開発者に「プッシュが非早送りとして拒否された場合は、
git pull
, 、もう一度押してみてください」とすべてうまくいきます。
他のヒント
これにより、Gitの「分布」の性質が破壊されます。それはすべてのコミットを多少グローバルにします。 CVSの「コミット」は、リモートエンドと通信するGIT「プッシュ」に類似しています。
分散モデルを本当に活用したい場合は、すべてのコミットでシステムを中央リポジトリにヒットさせるのではなく、チームにローカルコミットのポイントを奨励し、理解させる必要があります(これは集中化されていません)。
リモートブランチを追跡している場合:
git fetch
git log HEAD..origin
# or:
git diff ...origin
他の答えが暗示しているように、その種のチェックを強制することは必ずしも良い解決策ではありません どれか リモートリポジトリですが、警告として興味深い場合があります。
それを忘れないでください git push
それが高速な変更ではない場合、デフォルトで拒否されます.
だから git pull
とにかくそのメッセージを避ける方法になります。