web-dev-qa-db-ja.com

Git Push Origin Masterの代わりにGit Push Gerrit HEAD:refs / for / masterが使用される理由

Gerritを使い始めたばかりで、なぜgit Push gerrit HEAD:refs/for/masterではなくgit Push Origin masterを行う必要があるのか​​知りたい

git Push Origin masterを実行すると、! [remote rejected] master -> master (prohibited by Gerrit)というエラーが表示されます

131
Shrayas

Gerritのドキュメント、特に "Push changes" セクションでは、「Gitクライアントツールを使用して魔法のrefs/for/'branch' ref」にプッシュすることを説明しています。

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

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

これらのネームスペースのいずれかでrefを作成するためのプッシュリクエストを受信すると、Gerritは独自のロジックを実行してデータベースを更新し、操作の結果をクライアントに伝えます。結果が成功すると、クライアントはGerritがrefを作成したと信じますが、実際にはGerritはまったくrefを作成していません。 [ リンク-Gerrit、 "Gritty Details" ]。

The Gerrit workflow

パッチが成功すると(つまり、パッチがGerritにプッシュされ([Pending Changes]ステージングエリアに配置され)、レビューされ、レビューが合格した)、Gerritは変更を[Pending Changes]から[権限のあるリポジトリ」。refs/for/<BRANCH>にプッシュしたときの魔法に基づいて、どのブランチにプッシュするかを計算します。このようにして、正常にレビューされたパッチをAuthoritative Repositoryの正しいブランチから直接プルできます。

239
simont

Git Pushコマンドを完全に指定する必要を回避するために、代わりにgit configファイルを変更できます:

[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 による

51
Sean Murphy