James Moger
2013-06-19 724da52635fbcc7c80cd0b7932f8b0d1cff6cb73
commit | author | age
93d506 1 ## Gitblit WAR Installation & Setup
dd7961 2
f6b200 3 1. Download [Gitblit WAR ${project.releaseVersion}](%GCURL%gitblit-${project.releaseVersion}.war) to the webapps folder of your servlet container.  
d39680 4 2. You may have to manually extract the WAR (zip file) to a folder within your webapps folder.
93d506 5 3. By default, the Gitblit webapp is configured through `WEB-INF/data/gitblit.properties`.<br/>
JM 6 Open `WEB-INF/data/gitblit.properties` in your favorite text editor and make sure to review and set:
e4547f 7     - &lt;context-parameter&gt; *git.packedGitLimit* (set larger than the size of your largest repository)
JM 8     - &lt;context-parameter&gt; *git.streamFileThreshold* (set larger than the size of your largest committed file)
93d506 9 4. You may have to restart your servlet container. 
JM 10 5. Open your browser to <http://localhost/gitblit> or whatever the url should be.
11 6. Enter the default administrator credentials: **admin / admin** and click the *Login* button  
d39680 12     **NOTE:** Make sure to change the administrator username and/or password!! 
85c2e6 13
93d506 14 ### WAR Data Location
JM 15 By default, Gitblit WAR stores all data (users, settings, repositories, etc) in `${contextFolder}/WEB-INF/data`.  This is fine for a quick setup, but there are many reasons why you don't want to keep your data within the webapps folder of your servlet container.  You may specify an external location for your data by editing `WEB-INF/web.xml` and manipulating the *baseFolder* context parameter.  Choose a location that is writeable by your servlet container.  Your servlet container may be smart enough to recognize the change and to restart Gitblit.
16
17 On the next restart of Gitblit, Gitblit will copy the contents of the `WEB-INF/data` folder to your specified *baseFolder* **IF** the file `${baseFolder}/gitblit.properties` does not already exist.  This allows you to get going with minimal fuss.
18
19 Specifying an alternate *baseFolder* also allows for simpler upgrades in the future.
20
21 ## Gitblit GO Installation & Setup
85c2e6 22
f6b200 23 1. Download and unzip [Gitblit GO ${project.releaseVersion}](%GCURL%gitblit-${project.releaseVersion}.zip).  
85c2e6 24 *Its best to eliminate spaces in the path name.* 
93d506 25 2. The server itself is configured through a simple text file.<br/>
JM 26 Open `data/gitblit.properties` in your favorite text editor and make sure to review and set:
831469 27     - *server.httpPort* and *server.httpsPort*
3b5289 28     - *server.httpBindInterface* and *server.httpsBindInterface*  
28a1e9 29     - *server.storePassword*
831469 30     **https** is strongly recommended because passwords are insecurely transmitted form your browser/git client using Basic authentication!
e4547f 31     - *git.packedGitLimit* (set larger than the size of your largest repository)
JM 32     - *git.streamFileThreshold* (set larger than the size of your largest committed file)
f6b200 33 3. Execute `authority.cmd` or `java -cp gitblit.jar com.gitblit.authority.Launcher --baseFolder data` from a command-line
dc9735 34     1. fill out the fields in the *new certificate defaults* dialog
JM 35     2. enter the store password used in *server.storePassword* when prompted.  This generates an SSL certificate for **localhost**.
36     3. you may want to generate an SSL certificate for the hostname or ip address hostnames you are serving from<br/>**NOTE:** You can only have **one** SSL certificate specified for a port.
37     5. exit the authority app
93d506 38 4. Execute `gitblit.cmd` or `java -jar gitblit.jar --baseFolder data` from a command-line
230632 39 5. Open your browser to <http://localhost:8080> or <https://localhost:8443> depending on your chosen configuration.
d4c908 40 6. Enter the default administrator credentials: **admin / admin** and click the *Login* button    
d39680 41     **NOTE:** Make sure to change the administrator username and/or password!! 
85c2e6 42
93d506 43 ### GO Data Location
JM 44
45 By default, Gitblit GO stores all data (users, settings, repositories, etc) in the `data` subfolder of your GO installation.  You may specify an external location for your data on the command-line by setting the *--baseFolder* argument.  If you relocate the data folder then you must supply the *--baseFolder* argument to both GO and the Certificate Authority.
46
47 If you are deploying Gitblit to a *nix platform, you might consider moving the data folder out of the GO installation folder and then creating a symlink named "data" that points to your moved folder.
48
28a1e9 49 ### Creating your own Self-Signed SSL Certificate
JM 50 Gitblit GO (and Gitblit Certificate Authority) automatically generates a Certificate Authority (CA) certificate and an ssl certificate signed by this CA certificate that is bound to *localhost*.
85c2e6 51
724da5 52 Remote Eclipse/EGit/JGit clients (< 3.0) will fail to communicate using this certificate because JGit always verifies the hostname of the certificate, regardless of the *http.sslVerify=false* client-side setting.
d39680 53
JM 54 The EGit failure message is something like:
55
56     Cannot get remote repository refs.
57     Reason: https:/myserver.com/git/myrepo.git: cannot open git-upload-pack
58
dc9735 59 If you want to serve your repositories to another machine over https then you will want to generate a new certificate for the hostname or ip address you are serving from.
d39680 60
93d506 61 1. `authority.cmd` or `java -jar authority.jar --baseFolder data`
28a1e9 62 2. Click the *new ssl certificate* button (red rosette in the toolbar in upper left of window)
JM 63 3. Enter the hostname or ip address
dc9735 64 4. Make sure the checkbox *serve https with this certificate* is checked
JM 65 5. In the keystore password prompt, enter the *server.storePassword* password
85c2e6 66  
dc9735 67 If you decide to change the value of *server.storePassword* (recommended) <u>after</u> you have already started Gitblit or Gitblit Certificate Authority, then you will have to delete the following files and then restart the Gitblit Certificate Authority app:
JM 68
93d506 69 1. data/serverKeyStore.jks
JM 70 2. data/serverTrustStore.jks
71 3. data/certs/caKeyStore.jks
72 4. data/certs/ca.crt
73 5. data/certs/caRevocationList.crl (optional)
d39680 74
28a1e9 75 ### Client SSL Certificates
JM 76 SINCE 1.2.0
77
78 Gitblit supports X509 certificate authentication.  This authentication method relies on your servlet container to validate/verify/trust your client certificate and can be used by your browser and your git client.
79
80 All X509 certificates have a *distinguished name (DN)* which is a signature of several fields like:
81
82     C=US,O=Gitblit,OU=Gitblit,CN=james
83     
84 Gitblit must be able to map the DN of the certificate to an *existing* account username.  The default mapping is to extract the *common name (CN)* value from the DN and use that as the account name.  If the CN is a valid account, then the user is authenticated.  The servlet container which runs Gitblit validates, verifies, and trusts the certificate passed to Gitblit.  If you need to specify an alternative DN mapping you may do so with the *git.certificateUsernameOIDs* setting, but this mapping must be matched to the user account name.
85
86 How do you make your servlet container trust a client certificate?
87
88 In the WAR variant, you will have to manually setup your servlet container to:
93d506 89
28a1e9 90 1. want/need client certificates
JM 91 2. trust a CA certificate used to sign your client certificates
92 3. generate client certificates signed by your CA certificate
93
94 Alternatively, Gitblit GO is designed to facilitate use of client certificate authentication.  Gitblit GO ships with a tool that simplifies creation and management of client certificates, Gitblit Certificate Authority.
95
96 #### Creating SSL Certificates with Gitblit Certificate Authority
97
93d506 98 When you generate a new client certificate, a zip file bundle is created which includes a P12 keystore for browsers and a PEM keystore for Git.  Both of these are password-protected.  Additionally, a personalized README file is generated with setup instructions for popular browsers and Git.  The README is generated from `data\certs\instructions.tmpl` and can be modified to suit your needs.
28a1e9 99
93d506 100 1. `authority.cmd` or `java -jar authority.jar --baseFolder data`
28a1e9 101 2. Select the user for which to generate the certificate
dc9735 102 3. Click the *new certificate* button and enter the expiration date of the certificate.  You must also enter a password for the generated keystore.  This password is *not* the same as the user's login password.  This password is used to protect the privatekey and public certificate you will generate for the selected user.  You must also enter a password hint for the user.
28a1e9 103 4. If your mail server settings are properly configured you will have a *send email* checkbox which you can use to immediately send the generated certificate bundle to the user.
dc9735 104
JM 105 #### Certificate Inspection and Advanced Troubleshooting
106
107 X509 certificates can be confusing and tricky even with the simplified Gitblit Certificate Authority tool.  If you find you need more tooling to understand your keystores, certificates, and certificate revocation lists (CRLs), I highly recommend [Portecle](http://portecle.sourceforge.net) which can be conveniently launched as a [Java Web Start app](http://portecle.sourceforge.net/webstart/portecle.jnlp).
85c2e6 108
JM 109 ### Running as a Windows Service
d39680 110 Gitblit uses [Apache Commons Daemon](http://commons.apache.org/daemon) to install and configure its Windows service.
JM 111
1e9dda 112 1. **Review the contents** of the `installService.cmd` where you may have to change the <u>default keystore password</u>.
3b5289 113 2. Set the *ARCH* value as appropriate for your installed Java Virtual Machine.
d39680 114 3. Add any necessary *--StartParams* as enumerated below in **Command-Line Parameters**.
JM 115 4. Execute the script.
116
117 After service installation you can use the `gitblitw.exe` utility to control and modify the runtime settings of the service.<br/>
118 Additional service definition options and runtime capabilities of `gitblitw.exe` (prunmgr.exe) are documented [here](http://commons.apache.org/daemon/procrun.html).
119
120 **NOTE:**<br/>
121 If you change the name of the service from *gitblit* you must also change the name of `gitblitw.exe` to match the new service name otherwise the connection between the service and the utility is lost, at least to double-click execution. 
85c2e6 122
1c9219 123 #### VM Considerations
JM 124 By default, the service installation script configures your Windows service to use your default JVM.  This setup usually defaults to a client VM.<br/>
125 If you have installed a JDK, you might consider using the `gitblitw.exe` utility to manually specify the *server* VM.
126
127 1. Execute `gitblitw.exe`
128 2. On the *Java* tab uncheck *Use default*.
129 3. Manually navigate your filesystem and specify the server VM with the `...` button<br/><pre>
3b5289 130 Java Virtual Machine:
JM 131 C:\Program Files\Java\jre6\bin\server\jvm.dll</pre>
1c9219 132
85c2e6 133 #### Command-Line Parameters
JM 134 Command-Line parameters override the values in `gitblit.properties` at runtime.
135
93d506 136     --baseFolder           The default base folder for all relative file reference settings
85c2e6 137     --repositoriesFolder   Git Repositories Folder
JM 138     --userService          Authentication and Authorization Service (filename or fully qualified classname)
139     --useNio               Use NIO Connector else use Socket Connector.
140     --httpPort             HTTP port for to serve. (port <= 0 will disable this connector)
141     --httpsPort            HTTPS port to serve.  (port <= 0 will disable this connector)
3cc6e2 142     --ajpPort              AJP port to serve.  (port <= 0 will disable this connector)
dc9735 143     --alias                Alias in keystore of SSL cert to use for https serving
85c2e6 144     --storePassword        Password for SSL (https) keystore.
JM 145     --shutdownPort         Port for Shutdown Monitor to listen on. (port <= 0 will disable this monitor)
146     --tempFolder           Folder for server to extract built-in webapp
147     
148 **Example**
149
93d506 150     java -jar gitblit.jar --userService c:/myrealm.config --storePassword something --baseFolder c:/data
9c7a36 151
JM 152 #### Overriding Gitblit GO's Log4j Configuration
153
154 You can override Gitblit GO's default Log4j configuration with a command-line parameter to the JVM.
155
156     java -Dlog4j.configuration=file:///home/james/log4j.properties -jar gitblit.jar <optional_gitblit_args>
157     
158 For reference, here is [Gitblit's default Log4j configuration](https://github.com/gitblit/gitblit/blob/master/src/log4j.properties).  It includes some file appenders that are disabled by default. 
4b9d64 159     
JM 160 ## Running Gitblit behind Apache
161
162 Gitblit runs fine behind Apache.  You may use either *mod_proxy* (GO or WAR) or *mod_proxy_ajp* (GO).
163
164 Each Linux distribution may vary on the exact configuration of Apache 2.2.  
165 Here is a sample configuration that works on Debian 7.0 (Wheezy), your distribution may be different.
166
167 1. First we need to make sure we have Apache's proxy modules available.  
f6b200 168 ---FIXED---
4b9d64 169 sudo su
JM 170 cd /etc/apache2/mods-enabled
171 ln -s ../mods-available/proxy.load proxy.load
172 ln -s ../mods-available/proxy_balancer.load proxy_balancer.load
173 ln -s ../mods-available/proxy_http.load proxy_http.load
174 ln -s ../mods-available/proxy_ajp.load proxy_ajp.load
f6b200 175 ---FIXED---
4b9d64 176 2. Then we need to make sure we are configuring Apache to use the proxy modules and to setup the proxied connection from Apache to Gitblit GO or from Apache to your chosen servlet container.  The following snippet is stored as `/etc/apache2/conf.d/gitblit`.  
f6b200 177 ---FIXED---
4b9d64 178 # Turn off support for true Proxy behaviour as we are acting as 
JM 179 # a transparent proxy
180 ProxyRequests Off
181
182 # Turn off VIA header as we know where the requests are proxied
183 ProxyVia Off
184  
185 # Turn on Host header preservation so that the servlet container
186 # can write links with the correct host and rewriting can be avoided.
187 #
188 # This is important for all git push/pull/clone operations.
189 ProxyPreserveHost On
190  
191 # Set the permissions for the proxy
f6b200 192 <Proxy>
4b9d64 193     AddDefaultCharset off
JM 194     Order deny,allow
195     Allow from all
f6b200 196 </Proxy>
4b9d64 197  
JM 198 # The proxy context path must match the Gitblit context path.
199 # For Gitblit GO, see server.contextPath in gitblit.properties.
200
201 #ProxyPass /gitblit http://localhost:8080/gitblit
a00408 202 #ProxyPassreverse /gitblit http://localhost:8080/gitblit
JM 203
204 # If your httpd frontend is https but you are proxying http Gitblit WAR or GO
a717d5 205 #Header edit Location &#94;http://([&#94;&#8260;]+)/gitblit/ https://&#36;1/gitblit/
a00408 206
f1b488 207 # Additionally you will want to tell Gitblit the original scheme and port
5efc4a 208 #RequestHeader set X-Forwarded-Proto https
JM 209 #RequestHeader set X-Forwarded-Port 443
f1b488 210
c558de 211 # If you are using subdomain proxying then you will want to tell Gitblit the appropriate
JM 212 # context path for your repository url.
213 # If you are not using subdomain proxying, then ignore this setting.
214 #RequestHeader set X-Forwarded-Context /
215
4b9d64 216 #ProxyPass /gitblit ajp://localhost:8009/gitblit
f6b200 217 ---FIXED---  
4b9d64 218 **Please** make sure to:  
JM 219     1. Review the security of these settings as appropriate for your deployment
220     2. Uncomment the *ProxyPass* setting for whichever connection you prefer (http/ajp)
221     3. Correctly set the ports and context paths both in the *ProxyPass* definition and your Gitblit installation  
222     If you are using Gitblit GO you can easily configure the AJP connector by specifying a non-zero AJP port.  
223     Please remember that on Linux/UNIX, ports < 1024 require root permissions to open.
224     4. Set *web.mountParameters=false* in `gitblit.properties` or `web.xml` this will use parameterized URLs.  
225     Alternatively, you can respecify *web.forwardSlashCharacter*.
790c38 226
JM 227 ## Upgrading Gitblit
228
229 Any important changes to the setting keys or default values will always be mentioned in the [release log](releases.html).
230
93f472 231 Gitblit v0.8.0 introduced a new default user service implementation which serializes and deserializes user objects into `users.conf`.  A `users.conf` file will be automatically created from an existing `users.properties` file on the first launch after an upgrade.  To use the `users.conf` service, *realm.userService=users.conf* must be set.  This revised user service allows for more sophisticated Gitblit user objects and will facilitate the development of more advanced features without adding the complexity of an embedded SQL database.
JM 232
233 `users.properties` and its user service implementation are deprecated as of v0.8.0.
234
93d506 235 ### Upgrading Gitblit WAR (1.2.1+)
JM 236 1. Make sure your `WEB-INF/web.xml` *baseFolder* context parameter is not `${contextFolder}/WEB-INF/data`!<br/>
237 If it is, move your `WEB-INF/data` folder to a location writeable by your servlet container.
238 2. Deploy new WAR
239 3. Edit the new WAR's `WEB-INF/web.xml` file and set the *baseFolder* context parameter to your external baseFolder.
240 4. Review and optionally apply any new settings as indicated in the [release log](releases.html) to `${baseFolder}/gitblit.properties`. 
790c38 241  
93d506 242 ### Upgrading Gitblit GO (1.2.1+)
790c38 243  
93d506 244 1. Unzip Gitblit GO to a new folder
JM 245 2. Copy your `data` folder from your current Gitblit installation to the new folder and overwrite any conflicts
246 3. Review and optionally apply any new settings as indicated in the [release log](releases.html) to `data/gitblit.properties`.
247
248 In *nix systems, there are other tricks you can play like symlinking the `data` folder or symlinking the GO folder.
249 All platforms support the *--baseFolder* command-line argument.
250
251 ### Upgrading Gitblit WAR (pre-1.2.1)
252
253 1. Create a `data` as outlined in step 1 of *Upgrading Gitblit GO (pre-1.2.1)*
254 2. Copy your existing web.xml to your data folder
255 3. Deploy new WAR
256 4. Copy the new WAR's `WEB-INF/data/gitblit.properties` file to your data folder
257 5. Manually apply any changes you made to your original web.xml file to the gitblit.properties file you copied to your data folder
258 6. Edit the new WAR's `WEB-INF/web.xml` file and set the *baseFolder* context parameter to your external baseFolder.
259
260 ### Upgrading Gitblit GO (pre-1.2.1)
261 1. Create a `data` folder and copy the following files and folders to it:
d4e9b0 262     - **users.conf*
JM 263     - **projects.conf** *(if you have one)*
264     - **gitblit.properties**
265     - **serverKeystore.jks**
266     - **serverTrustStore.jks**
267     - *certs** folder
268     - **git** folder
269     - **groovy** folder
270     - **proposals** folder
93d506 271     - and any other custom files (robots.txt, welcome/login markdown files, etc)
d4e9b0 272     - then edit your `gitblit.properties` file and adjust the following settings:
JM 273         - *git.repositoriesFolder* = ${baseFolder}/git
274         - *groovy.scriptsFolder* = ${baseFolder}/groovy
275         - *groovy.grapeFolder* = ${baseFolder}/groovy/grape
276         - *web.projectsFile* = ${baseFolder}/projects.conf
277         - *realm.userService* = ${baseFolder}/users.conf
278         - *web.robots.txt* = ${baseFolder}/robots.txt
279         - *federation.proposalsFolder* = ${baseFolder}/proposals
280         - *realm.ldap.backingUserService* = ${baseFolder}/users.conf
281         - *realm.redmine.backingUserService* = ${baseFolder}/users.conf
282         - *server.tempFolder* = ${baseFolder}/temp
283
93d506 284 2. Unzip Gitblit GO to a new folder
JM 285 3. Copy your `data` folder and overwrite the folder of the same name in the just-unzipped version
286 4. Review and optionally apply any new settings as indicated in the [release log](releases.html) to `data/gitblit.properties`.
287
288 **NOTE:** You may need to adjust your service definitions to include the `--baseFolder data` argument.
790c38 289
JM 290 #### Upgrading Windows Service
3b5289 291 You may need to delete your old service definition and install a new one depending on what has changed in the release.
JM 292
85c2e6 293 ## Gitblit Configuration
dd7961 294
JM 295 ### Administering Repositories
00afd7 296 Repositories can be created, edited, renamed, and deleted through the web UI.  They may also be created, edited, and deleted from the command-line using real [Git](http://git-scm.com) or your favorite file manager and text editor.
dd7961 297
JM 298 All repository settings are stored within the repository `.git/config` file under the *gitblit* section.
299
300     [gitblit]
301         description = master repository
00afd7 302         owner = james
dd7961 303         useTickets = false
JM 304         useDocs = true
305         showRemoteBranches = false
306         accessRestriction = clone
00afd7 307         isFrozen = false
a1ea87 308         showReadme = false
f6740d 309         federationStrategy = FEDERATE_THIS
831469 310         isFederated = false
84c1d5 311         skipSizeCalculation = false
8f73a7 312         federationSets = 
3b5289 313
dd7961 314 #### Repository Names
93d506 315 Repository names must be case-insensitive-unique but are CASE-SENSITIVE ON CASE-SENSITIVE FILESYSTEMS.  The name must be composed of letters, digits, or `/ _ - . ~`<br/>
dd7961 316 Whitespace is illegal.
JM 317
168566 318 Repositories can be grouped within subfolders.  e.g. *libraries/mycoollib.git* and *libraries/myotherlib.git*
a3bde6 319
85c2e6 320 All repositories created with Gitblit are *bare* and will automatically have *.git* appended to the name at creation time, if not already specified. 
a3bde6 321
00afd7 322 #### Repository Owner
JM 323 The *Repository Owner* has the special permission of being able to edit a repository through the web UI.  The Repository Owner is not permitted to rename the repository, delete the repository, or reassign ownership to another user.
324
20714a 325 ### Access Restrictions and Access Permissions
JM 326 ![permissions matrix](permissions_matrix.png "Permissions and Restrictions")
327
328 #### Discrete Permissions (Gitblit v1.2.0+)
329
330 Since v1.2.0, Gitblit supports more discrete permissions.  While Gitblit does not offer a built-in solution for branch-based permissions like Gitolite, it does allow for the following repository access permissions:
331
332 - **V** (view in web ui, RSS feeds, download zip)
333 - **R** (clone)
334 - **RW** (clone and push)
335 - **RWC** (clone and push with ref creation)
336 - **RWD** (clone and push with ref creation, deletion)
337 - **RW+** (clone and push with ref creation, deletion, rewind)
5d7545 338
JM 339 These permission codes are combined with the repository path to create a user permission:
340
341     RW:mygroup/myrepo.git
342
343 #### Discrete Permissions with Regex Matching (Gitblit v1.2.0+)
344
e5aaa5 345 Gitblit also supports *case-insensitive* regex matching for repository permissions.  The following permission grants push privileges to all repositories in the *mygroup* folder.
5d7545 346
2d48e2 347     RW:mygroup/.*
JM 348
349 ##### Exclusions
350
351 When using regex matching it may also be useful to exclude specific repositories or to exclude regex repository matches.  You may specify the **X** permission for exclusion.  The following example grants clone permission to all repositories except the repositories in mygroup.  The user/team will have no access whatsoever to these repositories.
352
353     X:mygroup/.*
354     R:.*
355
356 ##### Order is Important
357
358 The preceding example should suggest that order of permissions is important with regex matching.  Here are the rules for determining the permission that is applied to a repository request:
359
360 1. If the user is an admin or repository owner, then RW+
361 2. Else if user has an explicit permission, use that
362 3. Else check for the first regex match in user permissions
363 4. Else check for the HIGHEST permission from team memberships
364     1. If the team is an admin team, then RW+
365     2. Else if a team has an explicit permission, use that
366     3. Else check for the first regex match in team permissions
20714a 367
724da5 368 #### No-So-Discrete Permissions (Gitblit &lt;= v1.1.0)
20714a 369
15640f 370 Prior to v1.2.0, Gitblit has two main access permission groupings:  
JM 371
372 1. what you are permitted to do as an anonymous user
373 2. **RW+** for any permitted user
374
375 #### Committer Verification
376
377 You may optionally enable committer verification which requires that each commit be committed by the authenticated user pushing the commits.  i.e. If Bob is pushing the commits, Bob **must** be the committer of those commits.
378
379 **How is this enforced?**
380
381 Bob must set his *user.name* and *user.email* values for the repository to match his Gitblit user account **BEFORE** committing to his repository.
382 <pre>
383 [user "bob"]
384     displayName = Bob Jones
385     emailAddress = bob@somewhere.com
386 </pre>
387 <pre>
388     git config user.name "Bob Jones"
389     git config user.email bob@somewhere.com    
390 </pre>
391 or
392
393     git config user.name bob
394     git config user.email bob@somewhere.com    
395
396 If the Gitblit account does not specify an email address, then the committer email address is ignored.  However, if the account does specify an address it must match the committer's email address.  Display name or username can be used as the committer name.
397
398 All checks are case-insensitive.
399
400 **What about merges?**
401
402 You can not use fast-forward merges on your client when using committer verification.  You must specify *--no-ff* to ensure that a merge commit is created with your identity as the committer.  Only the first parent chain is traversed when verifying commits.
20714a 403
93d506 404 #### Push Log
JM 405
406 Gitblit v1.2.1 introduces an incomplete push mechanism.  All pushes are logged since 1.2.1, but the log has not yet been exposed through the web ui.  This will be a feature of an upcoming release.
407
fe24a0 408 ### Teams
JM 409
410 Since v0.8.0, Gitblit supports *teams* for the original `users.properties` user service and the current default user service `users.conf`.  Teams have assigned users and assigned repositories.  A user can be a member of multiple teams and a repository may belong to multiple teams.  This allows the administrator to quickly add a user to a team without having to keep track of all the appropriate repositories. 
411
412 ### Administering Users (users.conf, Gitblit v0.8.0+)
413 All users are stored in the `users.conf` file or in the file you specified in `gitblit.properties`. Your file extension must be *.conf* in order to use this user service.
414
93f472 415 The `users.conf` file uses a Git-style configuration format:
JM 416
417     [user "admin"]
418         password = admin
419         role = "#admin"
420         role = "#notfederated"
20714a 421         repository = RW+:repo1.git
JM 422         repository = RW+:repo2.git
fe24a0 423         
JM 424     [user "hannibal"]
425         password = bossman
20714a 426         repository = RWD:topsecret.git
5d7545 427         repository = RW+:ateam/[A-Za-z0-9-~_\\./]+
fe24a0 428
JM 429     [user "faceman"]
430         password = vanity
431
432     [user "murdock"]
433         password = crazy        
434         
435     [user "babaracus"]
436         password = grrrr
437         
438     [team "ateam"]
439         user = hannibal
440         user = faceman
441         user = murdock
442         user = babaracus
20714a 443         repository = RW:topsecret.git
0b9119 444         mailingList = list@ateam.org
d7905a 445         postReceiveScript = sendmail
93f472 446
JM 447 The `users.conf` file allows flexibility for adding new fields to a UserModel object that the original `users.properties` file does not afford without imposing the complexity of relying on an embedded SQL database. 
448
fe24a0 449 ### Administering Users (users.properties, Gitblit v0.5.0 - v0.7.0)
JM 450 All users are stored in the `users.properties` file or in the file you specified in `gitblit.properties`. Your file extension must be *.properties* in order to use this user service.
451
fa54be 452 The format of `users.properties` loosely follows Jetty's convention for HashRealms:
dd7961 453
fa54be 454     username=password,role1,role2,role3...
0b9119 455     @teamname=&mailinglist,!username1,!username2,!username3,repository1,repository2,repository3...
dd7961 456
20714a 457 ### Usernames
3b5289 458 Usernames must be unique and are case-insensitive.  
dd7961 459 Whitespace is illegal.
JM 460
20714a 461 ### Passwords
486ee1 462 User passwords are CASE-SENSITIVE and may be *plain*, *md5*, or *combined-md5* formatted (see `gitblit.properties` -> *realm.passwordStorage*).
dd7961 463
20714a 464 ### User Roles
JM 465 There are four actual *roles* in Gitblit:
466
467 - *#admin*, which grants administrative powers to that user
468 - *#notfederated*, which prevents an account from being pulled by another Gitblit instance
469 - *#create*, which allows the user the power to create personal repositories
470 - *#fork*, which allows the user to create a personal fork of an existing Gitblit-hosted repository
471
472 Administrators automatically have access to all repositories.  All other *roles* are repository permissions.  If a repository is access-restricted, the user must have the repository's name within his/her roles to bypass the access restriction.  This is how users are granted access to a restricted repository.
473
474 **NOTE:**  
475 The following roles are equivalent:
476
477 - myrepo.git
478 - RW+:myrepo.git
479
480 This is to preserve backwards-compatibility with Gitblit <= 1.1.0 which granted rewind power to all access-permitted users.
481
482 ### Personal Repositories & Forks
483
484 Personal Repositories and Forks are related but are controlled individually.
485
486 #### Creating a Personal Repository
487 A user may be granted the power to create personal repositories by specifying the *#create* role through the web ui or through the RPC mechanism via the Gitblit Manager.  Personal repositories are exactly like common/shared repositories except that the owner has a few additional administrative powers for that repository, like rename and delete.
488
489 #### Creating a Fork
490 A user may also be granted the power to fork an existing repository hosted on your Gitblit server to their own personal clone by specifying the *#fork* role through the web ui or via the Gitblit Manager.
491
492 Forks are mostly likely personal repositories or common/shared repositories except for two important differences:
493
494 1. Forks inherit a view/clone access list from the origin repository.  
495 i.e. if Team A has clone access to the origin repository, then by default Team A also has clone access to the fork.  This is to facilitate collaboration.
496 2. Forks are always listed in the fork network, regardless of any access restriction set on the fork.  
497 In other words, if you fork *RepoA.git* to *~me/RepoA.git* and then set the access restriction of *~me/RepoA.git* to *Authenticated View, Clone, & Push* your fork will still be listed in the fork network for *RepoA.git*.
498
499 If you really must have an invisible fork, the clone it locally, create a new personal repository for your invisible fork, and push it back to that personal repository.
dd7961 500
6e15cb 501 ## Alternative Authentication and Authorization
eb96ea 502
6e15cb 503 ### LDAP Authentication
JM 504 *SINCE 1.0.0*
505
506 LDAP can be used to authenticate Users and optionally control Team memberships.  When properly configured, Gitblit will delegate authentication to your LDAP server and will cache some user information in the usual users file (.conf or .properties).
507
508 When using the LDAP User Service, new user accounts can not be manually created from Gitblit.  Gitblit user accounts are automatically created for new users on their first succesful authentication through Gitblit against the LDAP server.  It is also important to note that the LDAP User Service does not retrieve or store user passwords nor does it implement any LDAP-write functionality.
509
510 To use the *LdapUserService* set *realm.userService=com.gitblit.LdapUserService* in your `gitblit.properties` file or your `web.xml` file and then configure the *realm.ldap* settings appropriately for your LDAP environment.
511
512 #### Example LDAP Layout
513 ![block diagram](ldapSample.png "LDAP Sample")
514
515 Please see [ldapUserServiceSampleData.ldif](https://github.com/gitblit/gitblit/blob/master/tests/com/gitblit/tests/resources/ldapUserServiceSampleData.ldif) to see the data in LDAP that reflects the above picture.
516
517 #### Gitblit Settings for Example LDAP Layout
518 The following are the settings required to configure Gitblit to authenticate against the example LDAP server with LDAP-controlled team memberships.
519
520 <table class="table">
521 <thead>
522 <tr><th>parameter</th><th>value</th><th>description</th></tr>
523 </thead>
524 <tbody>
525 <tr>
526   <th>realm.ldap.server</th><td>ldap://localhost:389</td>
527   <td>Tells Gitblit to connect to the LDAP server on localhost port 389.  The URL Must be of form ldap(s)://&lt;server&gt;:&lt;port&gt; with port being optional (389 for ldap, 636 for ldaps).</td>
528 </tr>
529 <tr>
530   <th>realm.ldap.username</th><td>cn=Directory Manager</td>
531   <td>The credentials that will log into the LDAP server</td>
532 </tr>
533 <tr>
534   <th>realm.ldap.password</th><td>password</td>
535   <td>The credentials that will log into the LDAP server</td>
536 </tr>
537 <tr>
538   <th>realm.ldap.backingUserService</th><td>users.conf</td>
539   <td>Where to store all information that is used by Gitblit.  All information will be synced here upon user login.</td>
540 </tr>
541 <tr>
542   <th>realm.ldap.maintainTeams</th><td>true</td>
543   <td>Are team memberships maintained in LDAP (<em>true</em>) or manually in Gitblit (<em>false</em>).</td>
544 </tr>
545 <tr>
546   <th>realm.ldap.accountBase</th><td>OU=Users,OU=UserControl,OU=MyOrganization,DC=MyDomain</td>
547   <td>What is the root node for all users in this LDAP system.  Subtree searches will start from this node.</td>
548 </tr>
549 <tr>
550   <th>realm.ldap.accountPattern</th><td>(&(objectClass=person)(sAMAccountName=${username}))</td><td>The LDAP search filter that will match a particular user in LDAP.  ${username} will be replaced with whatever the user enters as their username in the Gitblit login panel.</td>
551 </tr>
552 <tr>
553   <th>realm.ldap.groupBase</th><td>OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain</td>
554   <td>What is the root node for all teams in this LDAP system.  Subtree searches will start from this node.</td>
555 </tr>
556 <tr>
557   <th>realm.ldap.groupMemberPattern</th><td>(&(objectClass=group)(member=${dn}))</td><td>The LDAP search filter that will match all teams for the authenticating user.  ${username} will be replaced with whatever the user enters as their username in the Gitblit login panel.  Anything else in ${} will be replaced by Attributes from the User node.</td>
558 </tr>
559 <tr>
560   <th>realm.ldap.admins</th><td>@Git_Admins</td><td>A space-delimited list of usernames and/or teams that indicate admin status in Gitblit.  Teams are referenced with a leading <em>@</em> character.</td>
561 </tr>
562 </tbody>
563 </table>
564
565 #### LDAP In-Memory Server
566
567 You can start Gitblit GO with an in-memory LDAP server by specifying the *--ldapLdifFile* command-line argument.  The LDAP server will listen on localhost of the port specified in *realm.ldap.url* of `gitblit.properties`.  Additionally, a root user record is automatically created for *realm.ldap.username* and *realm.ldap.password*.  Please note that the ldaps:// protocol is not supported for the in-memory server.
568
569 ### Custom Authentication
eb96ea 570 This is the simplest choice where you implement custom authentication and delegate all other standard user and team operations to one of Gitblit's user service implementations.  This choice insulates your customization from changes in User and Team model classes and additional API that may be added to IUserService.
JM 571
572 Please subclass [com.gitblit.GitblitUserService](https://github.com/gitblit/gitblit/blob/master/src/com/gitblit/GitblitUserService.java) and override the *setup()* and *authenticate()* methods.  
573 Make sure to set the *serviceImpl* field in your *setup()* method.
574
575 You may use your subclass by specifying its fully qualified classname in the *realm.userService* setting.
576
577 Your subclass must be on Gitblit's classpath and must have a public default constructor.  
578
6e15cb 579 ### Custom Everything
93f472 580 Instead of maintaining a `users.conf` or `users.properties` file, you may want to integrate Gitblit into an existing environment.
dd7961 581
3b5289 582 You may use your own custom *com.gitblit.IUserService* implementation by specifying its fully qualified classname in the *realm.userService* setting.
dd7961 583
fe24a0 584 Your user service class must be on Gitblit's classpath and must have a public default constructor.  
JM 585 Please see the following interface definition [com.gitblit.IUserService](https://github.com/gitblit/gitblit/blob/master/src/com/gitblit/IUserService.java).
230632 586
fa54be 587 ## Groovy Hook Scripts
JM 588
589 *SINCE 0.8.0*
590
444101 591 Gitblit uses Groovy for its push hook mechanism.  This mechanism only executes when pushing to Gitblit, not when pushing to some other Git tooling in your stack.
fa54be 592
JM 593 The Groovy hook mechanism allows for dynamic extension of Gitblit to execute custom tasks on receiving and processing push events.  The scripts run within the context of your Gitblit instance and therefore have access to Gitblit's internals at runtime.
594
eb96ea 595 ### Rules, Requirements, & Behaviors
6cc1d4 596 1. Your Groovy scripts must be stored in the *groovy.scriptsFolder* as specified in `gitblit.properties` or `web.xml`.
JM 597 2. All script files must have the *.groovy* extension. Because of this you may omit the extension when specifying the script.
0b9119 598 3. Script filenames must not have spaces!
JM 599 4. Scripts must be explicitly specified to be executed, no scripts are *automatically* executed by name or extension.
600 5. A script can be specified to run on *all repositories* by adding the script file name to *groovy.preReceiveScripts* or *groovy.postReceiveScripts* in `gitblit.properties` or `web.xml`.
d7905a 601 6. Scripts can be specified for a team.
JM 602 7. Scripts may also be specified per-repository in the repository's settings.
603 8. Globally-specified scripts and team-specified scripts are excluded from the list of available scripts in a repository's settings 
604 9. Globally-specified scripts are executed first, in their listed order; followed by team-specified scripts in their listed order by alphabetical team order; followed by per-repository scripts, in their listed order.
605 10. A script may only be defined once in a pre-receive chain and once in a post-receive chain.  
6cc1d4 606 You may execute the same script on pre-receive and post-receive, just not multiple times within a pre-receive or post-receive event.
d7905a 607 11. Gitblit does not differentiate between what can be a pre-receive script and what can be a post-receive script.
JM 608 12. If a script *returns false* then the hook chain is aborted and none of the subsequent scripts will execute.
fa54be 609
eb96ea 610 Some sample scripts are included in the GO and WAR distributions to show you how you can tap into Gitblit with the provided bound variables.  Additional implementation details may be specified in the header comment of these examples.
JM 611
fa54be 612 Hook contributions and improvements are welcome.
JM 613
67d4f8 614 ### Grapes
JM 615
616 *SINCE 1.0.0*
617
618 [Grape](http://groovy.codehaus.org/Grape) lets you quickly add maven repository dependencies to your Groovy hook script.  
619
e4547f 620 <blockquote>Grape (The Groovy Adaptable Packaging Engine or Groovy Advanced Packaging Engine) is the infrastructure enabling the grab() calls in Groovy, a set of classes leveraging <a href="http://ant.apache.org/ivy">Ivy</a> to allow for a repository driven module system for Groovy. This allows a developer to write a script with an essentially arbitrary library requirement, and ship just the script. Grape will, at runtime, download as needed and link the named libraries and all dependencies forming a transitive closure when the script is run from existing repositories such as Ibiblio, Codehaus, and java.net.</blockquote>
67d4f8 621
f6b200 622 ---JAVA---
67d4f8 623 // create and use a primitive array
JM 624 import org.apache.commons.collections.primitives.ArrayIntList
625
626 @Grab(group='commons-primitives', module='commons-primitives', version='1.0')
627 def createEmptyInts() { new ArrayIntList() }
628
629 def ints = createEmptyInts()
630 ints.add(0, 42)
631 assert ints.size() == 1
632 assert ints.get(0) == 42
f6b200 633 ---JAVA---
67d4f8 634
7c1cdc 635 ### Custom Fields
JM 636
637 *SINCE 1.0.0*
638
639 Gitblit allows custom repository string fields to be defined in `gitblit.properties` or `web.xml`.  Entry textfields are automatically created for these fields in the Edit Repository page of Gitblit and the Edit Repository dialog of the Gitblit Manager.  These fields are accessible from your Groovy hook scripts as
640
641     repository.customFields.myField
642
643 This feature allows you to customize the behavior of your hook scripts without hard-coding values in the hook scripts themselves.
644
6cc1d4 645 ### Pre-Receive
JM 646
647 Pre-Receive scripts execute after the pushed objects have all been written to the Git repository but before the refs have been updated to point to these new objects.
648
649 This is the appropriate point to block a push and is how many Git tools implement branch-write permissions.
650
651 ### Post-Receive
652
653 Post-Receive scripts execute after all refs have been updated.
654
655 This is the appropriate point to trigger continuous integration builds or send email notifications, etc.
656
0b9119 657 ## Push Email Notifications
JM 658
659 Gitblit implements email notifications in *sendmail.groovy* which uses the Groovy Hook Script mechanism.  This allows for dynamic customization of the notification process at the installation site and serves as an example push script.
660
661 ### Enabling Push Notifications
662
663 In order to send email notifications on a push to Gitblit, this script must be specified somewhere in the *post-receive* script chain.  
e927f4 664 You may specify *sendmail* in one of three places:
0b9119 665
JM 666 1. *groovy.postReceiveScripts* in `gitblit.properties` or `web.xml`, globally applied to all repositories
e927f4 667 2. post-receive scripts of a Team definition
JM 668 3. post-receive scripts of a Repository definition
0b9119 669
JM 670 ### Destination Addresses
671
672 Gitblit does not currently support individual subscriptions to repositories; i.e. a *user* can not subscribe or unsubscribe from push notifications.
673
674 However, Repository Managers and Administrators can specify subscribed email addresses in one of three places:
675
676 1. *mail.mailingLists* in `gitblit.properties` or `web.xml`, globally applied to all push-notified repositories
677 2. mailing lists in a Team definition, applied to all repositories that are part of the team definition
678 3. mailing lists in a Repository definition
679
680 All three sources are checked and merged into a unique list of destination addresses for push notifications.
681
682 **NOTE:**  
683 Care should be taken when devising your notification scheme as it relates to any VIEW restricted repositories you might have.  Setting a global mailing list and activating push notifications for a VIEW restricted repository may send unwanted emails.
684
ff3f0e 685 ## Lucene Search Integration
JM 686
687 *SINCE 0.9.0*
688
a717d5 689 Repositories may optionally be indexed using the Lucene search engine.  The Lucene search offers several advantages over commit-traversal search:
ff3f0e 690
a717d5 691 1. very fast commit and blob searches
JM 692 2. multi-term searches
693 3. term-highlighted and syntax-highlighted fragment matches
694 4. multi-repository searches
695
696 ### How do I use it?
697
7db092 698 First you must ensure that *web.allowLuceneIndexing* is set *true* in `gitblit.properties` or `web.xml`.  Then you must understand that Lucene indexing is an opt-in feature which means that no repositories are automatically indexed.  
a717d5 699 Like anything else, this design has pros and cons.
JM 700
701 #### Pros
7db092 702 1. no wasted cycles indexing repositories you will never search
a717d5 703 2. you specify exactly what branches are indexed; experimental/dead/personal branches can be ignored
JM 704
705 #### Cons
0273b2 706 1. you specify exactly what branches are indexed
a717d5 707
0273b2 708 #### I have 300 repositories and you want me to specify indexed branches on each one??
a717d5 709
0273b2 710 Yeah, I agree that is inconvenient.
a717d5 711
0273b2 712 If you are using Gitblit GO there is a utility script `add-indexed-branch.cmd` which allows you to specify an indexed branch for many repositories in one step.
JM 713
714 If you are using Gitblit WAR then, at present, you are out of luck unless you write your own script to traverse your repositories and use native Git to manipulate each repository config.
715
716     git config --add gitblit.indexBranch "default"
717     git config --add gitblit.indexBranch "refs/heads/master"
a717d5 718
JM 719 #### Indexing Branches
0273b2 720 You may specify which branches should be indexed per-repository in the *Edit Repository* page.  New/empty repositories may only specify the *default* branch which will resolve to whatever commit HEAD points to or the most recently updated branch if HEAD is unresolvable.
JM 721
722 Indexes are built and incrementally updated on a 2 minute cycle so you may have to wait a few minutes before your index is built or before your latest pushes get indexed.
ff3f0e 723
JM 724 **NOTE:**  
a717d5 725 After specifying branches, only the content from those branches can be searched via Gitblit.  Gitblit will automatically redirect any queries entered on a repository's search box to the Lucene search page. Repositories that do not specify any indexed branches will use the traditional commit-traversal search.
ff3f0e 726
7db092 727 #### Adequate Heap
JM 728
729 The initial indexing of an existing repository can potentially exhaust the memory allocated to your Java instance and may throw OutOfMemory exceptions.  Be sure to provide your Gitblit server adequate heap space to index your repositories.  The heap is set using the *-Xmx* JVM parameter in your Gitblit launch command (e.g. -Xmx1024M).
730
0273b2 731 #### Why does Gitblit check every 2 mins for repository/branch changes?
JM 732
733 Gitblit has to balance its design as a complete, integrated Git server and its utility as a repository viewer in an existing Git setup.
734
735 Gitblit could build indexes immediately on *edit repository* or on *receiving pushes*, but that design would not work if someone is pushing via ssh://, git://, or file:// (i.e. not pushing to Gitblit http(s)://).  For this reason Gitblit has a polling mechanism to check for ref changes every 2 mins.  This design works well for all use cases, aside from adding a little lag in updating the index.
736
1f9dae 737 ## Client Setup and Configuration
JM 738 ### Https with Self-Signed Certificates
d39680 739 You must tell Git/JGit not to verify the self-signed certificate in order to perform any remote Git operations.
1f9dae 740
3b5289 741 **NOTE:**  
JM 742 The default self-signed certificate generated by Gitlbit GO is bound to *localhost*.  
743 If you are using Eclipse/EGit/JGit clients, you will have to generate your own certificate that specifies the exact hostname used in your clone/push url.  
724da5 744 You must do this because Eclipse/EGit/JGit (< 3.0) always verifies certificate hostnames, regardless of the *http.sslVerify=false* client-side setting. 
d39680 745  
3b5289 746 - **Eclipse/EGit/JGit**
1f9dae 747     1. Window->Preferences->Team->Git->Configuration
JM 748     2. Click the *New Entry* button
3b5289 749     3. <pre>Key = <em>http.sslVerify</em>
JM 750 Value = <em>false</em></pre>
751 - **Command-line Git** ([Git-Config Manual Page](http://www.kernel.org/pub/software/scm/git/docs/git-config.html))  
752 <pre>git config --global --bool --add http.sslVerify false</pre>
1f9dae 753
28a1e9 754 ### Http Post Buffer Size
JM 755 You may find the default post buffer of your git client is too small to push large deltas to Gitblit.  Sometimes this can be observed on your client as *hanging* during a push.  Other times it can be observed by git erroring out with a message like: error: RPC failed; result=52, HTTP code = 0.
756
757 This can be adjusted on your client by changing the default post buffer size:
758 <pre>git config --global http.postBuffer 524288000</pre>
759
2fe1e2 760 ### Disabling SNI
JM 761
762 You may run into SNI alerts (Server Name Indication).  These will manifest as failures to clone or push to your Gitblit instance.
763
764 #### Java-based Clients
765
766 When using Java 7-based clients, SNI is enabled by default.  You can disable SNI by specifying the JVM system parameter `-Djsse.enableSNIExtension=false` when your Java-based client launches.
767
768 For Eclipse, you can append `-Djsse.enableSNIExtension=false` to your *eclipse.ini* file.
769
770 #### Native Clients
771
772 Native clients may display an error when attempting to clone or push that looks like this:
773 ---FIXED---
774 C:\projects\git\gitblit>git push rhcloud master
775 error: error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112) while accessing https://demo-gitblit.rhcloud.com/git/gitblit.git/info/refs?service=git-receive-pack
776 fatal: HTTP request failed
777 ---FIXED---
778
1f9dae 779 ### Cloning an Access Restricted Repository 
3b5289 780 - **Eclipse/EGit/JGit**  
JM 781 Nothing special to configure, EGit figures out everything.
782 <pre>https://yourserver/git/your/repository</pre>
783 - **Command-line Git**  
784 My testing indicates that your username must be embedded in the url.  YMMV.  
073b11 785 <pre>https://username@yourserver/git/your/repository</pre>
JC 786