Difference between revisions of "Svn"

From Colettapedia
Jump to navigation Jump to search
 
Line 84: Line 84:
 
** run svn diff -c 9238 to see the patch itself
 
** run svn diff -c 9238 to see the patch itself
 
* svn merge -c 9238 = merge changeset r9238 into your working copy
 
* svn merge -c 9238 = merge changeset r9238 into your working copy
 +
* svn merge -r LastRevisionMergedFromTrunkToBranch:HEAD url/of/trunk path/to/branch/wc
 
* svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
 
* svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
 
** switch transforms an existing working copy to reflect a different branch
 
** switch transforms an existing working copy to reflect a different branch

Latest revision as of 15:44, 6 December 2012

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
  • Remember to use the full path AS IT EXISTS ON THE SERVER if using svn+ssh, ex: svn co svn+ssh://iicbu2/srv/svn/repositories/iicbu

typical work cycle

  1. Update your working copy.
    • svn update
  2. 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
  3. Examine your changes.
    • svn status
    • svn diff
      • svn diff > patchfile
  4. 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
  5. Resolve conflicts (merge others' changes).
    • svn update
    • svn resolve
  6. 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 merge -r LastRevisionMergedFromTrunkToBranch:HEAD url/of/trunk path/to/branch/wc
  • svn switch http://svn.example.com/repos/calc/branches/my-calc-branch
    • switch transforms an existing working copy to reflect a different branch
    1. Copy the project's entire “trunk” to a new branch directory.
    2. 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

  1. First make sure your working copy of the branch is “clean”—that it has no local modifications reported by svn status
  2. svn merge URL = merge all recent changes from the URL to the current working directory (which is typically the root of your working copy)
  3. svn status
  4. look at the changes carefully with svn diff
  5. build and test your branch
  6. can always abort the local changes by running svn revert . -R
  7. 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

  1. Merge in all changes from trunk and commit your branch as above
  2. Get an up-to-date clean (no local edits) working copy of the trunk
  3. svn merge --reintegrate http://svn.example.com/repos/my_branch
  4. 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
  • do everything as root
  • svnadmin create /var/svn/repos
  • svn mkdir file:///srv/svn/repositories/iicbu/wndchrm -m "Setting up repository structure"
  • make hooks by copying hook template files to the appropriate location
  • now go to <repository>/conf/
    • IF YOU HAVE AUTHORIZATION FAILED ERRORS, THIS IS HOW YOU FIX THEM
  • svnserv.conf = control configuration of the svnserve daemon
    1. uncomment "anon-access = read"
    2. uncomment "auth-access = write"
    3. uncomment "password-db = passwd"
    4. make up a good realm and add realm
  • passwd
    1. add authorized checker-inners and their passwords
  • chown -R svn:svntest /srv/svn/repositories/svntest
  • chmod -R g+w /srv/svn/repositories/svntest
  • chmod g+s /srv/svn/repositories/svntest/db

setting root directory for svn access

  • looks like you specify the root using the svnserve daemon
colettace@iicbu2 /srv/svn/repositories/iicbu/conf
$ ps aux | grep svnserve
svn       2590  0.0  0.0  10320   760 ?        Ss   16:11   0:00 /usr/bin/svnserve.orig -d --threads --root /srv/svn/repositories/

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

  1. 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.
  2. just remove the .tmpl extension and svn will run that.
  • post-commit

svnlook

  • svnlook date /path/to/repos/