Best Practices

Setup a Repository

The SVN standard layout looks for a single-project repository:

[-] root
 +-- [-] branches
 |    +-- [+] branchA
 |    +-- [+] branchB
 |    ...
 +-- [-] tags
 |    +-- [+] tagA
 |    +-- [+] tagB
 |    ...
 +-- [+] trunk

or for multi-project repositories:

[-] root
 +-- [-] project1
 |    +-- [-] branches
 |    |    +-- [+] branchA
 |    |    +-- [+] branchB
 |    |    ...
 |    +-- [-] tags
 |    |    +-- [+] tagA
 |    |    +-- [+] tagB
 |    |    ...
 |    +-- [+] trunk
 +-- [-] project2
 |    +-- [-] branches
 |    |    +-- [+] branchA
 |    |    +-- [+] branchB
 |    |    ...
 |    +-- [-] tags
 |    |    +-- [+] tagA
 |    |    +-- [+] tagB
 |    |    ...
 |    +-- [+] trunk
 ...

Each of the directories branchA, branchB, …, tagA, tagB, … and trunk contain the full set of project files, not just sub-directories!

It is very recommended to follow this standard layout.

Checkout a Branch

You should neither checkout the repository root nor the project root from the repository, but just one of the directories branchA, branchB, …, tagA, tagB, … or trunk.

The reason is simple: if you would have checked out the whole repository or the whole project, including tags and branches, it would be a complete waste of hard disk space because each of the branches is a more or less different duplicate of the project content. Usually, branches and tags are created often and this would cause your full-repository or full-project working copy to quickly become very large and slow to handle.

After having checked out a branch from a project the first time, you can tell SmartSVN about the directory names for tags, branches by using Tag+Branch | Configure Layout.

Merge Changes

Before merging, it is highly recommended to have a clean working copy (no uncommitted local modifications or untracked files) and all files and directories of the working copy should have the same revision (no mixed-revision working copy).

To merge changes from a branch A to a branch B, first switch your working copy to the branch B using Modify | Switch (if branch B already is checked out, then you don’t need to switch, of course). Then invoke the Merge command (Modify | Merge) and select branch A as “Merge from”. If you don’t want to merge all changes from the branch A, but just a few ones, you may select “Revision Range” and select the commits by clicking the periods-button. You actually pull changes from the source branch into your current working copy state. If necessary, fix some conflicts (using the Conflict Solver or Modify | Mark Resolved) and then commit the changes from the root directory of the working copy (so the information of what has been merged - which is stored in the svn:mergeinfo property of the project’s root directory) is actually committed with the other changes to your current branch B.