Difference between revisions of "Subversion"

From Freephile Wiki
Jump to navigation Jump to search
(New page: foo)
 
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
foo
+
This page is about 'Subversion' which is more commonly known as svn.
 +
 
 +
{{highlight|
 +
|text = if you need help [[Git/migrating to git|migrating to git]] then call Greg Rundlett at {{CompanyName}} }}
 +
 
 +
==See Also==
 +
* [[Google:{{PAGENAME}}]]
 +
* '''[[:Category:{{PAGENAME}}]]'''
 +
* [[Subversion/client]]
 +
* [[Subversion/Vendor Sources]]
 +
* [[Subversion/Repository Layout]]
 +
 
 +
==Architecture==
 +
 
 +
[[File:Subversion.architecture.diagram.png]]
 +
 
 +
==Documentation and Resources==
 +
* http://www.digilife.be/quickreferences/QRC/Subversion%20Quick%20Reference%20Card.pdf
 +
* [http://svnbook.red-bean.com/ The Book] (all versions) including
 +
** [http://svnbook.red-bean.com/en/1.4/svn-book.html v1.4]
 +
** [http://svnbook.red-bean.com/en/1.5/svn-book.html v1.5]
 +
** [http://svnbook.red-bean.com/nightly/en/svn-book.html The nightly build version]
 +
* [http://svn.collab.net/repos/svn/trunk/doc/user/svn-best-practices.html Best Practices]
 +
* [http://subversion.tigris.org/servlets/ProjectHome The project website] at tigris.org
 +
* SVN Release Notes
 +
** [http://subversion.tigris.org/svn_1.3_releasenotes.html v 1.3]
 +
** [http://subversion.tigris.org/svn_1.4_releasenotes.html v 1.4]
 +
** [http://subversion.tigris.org/svn_1.5_releasenotes.html v 1.5]
 +
* [http://www.subversionary.org/ subversionary.org community] (Subversionary site runs on [[Drupal]])
 +
* [http://www.orcaware.com/svn/wiki/Main_Page orcaware.com wiki] (the wiki at orcaware runs on [[MediaWiki]])
 +
* [http://svnforum.org/ svnforum.org forums]
 +
* [http://www.collab.net/products/subversion/index.html Vendor Support] CollabNet offers full support and enterprise services for Subversion as the company behind the software project.
 +
* [http://www.pragmaticprogrammer.com/titles/svn/ Pragmatic Version Control] is a great book on some of the implementation topics.
 +
 
 +
==Subversion Clients==
 +
Subversion clients are available for all Operating Systems.  The powerful command-line client comes with the software.  More details are on the [[Subversion/client]] page.
 +
 
 +
==Administration==
 +
 
 +
===Managing Users===
 +
To add a user, or change their password
 +
<tt>
 +
sudo htpasswd -m /etc/apache2/auth/svn-auth-file username
 +
</tt>
 +
To give the user access to repositories
 +
<tt>
 +
sudo vi /etc/apache2/auth/svn-access-file
 +
</tt>
 +
 
 +
This simple procedure works well for modest-sized groups, but fuller methods of authentication and group management such as LDAP authentication and authorization will likely be the best solution in a larger setting.
 +
 
 +
===Software Installation and Initial Configuration===
 +
See http://gentoo-wiki.com/HOWTO_Apache2_with_subversion_SVN_and_DAV in addition to the manual.
 +
 
 +
Some of the key items for an install:
 +
# narrow your server options:  we use Apache exclusively.  We were using file:// but that uneccessarily complicates the security model and administration of user/system accounts and groups.
 +
# create a svn group so that you can add authors to that group
 +
# create wrappers (including apachectl) to set umask 0002 for some access
 +
# set group ownership on the 'db' and set group sticky bit
 +
 
 +
 
 +
=== Migrating a repo from one host to another ===
 +
To start with, do a dump of the repo
 +
<source lang="bash">
 +
svnadmin dump /var/svn/oasis > /home/me/svndump-2006-12-20
 +
</source>
 +
Since the dump file is a human-readable format, it can be compressed considerably.  In our case, the uncompressed file is 9GB, so compression is a big timesaver for sending it across the wire.  You could compress it in transit using rsync's -z option, or you could use gzip or bzip to compress and decompress on the fly.
 +
<source lang="bash">
 +
tar cf - ./svndump-2006-12-20 | gzip -9 | ssh grundlett@10.21.20.10 tar xzf - -C /home/grundlett
 +
</source>
 +
 
 +
 
 +
The configuration file is conf/svnserve.conf, however you MUST be familiar with all the repository tools (especially svnadmin) that come with SVN before you do anything manually on the filesystem.  Each repository comes with this warning in the README:
 +
 
 +
<blockquote>
 +
This is a Subversion repository; use the 'svnadmin' tool to examine
 +
it.  Do not add, delete, or modify files here unless you know how
 +
to avoid corrupting the repository.
 +
 
 +
If the directory "db" contains a Berkeley DB environment,
 +
you may need to tweak the values in "db/DB_CONFIG" to match the
 +
requirements of your site.
 +
 
 +
Visit http://subversion.tigris.org/ for more information.
 +
</blockquote>
 +
 
 +
===Administration tools===
 +
Note that many clients come with repository manipulation features
 +
 
 +
===svnadmin===
 +
svnadmin is the primary administration tool that comes with Subversion
 +
 
 +
Among other things, it can list locks in the repository with lslocks
 +
 
 +
general usage: svnadmin SUBCOMMAND REPOS_PATH
 +
 
 +
 
 +
 
 +
<nowiki>[ARGS & OPTIONS ...]</nowiki>
 +
Type 'svnadmin help <subcommand>' for help on a specific subcommand.
 +
 
 +
Available subcommands:
 +
*  create
 +
*  deltify
 +
*  dump
 +
*  help (?, h)
 +
*  hotcopy
 +
*  list-dblogs
 +
*  list-unused-dblogs
 +
*  load
 +
*  lslocks
 +
*  lstxns
 +
*  recover
 +
*  rmlocks
 +
*  rmtxns
 +
*  setlog
 +
*  verify
 +
 
 +
==Command Reference==
 +
=== Locking Files ===
 +
Dealing with binary files (e.g. *.doc, *.jpg)  Note that sometimes it is useful to work with 'locks' to advertise to other users that you are editing a binary file format like a jpg or doc (since binary files don't merge particularly well).  Subversion enables you to create a lock on a file.  You can also find out who has the file locked.  Locks are not authoritative.  You don't just create a lock and forget it.  You don't create a lock just to prevent others from working.  By policy, (long-lived ~72hr) locks can and will be broken by the repository administrator.  Locks can also be stolen (somebody else needs to work on the file, you forgot your lock was on it, they broke your lock and then lock the file themselves so they can advertise that they are working on the file.  If you have wide-area access control issues, speak to a repository administrator about the authorization permissions for a project.
 +
 
 +
http://svnbook.red-bean.com/nightly/en/svn-book.html#svn.advanced.locking
 +
 
 +
 
 +
 
 +
===Subversion Help===
 +
Subversion has a very extensive help interface available.  To see the top-level help, run:
 +
<pre>
 +
svn help
 +
</pre>
 +
 
 +
From there, other commands can be investigated by adding those commands like:
 +
<pre>
 +
svn help add
 +
svn help delete
 +
svn help commit
 +
</pre>
 +
 
 +
===Adding a file===
 +
<pre>
 +
svn add FILE_or_FILES
 +
</pre>
 +
 
 +
===Deleting a file===
 +
<pre>
 +
svn delete FILE_or_FILES
 +
</pre>
 +
 
 +
===Reverting to a prior point in history===
 +
Sometimes you want to use the older version of a file because 'bad' changes got introduced to the repository.  Say you have a binary pdf file, and you want to make an older version the current version.  You do a merge, with a reversed merge range.  This same procedure works equally well on text files.
 +
 
 +
First, look up file revision information:
 +
 
 +
<pre>
 +
svn log membership_agreement_print_version.pdf
 +
</pre>
 +
 
 +
Then, look up the merge command syntax and do a dry run before trying the real merge:
 +
 
 +
<pre>
 +
svn help merge
 +
svn merge --dry-run -r 101:1 somefile.php
 +
svn merge -r 101:1 somefile.php
 +
</pre>
 +
NB To revert a whole tree, you would use 'checkout' with a revision number or label and that would get you the snapshot you wanted.
 +
 
 +
===Renaming a file===
 +
If you have a file in subversion, and you wish to preserve it's history, but you want to rename it, use the svn mv command:
 +
<pre>
 +
svn mv file:///var/svn/myrepo/www.example.com/trunk/images/smile.png \
 +
file:///var/svn/myrepo/www.example.com/trunk/images/smile1.png
 +
</pre>
 +
 
 +
=== Deleting untracked files ===
 +
Say your project spews build artifacts into your source tree, and doesn't clean up after itself.  How do you clean out your working copy without having to do a clean checkout?
 +
<source lang="bash">
 +
svn status -no-ignore | grep -e ^\? -e ^I | awk '{ print $2 }' | xargs --no-run-if-empty rm -r
 +
</source>
 +
 
 +
=== Last Week's svn Log ===
 +
<source lang="bash">
 +
svn -vr {$(date --iso-8601 --date="last week")}:HEAD log http://code.example.com/svn/project/trunk/
 +
</source>
 +
 
 +
=== Add a bunch of new files ===
 +
<source lang="bash">
 +
svn status . | grep '^?' | sed  's/^? */svn  add "/g' | sed 's/$/"/g' | sh
 +
</source>
 +
 
 +
=== Find in svn ===
 +
Old versions of Subversion would store metadata throughout the working copy, and offers no facility for searching the content.  While you could and should setup a [[Search|fantastic indexing service]], you
 +
<source lang="bash">
 +
find . -name \.svn/ -prune -o -name '*.php' -exec grep -l needle {} \; | sed 's/^/# /'
 +
</source>
 +
 
 +
 
 +
 
 +
[[Category:Version Control]]
 +
[[Category:Subversion]]
 +
[[Category:Development]]
 +
[[Category:Best Practices]]

Latest revision as of 07:49, 4 December 2015

This page is about 'Subversion' which is more commonly known as svn.


See Also[edit | edit source]

Architecture[edit | edit source]

Subversion.architecture.diagram.png

Documentation and Resources[edit | edit source]

Subversion Clients[edit | edit source]

Subversion clients are available for all Operating Systems. The powerful command-line client comes with the software. More details are on the Subversion/client page.

Administration[edit | edit source]

Managing Users[edit | edit source]

To add a user, or change their password sudo htpasswd -m /etc/apache2/auth/svn-auth-file username To give the user access to repositories sudo vi /etc/apache2/auth/svn-access-file

This simple procedure works well for modest-sized groups, but fuller methods of authentication and group management such as LDAP authentication and authorization will likely be the best solution in a larger setting.

Software Installation and Initial Configuration[edit | edit source]

See http://gentoo-wiki.com/HOWTO_Apache2_with_subversion_SVN_and_DAV in addition to the manual.

Some of the key items for an install:

  1. narrow your server options: we use Apache exclusively. We were using file:// but that uneccessarily complicates the security model and administration of user/system accounts and groups.
  2. create a svn group so that you can add authors to that group
  3. create wrappers (including apachectl) to set umask 0002 for some access
  4. set group ownership on the 'db' and set group sticky bit


Migrating a repo from one host to another[edit | edit source]

To start with, do a dump of the repo

svnadmin dump /var/svn/oasis > /home/me/svndump-2006-12-20

Since the dump file is a human-readable format, it can be compressed considerably. In our case, the uncompressed file is 9GB, so compression is a big timesaver for sending it across the wire. You could compress it in transit using rsync's -z option, or you could use gzip or bzip to compress and decompress on the fly.

tar cf - ./svndump-2006-12-20 | gzip -9 | ssh grundlett@10.21.20.10 tar xzf - -C /home/grundlett


The configuration file is conf/svnserve.conf, however you MUST be familiar with all the repository tools (especially svnadmin) that come with SVN before you do anything manually on the filesystem. Each repository comes with this warning in the README:

This is a Subversion repository; use the 'svnadmin' tool to examine it. Do not add, delete, or modify files here unless you know how to avoid corrupting the repository.

If the directory "db" contains a Berkeley DB environment, you may need to tweak the values in "db/DB_CONFIG" to match the requirements of your site.

Visit http://subversion.tigris.org/ for more information.

Administration tools[edit | edit source]

Note that many clients come with repository manipulation features

svnadmin[edit | edit source]

svnadmin is the primary administration tool that comes with Subversion

Among other things, it can list locks in the repository with lslocks

general usage: svnadmin SUBCOMMAND REPOS_PATH


[ARGS & OPTIONS ...] Type 'svnadmin help <subcommand>' for help on a specific subcommand.

Available subcommands:

  • create
  • deltify
  • dump
  • help (?, h)
  • hotcopy
  • list-dblogs
  • list-unused-dblogs
  • load
  • lslocks
  • lstxns
  • recover
  • rmlocks
  • rmtxns
  • setlog
  • verify

Command Reference[edit | edit source]

Locking Files[edit | edit source]

Dealing with binary files (e.g. *.doc, *.jpg) Note that sometimes it is useful to work with 'locks' to advertise to other users that you are editing a binary file format like a jpg or doc (since binary files don't merge particularly well). Subversion enables you to create a lock on a file. You can also find out who has the file locked. Locks are not authoritative. You don't just create a lock and forget it. You don't create a lock just to prevent others from working. By policy, (long-lived ~72hr) locks can and will be broken by the repository administrator. Locks can also be stolen (somebody else needs to work on the file, you forgot your lock was on it, they broke your lock and then lock the file themselves so they can advertise that they are working on the file. If you have wide-area access control issues, speak to a repository administrator about the authorization permissions for a project.

http://svnbook.red-bean.com/nightly/en/svn-book.html#svn.advanced.locking


Subversion Help[edit | edit source]

Subversion has a very extensive help interface available. To see the top-level help, run:

svn help

From there, other commands can be investigated by adding those commands like:

svn help add
svn help delete
svn help commit

Adding a file[edit | edit source]

svn add FILE_or_FILES

Deleting a file[edit | edit source]

svn delete FILE_or_FILES

Reverting to a prior point in history[edit | edit source]

Sometimes you want to use the older version of a file because 'bad' changes got introduced to the repository. Say you have a binary pdf file, and you want to make an older version the current version. You do a merge, with a reversed merge range. This same procedure works equally well on text files.

First, look up file revision information:

svn log membership_agreement_print_version.pdf

Then, look up the merge command syntax and do a dry run before trying the real merge:

svn help merge
svn merge --dry-run -r 101:1 somefile.php
svn merge -r 101:1 somefile.php

NB To revert a whole tree, you would use 'checkout' with a revision number or label and that would get you the snapshot you wanted.

Renaming a file[edit | edit source]

If you have a file in subversion, and you wish to preserve it's history, but you want to rename it, use the svn mv command:

svn mv file:///var/svn/myrepo/www.example.com/trunk/images/smile.png \
file:///var/svn/myrepo/www.example.com/trunk/images/smile1.png

Deleting untracked files[edit | edit source]

Say your project spews build artifacts into your source tree, and doesn't clean up after itself. How do you clean out your working copy without having to do a clean checkout?

svn status -no-ignore | grep -e ^\? -e ^I | awk '{ print $2 }' | xargs --no-run-if-empty rm -r

Last Week's svn Log[edit | edit source]

svn -vr {$(date --iso-8601 --date="last week")}:HEAD log http://code.example.com/svn/project/trunk/

Add a bunch of new files[edit | edit source]

svn status . | grep '^?' | sed  's/^? */svn  add "/g' | sed 's/$/"/g' | sh

Find in svn[edit | edit source]

Old versions of Subversion would store metadata throughout the working copy, and offers no facility for searching the content. While you could and should setup a fantastic indexing service, you

find . -name \.svn/ -prune -o -name '*.php' -exec grep -l needle {} \; | sed 's/^/# /'