Использование рабочего процесса AGit
Forgejo поставляется с ограниченной поддержкой AGit-Flow, который был изначально представлен в Gitea версии 1.13.
Аналогично рабочему процессу Gerrit, этот подход позволяет отправлять изменения в репозитории, размещённые на экземплярах Forgejo, используя только команду git push, без необходимости создавать форки, ветки фич и затем использовать веб-интерфейс для создания Pull Request’а.
С помощью Push-опций (-o) и Refspec (идентификатор места назначения в Git) можно передать всю необходимую информацию для открытия Pull Request’а, такую как целевая ветка или заголовок Pull Request’а.
Создание Pull Request’ов
Для наглядности начнём с примеров.
Полный список параметров, а также информация об избежании дубликатов Pull Request’ов при ребейзе или изменении коммитов, будет приведён далее.
Примеры использования
Предположим, что вы клонировали репозиторий и создали новый коммит поверх ветки main. Pull Request, нацеленный на ветку main, с использованием текущей ветки можно создать так:
git push origin HEAD:refs/for/main -o topic="agit-typo-fixes"Обратите внимание, что HEAD:refs/for/main — это Refspec. HEAD указывает на текущую ветку, но может быть заменён на любую "локальную ссылку". refs/for/main — это место назначения ("удалённая ссылка"), где main — "целевая ветка", то есть ветка, в которую предлагается применить изменение.
Topic будет виден в Pull Request’е и используется для связи последующих коммитов с тем же Pull Request’ом.
Указание topic через параметр сессии
Topic можно также задать через параметр <session> в Refspec. В следующем примере мы создаём новый Pull Request, используя текущую ветку (HEAD). Целевая ветка — main, topic — topic-branch.
# topic-branch — это и session, и topic
git push origin HEAD:refs/for/main/topic-branchОтправка ссылки, отличной от текущей (не HEAD)
Предположим, вы хотите создать Pull Request для удалённой ветки remote-branch с topic topic, но изменения находятся в локальной ветке local-branch, которую вы не хотите переключать. В этом случае можно выполнить:
git push origin local-branch:refs/for/remote-branch/topicУстановка заголовка и описания в AGit
Также можно использовать дополнительные параметры, такие как title и description. Пример для ветки main:
git push origin HEAD:refs/for/main -o topic="topic-branch" \
-o title="Заголовок PR" \
-o description="# Описание PR
Это может быть **любой** markdown.\n
- [x] Всё ОК"Изменение метода отправки по умолчанию
Чтобы отправлять коммиты в Pull Request без указания Refspec, можно изменить метод push по умолчанию на upstream:
# Только для текущего репозитория
git config push.default upstream
# Или глобально
git config --global push.default upstreamЗатем выполните:
git config branch.local-branch.merge refs/for/main/topic-branchПосле этого можно просто запускать git push для отправки коммитов в Pull Request без указания Refspec. Также это позволит использовать pull, fetch, rebase и другие команды по умолчанию с этим Pull Request’ом.
Параметры
git push <имя-удалённого> <локальная-ссылка>:refs/for[draft|for-review]/<ветка>/<сессия> [-o <topic|title|description|force-push>]Доступные параметры:
<имя-удалённого>: имя удалённого репозитория (например,origin) (обязательно)<локальная-ссылка>: ссылка на локальный объект (например,HEAD,my-branch, хеш коммита) (обязательно)refs/<for|draft|for-review>/<ветка>/<сессия>: Refspec (обязательно)for/draft/for-review: Тип Pull Request’а.forоткрывает обычный Pull Request.draftиfor-reviewпока игнорируются.<ветка>: целевая ветка для Pull Request’а (обязательно)<сессия>: идентификатор сессии или topic для Pull Request’а. Если не указан, параметр-o topicобязателен.
-o <topic|title|description|force-push>: Опции Pushtopic: Идентификатор. Если не указан, будет использовано значение<сессия>. Если ни того, ни другого нет, Forgejo вернёт ошибку. Для добавления новых коммитов в уже созданный Pull Request необходимо использовать тот же topic.title: Заголовок Pull Request’а. Если не указан, будет использована первая строка первого нового коммита.description: Описание Pull Request’а.force-push: Необходимо при ребейзе, изменении коммитов или ретроактивном редактировании истории. Иначе будет создан новый Pull Request, даже при том же topic. Если используется, значение должно бытьtrue.
Forgejo полагается на параметр topic и линейную историю коммитов, чтобы связать новые коммиты с существующим Pull Request’ом. Если вы хотите перезаписать содержимое уже созданного PR, используйте параметр force-push.
Для пользователей Gerrit: Forgejo не поддерживает Change-Id из Gerrit.