3

チームを古いCVSリポジトリからgitの使用に移行しています。コミットがローカルで実行される(そしてプッシュされる)前に、各人が最新のリポジトリを持っていることを確認するために、precommitフックを追加したいと思っていました。

たとえば、CVSでは、変更を加えてからコミットする前に、全員が「cvsup」を実行します。私はそれを強制したいので、最初に行わない限り人々が変更をコミットできないようにしますgit pull origin master(余分なブランチは使用しません)

これを行う簡単な方法はありますか?助けを応援します:)

4

3 に答える 3

5

git ls-remote origin HEAD(リモートチップ)と(ローカルチップ)のSHAgit 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からもう一度プッシュしてみてください」と伝えるだけで、すべてが機能します。

于 2010-10-22T05:57:04.990 に答える
2

これにより、gitの「分散」の性質が破壊されます。これにより、すべてのコミットがある程度グローバルになります。cvsの「commit」は、リモートエンドと通信するgitの「push」に類似しています。

分散モデルを本当に利用したい場合は、すべてのコミットでシステムを中央リポジトリにヒットさせるのではなく、チームにローカルコミットのポイントを理解させるように促し、理解させる必要があります。

于 2010-10-22T05:58:53.977 に答える
2

リモートブランチを追跡している場合:

git fetch
git log HEAD..origin
# or:
git diff ...origin

他の回答がほのめかしているように、この種のチェックを強制することは、リモートリポジトリにとって必ずしも良い解決策ではありませんが、警告として興味深い場合があります。

git push早送りの変更でない場合、aはデフォルトで拒否されることを忘れないでください。
したがって、git pullとにかくそのメッセージを回避する方法になります。

于 2010-10-22T06:07:18.110 に答える