General
- Unlike most version control systems, Subversion's revision numbers apply to entire trees, not individual files.
- Recommended to have three directories in the repository
- a trunk directory to hold the “main line” of development
- a branches directory to contain branch copies
- and a tags directory to contain tag copies.
/proj1/trunk
/proj1/branches
/proj1/tags
/proj2/trunk
/proj2/branches
/proj2/tags
/proj3/trunk
...
Getting Started
- svn help <command>
- svn admin create /var/svn/newrepos
- svn import mytree file:///var/svn/newrepos/some/project -m "Initial Import"
- svn list file:///var/svn/newrepos/some/project
- svn checkout [repository location] {[new name of local directory]}
- svn checkout http://svn.example.com:9834/repos/trunk/some/project
- svn checkout file:///var/svn/repos
- svn checkout file://localhost/var/svn/repos
- svn commit button.c -m "Fixed a typo in button.c."
- svn update
- svn status --verbose
- svn log = display the history of changes to a file or directory
typical work cycle
- Update your working copy.
- Make changes.
- svn add
- svn delete
- svn copy foo bar = Create a new item bar as a duplicate of foo and automatically schedule bar for addition
- svn move foo bar = svn copy foo bar; svn delete foo
- svn mkdir blort = mkdir blort; svn add blort
- Examine your changes.
- Possibly undo some changes.
- svn revert = blow your crappy shit away and get back to a clean copy
- use to undo any scheduled operations, including add
- Resolve conflicts (merge others' changes).
- Commit your changes.
More commands
- svn log = Shows you broad information: log messages with date and author information attached to revisions and which paths changed in each revision
- svn diff = Shows line-level details of a particular change
- svn cat = Retrieves a file as it existed in a particular revision number and displays it on your screen
- svn list = Displays the files in a directory for any given revision
- svn checkout -r 1729
- svn export [-r revision#]
Letters
- ? - not under version control
- A - add
- C - file has textual conflicts from an update
- U - file was just updated
- D - file is scheduled for deletion
- M - file has local modificaations
Branching and Merging
svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Creating a private branch of /calc/trunk."
- svn checkout http://svn.example.com/repos/calc/branches/my-calc-branch
- changeset = a collection of changes with a unique name. The changes might include textual edits to file contents, modifications to tree structure, or tweaks to meta data. "A patch with a name you can refer to."
- Compare tree N with tree N-1 derives the exact patch committed.
- "This issue was fixed by r9238"
- run svn log -r 9238 to read about the exact changeset that fixed the bug
- run svn diff -c 9238 to see the patch itself
- svn merge -c 9238 = merge changeset r9238 into your working copy
- svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
- switch transforms an existing working copy to reflect a different branch
- Copy the project's entire “trunk” to a new branch directory.
- Switch only part of the trunk working copy to mirror the branch.
- That way, the user can continue to receive normal “trunk” updates to most of her working copy, but the switched portions will remain immune (unless someone commits a change to her branch)
- If you decided to save your local edits to its own branch
svn copy http://svn.example.com/repos/proj/trunk \
http://svn.example.com/repos/proj/branches/newbranch \
-m "Create branch 'newbranch'."
svn switch http://svn.example.com/repos/proj/branches/newbranch
- The svn switch command, like svn update, preserves your local edits. At this point, your working copy is now a reflection of the newly created branch, and your next svn commit invocation will send your changes there.
Merging in changes from the trunk
- First make sure your working copy of the branch is “clean”—that it has no local modifications reported by svn status
- svn merge URL = merge all recent changes from the URL to the current working directory (which is typically the root of your working copy)
- svn status
- look at the changes carefully with svn diff
- build and test your branch
- can always abort the local changes by running svn revert . -R
- svn commit -m "Merged latest trunk changes to my-calc-branch."
- Note: using patch is inferior to merge since patch cannot track changes to directory structure.
Merge your changes back to the trunk
- Merge in all changes from trunk and commit your branch as above
- Get an up-to-date clean (no local edits) working copy of the trunk
- svn merge --reintegrate http://svn.example.com/repos/my_branch
- delete your branch using "svn delete http://svn.example.com/repos/the_proj/branches/my-branch -m "Remove my-branch.""
Create Tag
svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/tags/release-1.0 \
-m "Tagging the 1.0 release of the 'calc' project."
svn copy my-working-copy \
http://svn.example.com/repos/calc/tags/mytag \
-m "Tag my existing working copy state."
Branch Maintenance
svn copy http://svn.example.com/repos/calc/branches/my-calc-branch@374 \
http://svn.example.com/repos/calc/branches/my-calc-branch \
-m "Restore my-calc-branch."
svn copy http://svn.example.com/repos/calc/trunk \
http://svn.example.com/repos/calc/branches/stable-1.0 \
-m "Creating stable branch of calc project."
Administration
- Step-by-step directions
- svnadmin create /var/svn/repos
- make hooks by copying hook template files to the appropriate location
- many more commands
Server Configuration
- If you need to integrate with existing legacy identity systems (LDAP, Active Directory, NTLM, X.509, etc.), you must use either the Apache-based server or svnserve configured with SASL.
- If you've decided to use either Apache or stock svnserve, create a single svn user on your system and run the server process as that user. Be sure to make the repository directory wholly owned by the svn user as well. From a security point of view, this keeps the repository data nicely siloed and protected by operating system filesystem permissions, changeable by only the Subversion server process itself.
- init.d script for fedora/redhat