5ba27bdc38
Change-Id: Ic8d81a64a89fe0046fccc13e7892acbe52c55bc4 Signed-off-by: Edwin Kempin <edwin.kempin@sap.com>
750 lines
32 KiB
Plaintext
750 lines
32 KiB
Plaintext
= Project Owner Guide
|
|
|
|
This is a Gerrit guide that is dedicated to project owners. It
|
|
explains the many possibilities that Gerrit provides to customize the
|
|
workflows for a project.
|
|
|
|
[[project-owner]]
|
|
== What is a project owner?
|
|
|
|
Being project owner means that you own a project in Gerrit.
|
|
Technically this is expressed by having the
|
|
link:access-control.html#category_owner[Owner] access right on
|
|
`refs/*` on that project. As project owner you have the permission to
|
|
edit the access control list and the project settings of the project.
|
|
It also means that you should get familiar with these settings so that
|
|
you can adapt them to the needs of your project.
|
|
|
|
Being project owner means being responsible for the administration of
|
|
a project. This requires having a deeper knowledge of Gerrit than the
|
|
average user. Normally per team there should be 2 to 3 persons, who
|
|
have a certain level of Git/Gerrit knowledge, assigned as project
|
|
owners. It normally doesn't make sense that everyone in a team is
|
|
project owner. For normal team members it is sufficient to be committer
|
|
or contributor.
|
|
|
|
[[access-rights]]
|
|
== Access Rights
|
|
|
|
As a project owner you can edit the access control list of your
|
|
project. This allows you to grant permissions on the project to
|
|
different groups.
|
|
|
|
Gerrit comes with a rich set of permissions which allow a very
|
|
fine-grained control over who can do what on a project. Access
|
|
control is one of the most powerful Gerrit features but it is also a
|
|
rather complex topic. This guide will only highlight the most
|
|
important aspects of access control, but the link:access-control.html[
|
|
Access Control] chapter explains all the details.
|
|
|
|
[[edit-access-rights]]
|
|
=== Editing Access Rights
|
|
|
|
To see the access rights of your project
|
|
|
|
- go to the Gerrit Web UI
|
|
- click on the `Projects` > `List` menu entry
|
|
- find your project in the project list and click on it
|
|
- click on the `Access` menu entry
|
|
|
|
By clicking on the `Edit` button the access rights become editable and
|
|
you may save any changes by clicking on the `Save Changes` button.
|
|
Optionally you can provide a `Commit Message` to explain the reasons
|
|
for changing the access rights.
|
|
|
|
The access rights are stored in the project's Git repository in a
|
|
special branch called `refs/meta/config`. On this branch there is a
|
|
`project.config` file which contains the access rights. More
|
|
information about this storage format can be found in the
|
|
link:config-project-config.html[Project Configuration File Format]
|
|
chapter. What is important to know is that by looking at the history
|
|
of the `project.config` file on the `refs/meta/config` branch you can
|
|
always see how the access rights were changed and by whom. If a good
|
|
commit message is provided you can also see from the history why the
|
|
access rights were modified.
|
|
|
|
If a Git browser such as GitWeb is configured for the Gerrit server you
|
|
can find a link to the history of the `project.config` file in the
|
|
Web UI. Otherwise you may inspect the history locally. If you have
|
|
cloned the repository you can do this by executing the following
|
|
commands:
|
|
|
|
====
|
|
$ git fetch origin refs/meta/config:config
|
|
$ git checkout config
|
|
$ git log project.config
|
|
====
|
|
|
|
Non project owners may still edit the access rights and propose the
|
|
modifications to the project owners by clicking on the `Save for
|
|
Review` button. This creates a new change with the access rights
|
|
modifications that can be approved by a project owner. The project
|
|
owners are automatically added as reviewer on this change so that they
|
|
get informed about it by email.
|
|
|
|
[[inheritance]]
|
|
=== Inheritance
|
|
|
|
Normally when a new project is created in Gerrit it already has some
|
|
access rights which are inherited from the parent projects.
|
|
Projects in Gerrit are organized hierarchically as a tree with the
|
|
`All-Projects' project as root from which all projects inherit. Each
|
|
project can have only a single parent project, multi-inheritance is
|
|
not supported.
|
|
|
|
Looking at the access rights of your project in the Gerrit Web UI, you
|
|
only see the access rights which are defined on that project. To see
|
|
the inherited access rights you must follow the link to the parent
|
|
project under `Rights Inherit From`.
|
|
|
|
Inherited access rights can be overwritten unless they are defined as
|
|
link:access-control.html#block[BLOCK rule]. BLOCK rules are used to
|
|
limit the possibilities of the project owners on the inheriting
|
|
projects. With this, global policies can be enforced on all projects.
|
|
Please note that Gerrit doesn't prevent you from assigning access
|
|
rights that contradict an inherited BLOCK rule, but these access rights
|
|
will simply have no effect.
|
|
|
|
If you are responsible for several projects which require the same
|
|
permissions, it makes sense to have a common parent for them and to
|
|
maintain the access rights on that common parent. Changing the parent
|
|
of a project is only allowed for Gerrit administrators. This means you
|
|
need to contact the administrator of your Gerrit server if you want to
|
|
reparent your project. One way to do this is to change the parent
|
|
project in the Web UI, save the modifications for review and get the
|
|
change approved and merged by a Gerrit administrator.
|
|
|
|
[[refs]]
|
|
=== References
|
|
|
|
Access rights in Gerrit are assigned on references (aka refs). Refs in
|
|
Git exist in different namespaces, e.g. all branches normally exist
|
|
under `refs/heads/` and all tags under `refs/tags/`. In addition there
|
|
are a number of link:access-control.html#references_special[special refs]
|
|
and link:access-control.html#references_magic[magic refs].
|
|
|
|
Access rights can be assigned on a concrete ref, e.g.
|
|
`refs/heads/master` but also on ref patterns and regular expressions
|
|
for ref names.
|
|
|
|
A ref pattern ends with `/*` and describes a complete ref name
|
|
namespace, e.g. access rights assigned on `refs/heads/*` apply to all
|
|
branches.
|
|
|
|
Regular expressions must start with `^`, e.g. access rights assigned
|
|
on `^refs/heads/rel-.*` would apply to all `rel-*` branches.
|
|
|
|
[[groups]]
|
|
=== Groups
|
|
|
|
Access rights are granted to groups. It is useful to know that Gerrit
|
|
maintains its own groups internally but also supports different external
|
|
group backends.
|
|
|
|
The Gerrit internal groups can be seen in the Gerrit Web UI by clicking
|
|
on the `Groups` > `List` menu entry. By clicking on a group you can
|
|
edit the group members (`Members` tab) and the group options
|
|
(`General` tab).
|
|
|
|
Gerrit internal groups contain users as members, but can also include
|
|
other groups, even external groups.
|
|
|
|
Every group is owned by an owner group. Only members of the owner
|
|
group can administrate the owned group (assign members, edit the group
|
|
options). A group can own itself; in this case members of the group
|
|
can, for example, add further members to the group. When you create new
|
|
groups for your project to assign access rights to committer or other
|
|
roles, make sure that they are owned by the project owner group.
|
|
|
|
An important setting on a group is the option
|
|
`Make group visible to all registered users.`, which defines whether
|
|
non-members can see who is member of the group.
|
|
|
|
New internal Gerrit groups can be created under `Groups` >
|
|
`Create New Group`. This menu is only available if you have the global
|
|
capability link:access-control.html#capability_createGroup[Create Group]
|
|
assigned.
|
|
|
|
Gerrit also has a set of special
|
|
link:access-control.html#system_groups[system groups] that you might
|
|
find useful.
|
|
|
|
External groups need to be prefixed when assigning access rights to
|
|
them, e.g. link:access-control.html#ldap_groups[LDAP group names] need
|
|
to be prefixed with `ldap/`.
|
|
|
|
If the link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/singleusergroup[
|
|
singleusergroup] plugin is installed you can also directly assign
|
|
access rights to users, by prefixing the username with `user/` or the
|
|
user's account ID by `userid/`.
|
|
|
|
[[common-access-rights]]
|
|
=== Common Access Rights
|
|
|
|
Different roles in a project, such as developer (committer) or
|
|
contributor, need different access rights. Examples for which access
|
|
rights are typically assigned for which role are described in the
|
|
link:access-control.html#example_roles[Access Control] chapter.
|
|
|
|
[[code-review]]
|
|
=== Code Review
|
|
|
|
Gerrit's main functionality is code review, however using code review
|
|
is optional and you may decide to only use Gerrit as a Git server with
|
|
access control. Whether you allow only pushes for review or also
|
|
direct pushes depends on the project's access rights.
|
|
|
|
To push a commit for review it must be pushed to
|
|
link:access-control.html#refs_for[refs/for/<branch-name>]. This means
|
|
the link:access-control.html#category_push_review[Push] access right
|
|
must be assigned on `refs/for/<branch-name>`.
|
|
|
|
To allow direct pushes and bypass code review, the
|
|
link:access-control.html#category_push_direct[Push] access right is
|
|
required on `refs/heads/<branch-name>`.
|
|
|
|
By pushing for review you are not only enabling the review workflow,
|
|
but you can also get link:#continuous-integration[automatic
|
|
verifications from a build server] before changes are merged. In
|
|
addition you can benefit from Gerrit's merge strategies that can
|
|
automatically merge/rebase commits on server side if necessary. You can
|
|
control the merge strategy by configuring the
|
|
link:project-configuration.html#submit_type[submit type] on the project. If you
|
|
bypass code review you always need to merge/rebase manually if the tip
|
|
of the destination branch has moved. Please keep this in mind if you
|
|
choose to not work with code review because you think it's easier to
|
|
avoid the additional complexity of the review workflow; it might
|
|
actually not be easier.
|
|
|
|
You may also enable link:user-upload.html#auto_merge[auto-merge on
|
|
push] to benefit from the automatic merge/rebase on server side while
|
|
pushing directly into the repository.
|
|
|
|
[[project-options]]
|
|
== Project Options
|
|
|
|
As project owner you can control several options on your project.
|
|
The different options are described in the
|
|
link:project-configuration.html#project_options[Project Options] section.
|
|
|
|
To see the options of your project
|
|
|
|
- go to the Gerrit Web UI
|
|
- click on the `Projects` > `List` menu entry
|
|
- find your project in the project list and click on it
|
|
- click on the `General` menu entry
|
|
|
|
[[submit-type]]
|
|
=== Submit Type
|
|
|
|
An important decision for a project is the choice of the submit type
|
|
and the content merge setting (aka `Automatically resolve conflicts`).
|
|
The link:project-configuration.html#submit_type[submit type] is the method
|
|
Gerrit uses to submit a change to the project. The submit type defines
|
|
what Gerrit should do on submit of a change if the destination branch
|
|
has moved while the change was in review. The
|
|
link:project-configuration.html#content_merge[content merge] setting applies
|
|
if the same files have been modified concurrently and tells Gerrit
|
|
whether it should attempt a content merge for these files.
|
|
|
|
When choosing the submit type and the content merge setting one must
|
|
weigh development comfort against the safety of not breaking the
|
|
destination branch.
|
|
|
|
The most restrictive submit type is
|
|
link:project-configuration.html#fast_forward_only[Fast Forward Only]. Using
|
|
this submit type means that after submitting one change all other open
|
|
changes for the same destination branch must be rebased manually. This
|
|
is quite burdensome and in practice only feasible for branches with
|
|
very few changes. On the other hand, if changes are verified before
|
|
submit, e.g. automatically by a CI integration, with this submit type,
|
|
you can be sure that the destination branch never gets broken.
|
|
|
|
Choosing link:project-configuration.html#merge_if_necessary[Merge If Necessary]
|
|
as submit type makes the life for developers more comfortable,
|
|
especially if content merge is enabled. If this submit strategy is used
|
|
developers only need to rebase manually if the same files have been
|
|
modified concurrently or if the content merge on such a file fails. The
|
|
drawback with this submit type is that there is a risk of breaking
|
|
the destination branch, e.g. if one change moves a class into another
|
|
package and another change imports this class from the old location.
|
|
Experience shows that in practice `Merge If Necessary` with content
|
|
merge enabled works pretty well and breaking the destination branch
|
|
happens rarely. This is why this setting is recommended at least for
|
|
development branches. You likely want to start with
|
|
`Merge If Necessary` with content merge enabled and only switch to a
|
|
more restrictive policy if you are facing issues with the build and
|
|
test stability of the destination branches.
|
|
|
|
It is also possible to define the submit type dynamically via
|
|
link:#prolog-submit-type[Prolog]. This way you can use different submit
|
|
types for different branches.
|
|
|
|
Please note that there are other submit types available; they are
|
|
described in the link:project-configuration.html#submit_type[Submit Type]
|
|
section.
|
|
|
|
[[labels]]
|
|
== Labels
|
|
|
|
The code review process includes that reviewers formally express their
|
|
opinion about a change by voting on different link:config-labels.html[
|
|
labels]. By default Gerrit comes with the
|
|
link:config-labels.html#label_Code-Review[Code-Review] label and many
|
|
Gerrit servers have the link:config-labels.html#label_Verified[Verified]
|
|
label configured globally. However projects can also define their own
|
|
link:config-labels.html#label_custom[custom labels] to formalize
|
|
project-specific workflows. For example if a project requires an IP
|
|
approval from a special IP-team, it can define an `IP-Review` label
|
|
and grant permissions to the IP-team to vote on this label.
|
|
|
|
The behavior of a label can be controlled by its
|
|
link:config-labels.html#label_function[function], e.g. it can be
|
|
configured whether a max positive voting on the label is required for
|
|
submit or if the voting on the label is optional.
|
|
|
|
By using a custom link:#submit-rules[submit rule] it can be controlled
|
|
per change whether a label is required for submit or not.
|
|
|
|
A useful feature on labels is the possibility to automatically copy
|
|
scores forward to new patch sets if it was a
|
|
link:config-labels.html#label_copyAllScoresOnTrivialRebase[trivial
|
|
rebase] or if link:config-labels.html#label_copyAllScoresIfNoCodeChange[
|
|
there was no code change] (e.g. only the commit message was edited).
|
|
|
|
[[submit-rules]]
|
|
== Submit Rules
|
|
|
|
A link:prolog-cookbook.html#SubmitRule[submit rule] in Gerrit is logic
|
|
that defines when a change is submittable. By default, a change is
|
|
submittable when it gets at least one highest vote on each label and
|
|
has no lowest vote (aka veto vote) on any label.
|
|
|
|
The submit rules in Gerrit are implemented in link:prolog-cookbook.html[
|
|
Prolog] and projects that need more flexibility can define their own
|
|
submit rules to decide when a change should be submittable. A good
|
|
link:prolog-cookbook.html#NonAuthorCodeReview[example] from the Prolog
|
|
cookbook shows how to allow submit only if a change has a
|
|
`Code-Review+2` vote from a person that is not the change author. This
|
|
way a four-eyes principle for the reviews can be enforced.
|
|
|
|
A Prolog submit rule has access to link:prolog-change-facts.html[
|
|
information] about the change for which it is testing the
|
|
submittability. Amongst others the list of the modified files can be
|
|
accessed, which allows special logic if certain files are touched. For
|
|
example, a common practice is to require a vote on an additional label,
|
|
like `Library-Compliance`, if the dependencies of the project are
|
|
changed.
|
|
|
|
[[prolog-submit-type]]
|
|
It is also possible to control the link:prolog-cookbook.html#SubmitType[
|
|
submit type] from Prolog. For example this can be used to define a more
|
|
restrictive submit type such as `Fast Forward Only` for stable branches
|
|
while using a more liberal submit type, e.g. `Merge If Necessary` with
|
|
content merge, for development branches. How this can be done can be
|
|
seen from an link:prolog-cookbook.html#SubmitTypePerBranch[example] in
|
|
the Prolog cookbook.
|
|
|
|
Submit rules are maintained in the link:prolog-cookbook.html#RulesFile[
|
|
rules.pl] file in the `refs/meta/config` branch of the project. How to
|
|
write submit rules is explained in the
|
|
link:prolog-cookbook.html#HowToWriteSubmitRules[Prolog cookbook]. There
|
|
is also good support for link:prolog-cookbook.html#TestingSubmitRules[
|
|
testing submit rules] while developing them.
|
|
|
|
[[continuous-integration]]
|
|
== Continuous Integration
|
|
|
|
With Gerrit you can have continuous integration builds not only for
|
|
updates of central branches but also whenever a new change/patch set is
|
|
uploaded for review. This way you get automatic verification of all
|
|
changes *before* they are merged and any build and test issues are
|
|
detected early. To indicate the build and test status the continuous
|
|
integration system normally votes with the
|
|
link:config-labels.html#label_Verified[Verified] label on the change.
|
|
|
|
There are several solutions for integrating continuous integration
|
|
systems. The most commonly used are:
|
|
|
|
- link:https://wiki.jenkins-ci.org/display/JENKINS/Gerrit+Trigger[
|
|
Gerrit Trigger] plugin for link:http://jenkins-ci.org/[Jenkins]
|
|
|
|
- link:http://www.mediawiki.org/wiki/Continuous_integration/Zuul[
|
|
Zuul] for link:http://jenkins-ci.org/[Jenkins]
|
|
|
|
For the integration with the continuous integration system you must
|
|
have a service user that is able to access Gerrit. To create a service
|
|
user in Gerrit you can use the link:cmd-create-account.html[create-account]
|
|
SSH command if the link:access-control.html#capability_createAccount[
|
|
Create Account] global capability is granted. If not, you need to ask
|
|
a Gerrit administrator to create the service user.
|
|
|
|
If the link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/serviceuser[
|
|
serviceuser] plugin is installed you can also create new service users
|
|
in the Gerrit Web UI under `People` > `Create Service User`. For this
|
|
the `Create Service User` global capability must be assigned.
|
|
|
|
The service user must have link:access-control.html#category_read[read]
|
|
access to your project. In addition, if automatic change verification
|
|
is enabled, the service user must be allowed to vote on the
|
|
link:config-labels.html#label_Verified[Verified] label.
|
|
|
|
Continuous integration systems usually integrate with Gerrit by
|
|
listening to the Gerrit link:cmd-stream-events.html#events[stream
|
|
events]. For this the service user must have the
|
|
link:access-control.html#capability_streamEvents[Stream Events] global
|
|
capability assigned.
|
|
|
|
[[branch-administration]]
|
|
== Branch Administration
|
|
|
|
As project owner you can administrate the branches of your project in
|
|
the Gerrit Web UI under `Projects` > `List` > <your project> >
|
|
`Branches`. In the Web UI both link:project-configuration.html#branch-creation[
|
|
branch creation] and link:project-configuration.html#branch-deletion[branch
|
|
deletion] are allowed for project owners without requiring any
|
|
additional access rights.
|
|
|
|
By setting `HEAD` on the project you can define its
|
|
link:project-configuration.html#default-branch[default branch]. For convenience
|
|
reasons, when the repository is cloned Git creates a local branch for
|
|
this default branch and checks it out.
|
|
|
|
[[notifications]]
|
|
== Email Notifications
|
|
|
|
With Gerrit individual users control their own email subscriptions. By
|
|
editing the link:user-notify.html#user[watched projects] in the Web UI
|
|
under `Settings` > `Watched Projects` users can decide which events to
|
|
be informed about by email. The change notifications can be filtered by
|
|
link:user-search.html[change search expressions].
|
|
|
|
This means as a project owner you normally don't need to do anything
|
|
about email notifications, except maybe telling your project team where
|
|
to configure the watches.
|
|
|
|
Gerrit also supports link:user-notify.html#project[notifications on
|
|
project level] that allow project owners to set up email notifications
|
|
for team mailing lists or groups of users. This configuration is done
|
|
in the `project.config` file in the `refs/meta/config` branch as
|
|
explained in the section about link:user-notify.html#project[project
|
|
level notifications].
|
|
|
|
[[dashboards]]
|
|
== Dashboards
|
|
|
|
Gerrit comes with a pre-defined user dashboard that provides a view
|
|
of the changes that are relevant for a user. Users can also define
|
|
their own link:user-dashboards.html[custom dashboards] where the
|
|
dashboard sections can be freely configured. As a project owner you can
|
|
configure such custom dashboards on
|
|
link:user-dashboards.html#project-dashboards[project level]. This way
|
|
you can define a view of the changes that are relevant for your
|
|
project and share this dashboard with all users. The project dashboards
|
|
can be seen in the Web UI under `Projects` > `List` > <your project> >
|
|
`Dashboards`.
|
|
|
|
[[issue-tracker-integration]]
|
|
== Issue Tracker Integration
|
|
|
|
There are several possibilities to integrate issue trackers with
|
|
Gerrit.
|
|
|
|
- Comment Links
|
|
+
|
|
As described in the link:#comment-links[Comment Links] section, comment
|
|
links can be used to link IDs from commit message footers to issues in
|
|
an issue tracker system.
|
|
|
|
- Tracking IDs
|
|
+
|
|
Gerrit can be configured to index IDs from commit message footers so
|
|
that the link:user-search.html#tr[tr/bug] search operators can be used
|
|
to query for changes with a certain ID. The
|
|
link:config-gerrit.html#trackingid[configuration of tracking IDs] can
|
|
only be done globally by a Gerrit administrator.
|
|
|
|
- Issue Tracker System Plugins
|
|
+
|
|
There are Gerrit plugins for a tight integration with
|
|
link:https://gerrit-review.googlesource.com/\#/admin/projects/plugins/its-jira[Jira],
|
|
link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/its-bugzilla[Bugzilla] and
|
|
link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/its-rtc[IBM Rational Team Concert].
|
|
If installed, these plugins can e.g. be used to automatically add links
|
|
to Gerrit changes to the issues in the issue tracker system or to
|
|
automatically close an issue if the corresponding change is merged.
|
|
If installed, project owners may enable/disable the issue tracker
|
|
integration from the Gerrit Web UI under `Projects` > `Lists` >
|
|
<your project> > `General`.
|
|
|
|
[[comment-links]]
|
|
== Comment Links
|
|
|
|
Gerrit can linkify strings in commit messages, summary comments and
|
|
inline comments. A string that matches a defined regular expression is
|
|
then displayed as hyperlink to a configured backend system.
|
|
|
|
So called comment links can be configured globally by a Gerrit
|
|
administrator, but also per project by the project owner. Comment links
|
|
on project level are defined in the `project.config` file in the
|
|
`refs/meta/config` branch of the project as described in the
|
|
documentation of the link:config-gerrit.html#commentlink[commentlink]
|
|
configuration parameter.
|
|
|
|
Often comment links are used to link an ID in a commit message footer
|
|
to an issue in an issue tracker system. For example, to link the ID
|
|
from the `Bug` footer to Jira the following configuration can be used:
|
|
|
|
====
|
|
[commentlink "myjira"]
|
|
match = ([Bb][Uu][Gg]:\\s+)(\\S+)
|
|
link = https://myjira/browse/$2
|
|
====
|
|
|
|
[[reviewers]]
|
|
== Reviewers
|
|
|
|
Normally it is not needed to explicitly assign reviewers to every
|
|
change since the project members either link:user-notify.html#user[
|
|
watch the project] and get notified by email or regularly check the
|
|
list of open changes in the Gerrit Web UI. The project members then
|
|
pick the changes themselves that are interesting to them for review.
|
|
|
|
If authors of changes want to have a review by a particular person
|
|
(e.g. someone who is known to be expert in the touched code area, or a
|
|
stakeholder for the implemented feature), they can request the review
|
|
by adding this person in the Gerrit Web UI as a reviewer on the change.
|
|
Gerrit will then notify this person by email about the review request.
|
|
|
|
With the link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/reviewers[
|
|
reviewers] plugin it is possible to configure default reviewers who
|
|
will be automatically added to each change. The default reviewers can
|
|
be configured in the Gerrit Web UI under `Projects` > `List` >
|
|
<your project> > `General` in the `reviewers Plugin` section.
|
|
|
|
The link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/reviewers-by-blame[
|
|
reviewers-by-blame] plugin can automatically add reviewers to changes
|
|
based on the link:https://www.kernel.org/pub/software/scm/git/docs/git-blame.html[
|
|
git blame] computation on the changed files. This means that the plugin
|
|
will add those users as reviewer that authored most of the lines
|
|
touched by the change, since these users should be familiar with the
|
|
code and can most likely review the change. How many reviewers the
|
|
plugin will add to a change at most can be configured in the Gerrit
|
|
Web UI under `Projects` > `List` > <your project> > `General` in the
|
|
`reviewers-by-blame Plugin` section.
|
|
|
|
[[download-commands]]
|
|
== Download Commands
|
|
|
|
On the change screen in the `Downloads` drop-down panel Gerrit offers
|
|
commands for downloading the currently viewed patch set.
|
|
|
|
The download commands are implemented by Gerrit plugins. This means
|
|
that the available download commands depend on the installed Gerrit
|
|
plugins:
|
|
|
|
- link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/download-commands[
|
|
download-commands] plugin:
|
|
+
|
|
The `download-commands` plugin provides the default download commands
|
|
(`Checkout`, `Cherry Pick`, `Format Patch` and `Pull`).
|
|
+
|
|
Gerrit administrators may configure which of the commands are shown on
|
|
the change screen.
|
|
|
|
- link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/egit[
|
|
egit] plugin:
|
|
+
|
|
The `egit` plugin provides the change ref as a download command, which is
|
|
needed for downloading a change from within
|
|
link:https://www.eclipse.org/egit/[EGit].
|
|
|
|
- link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/project-download-commands[
|
|
project-download-commands] plugin:
|
|
+
|
|
The `project-download-commands` plugin enables project owners to
|
|
configure project-specific download commands. For example, a
|
|
project-specific download command may update submodules, trigger a
|
|
build, execute the tests or even do a deployment.
|
|
+
|
|
The project-specific download commands must be configured in the
|
|
`project.config` file in the `refs/meta/config` branch of the project:
|
|
+
|
|
====
|
|
[plugin "project-download-commands"]
|
|
Build = git fetch ${url} ${ref} && git checkout FETCH_HEAD && buck build ${project}
|
|
Update = git fetch ${url} ${ref} && git checkout FETCH_HEAD && git submodule update
|
|
====
|
|
+
|
|
Project-specific download commands that are defined on a parent project
|
|
are inherited by the child projects. A child project can overwrite an
|
|
inherited download command, or remove it by assigning no value to it.
|
|
|
|
[[theme]]
|
|
== Theme
|
|
|
|
Gerrit supports project-specific themes for customizing the appearance
|
|
of the change screen and the diff screens. It is possible to define an
|
|
HTML header and footer and to adapt Gerrit's CSS. Details about themes
|
|
are explained in the link:config-themes.html[Themes] section.
|
|
|
|
Project-specific themes can only be installed by Gerrit administrators
|
|
since the theme files must be copied into the Gerrit installation
|
|
folder.
|
|
|
|
[[tool-integration]]
|
|
== Integration with other tools
|
|
|
|
Gerrit provides many possibilities for the integration with other
|
|
tools:
|
|
|
|
- Stream Events:
|
|
+
|
|
The link:cmd-stream-events.html[stream-events] SSH command allows to
|
|
listen to Gerrit link:cmd-stream-events.html#events[events]. Other
|
|
tools can use this to react on actions done in Gerrit.
|
|
+
|
|
The link:access-control.html#capability_streamEvents[Stream Events]
|
|
global capability is required for using the `stream-events` command.
|
|
|
|
- REST API:
|
|
+
|
|
Gerrit provides a rich link:rest-api.html[REST API] that other tools
|
|
can use to query information from Gerrit and and to trigger actions in
|
|
Gerrit.
|
|
|
|
- Gerrit Plugins:
|
|
+
|
|
The Gerrit functionality can be extended by plugins and there are many
|
|
extension points, e.g. plugins can
|
|
+
|
|
** link:dev-plugins.html#top-menu-extensions[add new menu entries]
|
|
** link:dev-plugins.html#ui_extension[extend existing screens] and
|
|
link:dev-plugins.html#screen[add new screens]
|
|
** link:config-validation.html[do validation], e.g. of new commits
|
|
** add new REST endpoints and link:dev-plugins.html#ssh[SSH commands]
|
|
|
|
+
|
|
How to develop a Gerrit plugin is described in the link:dev-plugins.html[
|
|
Plugin Development] section.
|
|
|
|
[[prject-lifecycle]]
|
|
== Project Lifecycle
|
|
|
|
[[project-creation]]
|
|
=== Project Creation
|
|
|
|
New projects can be created in the Gerrit Web UI under `Projects` >
|
|
`Create Project`. The `Create Project` menu entry is only available if
|
|
you have the link:access-control.html#capability_createProject[
|
|
Create Project] global capability assigned.
|
|
|
|
Projects can also be created via REST or SSH as described in the
|
|
link:project-configuration.html#project-creation[Project Setup] section.
|
|
|
|
Creating the project with an initial empty commit is generally
|
|
recommended because some tools have issues with cloning repositories
|
|
that are completely empty. However, if you plan to link:#import-history[
|
|
import an existing history] into the new project, it is better to
|
|
create the project without an initial empty commit.
|
|
|
|
[[import-history]]
|
|
=== Import Existing History
|
|
|
|
If you have an existing history you can import it into a Gerrit
|
|
project. To do this you need to have a local Git repository that
|
|
contains this history. If your existing codebase is in another VCS you
|
|
must migrate it to Git first. For Subversion you can use the
|
|
link:http://git-scm.com/book/en/Git-and-Other-Systems-Git-and-Subversion[
|
|
git svn] command as described in the
|
|
link:http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git#Subversion[
|
|
Subversion migration guide]. An importer for Perforce is available in
|
|
the `contrib` section of the Git source code; how to use
|
|
link:http://git-scm.com/docs/git-p4[git p4] to do the import from
|
|
Perforce is described in the
|
|
link:http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git#Perforce[
|
|
Perforce migration guide].
|
|
|
|
To import an existing history into a Gerrit project you bypass code
|
|
review and push it directly to `refs/heads/<branch>`. For this you must
|
|
have the corresponding link:access-control.html#category_push_direct[
|
|
Push] access right assigned. If the destination branch in the Gerrit
|
|
repository already contains a history (e.g. an initial empty commit),
|
|
you can overwrite it by doing a force push. In this case force push
|
|
must be allowed in the access controls of the project.
|
|
|
|
Some Gerrit servers may disallow forging committers by blocking the
|
|
link:access-control.html#category_forge_committer[Forge Committer]
|
|
access right globally. In this case you must use the
|
|
link:https://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html[
|
|
git filter-branch] command to rewrite the committer information for all
|
|
commits (the author information that records who was writing the code
|
|
stays intact; signed tags will lose their signature):
|
|
|
|
====
|
|
$ git filter-branch --tag-name-filter cat --env-filter 'GIT_COMMITTER_NAME="John Doe"; GIT_COMMITTER_EMAIL="john.doe@example.com";' -- --all
|
|
====
|
|
|
|
If a link:config-gerrit.html#receive.maxObjectSizeLimit[max object size
|
|
limit] is configured on the server you may need to remove large objects
|
|
from the history before you are able to push. To find large objects in
|
|
the history of your project you can use the `reposize.sh` script which
|
|
you can download from Gerrit:
|
|
|
|
$ curl -Lo reposize.sh http://review.example.com:8080/tools/scripts/reposize.sh
|
|
|
|
or
|
|
|
|
$ scp -p -P 29418 john.doe@review.example.com:scripts/reposize.sh .
|
|
|
|
You can then use the
|
|
link:https://www.kernel.org/pub/software/scm/git/docs/git-filter-branch.html[
|
|
git filter-branch] command to remove the large objects from the history
|
|
of all branches:
|
|
|
|
====
|
|
$ git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch path/to/large-file.jar' -- --all
|
|
====
|
|
|
|
Since this command rewrites all commits in the repository it's a good
|
|
idea to create a fresh clone from this rewritten repository before
|
|
pushing to Gerrit, this will ensure that the original objects which
|
|
have been rewritten are removed.
|
|
|
|
[[project-deletion]]
|
|
=== Project Deletion
|
|
|
|
Gerrit core does not support the deletion of projects.
|
|
|
|
If the link:https://gerrit-review.googlesource.com/#/admin/projects/plugins/delete-project[
|
|
delete-project] plugin is installed, projects can be deleted from the
|
|
Gerrit Web UI under `Projects` > `List` > <project> > `General` by
|
|
clicking on the `Delete` command under `Project Commands`. The `Delete`
|
|
command is only available if you have the `Delete Projects` global
|
|
capability assigned, or if you own the project and you have the
|
|
`Delete Own Projects` global capability assigned. If neither of these
|
|
capabilities is granted, you need to contact a Gerrit administrator to
|
|
request the deletion of your project.
|
|
|
|
Instead of deleting a project you may set the
|
|
link:project-configuration.html#project-state[project state] to `ReadOnly` or
|
|
`Hidden`.
|
|
|
|
[[project-rename]]
|
|
=== Project Rename
|
|
|
|
Gerrit core does not support the renaming of projects.
|
|
|
|
As workaround you may
|
|
|
|
. link:#project-creation[create a new project] with the new name
|
|
. link:#import-history[import the history of the old project]
|
|
. link:#project-deletion[delete the old project]
|
|
|
|
GERRIT
|
|
------
|
|
Part of link:index.html[Gerrit Code Review]
|
|
|
|
SEARCHBOX
|
|
---------
|