<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Subversion_for_Users</id>
	<title>Subversion for Users - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://training-course-material.com/index.php?action=history&amp;feed=atom&amp;title=Subversion_for_Users"/>
	<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Subversion_for_Users&amp;action=history"/>
	<updated>2026-06-07T19:28:26Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://training-course-material.com/index.php?title=Subversion_for_Users&amp;diff=86216&amp;oldid=prev</id>
		<title>Lsokolowski1: /* Good Practices Con&#039;t ⌘ */</title>
		<link rel="alternate" type="text/html" href="https://training-course-material.com/index.php?title=Subversion_for_Users&amp;diff=86216&amp;oldid=prev"/>
		<updated>2022-10-03T16:17:13Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Good Practices Con&amp;#039;t ⌘&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{Cat|Subversion}}&lt;br /&gt;
{{SVN Links}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;slideshow style=&amp;quot;nobleprog&amp;quot; headingmark=&amp;quot;⌘&amp;quot; incmark=&amp;quot;…&amp;quot; scaled=&amp;quot;false&amp;quot; font=&amp;quot;Trebuchet MS&amp;quot; &amp;gt;&lt;br /&gt;
;title: Subversion for Users&lt;br /&gt;
;author: Bernard Szlachta (NobleProg Ltd), Lukasz Sokolowski&lt;br /&gt;
&amp;lt;/slideshow&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Subversion for Users ==&lt;br /&gt;
Subversion for Users Training Materials&lt;br /&gt;
&lt;br /&gt;
{{Can I use your material}}&lt;br /&gt;
&lt;br /&gt;
== Agenda ⌘==&lt;br /&gt;
* Revision Control Idea and Problems&lt;br /&gt;
* Architecture of Subversion&lt;br /&gt;
* The working cycle&lt;br /&gt;
* Team Work I&lt;br /&gt;
* Locking&lt;br /&gt;
* Tagging&lt;br /&gt;
* Branching&lt;br /&gt;
* Merging&lt;br /&gt;
* Team Work II&lt;br /&gt;
* Properties&lt;br /&gt;
* Do’s and don’t’s&lt;br /&gt;
* Subversion Configuration&lt;br /&gt;
&lt;br /&gt;
== Actors ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Duck_svn.png|200px]][[File:Frog.png|200px]]&lt;br /&gt;
[[File:Turtle_svn.png|200px]][[File:Chicken.png|200px]]&lt;br /&gt;
&lt;br /&gt;
== Problems ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Duck_svn.png]][[File:Frog.png]]&lt;br /&gt;
&lt;br /&gt;
== Problems, file sharing ⌘==&lt;br /&gt;
&lt;br /&gt;
* Where the &amp;#039;&amp;#039;&amp;#039;duck&amp;#039;&amp;#039;&amp;#039; is my file?&lt;br /&gt;
* Who the &amp;#039;&amp;#039;&amp;#039;frog&amp;#039;&amp;#039;&amp;#039; overridden my files?&lt;br /&gt;
* I haven’t created a &amp;#039;&amp;#039;&amp;#039;backup&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* It is faster to write it again than restore it from backup!&lt;br /&gt;
* What has changed during &amp;#039;&amp;#039;&amp;#039;last day&amp;#039;&amp;#039;&amp;#039;?&lt;br /&gt;
* Can we check whether the problem is in the code or in the database?&lt;br /&gt;
&lt;br /&gt;
== Subversion ⌘==&lt;br /&gt;
&lt;br /&gt;
* The act or an instance of subverting.&lt;br /&gt;
* The condition of being subverted.&lt;br /&gt;
* Obsolete A cause of overthrow or ruin.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;small&amp;gt;From www.thefreedictionary.com&amp;lt;/small&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Subvert ⌘==&lt;br /&gt;
&lt;br /&gt;
* To destroy completely; ruin: &amp;quot;schemes to subvert the liberties of a great community&amp;quot; &amp;#039;&amp;#039;&amp;lt;small&amp;gt;Alexander Hamilton.&amp;lt;/small&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
* To undermine the character, morals, or allegiance of; corrupt.&lt;br /&gt;
* To overthrow completely: &amp;quot;Economic assistance ... must subvert the existing ... feudal or tribal order&amp;quot; &amp;#039;&amp;#039;&amp;lt;small&amp;gt;Henry A. Kissinger.&amp;lt;/small&amp;gt;&amp;#039;&amp;#039; See Synonyms at &amp;#039;&amp;#039;&amp;#039;overthrow&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;small&amp;gt;From www.thefreedictionary.com&amp;lt;/small&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Revision Control ⌘==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Revision control&amp;#039;&amp;#039;&amp;#039; (AKA &amp;#039;&amp;#039;&amp;#039;version control (system) (VCS)&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;source control&amp;#039;&amp;#039;&amp;#039; or &amp;#039;&amp;#039;&amp;#039;(source) code management (SCM)&amp;#039;&amp;#039;&amp;#039;) is the management of multiple revisions of the same unit of information. It is most commonly used in &amp;#039;&amp;#039;engineering&amp;#039;&amp;#039; and &amp;#039;&amp;#039;software development&amp;#039;&amp;#039; to manage ongoing development of digital documents like application &amp;#039;&amp;#039;source code&amp;#039;&amp;#039;, art resources such as &amp;#039;&amp;#039;blueprints&amp;#039;&amp;#039; or electronic models, and other projects that may be worked on by a &amp;#039;&amp;#039;team of people&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;small&amp;gt;From www.wikipedia.org&amp;lt;/small&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Revision Control Systems ⌘==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Software !! Maintainer !! Development status !! Concurrency model !! License !! Platforms supported&lt;br /&gt;
|-&lt;br /&gt;
| CVS || The CVS Team || maintained but new features not added || Merge || GPL || Unix-like, Windows, Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
| Subversion (SVN) || CollabNet, Inc. || actively developed || Merge or lock || Apache/BSD style || Unix-like, Windows, Mac OS X&lt;br /&gt;
|-&lt;br /&gt;
| Team Foundation Server || Microsoft || actively developed || Lock or merge || Proprietary || Server: Windows Server 2003; Clients: Windows and Web included&lt;br /&gt;
|-&lt;br /&gt;
| Telelogic Synergy || Telelogic (IBM) || actively supported || Merge or Lock || Proprietary || Linux, Windows, Unix-like&lt;br /&gt;
|-&lt;br /&gt;
| Visual SourceSafe || Microsoft || serious bug fixes only || Lock or merge || Proprietary || Windows&lt;br /&gt;
|-&lt;br /&gt;
| Git || The Git Team || actively developed || Merge or Rebase || GPL || Linux, Windows, Unix-like&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== The history of Subversion ⌘==&lt;br /&gt;
&lt;br /&gt;
* RCS&lt;br /&gt;
* CVS&lt;br /&gt;
* Subversion&lt;br /&gt;
* June 2000 - Coding begins.&lt;br /&gt;
* August 2001 - Subversion becomes self-hosting.&lt;br /&gt;
* 2002 – 1&amp;lt;sup&amp;gt;st&amp;lt;/sup&amp;gt; release &lt;br /&gt;
* 2004 – Feb. Release 1.0.0&lt;br /&gt;
* 2006 – Sept. Release 1.4.0&lt;br /&gt;
* 2009 – August Release 1.6.4&lt;br /&gt;
* 2011 - Release 1.7&lt;br /&gt;
* 2014 - August Release 1.8.10&lt;br /&gt;
* 2016 - it&amp;#039;s still ugly, but best for centralized systems (-: &lt;br /&gt;
Estimated amount of Subversion developers: 1.4 million&lt;br /&gt;
&lt;br /&gt;
== Subversion Users and Sizes ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Apache_svn.png]] &amp;#039;&amp;#039;803 577 Revisions&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;big&amp;gt;Testimonial:&amp;lt;/big&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&amp;#039;&amp;#039;Stuart Robertson of Absolute Systems, Inc&amp;#039;&amp;#039;&amp;#039; (5 May 2004)&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;In the last 4 months we have migrated all of our internal product source repositories from XXX to SVN […]&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;Our largest SVN repository is now 3.7GB and currently has 68806 revisions. We are running SVN 1.0.1 + Apache 2.0.48 on Linux. ...&amp;#039;&amp;#039;&lt;br /&gt;
&amp;#039;&amp;#039;SVN is a superb piece of work, and it is a *huge* step forward from XXX. To put things in perspective... previously we had 26 XXX databases for one product&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;small&amp;gt;More testimonials on: https://svn.apache.org/repos/asf/subversion/branches/1.2.x/www/testimonials.html&amp;lt;/small&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
== Subversion Concepts ⌘==&lt;br /&gt;
* Most current CVS features. &lt;br /&gt;
* Directories, renames, and file meta-data are versioned. &lt;br /&gt;
* Commits are truly &amp;#039;&amp;#039;&amp;#039;atomic&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
* Apache network server option, with WebDAV/DeltaV protocol. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Standalone&amp;#039;&amp;#039;&amp;#039; server option. &lt;br /&gt;
* Branching and tagging are cheap (constant time) operations &lt;br /&gt;
* Natively client/server, &amp;#039;&amp;#039;&amp;#039;layered&amp;#039;&amp;#039;&amp;#039; library design &lt;br /&gt;
* Costs are proportional to &amp;#039;&amp;#039;&amp;#039;change size&amp;#039;&amp;#039;&amp;#039;, not data size &lt;br /&gt;
* Choice of database or plain-file repository implementations &lt;br /&gt;
* Versioning of &amp;#039;&amp;#039;&amp;#039;symbolic links&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* Efficient handling of &amp;#039;&amp;#039;&amp;#039;binary&amp;#039;&amp;#039;&amp;#039; files &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Parseable&amp;#039;&amp;#039;&amp;#039; output &lt;br /&gt;
* Localized messages&lt;br /&gt;
&lt;br /&gt;
== Subversion Architecture ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Architecture_svn.png|800px]]&lt;br /&gt;
&lt;br /&gt;
== Access URLs ⌘==&lt;br /&gt;
&lt;br /&gt;
* file:// &lt;br /&gt;
Direct repository access to local or network drive.)&lt;br /&gt;
* http:// &lt;br /&gt;
Access via WebDAV protocol to Subversion-aware Apache server.)&lt;br /&gt;
* https:// &lt;br /&gt;
Same as http://, but with SSL encryption.&lt;br /&gt;
* svn:// &lt;br /&gt;
Unauthenticated TCP/IP access via custom protocol to an svnserve server.&lt;br /&gt;
* svn+ssh:// &lt;br /&gt;
Authenticated, encrytped TCP/IP access via custom protocol to an svnserve server.&lt;br /&gt;
&lt;br /&gt;
=== Access URLs ⌘===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;big&amp;gt;file://hostname/path/to/repos&amp;lt;/big&amp;gt;&lt;br /&gt;
** On local machines the hostname part must be absent or localhost.&lt;br /&gt;
* &amp;lt;big&amp;gt;This results in a path like this one:&amp;lt;/big&amp;gt;&lt;br /&gt;
** file:///path/to/repos&lt;br /&gt;
* &amp;lt;big&amp;gt;On Windows you have to specify the drive where to find the repository:&amp;lt;/big&amp;gt;&lt;br /&gt;
** file:///X:/path/to/repos&lt;br /&gt;
&lt;br /&gt;
== Repository Layout ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Repo_layout1.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Repository Layout ⌘===&lt;br /&gt;
&lt;br /&gt;
[[File:Repo_layout2.png|600px]]&lt;br /&gt;
&lt;br /&gt;
== Revisions ⌘==&lt;br /&gt;
&lt;br /&gt;
* Every commit produces a new unique revision number.&lt;br /&gt;
* The revision numbers are unique per repository.&lt;br /&gt;
* A commit in Subversion is atomic just like a database transaction (technically there is no difference).&lt;br /&gt;
&lt;br /&gt;
== Working Cycle ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Working_cycle.png|600px]]&lt;br /&gt;
&lt;br /&gt;
== Importing New Project ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Importing_proj.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Importing Project ⌘===&lt;br /&gt;
&lt;br /&gt;
Linux&lt;br /&gt;
 svn import /sample_path file:///repopath/projectname/trunk   -m “Initial Import”&lt;br /&gt;
&lt;br /&gt;
Micro$oft Window$&lt;br /&gt;
 svn import c:\sample_project file:///c:/repo/sample_project -m &amp;quot;Initial import&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Checking Out ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Checkout.png|600px]]&lt;br /&gt;
&lt;br /&gt;
A check out will transfer the project’s content&lt;br /&gt;
from the repository server &lt;br /&gt;
to the client machine.&lt;br /&gt;
&lt;br /&gt;
=== Checking Out ⌘===&lt;br /&gt;
&lt;br /&gt;
 svn checkout file:///repopath/&amp;#039;&amp;#039;&amp;#039;projectname/trunk dirname&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The “dirname” is a local directory. The name of the directory where the checked out project tree will be stored. This is called the “working copy” (WC).&lt;br /&gt;
&lt;br /&gt;
=== Chick Out ⌘===&lt;br /&gt;
&lt;br /&gt;
[[File:Chicken.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== WorkingCopies (WC) ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Wc_svn.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Checking WC Status ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Wc_status.png|400px]] &amp;lt;big&amp;gt;svn status&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Status Meanings ⌘===&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;: (Added)scheduled for addition into the repository.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;C&amp;#039;&amp;#039;&amp;#039;: conflict. That is, changes received from the server during an update overlap with local changes that you have in your working copy. You must resolve this conflict before committing your changes to the repository.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039;: Scheduled for deletion from the repository.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;M&amp;#039;&amp;#039;&amp;#039;: &amp;#039;&amp;#039;&amp;#039;The content of the file item has been modified.&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;: Scheduled to replace an item in the repository. This means that the object is first deleted, then another object of the same name is added, all within a single revision.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;X&amp;#039;&amp;#039;&amp;#039;: The directory item is unversioned, but is related to a Subversion externals definition.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;?&amp;#039;&amp;#039;&amp;#039;: The file, directory, or symbolic link item is not under version control. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;!&amp;#039;&amp;#039;&amp;#039;: The file, directory, or symbolic link item is under version control but is missing or somehow incomplete. The item can be missing if it&amp;#039;s removed using a non-Subversion command. &lt;br /&gt;
** =&amp;gt; &amp;#039;&amp;#039;&amp;#039;svn update&amp;#039;&amp;#039;&amp;#039; will refetch the file or directory from the repository, or &lt;br /&gt;
** =&amp;gt; &amp;#039;&amp;#039;&amp;#039;svn revert file&amp;#039;&amp;#039;&amp;#039; will restore a missing file.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;~&amp;#039;&amp;#039;&amp;#039;: The file, directory, or symbolic link item exists in the repository as one kind of object, but what&amp;#039;s actually in your working copy is of some other kind. &lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;I&amp;#039;&amp;#039;&amp;#039;: The item is not under version control, and Subversion is configured to ignore it.&lt;br /&gt;
&lt;br /&gt;
=== Status Meaning in SVN ⌘===&lt;br /&gt;
&lt;br /&gt;
[[File:Status_meaning.png|400px]]&lt;br /&gt;
&lt;br /&gt;
== Committing Changes ⌘==&lt;br /&gt;
&lt;br /&gt;
 svn commit –m “Log messages”&lt;br /&gt;
&lt;br /&gt;
== Item History ⌘==&lt;br /&gt;
&lt;br /&gt;
 svn log file(s)&lt;br /&gt;
&lt;br /&gt;
== Adding file to repo ⌘==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Add merely means to schedule it for the next commit.&amp;lt;/big&amp;gt;&lt;br /&gt;
 svn add file(s)&lt;br /&gt;
* The Subversion “add”-command&lt;br /&gt;
* One or more files separated by spaces which are scheduled for addition. If you use a directory all files in the directory are added recursively. You can use the command option --non-recursive (-N) to change this behaviour.&lt;br /&gt;
&lt;br /&gt;
== Creating New Directories ⌘==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
* mkdir direcotry &lt;br /&gt;
* svn add directory&lt;br /&gt;
|| &lt;br /&gt;
svn mkdir directory&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Removing Items ⌘==&lt;br /&gt;
&lt;br /&gt;
 svn delete file(s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;If you like to schedule a directory for deletion it is usually recursively marked for deletion.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;If you have changed the file and you would like to delete it you’ll have to use the --force option.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Removing Items Caveat ⌘===&lt;br /&gt;
&lt;br /&gt;
* Make sure that all the files are closed&lt;br /&gt;
&lt;br /&gt;
== Moving Files ⌘==&lt;br /&gt;
&lt;br /&gt;
 svn move source destination&lt;br /&gt;
&lt;br /&gt;
== Copying Files ⌘==&lt;br /&gt;
&lt;br /&gt;
 svn copy source destination&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_copy_files.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Copying Files via CLI ⌘===&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_copy_cli.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Copying with Tortoise ⌘===&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_cp_turtles.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Copying with TortoiseSVN ⌘===&lt;br /&gt;
&lt;br /&gt;
Move/Copy files/directories via TortoiseSVN:&lt;br /&gt;
* If you use the right mouse button you will see the context menu for moving and copying files.&lt;br /&gt;
[[File:Svn_cp_tortoise.png]]&lt;br /&gt;
&lt;br /&gt;
== Check What Was Changed ⌘==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Examine local changes:&amp;lt;/big&amp;gt;&lt;br /&gt;
 svn diff&lt;br /&gt;
* The Subversion “diff”-command.&lt;br /&gt;
* If you provide no options at all you will see the differences between your working copy and the cached “pristine” copy in the .svn area&lt;br /&gt;
&lt;br /&gt;
== Status vs Diff ⌘==&lt;br /&gt;
&lt;br /&gt;
 C:\wc&amp;gt;svn status&lt;br /&gt;
 M      new_file_name.txt&lt;br /&gt;
 M      afile.txt&lt;br /&gt;
 A  +   copyofafile.txt&lt;br /&gt;
&lt;br /&gt;
=== Status vs Diff ⌘===&lt;br /&gt;
&lt;br /&gt;
 C:\wc&amp;gt;svn diff&lt;br /&gt;
 Index: new_file_name.txt&lt;br /&gt;
 ===================================================================&lt;br /&gt;
 --- new_file_name.txt   (revision 6)&lt;br /&gt;
 +++ new_file_name.txt   (working copy)&lt;br /&gt;
 @@ -1,3 +1,3 @@&lt;br /&gt;
  Old Line&lt;br /&gt;
 -New Line&lt;br /&gt;
 -Modified Line&lt;br /&gt;
 \ No newline at end of file&lt;br /&gt;
 +Modified Line New bits&lt;br /&gt;
 +New Line&lt;br /&gt;
 \ No newline at end of file&lt;br /&gt;
 Index: afile.txt&lt;br /&gt;
 ===================================================================&lt;br /&gt;
 --- afile.txt   (revision 4)&lt;br /&gt;
 +++ afile.txt   (working copy)&lt;br /&gt;
 @@ -0,0 +1 @@&lt;br /&gt;
 +New Line&lt;br /&gt;
 \ No newline at end of file&lt;br /&gt;
 &lt;br /&gt;
 Property changes on: copyofafile.txt&lt;br /&gt;
 ___________________________________________________________________&lt;br /&gt;
 Added: svn:mergeinfo&lt;br /&gt;
&lt;br /&gt;
== Tortoise Diff ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Tortoise_diff.png|600px]]&lt;br /&gt;
&lt;br /&gt;
== Caveats ⌘==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;big&amp;gt;Never move, delete, copy files or create directories without the Subversion commands:&amp;lt;/big&amp;gt;&lt;br /&gt;
** svn move&lt;br /&gt;
** svn delete&lt;br /&gt;
** svn copy&lt;br /&gt;
** svn mkdir&lt;br /&gt;
* &amp;lt;big&amp;gt;If using TortoiseSVN it is integrated directly in Windows Explorer&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Undo Operation (revert) ⌘==&lt;br /&gt;
&lt;br /&gt;
 svn revert destination&lt;br /&gt;
&lt;br /&gt;
* The Subversion “revert”-command.&lt;br /&gt;
* The destination of the operation file/directory. You have to provide a destination. If you don’t the help output is shown.&lt;br /&gt;
&lt;br /&gt;
If you want to revert a whole directory of files, use the „--recursive“ flag.&lt;br /&gt;
&lt;br /&gt;
=== Pristine Copy Revert ⌘===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;How does the revert operation work?&amp;lt;/big&amp;gt;&lt;br /&gt;
* Subversion holds a complete “pristine” copy of the checked out working copy in its “.svn” directory structure.&lt;br /&gt;
* Every operation can be rolled back:&lt;br /&gt;
** add&lt;br /&gt;
** remove&lt;br /&gt;
** copy&lt;br /&gt;
** delete&lt;br /&gt;
** mkdir&lt;br /&gt;
** …&lt;br /&gt;
* But only as long as it is uncommitted.&lt;br /&gt;
&lt;br /&gt;
=== Revert and other changes ⌘===&lt;br /&gt;
&lt;br /&gt;
If you copied (without svn copy) directory, svn revert will not revert the change. The easiest way to make sure that your WC is really pristine is to remove the whole working copy and check it out again.&lt;br /&gt;
&lt;br /&gt;
== Operation on WC versus Repo ⌘==&lt;br /&gt;
&lt;br /&gt;
 svn mkdir file:///repo/dirname&lt;br /&gt;
&lt;br /&gt;
 svn mkdir wcdir/dirname&lt;br /&gt;
&lt;br /&gt;
== Working Copies ⌘==&lt;br /&gt;
&lt;br /&gt;
[[File:Wc_copies.png|600px]]&lt;br /&gt;
&lt;br /&gt;
== Conflicts ⌘==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Both begin to edit the same file in their copies and their changes overlap.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_conflicts.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Sally commits her work&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_confl_sally.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Harry tries to commit his work after Sally.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_confl_harry.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Harry has to update his local working copy to get Sally‘s changes.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_confl_update.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
* U: File was Updated (received changes from the server).&lt;br /&gt;
* A: File or directory was Added to your working copy.&lt;br /&gt;
* D: File or directory was Deleted from your working copy.&lt;br /&gt;
* R: File or directory was Replaced in your working copy; that is, file was deleted and a new item with the same name was added. While they may have the same name, the repository considers them to be distinct objects with distinct histories.&lt;br /&gt;
* G: File received new changes from the repository, but your local copy of the file contained your modifications. Either the changes did not intersect, or the changes were exactly the same as your local modifications, so Subversion has successfully merGed the repository&amp;#039;s changes into the file without a problem.&lt;br /&gt;
* C: File received Conflicting changes from the server. The changes from the server directly overlap your own changes to the file. No need to panic, though. This overlap needs to be resolved by a human (you);&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;How to solve a conflict?&amp;lt;/big&amp;gt;&lt;br /&gt;
* No tool is able to handle the conflict.&lt;br /&gt;
* Only humans are capable of understanding and making the necessary intelligent choices.&lt;br /&gt;
* The two members (in the example) have to discuss the conflict as well as possible solutions.&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;How does Subversion support you?&amp;lt;/big&amp;gt;&lt;br /&gt;
* Subversion outputs a C during the update and remembers that the file is in a state of conflict.&lt;br /&gt;
* If Subversion considers the file to be of a mergeable type, it places conflict markers „&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;“ or „&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;“ —special strings of text which delimit the “sides” of the conflict—into the file to demonstrate visibly the overlapping areas (Subversion uses the svn:mime-type property to decide if a file is capable of contextual, line-based merging).&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&amp;lt;big&amp;gt;How does Subversion support you?&amp;lt;/big&amp;gt;&lt;br /&gt;
* For every conflicted file Subversion places up to three extra unversioned files in your working copy: &lt;br /&gt;
** filename.mine&lt;br /&gt;
*** This is your file as it existed in your working copy before you updated your working copy—that is, without conflict markers. This file has your latest changes in it and nothing else. (If Subversion considers the file to be non mergeable, then the .mine file isn&amp;#039;t created, since it would be identical to the working file.) &lt;br /&gt;
** filename.rOLDREV&lt;br /&gt;
*** This is the file that was the BASE revision before you updated your working copy. That is, the file that you checked out before you made your latest edits. &lt;br /&gt;
** filename.rNEWREV&lt;br /&gt;
*** This is the file that your Subversion client just received from the server when you updated your working copy. This file corresponds to the HEAD revision of the repository.&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_confl_tortoise.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
* Conflict has been solved by a human being. It is clear now which part of the code or documentation is the right one.&lt;br /&gt;
* Before you can check in the merged file you have to tell Subversion that the conflict has been solved.&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
Tell svn which ver do you want to keep:&lt;br /&gt;
 svn resolve --accept &amp;lt;base, mine-full, theirs-full, working&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Deprecated:&lt;br /&gt;
 svn resolved destination&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_confl_commit.png|600px]]&lt;br /&gt;
&lt;br /&gt;
=== Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;In the last step Sally has to update her local working copy.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[File:Svn_confl_solved.png|600px]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;Now both share the same state.&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reasons for Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
* Two members of a team work on the same files and overlapping areas.&lt;br /&gt;
* In the end it can be reduced to one critical factor:&lt;br /&gt;
** User communication.&lt;br /&gt;
* It must be clear who is working on what.&lt;br /&gt;
* How often do conflicts arise?&lt;br /&gt;
** Conflicts arise due to poor human communication, no software can solve that. If people communicate, conflicts are rare.&lt;br /&gt;
&lt;br /&gt;
=== Binary Conflicts ⌘===&lt;br /&gt;
&lt;br /&gt;
 M:\training\svn_subversion\np_svn_for_users&amp;gt;svn up&lt;br /&gt;
 Conflict discovered in &amp;#039;svn_for_users.ppt&amp;#039;.&lt;br /&gt;
 Select: (p) postpone, (mf) mine-full, (tf) theirs-full,&lt;br /&gt;
         (h) help for more options: _&lt;br /&gt;
&lt;br /&gt;
== Locking ⌘==&lt;br /&gt;
* Locking Models&lt;br /&gt;
* Optimistic Locking&lt;br /&gt;
* Pessimistic Locking&lt;br /&gt;
&lt;br /&gt;
=== Copy-Edit-Merge Model ⌘===&lt;br /&gt;
The default model of Subversion is the &amp;quot;copy-edit-merge&amp;quot; model.&lt;br /&gt;
* Check out a working copy&lt;br /&gt;
* Make any edits&lt;br /&gt;
* merge changes from server&lt;br /&gt;
* Commit your changes&lt;br /&gt;
But there are situations in which this model might cause problems.&lt;br /&gt;
&lt;br /&gt;
=== The Two Models ⌘===&lt;br /&gt;
* You can&amp;#039;t use the &amp;quot;copy-modify-merge&amp;quot; model with files like Word or Excel (this applies for other types too) &lt;br /&gt;
** because you can&amp;#039;t merge those files&lt;br /&gt;
* So you have to go another way. There are two possible solutions:&lt;br /&gt;
** The first one is to explicitly lock the file before you start to edit a file of the above type (called optimistic locking)&lt;br /&gt;
** The second one is to use the &amp;quot;pessimistic-locking&amp;quot; variety&lt;br /&gt;
&lt;br /&gt;
=== Optimistic Locking ⌘===&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Explicit&amp;#039;&amp;#039;&amp;#039; Locking strategy&lt;br /&gt;
* Before you start working on a non-mergeable file (like Word etc.) you have to request a lock for the given file&lt;br /&gt;
* If you get the lock you can start working on it&lt;br /&gt;
* When you are done with your changes, you commit whereas the lock will be released at the same time&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Advantages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** It’s simple&lt;br /&gt;
** It’s not error-prone&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Disadvantages&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** You miss to unlock a file e.g. before you are going on vacation etc. (You can steal locks ;-))&lt;br /&gt;
** Everyone has to apply this procedure as a default rule&lt;br /&gt;
** No lock &amp;quot;reminder&amp;quot; for the user&lt;br /&gt;
&lt;br /&gt;
=== Optimistic Locking Con&amp;#039;t ⌘===&lt;br /&gt;
* To unlock a file just type the &amp;#039;&amp;#039;&amp;#039;svn unlock&amp;#039;&amp;#039;&amp;#039; command with a particular destination&lt;br /&gt;
* Or it will be unlocked automatically if you commit your changes back to the repository&lt;br /&gt;
&lt;br /&gt;
=== Pessimistic Locking ⌘===&lt;br /&gt;
* You can put a special property to a file &amp;#039;&amp;#039;&amp;#039;svn:needs-lock&amp;#039;&amp;#039;&amp;#039; with any value&lt;br /&gt;
* The result is if you check out a file with the property set, the file will be marked as read-only&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Advantage&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** The application you use with this type of file will give you a reminder about the read-only state&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Disadvantage&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
** The system isn&amp;#039;t flawless, either. It&amp;#039;s possible that even when a file has the property, the read-only reminder won&amp;#039;t always work. Sometimes applications misbehave and &amp;quot;hijack&amp;quot; the read-only file, silently allowing users to edit and save the file anyway. Unfortunately there&amp;#039;s not much Subversion can do about this.&lt;br /&gt;
&lt;br /&gt;
== Tagging ⌘==&lt;br /&gt;
* Why do we need tags?&lt;br /&gt;
** Mark a release state of a product.&lt;br /&gt;
** Mark a snapshot of the current development.&lt;br /&gt;
* Typical Release names:&lt;br /&gt;
** Release 1.0.0, Release 2.3.1, PRODUCT 1.0.0RC1 etc.&lt;br /&gt;
* A Tag name&lt;br /&gt;
** must be unique to mark all components of the given product (source code and documentation)&lt;br /&gt;
** and is used to reproduce the state of the tag in the future.&lt;br /&gt;
&lt;br /&gt;
=== What are Tags ⌘===&lt;br /&gt;
* If we take a look at the architecture chapter we really don‘t need a special tag. We only need to write down the revision number.&lt;br /&gt;
* But human beings have other requirements.&lt;br /&gt;
* They like to have self-explanatory tag names which are more handy.&lt;br /&gt;
* But the question is:&lt;br /&gt;
** Where to put the tag information in the repository?&lt;br /&gt;
&lt;br /&gt;
=== Tagging con&amp;#039;t ⌘===&lt;br /&gt;
* You can create a tag using the following command:&lt;br /&gt;
** &amp;lt;pre&amp;gt;svn copy source destination&amp;lt;/pre&amp;gt;&lt;br /&gt;
*** The Subversion &amp;quot;copy&amp;quot;-command.&lt;br /&gt;
*** The source of the operation (this can be the current working copy or an explicit referenced part in the repository).&lt;br /&gt;
*** The destination of the operation. This means the name of the tag.&lt;br /&gt;
&lt;br /&gt;
=== Tagging Example ⌘===&lt;br /&gt;
* Example:&lt;br /&gt;
** &amp;lt;pre&amp;gt;svn copy http://svnserver/calc/trunk http://svnserver/calc/tags/RELEASE-1.0.0 -m &amp;quot;Create Release Tag for Release 1.0.0&amp;quot;&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If the release name contains spaces you have to use quotes.&lt;br /&gt;
&lt;br /&gt;
== Branching ⌘==&lt;br /&gt;
* Assume the following situation:&lt;br /&gt;
** You have created a great product and it has been delivered to your customer.&lt;br /&gt;
** Before you delivered the product you have created a tag, let us name it &amp;quot;Release 1.0.0&amp;quot;&lt;br /&gt;
** Your current development crew is working on Release 1.1.0 with new features.&lt;br /&gt;
* And now Murphy‘s Law caught you:&lt;br /&gt;
** Your customer calls you and reports that he has found a bug in your software.&lt;br /&gt;
&lt;br /&gt;
=== Branching con&amp;#039;t ⌘===&lt;br /&gt;
* The development has continued after the release of RELEASE 1.0.0&lt;br /&gt;
* You want to fix the bug to satisfy your customer!&lt;br /&gt;
* In your current development&lt;br /&gt;
** you have enhanced many of the product&amp;#039;s functions&lt;br /&gt;
** but you don&amp;#039;t want to deliver a product with more features&lt;br /&gt;
** and you haven&amp;#039;t finished testing yet&lt;br /&gt;
* How to solve this situation?&lt;br /&gt;
&lt;br /&gt;
=== Branching con&amp;#039;t ⌘===&lt;br /&gt;
* Based on the tag you&amp;#039;ve created during the delivery you can check out the exact state of the delivery.&lt;br /&gt;
* You create a Branch to fix the bug in the software.&lt;br /&gt;
* After you have fixed the bug you can tag the Branch and deliver another version to the customer.&lt;br /&gt;
* Your customer is satisfied that you fixed the bug so fast.&lt;br /&gt;
* You haven&amp;#039;t disturbed the current development.&lt;br /&gt;
[[File:BranchSvn1.png|480px]]&lt;br /&gt;
&lt;br /&gt;
=== Branch Example ⌘===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
svn copy &lt;br /&gt;
  http://svnserver/calc/trunk                     # You can replace this with a &amp;quot;.&amp;quot; for your working copy&lt;br /&gt;
  http://svnserver/calc/branches/my-calc-branch   # The branch name&lt;br /&gt;
  -m &amp;quot;Create the branch&amp;quot;                          # Log Message&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Switching WC ⌘===&lt;br /&gt;
* You can switch your current working copy to a branch with the following command&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
svn switch destination&lt;br /&gt;
&lt;br /&gt;
– The Subversion &amp;quot;switch&amp;quot;-command&lt;br /&gt;
– The destination of the operation which means the name of the branch&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Branching - Releases ⌘===&lt;br /&gt;
* Fix the bug through doing the necessary modifications and finally commit the changes to the branch&lt;br /&gt;
* After having fixed the bug on the branch create a tag to mark the new release which can be delivered to the customer&lt;br /&gt;
* Create the new Release Tag&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
svn copy&lt;br /&gt;
file:///home/kama/repos/project1/branches/BUGFIX_BRANCH&lt;br /&gt;
file:///home/kama/repos/project1/tags/RELEASE-1.0.1&lt;br /&gt;
-m”- Fixed Release 1.0.1”&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Merging From a Branch ⌘===&lt;br /&gt;
* What&amp;#039;s with the bug you&amp;#039;ve fixed on the bug-fix-branch?&lt;br /&gt;
* What about your current development?&lt;br /&gt;
* You have to merge the changes made in the branch back to the main line&lt;br /&gt;
[[File:MergingSvn1.png|480px]]&lt;br /&gt;
&lt;br /&gt;
=== Merging Con&amp;#039;t ⌘===&lt;br /&gt;
* You can merge the changes from the branch into your current working copy with the following command&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
svn merge ^branchname&lt;br /&gt;
&lt;br /&gt;
– The Subversion &amp;quot;merge&amp;quot;-command&lt;br /&gt;
– The branch-name you like to merge into your current working copy&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Merge Info ⌘===&lt;br /&gt;
Which changes have already been merged from trunk to branch?&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
$ svn mergeinfo ^/calc/trunk&lt;br /&gt;
r341&lt;br /&gt;
r390&lt;br /&gt;
# Which changes are still eligible to merge from trunk to branch?&lt;br /&gt;
$ svn mergeinfo ^/calc/trunk --show-revs eligible&lt;br /&gt;
r391&lt;br /&gt;
r392&lt;br /&gt;
r393&lt;br /&gt;
r394&lt;br /&gt;
r395&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Merge --reintegrate ⌘===&lt;br /&gt;
Merging branch back into the trunk&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
svn merge ^trunk --reintegrate&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Best Practices ⌘===&lt;br /&gt;
* If you need to create a branch, you should do it from a completely committed working copy. This prevents you from becoming confused&lt;br /&gt;
* If you merge check out a clean copy into another directory&lt;br /&gt;
** Otherwise you can&amp;#039;t go back using &amp;quot;svn revert&amp;quot;&lt;br /&gt;
** After you&amp;#039;ve merged commit the changes and provide a log message with information on which revision/branch you have merged (merge tracking)&lt;br /&gt;
** You can first test the merge using the &amp;#039;&amp;#039;&amp;#039;--dry-run&amp;#039;&amp;#039;&amp;#039; flag of the merge command&lt;br /&gt;
&lt;br /&gt;
=== Branches vs Tags ⌘===&lt;br /&gt;
* The intention of a tag is that it should be used as read-only area whereas a branch is used to continue development (interim code, bug-fixing, release candidate etc.)&lt;br /&gt;
* Technically you can use a tag to continue development and check in etc. but you shouldn’t do it&lt;br /&gt;
* So in other words the difference between a tag and a branch is just an agreement&lt;br /&gt;
&lt;br /&gt;
=== Reverting Commited Changes ⌘===&lt;br /&gt;
* svn merge -c -303 ^/calc/trunk&lt;br /&gt;
* svn merge -r -303:302 ^/calc/trunk&lt;br /&gt;
&lt;br /&gt;
=== Reverting Deleted Files/Directories ⌘===&lt;br /&gt;
* svn cat ^/calc/trunk/real.c@807 &amp;gt; ./real.c&lt;br /&gt;
&lt;br /&gt;
=== Cherry Picking ⌘===&lt;br /&gt;
* svn diff -c 355 ^/calc/trunk&lt;br /&gt;
* svn diff -r 355:360 ^/calc/trunk&lt;br /&gt;
&lt;br /&gt;
== Properties ⌘==&lt;br /&gt;
* You can get a list of properties using the following command&lt;br /&gt;
 svn proplist --verbose destination&lt;br /&gt;
&lt;br /&gt;
=== svn:ignore ⌘===&lt;br /&gt;
* Tell Subversion which files and subdirectories to ignore&lt;br /&gt;
* Equivalent to CVS’s .cvsignore file&lt;br /&gt;
* You can define a special file/directory or patterns defining the files/directories which will be ignored&lt;br /&gt;
* You can suppress the exclusion if you use the &amp;#039;&amp;#039;&amp;#039;--no-ignore&amp;#039;&amp;#039;&amp;#039; flag for the svn status command&lt;br /&gt;
&lt;br /&gt;
== Some Good Practices ⌘==&lt;br /&gt;
* Do not not commit just a single file if your change applies to more than one file&lt;br /&gt;
* Commit the complete directory tree beginning at the root of your working copy&lt;br /&gt;
* Make sure your change reflects a single purpose: fixing a specific bug, the addition of a new feature, or some specific task&lt;br /&gt;
** But why?&lt;br /&gt;
&lt;br /&gt;
=== Good Practices Con&amp;#039;t ⌘===&lt;br /&gt;
* Log messages should describe the change from a business point of view&lt;br /&gt;
* Put in a reference to Ticket/Issue/Bug Id&lt;br /&gt;
* Don&amp;#039;t write log messages like:&lt;br /&gt;
** Removed line 4&lt;br /&gt;
** Inserted line 10 in file, etc&lt;br /&gt;
* The above is the job of Subversion not yours ;-)&lt;br /&gt;
* Often Log messages have to follow policies given by the company. Pay attention to yours&lt;br /&gt;
&lt;br /&gt;
== Recap ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
## GETTING HELP&lt;br /&gt;
svn help                   # For usage &lt;br /&gt;
svn help &amp;lt;subcommand&amp;gt;      # For help on a specific subcommand&lt;br /&gt;
svn help &amp;lt;subcommand&amp;gt; -v   # For help and show global and experimental options&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## MAKING REPOS&lt;br /&gt;
# Create catalog for all repositories&lt;br /&gt;
svnadmin create /home/userName/repos&lt;br /&gt;
# Put new project files into&lt;br /&gt;
svn import ... file:///home/userName/repos/slideshow -m &amp;quot;Initial Rev&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## WORKING COPIES (WC)&lt;br /&gt;
# Full copy (branches, tags, trunk)&lt;br /&gt;
svn checkout file:///home/userName/repos/slideshow wc1&lt;br /&gt;
# Your BEST FRIEND - Status&lt;br /&gt;
svn st -uv                 # Do it ALWAYS before any new commit&lt;br /&gt;
# ..and his great sis - Difference&lt;br /&gt;
svn diff                   # Do this ALWAYS before any new commit&lt;br /&gt;
svn diff -r REV1:REV2&lt;br /&gt;
# ..and their younger bros&lt;br /&gt;
svn info                   # To check where your things live&lt;br /&gt;
svn list                   # To see what&amp;#039;s inside&lt;br /&gt;
# WC usuals&lt;br /&gt;
svn add                    # New files&lt;br /&gt;
svn mkdir                  # New folders&lt;br /&gt;
svn ci -m &amp;quot;...&amp;quot;            # Making revs&lt;br /&gt;
svn mv                     # Moving things around&lt;br /&gt;
svn rm                     # Deleting&lt;br /&gt;
svn cp                     # Cloning (-;&lt;br /&gt;
# Updating locals&lt;br /&gt;
svn up                     # Do it ALWAYS in the very root folder&lt;br /&gt;
svn up --force&lt;br /&gt;
svn up --parents&lt;br /&gt;
svn up -r REV1             # Time vehicle, but you can&amp;#039;t kill the Hitler, nope.. (-:&lt;br /&gt;
# Boring History&lt;br /&gt;
svn log -vq -l 5                            # Verbose without messages limitted to 5&lt;br /&gt;
svn log trunk/logo.html@2                   # Changes for &amp;#039;logo.html&amp;#039; from &amp;#039;rev2&amp;#039;&lt;br /&gt;
svn log ^/slideshow/trunk@3 logo5.html      # Changes from &amp;#039;rev3&amp;#039; for file &amp;#039;logo5.html&amp;#039;&lt;br /&gt;
svn log -r BASE:HEAD trunk/logo.html        # Incoming changes from the next &amp;#039;svn up&amp;#039;&lt;br /&gt;
# Blaming (-;&lt;br /&gt;
svn blame trunk/logo.css -v&lt;br /&gt;
# Cleaning&lt;br /&gt;
svn cleanup                                 # Recover from an interrupted operation that left the working copy locked, or remove unwanted files&lt;br /&gt;
svn revert                                  # Restore pristine working copy state (undo local changes)&lt;br /&gt;
# Locking&lt;br /&gt;
svn lock&lt;br /&gt;
svn unlock&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
## BRANCHES&lt;br /&gt;
# Create a branch or tag	                  ( svn copy URL1 URL2 )&lt;br /&gt;
# Switch a working copy to a branch or tag    ( svn switch URL )&lt;br /&gt;
# Synchronize a branch with trunk	          ( svn merge trunkURL; svn commit )&lt;br /&gt;
# See merge history or eligible changesets    ( svn mergeinfo SOURCE TARGET )&lt;br /&gt;
# Merge a branch back into trunk	          ( svn merge --reintegrate branchURL; svn commit )&lt;br /&gt;
# Merge one specific change	                  ( svn merge -c REV URL; svn commit )&lt;br /&gt;
# Merge a range of changes	                  ( svn merge -r REV1:REV2 URL; svn commit )&lt;br /&gt;
# Block a change from automatic merging	      ( svn merge -c REV --record-only URL; svn commit )&lt;br /&gt;
# Preview a merge	                          ( svn merge URL --dry-run )&lt;br /&gt;
# Abandon merge results	                      ( svn revert -R . )&lt;br /&gt;
# Resurrect something from history	          ( svn copy URL@REV localPATH )&lt;br /&gt;
# Undo a committed change	                  ( svn merge -c -REV URL; svn commit )&lt;br /&gt;
# Examine merge-sensitive history	          ( svn log -g; svn blame -g )&lt;br /&gt;
# Create a tag from a working copy	          ( svn copy . tagURL )&lt;br /&gt;
# Rearrange a branch or tag	                  ( svn move URL1 URL2 )&lt;br /&gt;
# Remove a branch or tag	                  ( svn delete URL )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exercises ==&lt;br /&gt;
&lt;br /&gt;
[[Svn exercises]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Polish exercises ==&lt;br /&gt;
[[SVN Polish Exercises]]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lsokolowski1</name></author>
	</entry>
</feed>