Gerritを使い始めたばかりで、なぜgit Push gerrit HEAD:refs/for/master
ではなくgit Push Origin master
を行う必要があるのか知りたい
git Push Origin master
を実行すると、! [remote rejected] master -> master (prohibited by Gerrit)
というエラーが表示されます
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" ]。
パッチが成功すると(つまり、パッチがGerritにプッシュされ([Pending Changes]ステージングエリアに配置され)、レビューされ、レビューが合格した)、Gerritは変更を[Pending Changes]から[権限のあるリポジトリ」。refs/for/<BRANCH>
にプッシュしたときの魔法に基づいて、どのブランチにプッシュするかを計算します。このようにして、正常にレビューされたパッチをAuthoritative Repository
の正しいブランチから直接プルできます。
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 による