## Upgrading Gitblit GO (1.7.0+)

The default `gitblit.properties` file has been split into two files: `gitblit.properties`, which is the recommended file for setting your configuration, and `defaults.properties` which are Gitblit's default settings.

    # Include Gitblit's 'defaults.properties' within your configuration.
    #
    # COMMA-DELIMITED
    # SINCE 1.7.0
    include = defaults.properties

Notice that the default settings are *included* by your `gitblit.properties` file.  The disadvantage to this approach is you must flip between discovering/reading the settings in `defaults.properties` and setting them in `gitblit.properties`, but there are some clear advantages too.  This setup is not required.  You may continue to keep all your settings in `gitblit.properties` like before.

Additionally you may find it useful if you are maintaining several Gitblit instances to share common properties files.

## Upgrading Gitblit GO (1.2.1+)
 
1. Unzip Gitblit GO to a new folder
2. Set the *--baseFolder* argument to point to your old `data` folder
3. Review and optionally apply any new settings as indicated in the [release log](releases.html) to `data/gitblit.properties`.

In *nix systems or Windows Vista/7/8, there are other tricks you can play like symlinking the `data` folder or symlinking the GO folder.
All platforms support the *--baseFolder* command-line argument.

## Upgrading Gitblit GO (pre-1.2.1)
1. Create a `data` folder and copy the following files and folders to it:
    - **users.conf**
	- **projects.conf** *(if you have one)*
	- **gitblit.properties**
	- **serverKeystore.jks**
	- **serverTrustStore.jks**
	- **certs** folder
	- **git** folder
	- **groovy** folder
	- **proposals** folder
    - and any other custom files (robots.txt, welcome/login markdown files, etc)
	- then edit your `gitblit.properties` file and adjust the following settings:
        - *git.repositoriesFolder* = ${baseFolder}/git
        - *groovy.scriptsFolder* = ${baseFolder}/groovy
        - *groovy.grapeFolder* = ${baseFolder}/groovy/grape
        - *web.projectsFile* = ${baseFolder}/projects.conf
        - *realm.userService* = ${baseFolder}/users.conf
        - *web.robots.txt* = ${baseFolder}/robots.txt
        - *federation.proposalsFolder* = ${baseFolder}/proposals
        - *realm.ldap.backingUserService* = ${baseFolder}/users.conf
        - *realm.redmine.backingUserService* = ${baseFolder}/users.conf
        - *server.tempFolder* = ${baseFolder}/temp

2. Unzip Gitblit GO to a new folder
3. Copy your `data` folder and overwrite the folder of the same name in the just-unzipped version
4. Review and optionally apply any new settings as indicated in the [release log](releases.html) to `data/gitblit.properties`.

**NOTE:** You may need to adjust your service definitions to include the `--baseFolder data` argument.

#### Upgrading Windows Service
You may need to delete your old service definition and install a new one depending on what has changed in the release.

