私がやりたいこと:
マージコミットを中央リポジトリにプッシュすることを禁止したい。唯一の例外は、中央リポジトリに存在するブランチ間でマージが行われる場合です。これを中央リポジトリで実施したいと思います。
私がこれをしたい理由の説明:
注:この説明によって、私がやりたいことの道から外れてしまう場合は、説明を無視してください。もちろん、以下で説明する問題を解決する他の方法を聞いてうれしいですが、私が興味を持っている答えは、上記のようにやりたいことです。
いくつかの開発者が追跡するブランチを持つ中央のgitリポジトリがあります。各開発者は、その中央リポジトリのブランチ用にリモートを構成しています。
このプロジェクトの同期コミットポリシーに従うため、各開発者は、プッシュする前に、常に最新の作業をリモートブランチHEADの上にリベースする必要があります。マージコミットが中央リポジトリにプッシュされないようにすることで、このポリシーを適用したいと思います。唯一の例外は、中央リポジトリに存在するブランチ間でマージが行われる場合です。
簡単にするために、開発者のローカル追跡ブランチがリモートブランチとマージされることは望ましくありません。ただし、常にリモートブランチに基づいてリベースします。
branch.NAME.rebase = trueを設定することで、開発者のマシンにこれを部分的に適用しました。これは、開発者がgit pullを使用する場合の問題を回避するのに役立ちますが、中央リポジトリ側でこれを適用するソリューションが必要です。
非常に基本的な解決策は、「GITURLのブランチ'NAME'をマージする」というコメントでコミットを拒否することですが、コミットのすべての親が中央リポジトリのブランチパスに存在するかどうかをチェックするという方針に沿った何かがより興味深いでしょう。
提案?ソリューション?
編集:
これは私がこれまでに持っているものです:
#!/bin/sh
read sha1old sha1new refname
# check if this is merge commit
merge_commit="`git rev-list --parents --merges --no-walk $sha1new 2> /dev/null`"
if test -n "$merge_commit"
then
# this was a merge commit
# $merge_commit contains: sha1new sha1parent_1 ... sha1parent_n
fi
exit 0
厄介なのは、2人の親の祖先が1つのブランチに由来するかどうかを判断することです。また、refが更新される前にpre-receiveフックが呼び出されるため、プッシュにリモートに存在する2つのブランチのコミットが含まれている場合(これら2つのブランチ間のマージを含む)、ここでの解決策はわかりません。 。