web-dev-qa-db-ja.com

Gerritから特定のパッチセットをgit-pullする方法は?

Gerrit(Code Review)を使用する場合、テストまたは検証の目的で特定のパッチセットのコピーを取得する必要があることがよくあります。明白で簡単な方法は、Gerrit Webインターフェースを介してアーカイブまたはパッチファイルをダウンロードし、ローカルソースに手動で適用することです。

上記の手順は非常に簡単で、私のニーズを満たしますが、最高の世界では、ローカルGitでパッチセットをコミットとして表示したいと思います。

私は周りを見回していたが、解決策が見つからなかった。一度一緒にコンパイルすると次の解決策を提供するスパース情報が見つかりました。

Gerrit変更1222のパッチセット2を取得するとします。

興味のあるリモートrefを見つけます。

$ git ls-remote | grep 1220
From http://something.com:8081/MyProject
e2e0212a59240ac5cd7c11220c35542523f44b59        refs/changes/13/713/1
b8c4dceea5eaf1bad711b0ea6938c80ec932726a        refs/changes/20/1220/1
6f20c182ec7f54a2aa9e8f6188a0eef1b0790df4        refs/changes/20/1220/2
ed94a98386d224ce3d86004ce99f61220905a077        refs/changes/22/1222/1

参照を引き出します:

git pull Origin refs/changes/20/1220/2

これにより、最終的にリベースできるGitコミットポイントが作成されます。

git rebase
58
Herve Thu

この機能はGerrit UIの標準です。

パッチのUIの右上にある[ダウンロード]をクリックすると、次のようなものが表示されます。

Gerrit Change Screen Download

パッチをナビゲートしているときは、ダウンロードセクションに移動して、次のようにパッチセットをチェックアウトするためのコマンドラインコマンドをコピーします。

git fetch https://gerrit.googlesource.com/gerrit refs/changes/03/64403/2 && git checkout FETCH_HEAD

次に、通常はレビュー番号とパッチセットを名前に持つブランチを作成します

git checkout -b b64403-2

ここでは、通常どおり作業して変更をコミットするか、この変更で変更をチェリーピック/リベースできます。

R64403のレビューが完了したら、コードをマージできます。または、別のパッチセットが送信された場合、同じことを再度行う必要があります。

CheckoutまたはCherry Pickにオプションをダウンロードするオプションが表示されない場合、次のようなgerrit.configを編集する必要があります。

[download]
    scheme = ssh
    command = checkout
    command = cherry_pick

詳細は Gerrit Documentation で見つけることができます


更新: barryk が正しく指摘しているように、後のバージョンではdownloads-commandsプラグインをダウンロードする必要があります。これは、初期セットアップ中に、または次のコマンドを使用して実行できます。

Java -jar gerrit-2.11.4.war init -d review_site --batch --install-plugin download-commands
63
uncletall

または、-dgit-reviewオプションを使用できます。たとえば、 nova-docker リポジトリで作業しており、gerritのこの変更に関心があると仮定します。

次のような最新のパッチセットをダウンロードできます。

git review -d 148486

または、変更IDを使用できます。

git review -d I35729a86e211391f67cc959d19416c9125c6f9eb

コンマとパッチ番号を追加して、パッチの特定のリビジョンを要求することもできます。たとえば、そのパッチの2番目のリビジョンを取得するには:

git review -d 148486,2
40
larsks

私はあなたの質問が何であるか100%確信していません。ワークフローやタイピングを簡単にしたいようです。 larsksはすでにgit reviewに言及しており、これは主に使用されています。

あなたの場合、多分それはあなたがそれらを直接参照できるようにすべてのrefを自動的にダウンロードするのに役立つかもしれません。次のように、指定されたすべてのrefをいつでも使用できます。

git fetch Origin "+refs/changes/*:refs/remotes/Origin/changes/*" 

そして、コミットIDでローカルに作業できます。

単純なgitエイリアスまたはすべての参照用のスクリプトを簡単に作成できます。このようなwhileループの例は、 https://github.com/saper/gerrit-fetch-all のスクリプトで見つけることができます参照IDを使用して、参照しやすくします。

    Server side:                 Client side:
    refs/changes/13/713/1        refs/head/713/1
    refs/changes/20/1220/1       refs/head/1220/1
    refs/changes/20/1220/2       refs/head/1220/2
    refs/changes/22/1222/1       refs/head/1222/1
8
volker

コメントで述べたように、gerrit GUIから正しいgitコマンドを取得できます。 GUIが本当に嫌いな場合、またはGUIを自動化する場合(および何らかの理由でgit-reviewを使用できない場合)、gerrit APIを使用できます。

curl -s 'https://<your gerrit server>/r/changes/<change id>?o=CURRENT_REVISION&o=DOWNLOAD_COMMANDS' | tail -n+2 | jq -r '.revisions[.current_revision].fetch["anonymous http"].commands.Pull' | bash -

または

git pull Origin `curl -s 'https://<your gerrit server>/r/changes/<change id>?o=CURRENT_REVISION' | tail -n+2 | jq -r '.revisions[.current_revision].ref'`
5
Tgr