Difference between revisions of "Svn"
Jump to navigation
Jump to search
Line 132: | Line 132: | ||
* make hooks by copying hook template files to the appropriate location | * make hooks by copying hook template files to the appropriate location | ||
* many more commands | * many more commands | ||
+ | ===<repository>/conf/ directory=== | ||
+ | * svnserv.conf = control configuration of the svnserve daemon | ||
+ | *# uncomment "anon-access = read" | ||
+ | *# uncomment "auth-access = write" | ||
+ | *# uncomment "password-db = passwd" | ||
+ | *# make up a good realm and add realm | ||
+ | * passwd | ||
+ | *# add authorized checker-inners and their passwords | ||
==Server Configuration== | ==Server Configuration== |
Revision as of 21:53, 30 December 2009
Contents
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>
- svnadmin create /var/svn/newrepos
- svn makedir file:///var/svn/newrepos/some/trunk -m "Setting up repository structure"
- 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.
- svn update
- 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.
- svn status
- svn diff
- svn diff > patchfile
- 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
- svn revert = blow your crappy shit away and get back to a clean copy
- Resolve conflicts (merge others' changes).
- svn update
- svn resolve
- Commit your changes.
- svn commit
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 log -r 5:19 - v
- 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 cat -r 2 foo.c
- svn list = Displays the files in a directory for any given revision
- svn list -v
- 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'."
- then
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
- create a 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."
- tag my working copy
svn copy my-working-copy \ http://svn.example.com/repos/calc/tags/mytag \ -m "Tag my existing working copy state."
Branch Maintenance
- restore deleted
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."
- tag a stable point
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
<repository>/conf/ directory
- svnserv.conf = control configuration of the svnserve daemon
- uncomment "anon-access = read"
- uncomment "auth-access = write"
- uncomment "password-db = passwd"
- make up a good realm and add realm
- passwd
- add authorized checker-inners and their passwords
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
Repository Hooks
- On a repository that you've already set up, navigate on command line to /path/to/repos/hooks/ and there will be template files there for each event type.
- just remove the .tmpl extension and svn will run that.
- post-commit
svnlook
- svnlook date /path/to/repos/