|  | 
 | = Gerrit Code Review - Groups | 
 |  | 
 | == Overview | 
 |  | 
 | In Gerrit, we assign permissions to groups of accounts. These groups | 
 | can be provided by an external system such as LDAP, but Gerrit also | 
 | has a group system built-in ("internal groups") | 
 |  | 
 | Starting from 2.16, these internal groups are fully stored in | 
 | link:note-db.html[NoteDb]. | 
 |  | 
 | A group is characterized by the following information: | 
 |  | 
 | * list of members (accounts) | 
 | * list of subgroups | 
 | * properties | 
 |   - visibleToAll | 
 |   - group owner | 
 |  | 
 | Groups are keyed by the following unique identifiers: | 
 |  | 
 | * GroupID, the former database key (a sequential number) | 
 |  | 
 | * UUID, an opaque identifier. Internal groups use a 40 byte hex string | 
 | as UUID | 
 |  | 
 | * Name: Gerrit enforces that group names are unique | 
 |  | 
 | == Storage format | 
 |  | 
 | Group data is stored in the | 
 | link:config-accounts.html#all-users[`All-Users` repository]. For each | 
 | group, there is a ref, stored as a sharded UUID, e.g. | 
 |  | 
 | ---- | 
 |   refs/groups/ef/deafbeefdeafbeefdeafbeefdeafbeefdeafbeef | 
 | ---- | 
 |  | 
 | The ref points to commits holding files. The files are | 
 |  | 
 | * `members`, holding numeric account IDs of members, one per line | 
 | * `subgroups`, holding group UUIDs of subgroups, one per line | 
 | * `group.config`, holding further configuration. | 
 |  | 
 | The `group.config` file follows the following format | 
 |  | 
 | ---- | 
 | [group] | 
 |   name = <name of the group> | 
 |   id = 42 | 
 |   visibleToAll = false | 
 |   description = <description of the group> | 
 |   groupOwnerUuid = <UUID of the owner group> | 
 | ---- | 
 |  | 
 | Gerrit updates the ref for a group based on REST API calls, and the | 
 | commit log effectively forms an audit log which shows how group | 
 | membership evolved over time. | 
 |  | 
 | To ensure uniqueness of the name, a separate ref | 
 | `refs/meta/group-names` contains a notemap, ie. a map represented as a | 
 | branch with a flat list of files. | 
 |  | 
 | The format of this map is as follows: | 
 |  | 
 | * keys are the normal SHA-1 of the group name | 
 | * values are blobs that look like | 
 | + | 
 | ---- | 
 | [group] | 
 |   name = <name of the group> | 
 |   uuid = <hex UUID identifier of the group> | 
 | ---- | 
 |  | 
 | To ensure uniqueness of the sequential ID, the ID for each new group | 
 | is taken from the sequence counter under `refs/sequences/groups`, | 
 | which works analogously to the ones for accounts and changes. | 
 |  | 
 | == Visibility | 
 |  | 
 | Group ownership together with `visibleToAll` determines visibility of | 
 | the groups in the REST API. | 
 |  | 
 | Fetching a group ref is permitted to the group's owners that also have | 
 | READ permissions on the ref. For users that are not owners, the | 
 | permissions on the ref are ignored. In addition, anyone with the | 
 | link:access-control.html#capability_accessDatabase[Access Database] | 
 | capability can read all group refs. The `refs/meta/group-names` ref is | 
 | visible only to users with the | 
 | link:access-control.html#capability_accessDatabase[Access Database] | 
 | capability. | 
 |  | 
 | == Pushing to group refs | 
 |  | 
 | Validation on push for changes to the group ref is not implemented, so | 
 | pushes are rejected. Pushes that bypass Gerrit should be avoided since | 
 | the names, IDs and UUIDs must be internally consistent between all the | 
 | branches involved. In addition, group references should not be created | 
 | or deleted manually either. If you attempt any of these actions | 
 | anyway, don't forget to link:rest-api-groups.html#index-group[Index | 
 | Group] reindex the affected groups manually. | 
 |  | 
 | == Replication | 
 |  | 
 | In a replicated setting (eg. backups and or primary/replica configurations), all | 
 | refs in the `All-Users` project on primary nodes must be copied onto all | 
 | replicas, including `refs/groups/*`, `refs/meta/group-names` and | 
 | `refs/sequences/groups`. |