git push originマスターの代わりにgit push gerrit HEAD:refs / for / masterが使用されるのはなぜですか


148

私はgerritを使い始めたばかりで、なぜ私たちがgit push gerrit HEAD:refs/for/master代わりにやらなければならないのか知りたいですgit push origin master

実行するとgit push origin master、次のエラーが表示されます! [remote rejected] master -> master (prohibited by Gerrit)

回答:


259

Gerritのドキュメント、特に「プッシュ変更」セクションでは、「refs/for/'branch'Gitクライアントツールを使用した魔法のリファレンス」にプッシュすることが説明されています。

次の画像は、Intro to Gerritから取得したものです。Gerritにプッシュすると、を実行しますgit push gerrit HEAD:refs/for/<BRANCH>。これにより、変更がステージング領域にプッシュされます(図では、「保留中の変更」)。Gerritには実際にはと呼ばれるブランチはありません<BRANCH>。それはgitクライアントにあります。

内部的には、Gerritには、GitおよびSSHスタック用の独自の実装があります。これにより、「魔法の」refs/for/<BRANCH>参照を提供できます。

これらの名前空間のいずれかに参照を作成するためのプッシュ要求が受信されると、Gerritは独自のロジックを実行してデータベースを更新し、操作の結果についてクライアントに嘘をつきます。成功した結果により、クライアントはGerritが参照を作成したと考えますが、実際にはGerritは参照をまったく作成していません。[ リンク-Gerrit、「Gritty Details」 ]。

Gerritワークフロー

パッチが成功すると(つまり、パッチがGerritにプッシュされ、[「保留中の変更」のステージング領域に入れて]確認され、レビューに合格した)、Gerritは「保留中の変更」から「 Authoritative Repository」refs/for/<BRANCH>。プッシュするときに行った魔法に基づいて、プッシュするブランチを計算します。このようにして、レビューに成功したパッチは、の正しいブランチから直接プルできますAuthoritative Repository


好奇心から、「git push origin」のようなことだけをするとどうなりますか?試してみましたが、どこにも変化が見られないので、質問です。しかし、それは当然、私のローカルログに存在します。

1
@Pintolaranja偶然同じことをした。そうです、Gerritはそのような状況を「処理」しますが、それによって何の変化も生じません。そのため、実際にはまったく処理されません。これは本当に愚かなので、私は本当に私を怒らせます。なぜユーザーが何かをコミットできるようにするのか、そのGerritは適切に処理できないのですか?
trejder 2013

1
@gregbはい。矢印はコマンドのソースと宛先を示し、その結果としての後続のデータフローは示していません。たとえば、開発者1が権限のあるリポジトリにフェッチを発行し、その逆ではありません
Gareth

5
@trejder Gerritでは、レビューをバイパスするように一部のアカウントを設定できるため、これが可能になります。デフォルトのブランチにプッシュすると、「レビューなしでこの変更をマージしたい」と効果的に言うことになります。それが許可されていない場合、プッシュは失敗します。
Hounshell 2015年

4
または、gerritを使用して、この陽気な混乱を完全に回避することはできません。
Cジョンソン

57

git pushコマンドを完全に指定する必要がないようにするには、代わりにgit構成ファイルを変更します。

[remote "gerrit"]
    url = https://your.gerrit.repo:44444/repo
    fetch = +refs/heads/master:refs/remotes/origin/master
    push = refs/heads/master:refs/for/master

今、あなたは簡単にできます:

git fetch gerrit
git push gerrit

これはGerritによると


1
私からの+1!remote.origin.push毎回入力/貼り付けする代わりに、これをハードコード化しておく方がずっといいです!
DaoWen、2015年

7
@SeanMurphy 'master'のインスタンスを '*'に置き換えることで、より一般的なものにすることができます。これにより、 'git push gerrit TopicBranch'なども機能します。
David Doria、

また、gerritが唯一のリモートである場合は、それを指定する必要はありません。私は単純にやるgit fetchgit push@DavidDoriaは、上記の設定を持ちます。
bernk

push = refs / heads / *:refs / for / *はすべてのブランチに対応
Victor Choy

現在のブランチではなく、上流のブランチを使用する必要があります。私は通常、12個ほどの変更を並行して行っているため、単一のブランチを使用しても機能しません。
クリスチャンゲッツェ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.