James Moger
2012-12-03 2e8c48c0048e386431d5c41cea733b6d95760d52
commit | author | age
85c2e6 1 ## Gitblit WAR Setup
dd7961 2
3b5289 3 1. Download [Gitblit WAR %VERSION%](http://code.google.com/p/gitblit/downloads/detail?name=%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.
93f472 5 3. Copy the `WEB-INF/users.conf` file to a location outside the webapps folder that is accessible by your servlet container.  
fa54be 6 Optionally copy the example hook scripts in `WEB-INF/groovy` to a location outside the webapps folder that is accesible by your servlet container.
3b5289 7 4. The Gitblit webapp is configured through its `web.xml` file.  
85c2e6 8 Open `web.xml` in your favorite text editor and make sure to review and set:
JM 9     - <context-parameter> *git.repositoryFolder* (set the full path to your repositories folder)
fa54be 10     - <context-parameter> *groovy.scriptsFolder* (set the full path to your Groovy hook scripts folder)
e4547f 11     - <context-parameter> *groovy.grapeFolder* (set the full path to your Groovy Grape artifact cache)
13a3f5 12     - <context-parameter> *web.projectsFile* (set the full path to your projects metadata file)
93f472 13     - <context-parameter> *realm.userService* (set the full path to `users.conf`)
e4547f 14     - <context-parameter> *git.packedGitLimit* (set larger than the size of your largest repository)
JM 15     - <context-parameter> *git.streamFileThreshold* (set larger than the size of your largest committed file)
85c2e6 16 5. You may have to restart your servlet container. 
JM 17 6. Open your browser to <http://localhost/gitblit> or whatever the url should be.
d4c908 18 7. Enter the default administrator credentials: **admin / admin** and click the *Login* button  
d39680 19     **NOTE:** Make sure to change the administrator username and/or password!! 
85c2e6 20
JM 21 ## Gitblit GO Setup
22
3b5289 23 1. Download and unzip [Gitblit GO %VERSION%](http://code.google.com/p/gitblit/downloads/detail?name=%GO%).  
85c2e6 24 *Its best to eliminate spaces in the path name.* 
3b5289 25 2. The server itself is configured through a simple text file.  
dd7961 26 Open `gitblit.properties` in your favorite text editor and make sure to review and set:
d39680 27     - *git.repositoryFolder* (path may be relative or absolute)
fa54be 28     - *groovy.scriptsFolder* (path may be relative or absolute)
e4547f 29     - *groovy.grapeFolder* (path may be relative or absolute)
28a1e9 30     - *web.siteName* (used in certificate generation, etc)
d39680 31     - *server.tempFolder* (path may be relative or absolute)
831469 32     - *server.httpPort* and *server.httpsPort*
3b5289 33     - *server.httpBindInterface* and *server.httpsBindInterface*  
28a1e9 34     - *server.storePassword*
831469 35     **https** is strongly recommended because passwords are insecurely transmitted form your browser/git client using Basic authentication!
e4547f 36     - *git.packedGitLimit* (set larger than the size of your largest repository)
JM 37     - *git.streamFileThreshold* (set larger than the size of your largest committed file)
28a1e9 38 3. Execute `authority.cmd` or `java -jar authority.jar` from a command-line
JM 39     a. enter default values for your generated certificates in the *new certificate defaults* dialog
40     b. enter the store password used in *server.storePassword* when prompted *(this generates an SSL certificate for **localhost**)*
41     c. you will also want to generate SSL certificates for the hostnames or ip addresses you serve from
42     d. exit the authority app
43 4. Execute `gitblit.cmd` or `java -jar gitblit.jar` from a command-line
230632 44 5. Open your browser to <http://localhost:8080> or <https://localhost:8443> depending on your chosen configuration.
d4c908 45 6. Enter the default administrator credentials: **admin / admin** and click the *Login* button    
d39680 46     **NOTE:** Make sure to change the administrator username and/or password!! 
85c2e6 47
28a1e9 48 ### Creating your own Self-Signed SSL Certificate
JM 49 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 50
28a1e9 51 Remote Eclipse/EGit/JGit clients (<= 2.1.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 52
JM 53 The EGit failure message is something like:
54
55     Cannot get remote repository refs.
56     Reason: https:/myserver.com/git/myrepo.git: cannot open git-upload-pack
57
58 If you want to serve your repositories to another machine over https then you will want to generate your own certificate.
59
28a1e9 60 1. `authority.cmd` or `java -jar authority.jar`
JM 61 2. Click the *new ssl certificate* button (red rosette in the toolbar in upper left of window)
62 3. Enter the hostname or ip address
63 4. Enter the *server.storePassword* password
85c2e6 64  
28a1e9 65 Additionally, if you want to change the value of *server.storePassword* (recommended) you will have to delete the following files and then start the Gitblit Certificate Authority app:
JM 66 1. serverKeyStore.jks
67 2. serverTrustStore.jks
68 3. certs/caKeyStore.jks
69 4. certs/ca.crt
d39680 70
28a1e9 71 ### Client SSL Certificates
JM 72 SINCE 1.2.0
73
74 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.
75
76 All X509 certificates have a *distinguished name (DN)* which is a signature of several fields like:
77
78     C=US,O=Gitblit,OU=Gitblit,CN=james
79     
80 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.
81
82 How do you make your servlet container trust a client certificate?
83
84 In the WAR variant, you will have to manually setup your servlet container to:
85 1. want/need client certificates
86 2. trust a CA certificate used to sign your client certificates
87 3. generate client certificates signed by your CA certificate
88
89 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.
90
91 #### Creating SSL Certificates with Gitblit Certificate Authority
92
93 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 `certs\instructions.tmpl` and can be modified to suit your needs.
94
95 1. `authority.cmd` or `java -jar authority.jar`
96 2. Select the user for which to generate the certificate
97 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.
98 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.
85c2e6 99
JM 100 ### Running as a Windows Service
d39680 101 Gitblit uses [Apache Commons Daemon](http://commons.apache.org/daemon) to install and configure its Windows service.
JM 102
103 1. Review the contents of the `installService.cmd`
3b5289 104 2. Set the *ARCH* value as appropriate for your installed Java Virtual Machine.
d39680 105 3. Add any necessary *--StartParams* as enumerated below in **Command-Line Parameters**.
JM 106 4. Execute the script.
107
108 After service installation you can use the `gitblitw.exe` utility to control and modify the runtime settings of the service.<br/>
109 Additional service definition options and runtime capabilities of `gitblitw.exe` (prunmgr.exe) are documented [here](http://commons.apache.org/daemon/procrun.html).
110
111 **NOTE:**<br/>
112 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 113
1c9219 114 #### VM Considerations
JM 115 By default, the service installation script configures your Windows service to use your default JVM.  This setup usually defaults to a client VM.<br/>
116 If you have installed a JDK, you might consider using the `gitblitw.exe` utility to manually specify the *server* VM.
117
118 1. Execute `gitblitw.exe`
119 2. On the *Java* tab uncheck *Use default*.
120 3. Manually navigate your filesystem and specify the server VM with the `...` button<br/><pre>
3b5289 121 Java Virtual Machine:
JM 122 C:\Program Files\Java\jre6\bin\server\jvm.dll</pre>
1c9219 123
85c2e6 124 #### Command-Line Parameters
JM 125 Command-Line parameters override the values in `gitblit.properties` at runtime.
126
127     --repositoriesFolder   Git Repositories Folder
128     --userService          Authentication and Authorization Service (filename or fully qualified classname)
129     --useNio               Use NIO Connector else use Socket Connector.
130     --httpPort             HTTP port for to serve. (port <= 0 will disable this connector)
131     --httpsPort            HTTPS port to serve.  (port <= 0 will disable this connector)
3cc6e2 132     --ajpPort              AJP port to serve.  (port <= 0 will disable this connector)
85c2e6 133     --storePassword        Password for SSL (https) keystore.
JM 134     --shutdownPort         Port for Shutdown Monitor to listen on. (port <= 0 will disable this monitor)
135     --tempFolder           Folder for server to extract built-in webapp
136     
137 **Example**
138
93f472 139     java -jar gitblit.jar --userService c:\myrealm.config --storePassword something
9c7a36 140
JM 141 #### Overriding Gitblit GO's Log4j Configuration
142
143 You can override Gitblit GO's default Log4j configuration with a command-line parameter to the JVM.
144
145     java -Dlog4j.configuration=file:///home/james/log4j.properties -jar gitblit.jar <optional_gitblit_args>
146     
147 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 148     
JM 149 ## Running Gitblit behind Apache
150
151 Gitblit runs fine behind Apache.  You may use either *mod_proxy* (GO or WAR) or *mod_proxy_ajp* (GO).
152
153 Each Linux distribution may vary on the exact configuration of Apache 2.2.  
154 Here is a sample configuration that works on Debian 7.0 (Wheezy), your distribution may be different.
155
156 1. First we need to make sure we have Apache's proxy modules available.  
157 <pre>
158 sudo su
159 cd /etc/apache2/mods-enabled
160 ln -s ../mods-available/proxy.load proxy.load
161 ln -s ../mods-available/proxy_balancer.load proxy_balancer.load
162 ln -s ../mods-available/proxy_http.load proxy_http.load
163 ln -s ../mods-available/proxy_ajp.load proxy_ajp.load
164 </pre>
165 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`.  
166 %BEGINCODE%
167 # Turn off support for true Proxy behaviour as we are acting as 
168 # a transparent proxy
169 ProxyRequests Off
170
171 # Turn off VIA header as we know where the requests are proxied
172 ProxyVia Off
173  
174 # Turn on Host header preservation so that the servlet container
175 # can write links with the correct host and rewriting can be avoided.
176 #
177 # This is important for all git push/pull/clone operations.
178 ProxyPreserveHost On
179  
180 # Set the permissions for the proxy
181 &lt;Proxy *&gt;
182     AddDefaultCharset off
183     Order deny,allow
184     Allow from all
185 &lt;/Proxy&gt;
186  
187 # The proxy context path must match the Gitblit context path.
188 # For Gitblit GO, see server.contextPath in gitblit.properties.
189
190 #ProxyPass /gitblit http://localhost:8080/gitblit
a00408 191 #ProxyPassreverse /gitblit http://localhost:8080/gitblit
JM 192
193 # If your httpd frontend is https but you are proxying http Gitblit WAR or GO
a717d5 194 #Header edit Location &#94;http://([&#94;&#8260;]+)/gitblit/ https://&#36;1/gitblit/
a00408 195
f1b488 196 # Additionally you will want to tell Gitblit the original scheme and port
5efc4a 197 #RequestHeader set X-Forwarded-Proto https
JM 198 #RequestHeader set X-Forwarded-Port 443
f1b488 199
c558de 200 # If you are using subdomain proxying then you will want to tell Gitblit the appropriate
JM 201 # context path for your repository url.
202 # If you are not using subdomain proxying, then ignore this setting.
203 #RequestHeader set X-Forwarded-Context /
204
4b9d64 205 #ProxyPass /gitblit ajp://localhost:8009/gitblit
JM 206 %ENDCODE%  
207 **Please** make sure to:  
208     1. Review the security of these settings as appropriate for your deployment
209     2. Uncomment the *ProxyPass* setting for whichever connection you prefer (http/ajp)
210     3. Correctly set the ports and context paths both in the *ProxyPass* definition and your Gitblit installation  
211     If you are using Gitblit GO you can easily configure the AJP connector by specifying a non-zero AJP port.  
212     Please remember that on Linux/UNIX, ports < 1024 require root permissions to open.
213     4. Set *web.mountParameters=false* in `gitblit.properties` or `web.xml` this will use parameterized URLs.  
214     Alternatively, you can respecify *web.forwardSlashCharacter*.
790c38 215
JM 216 ## Upgrading Gitblit
217 Generally, upgrading is easy.
218
93f472 219 Since Gitblit does not use a database the only files you have to worry about are your configuration file (`gitblit.properties` or `web.xml`) and possibly your `users.conf` or `users.properties` file.
790c38 220
JM 221 Any important changes to the setting keys or default values will always be mentioned in the [release log](releases.html).
222
93f472 223 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 224
225 `users.properties` and its user service implementation are deprecated as of v0.8.0.
226
790c38 227 ### Upgrading Gitblit WAR
93f472 228 1. Backup your `web.xml` file  
JM 229 Backup your `web.properties` file (if you have one, these are the setting overrides from using the RPC administration service)
790c38 230 2. Delete currently deployed gitblit WAR
JM 231 3. Deploy new WAR and overwrite the `web.xml` file with your backup
232 4. Review and optionally apply any new settings as indicated in the [release log](releases.html). 
233  
234 ### Upgrading Gitblit GO
235  
236 1. Backup your `gitblit.properties` file
93f472 237 2. Backup your `users.properties` file *(if it is located in the Gitblit GO folder)*  
JM 238 OR  
239 Backup your `users.conf` file *(if it is located in the Gitblit GO folder)*
fa54be 240 3. Backup your Groovy hook scripts
JM 241 4. Unzip Gitblit GO to a new folder
242 5. Overwrite the `gitblit.properties` file with your backup
243 6. Overwrite the `users.properties` file with your backup *(if it was located in the Gitblit GO folder)*  
93f472 244 OR  
JM 245 Overwrite the `users.conf` file with your backup *(if it was located in the Gitblit GO folder)*
fa54be 246 7. Review and optionally apply any new settings as indicated in the [release log](releases.html).
790c38 247
JM 248 #### Upgrading Windows Service
3b5289 249 You may need to delete your old service definition and install a new one depending on what has changed in the release.
JM 250
85c2e6 251 ## Gitblit Configuration
dd7961 252
JM 253 ### Administering Repositories
00afd7 254 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 255
JM 256 All repository settings are stored within the repository `.git/config` file under the *gitblit* section.
257
258     [gitblit]
259         description = master repository
00afd7 260         owner = james
dd7961 261         useTickets = false
JM 262         useDocs = true
263         showRemoteBranches = false
264         accessRestriction = clone
00afd7 265         isFrozen = false
a1ea87 266         showReadme = false
f6740d 267         federationStrategy = FEDERATE_THIS
831469 268         isFederated = false
84c1d5 269         skipSizeCalculation = false
8f73a7 270         federationSets = 
3b5289 271
dd7961 272 #### Repository Names
5d7545 273 Repository names must be unique and are CASE-SENSITIVE ON CASE-SENSITIVE FILESYSTEMS.  The name must be composed of letters, digits, or `/ _ - . ~`<br/>
dd7961 274 Whitespace is illegal.
JM 275
168566 276 Repositories can be grouped within subfolders.  e.g. *libraries/mycoollib.git* and *libraries/myotherlib.git*
a3bde6 277
85c2e6 278 All repositories created with Gitblit are *bare* and will automatically have *.git* appended to the name at creation time, if not already specified. 
a3bde6 279
00afd7 280 #### Repository Owner
JM 281 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.
282
20714a 283 ### Access Restrictions and Access Permissions
JM 284 ![permissions matrix](permissions_matrix.png "Permissions and Restrictions")
285
286 #### Discrete Permissions (Gitblit v1.2.0+)
287
288 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:
289
290 - **V** (view in web ui, RSS feeds, download zip)
291 - **R** (clone)
292 - **RW** (clone and push)
293 - **RWC** (clone and push with ref creation)
294 - **RWD** (clone and push with ref creation, deletion)
295 - **RW+** (clone and push with ref creation, deletion, rewind)
5d7545 296
JM 297 These permission codes are combined with the repository path to create a user permission:
298
299     RW:mygroup/myrepo.git
300
301 #### Discrete Permissions with Regex Matching (Gitblit v1.2.0+)
302
e5aaa5 303 Gitblit also supports *case-insensitive* regex matching for repository permissions.  The following permission grants push privileges to all repositories in the *mygroup* folder.
5d7545 304
2d48e2 305     RW:mygroup/.*
JM 306
307 ##### Exclusions
308
309 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.
310
311     X:mygroup/.*
312     R:.*
313
314 ##### Order is Important
315
316 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:
317
318 1. If the user is an admin or repository owner, then RW+
319 2. Else if user has an explicit permission, use that
320 3. Else check for the first regex match in user permissions
321 4. Else check for the HIGHEST permission from team memberships
322     1. If the team is an admin team, then RW+
323     2. Else if a team has an explicit permission, use that
324     3. Else check for the first regex match in team permissions
20714a 325
JM 326 #### No-So-Discrete Permissions (Gitblit <= v1.1.0)
327
15640f 328 Prior to v1.2.0, Gitblit has two main access permission groupings:  
JM 329
330 1. what you are permitted to do as an anonymous user
331 2. **RW+** for any permitted user
332
333 #### Committer Verification
334
335 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.
336
337 **How is this enforced?**
338
339 Bob must set his *user.name* and *user.email* values for the repository to match his Gitblit user account **BEFORE** committing to his repository.
340 <pre>
341 [user "bob"]
342     displayName = Bob Jones
343     emailAddress = bob@somewhere.com
344 </pre>
345 <pre>
346     git config user.name "Bob Jones"
347     git config user.email bob@somewhere.com    
348 </pre>
349 or
350
351     git config user.name bob
352     git config user.email bob@somewhere.com    
353
354 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.
355
356 All checks are case-insensitive.
357
358 **What about merges?**
359
360 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 361
fe24a0 362 ### Teams
JM 363
364 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. 
365
366 ### Administering Users (users.conf, Gitblit v0.8.0+)
367 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.
368
93f472 369 The `users.conf` file uses a Git-style configuration format:
JM 370
371     [user "admin"]
372         password = admin
373         role = "#admin"
374         role = "#notfederated"
20714a 375         repository = RW+:repo1.git
JM 376         repository = RW+:repo2.git
fe24a0 377         
JM 378     [user "hannibal"]
379         password = bossman
20714a 380         repository = RWD:topsecret.git
5d7545 381         repository = RW+:ateam/[A-Za-z0-9-~_\\./]+
fe24a0 382
JM 383     [user "faceman"]
384         password = vanity
385
386     [user "murdock"]
387         password = crazy        
388         
389     [user "babaracus"]
390         password = grrrr
391         
392     [team "ateam"]
393         user = hannibal
394         user = faceman
395         user = murdock
396         user = babaracus
20714a 397         repository = RW:topsecret.git
0b9119 398         mailingList = list@ateam.org
d7905a 399         postReceiveScript = sendmail
93f472 400
JM 401 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. 
402
fe24a0 403 ### Administering Users (users.properties, Gitblit v0.5.0 - v0.7.0)
JM 404 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.
405
fa54be 406 The format of `users.properties` loosely follows Jetty's convention for HashRealms:
dd7961 407
fa54be 408     username=password,role1,role2,role3...
0b9119 409     @teamname=&mailinglist,!username1,!username2,!username3,repository1,repository2,repository3...
dd7961 410
20714a 411 ### Usernames
3b5289 412 Usernames must be unique and are case-insensitive.  
dd7961 413 Whitespace is illegal.
JM 414
20714a 415 ### Passwords
486ee1 416 User passwords are CASE-SENSITIVE and may be *plain*, *md5*, or *combined-md5* formatted (see `gitblit.properties` -> *realm.passwordStorage*).
dd7961 417
20714a 418 ### User Roles
JM 419 There are four actual *roles* in Gitblit:
420
421 - *#admin*, which grants administrative powers to that user
422 - *#notfederated*, which prevents an account from being pulled by another Gitblit instance
423 - *#create*, which allows the user the power to create personal repositories
424 - *#fork*, which allows the user to create a personal fork of an existing Gitblit-hosted repository
425
426 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.
427
428 **NOTE:**  
429 The following roles are equivalent:
430
431 - myrepo.git
432 - RW+:myrepo.git
433
434 This is to preserve backwards-compatibility with Gitblit <= 1.1.0 which granted rewind power to all access-permitted users.
435
436 ### Personal Repositories & Forks
437
438 Personal Repositories and Forks are related but are controlled individually.
439
440 #### Creating a Personal Repository
441 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.
442
443 #### Creating a Fork
444 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.
445
446 Forks are mostly likely personal repositories or common/shared repositories except for two important differences:
447
448 1. Forks inherit a view/clone access list from the origin repository.  
449 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.
450 2. Forks are always listed in the fork network, regardless of any access restriction set on the fork.  
451 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*.
452
453 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 454
6e15cb 455 ## Alternative Authentication and Authorization
eb96ea 456
6e15cb 457 ### LDAP Authentication
JM 458 *SINCE 1.0.0*
459
460 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).
461
462 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.
463
464 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.
465
466 #### Example LDAP Layout
467 ![block diagram](ldapSample.png "LDAP Sample")
468
469 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.
470
471 #### Gitblit Settings for Example LDAP Layout
472 The following are the settings required to configure Gitblit to authenticate against the example LDAP server with LDAP-controlled team memberships.
473
474 <table class="table">
475 <thead>
476 <tr><th>parameter</th><th>value</th><th>description</th></tr>
477 </thead>
478 <tbody>
479 <tr>
480   <th>realm.ldap.server</th><td>ldap://localhost:389</td>
481   <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>
482 </tr>
483 <tr>
484   <th>realm.ldap.username</th><td>cn=Directory Manager</td>
485   <td>The credentials that will log into the LDAP server</td>
486 </tr>
487 <tr>
488   <th>realm.ldap.password</th><td>password</td>
489   <td>The credentials that will log into the LDAP server</td>
490 </tr>
491 <tr>
492   <th>realm.ldap.backingUserService</th><td>users.conf</td>
493   <td>Where to store all information that is used by Gitblit.  All information will be synced here upon user login.</td>
494 </tr>
495 <tr>
496   <th>realm.ldap.maintainTeams</th><td>true</td>
497   <td>Are team memberships maintained in LDAP (<em>true</em>) or manually in Gitblit (<em>false</em>).</td>
498 </tr>
499 <tr>
500   <th>realm.ldap.accountBase</th><td>OU=Users,OU=UserControl,OU=MyOrganization,DC=MyDomain</td>
501   <td>What is the root node for all users in this LDAP system.  Subtree searches will start from this node.</td>
502 </tr>
503 <tr>
504   <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>
505 </tr>
506 <tr>
507   <th>realm.ldap.groupBase</th><td>OU=Groups,OU=UserControl,OU=MyOrganization,DC=MyDomain</td>
508   <td>What is the root node for all teams in this LDAP system.  Subtree searches will start from this node.</td>
509 </tr>
510 <tr>
511   <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>
512 </tr>
513 <tr>
514   <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>
515 </tr>
516 </tbody>
517 </table>
518
519 #### LDAP In-Memory Server
520
521 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.
522
523 ### Custom Authentication
eb96ea 524 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 525
526 Please subclass [com.gitblit.GitblitUserService](https://github.com/gitblit/gitblit/blob/master/src/com/gitblit/GitblitUserService.java) and override the *setup()* and *authenticate()* methods.  
527 Make sure to set the *serviceImpl* field in your *setup()* method.
528
529 You may use your subclass by specifying its fully qualified classname in the *realm.userService* setting.
530
531 Your subclass must be on Gitblit's classpath and must have a public default constructor.  
532
6e15cb 533 ### Custom Everything
93f472 534 Instead of maintaining a `users.conf` or `users.properties` file, you may want to integrate Gitblit into an existing environment.
dd7961 535
3b5289 536 You may use your own custom *com.gitblit.IUserService* implementation by specifying its fully qualified classname in the *realm.userService* setting.
dd7961 537
fe24a0 538 Your user service class must be on Gitblit's classpath and must have a public default constructor.  
JM 539 Please see the following interface definition [com.gitblit.IUserService](https://github.com/gitblit/gitblit/blob/master/src/com/gitblit/IUserService.java).
230632 540
fa54be 541 ## Groovy Hook Scripts
JM 542
543 *SINCE 0.8.0*
544
444101 545 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 546
JM 547 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.
548
eb96ea 549 ### Rules, Requirements, & Behaviors
6cc1d4 550 1. Your Groovy scripts must be stored in the *groovy.scriptsFolder* as specified in `gitblit.properties` or `web.xml`.
JM 551 2. All script files must have the *.groovy* extension. Because of this you may omit the extension when specifying the script.
0b9119 552 3. Script filenames must not have spaces!
JM 553 4. Scripts must be explicitly specified to be executed, no scripts are *automatically* executed by name or extension.
554 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 555 6. Scripts can be specified for a team.
JM 556 7. Scripts may also be specified per-repository in the repository's settings.
557 8. Globally-specified scripts and team-specified scripts are excluded from the list of available scripts in a repository's settings 
558 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.
559 10. A script may only be defined once in a pre-receive chain and once in a post-receive chain.  
6cc1d4 560 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 561 11. Gitblit does not differentiate between what can be a pre-receive script and what can be a post-receive script.
JM 562 12. If a script *returns false* then the hook chain is aborted and none of the subsequent scripts will execute.
fa54be 563
eb96ea 564 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 565
fa54be 566 Hook contributions and improvements are welcome.
JM 567
67d4f8 568 ### Grapes
JM 569
570 *SINCE 1.0.0*
571
572 [Grape](http://groovy.codehaus.org/Grape) lets you quickly add maven repository dependencies to your Groovy hook script.  
573
e4547f 574 <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 575
JM 576 %BEGINCODE%
577 // create and use a primitive array
578 import org.apache.commons.collections.primitives.ArrayIntList
579
580 @Grab(group='commons-primitives', module='commons-primitives', version='1.0')
581 def createEmptyInts() { new ArrayIntList() }
582
583 def ints = createEmptyInts()
584 ints.add(0, 42)
585 assert ints.size() == 1
586 assert ints.get(0) == 42
587 %ENDCODE%
588
7c1cdc 589 ### Custom Fields
JM 590
591 *SINCE 1.0.0*
592
593 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
594
595     repository.customFields.myField
596
597 This feature allows you to customize the behavior of your hook scripts without hard-coding values in the hook scripts themselves.
598
6cc1d4 599 ### Pre-Receive
JM 600
601 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.
602
603 This is the appropriate point to block a push and is how many Git tools implement branch-write permissions.
604
605 ### Post-Receive
606
607 Post-Receive scripts execute after all refs have been updated.
608
609 This is the appropriate point to trigger continuous integration builds or send email notifications, etc.
610
0b9119 611 ## Push Email Notifications
JM 612
613 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.
614
615 ### Enabling Push Notifications
616
617 In order to send email notifications on a push to Gitblit, this script must be specified somewhere in the *post-receive* script chain.  
e927f4 618 You may specify *sendmail* in one of three places:
0b9119 619
JM 620 1. *groovy.postReceiveScripts* in `gitblit.properties` or `web.xml`, globally applied to all repositories
e927f4 621 2. post-receive scripts of a Team definition
JM 622 3. post-receive scripts of a Repository definition
0b9119 623
JM 624 ### Destination Addresses
625
626 Gitblit does not currently support individual subscriptions to repositories; i.e. a *user* can not subscribe or unsubscribe from push notifications.
627
628 However, Repository Managers and Administrators can specify subscribed email addresses in one of three places:
629
630 1. *mail.mailingLists* in `gitblit.properties` or `web.xml`, globally applied to all push-notified repositories
631 2. mailing lists in a Team definition, applied to all repositories that are part of the team definition
632 3. mailing lists in a Repository definition
633
634 All three sources are checked and merged into a unique list of destination addresses for push notifications.
635
636 **NOTE:**  
637 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.
638
ff3f0e 639 ## Lucene Search Integration
JM 640
641 *SINCE 0.9.0*
642
a717d5 643 Repositories may optionally be indexed using the Lucene search engine.  The Lucene search offers several advantages over commit-traversal search:
ff3f0e 644
a717d5 645 1. very fast commit and blob searches
JM 646 2. multi-term searches
647 3. term-highlighted and syntax-highlighted fragment matches
648 4. multi-repository searches
649
650 ### How do I use it?
651
7db092 652 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 653 Like anything else, this design has pros and cons.
JM 654
655 #### Pros
7db092 656 1. no wasted cycles indexing repositories you will never search
a717d5 657 2. you specify exactly what branches are indexed; experimental/dead/personal branches can be ignored
JM 658
659 #### Cons
0273b2 660 1. you specify exactly what branches are indexed
a717d5 661
0273b2 662 #### I have 300 repositories and you want me to specify indexed branches on each one??
a717d5 663
0273b2 664 Yeah, I agree that is inconvenient.
a717d5 665
0273b2 666 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 667
668 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.
669
670     git config --add gitblit.indexBranch "default"
671     git config --add gitblit.indexBranch "refs/heads/master"
a717d5 672
JM 673 #### Indexing Branches
0273b2 674 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 675
676 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 677
JM 678 **NOTE:**  
a717d5 679 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 680
7db092 681 #### Adequate Heap
JM 682
683 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).
684
0273b2 685 #### Why does Gitblit check every 2 mins for repository/branch changes?
JM 686
687 Gitblit has to balance its design as a complete, integrated Git server and its utility as a repository viewer in an existing Git setup.
688
689 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.
690
1f9dae 691 ## Client Setup and Configuration
JM 692 ### Https with Self-Signed Certificates
d39680 693 You must tell Git/JGit not to verify the self-signed certificate in order to perform any remote Git operations.
1f9dae 694
3b5289 695 **NOTE:**  
JM 696 The default self-signed certificate generated by Gitlbit GO is bound to *localhost*.  
697 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.  
28a1e9 698 You must do this because Eclipse/EGit/JGit (<= 2.1.0) always verifies certificate hostnames, regardless of the *http.sslVerify=false* client-side setting. 
d39680 699  
3b5289 700 - **Eclipse/EGit/JGit**
1f9dae 701     1. Window->Preferences->Team->Git->Configuration
JM 702     2. Click the *New Entry* button
3b5289 703     3. <pre>Key = <em>http.sslVerify</em>
JM 704 Value = <em>false</em></pre>
705 - **Command-line Git** ([Git-Config Manual Page](http://www.kernel.org/pub/software/scm/git/docs/git-config.html))  
706 <pre>git config --global --bool --add http.sslVerify false</pre>
1f9dae 707
28a1e9 708 ### Http Post Buffer Size
JM 709 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.
710
711 This can be adjusted on your client by changing the default post buffer size:
712 <pre>git config --global http.postBuffer 524288000</pre>
713
1f9dae 714 ### Cloning an Access Restricted Repository 
3b5289 715 - **Eclipse/EGit/JGit**  
JM 716 Nothing special to configure, EGit figures out everything.
717 <pre>https://yourserver/git/your/repository</pre>
718 - **Command-line Git**  
719 My testing indicates that your username must be embedded in the url.  YMMV.  
073b11 720 <pre>https://username@yourserver/git/your/repository</pre>
JC 721