Як git-тягнути заданий набір патчів від Gerrit?


75

Працюючи з Gerrit (Перегляд коду), мені часто потрібно отримати копію заданого набору виправлень для тестування або перевірки. Очевидний і найпростіший спосіб - це завантажити архів або файл виправлення через веб-інтерфейс Gerrit і вручну застосувати його до мого локального джерела.

Хоча наведені вище кроки досить прості і відповідають моїм потребам, у найкращому світі я хотів би, щоб набір виправлень з’являвся як коміт у моєму локальному Git.

Я озирався навколо і не знаходив рішення. Я знайшов рідкісну інформацію, яка після компіляції дає таке рішення.

Скажімо, що ви хочете витягнути набір виправлень 2 зміни Герріта 1222:

Знайдіть віддалені посилання, які нас цікавлять:

$ 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

1
Чи є якась причина, чому ви не використовуєте стандартні варіанти завантаження , доступні в інтерфейсі Gerrit?
дядько

Причина полягає в тому, що якщо є очікуваний огляд коду (зроблений кимось іншим), який я хочу отримати, тому що у мене є зміна, яку мені потрібно зробити поверх нього, витягування набору патчів є зручнішим. Це дозволяє мені негайно подати зміну коду, поки попередній пункт коміту все ще переглядається.
Ерве, четвер,

Саме для цього ви використовуєте ці варіанти завантаження. Будь ласка, прочитайте документ, і ви зрозумієте.
дядько

2
FWIW, метод зіставлення на посиланнях менш схильний до помилок git ls-remote origin 'refs/changes/*/1220/*'.
Tgr

Відповіді:


74

Ця функція є стандартною для інтерфейсу Gerrit.

У верхньому правому куті інтерфейсу для виправлення натисніть кнопку Завантажити, і ви побачите щось на зразок:

Завантажити екран зміни екрану

Під час навігації виправленнями ви переходите до розділу завантаження та копіюєте команду командного рядка для перевірки набору виправлень, наприклад так:

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

Детальніше можна знайти в Документації Герріта


Оновлення: Як правильно вказує barryku , у пізнішій версії потрібно завантажити плагін downloads-command. Це можна зробити під час початкового налаштування або за допомогою наступної команди:

java -jar gerrit-2.11.4.war init -d review_site --batch --install-plugin download-commands

Цікаво. У мене немає опцій «Оформити замовлення» та «Вишневий вибір» під «Завантажити». У мене є лише "Патч-файл" та "Архів". Можливо, деякі параметри адміністратора Gerrit, щоб увімкнути показ "Checkout" та "Cherry Pick"? А може, потрібно оновити до останньої версії Gerrit?
Ерве, четвер,

2
Додано відповідний приклад розділу gerrit.config.
дядько

1
Дякую, я повністю пропустив це в інтерфейсі, і знадобився певний час, щоб знайти просту відповідь на зразок цієї.
SpoonMeiser

2
Я кілька разів перезапустив свій сервер Gerrit після безрезультатного налаштування плагіна для завантаження. Виявилося, що файл download-commands.jar відсутній. Після копіювання у зниклу банку з файлу війни ці посилання нарешті з’являються. Я не впевнений, що це тому, що мій сервер був оновлений з 2.x раніше. У будь-якому випадку, на випадок, якщо хтось зіткнеться з цією проблемою, ви можете звернутися до gerrit-documentation.storage.googleapis.com/ReleaseNotes/…, щоб отримати докладнішу інформацію.
barryku

48

Або ви можете використовувати -dопцію git-review . Наприклад, припускаючи, що ви працювали зі сховищем nova-docker і були зацікавлені в цій зміні в gerrit:

Ви можете завантажити останню набір виправлень таким чином:

git review -d 148486

Або ви можете використовувати ідентифікатор зміни:

git review -d I35729a86e211391f67cc959d19416c9125c6f9eb

Ви також можете подати запит на певний перегляд виправлення, додавши кому та номер виправлення. Наприклад, щоб отримати другу редакцію цього патчу:

git review -d 148486,2

Дякую за підказку, але, схоже, мені знадобиться додаткове налаштування, щоб використовувати git review, оскільки я отримую помилку (нижче). $ git review -d I85be47d597611508f5dd9360145bbe2f67cb2148 У цьому сховищі не знайдено файлу '.gitreview'. Ми не знаємо, де ваш геррит. Будь ласка, створіть вручну пульт з ім’ям «gerrit» і повторіть спробу.
Ерве, четвер,

Ах, я припустив, оскільки ви працювали з геррітом, який ви вже використовували git-review. .gitreviewФайл виглядає приблизно так це .
larsks

1
git review -sповинен встановити цей файл.
volker

1
@volker, Вам .gitreviewспочатку потрібен файл (інакше git review -sне знає, де знаходиться ваш пульт дистанційного керування gerrit ...). Якщо ви спробуєте це без .gitreviewфайлу, ви отримаєте "Ні" .gitreview "файл, знайдений у цьому сховищі. Ми не знаємо, де ваш gerrit. Будь ласка, створіть вручну віддалене ім'я" gerrit "і повторіть спробу."
larsks

Зауважте, що залежно від версії самого gerrit-репо, можливо, вам доведеться переконатися, що воно git-reviewстановить 1,27+ (див. Phabricator.wikimedia.org/T194520#5446026 )
Lokal_Profil

10

Я не впевнений на 100%, у чому ваше питання. Здається, ви хочете полегшити робочий процес або набір тексту. larsks, згаданий вже, git reviewякий в основному використовується.

Для вашого випадку, можливо, це допомагає завантажувати всі посилання автоматично, щоб ви могли безпосередньо на них посилатися . Ви завжди можете всі вказані посилання, як з

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

Тоді ви можете працювати локально з ідентифікатором коміту .

Простий псевдонім git або написання його для всіх посилань можна легко зробити. Приклад такого циклу while можна знайти у сценарії на https://github.com/saper/gerrit-fetch-all За допомогою такого маленького фрагмента оболонки ви можете легко виконати, щоб пропустити одну частину ідентифікатора посилання для спрощення посилання їх:

    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

Питання в тому, як витягнути патч із Герріта, і я також відповідав собі на це питання, розповідаючи, як я це роблю. Ніколи не використовував git-review до того, як виписав моє запитання.
Ерве, четвер,

2
Для нас, хто хоче використовувати лише gitвсі зміни, а не встановлювати та налаштовувати певні інструменти gerrit, це правильна відповідь.
Уго Йозефсон

6

Як зазначалося в коментарях, ви можете просто отримати правильну команду git із графічного інтерфейсу gerrit. Якщо вам дійсно не подобається графічний інтерфейс, або ви хочете автоматизувати його (і з якихось причин не можете використовувати git-review), ви можете використовувати API gerrit:

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'`
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.