<p>I have a few C# <code>.dll</code> projects which are common to many applications.  Currently, I have one big repository. I have each DLL stored as a separate project within the repository and every application project stored as a project within the same repository.</p>

<p>I recently switched to Subversion for source control and I fear that I did not do a good job of structuring the repository. I would like to hear what others are doing.</p>

[{'answer_id': 15633, 'author': 'Judge Maygarden', 'author_id': 1491, 'author_profile': 'https://Stackoverflow.com/users/1491', 'pm_score': 3, 'selected': False, 'text': '<p>Subversion repositories are typical sub-divided into:</p>\n\n<pre><code>branch/\ntags/\ntrunk/\n</code></pre>\n\n<p>You would either place all of your DLL and application projects into the <strong>trunk</strong> and then use <strong>branch</strong> and <strong>tags</strong> for all of them as necessary too:</p>\n\n<pre><code>branch/\ntags/\ntrunk/\n    project1/\n    project2/\n</code></pre>\n\n<p>Alternatively, you could create folders for each project in the root and then place the common branch, tags and trunk folders within them.</p>\n\n<pre><code>project1/\n    branch/\n    tags/\n    trunk/\n\nproject2/\n    branch/\n    tags/\n    trunk/\n</code></pre>\n\n<p>Note that this practice is simply convention and nothing in SVN requires (or really promotes) doing it exactly this way. However, everyone is used to it. So, you would be doing people a favor to go along.</p>\n\n<p>To elaborate further, the <strong>trunk</strong> is where your main development will take place. When you want to mark a particular revision (e.g. a release version), then simply <strong>svn</strong> <strong>copy</strong> the project into the tags directory. Also, just copy code into the <strong>branch</strong> directory when you want to do something dramatic or prolonged and don\'t want to hinder progress in the <strong>trunk</strong>. Later you can <strong>svn</strong> <strong>merge</strong> your <strong>branch</strong> back into the <strong>trunk</strong> when it is ready for action!</p>\n\n<p>If you want to correct mishaps in your current Subverion repository, then just use <strong>svn</strong> <strong>move</strong> to relocate them. Unlike the delete and add process of <a href="http://www.nongnu.org/cvs/" rel="noreferrer">CVS</a>, move will retain version history for the new location.</p>\n'}, {'answer_id': 15639, 'author': 'AdamSane', 'author_id': 805, 'author_profile': 'https://Stackoverflow.com/users/805', 'pm_score': 0, 'selected': False, 'text': '<p>if your sub projects can be released at different versions (like controls, web parts, ect...) then it may make sense to build your structure like this:</p>\n\n<p><strong>Solution</strong><br>\nProject 1  </p>\n\n<blockquote>\n  <ul>\n  <li>Branch  </li>\n  <li>Tags  </li>\n  <li>Trunk  </li>\n  </ul>\n</blockquote>\n\n<p>Project 2</p>\n\n<blockquote>\n  <ul>\n  <li>Branch  </li>\n  <li>Tags  </li>\n  <li>Trunk  </li>\n  </ul>\n</blockquote>\n\n<p>This way you can manage each project release independently.</p>\n\n<p>Otherwise the most common structure is:</p>\n\n<blockquote>\n  <ul>\n  <li>Branch  </li>\n  <li>Tags  </li>\n  <li>Trunk  </li>\n  <li>Docs (Optional)</li>\n  </ul>\n</blockquote>\n'}, {'answer_id': 15651, 'author': 'lomaxx', 'author_id': 493, 'author_profile': 'https://Stackoverflow.com/users/493', 'pm_score': 3, 'selected': True, 'text': '<p>using the branch/trunk/tag repository structure is pretty standard, but if I\'m understanding you properly, your issue is that you have a set of common dll projects that get used across multiple projects. This can definately become tricky to manage.</p>\n\n<p>So the typical scenario here is that you have some class library called Common.Helpers that has code that is common to all your applications.</p>\n\n<p>Let\'s say I\'m starting a new application called StackOverflow.Web that needs to reference Common.Helpers.</p>\n\n<p>Usually what you would do is create a new solution file and add a new project called Stackoverflow.Web and add the existing Common.Helpers project and then reference it from the new Stackoverflow.Web project.</p>\n\n<p>What I usually try and do is create a repository for the Common.Helpers project and then in subversion reference it as an <a href="http://svnbook.red-bean.com/en/1.1/ch07s04.html" rel="noreferrer">external</a>. That way you can keep the code under source control in a single location, but still use it seperately in multiple projects.</p>\n'}, {'answer_id': 15682, 'author': 'Brett Veenstra', 'author_id': 307, 'author_profile': 'https://Stackoverflow.com/users/307', 'pm_score': 0, 'selected': False, 'text': '<p>I store everything in the repository to make it easy for developers (or rebuilt devboxes) to check-out from SVN and then run a build (with all necessary assemblies in relative paths).  If you have multiple projects that should be separate, this would also encourage the team of your shared components to deliver high quality assemblies.  This could follow a normal release to production mentality where the shared assemblied would be updated in your downstream projects.  This is a very natural <a href="http://www.spaconference.org/cgi-bin/wiki.pl/ot2004/?KkbagegehhgidslcbhbffcaabcbzencoukKk" rel="nofollow noreferrer">Software Value Chain,</a> at the cost of a little bit of disk space.</p>\n\n<p>JP Boodhoo has <a href="http://blog.jpboodhoo.com/AutomatingYourBuildsWithNAntPart1.aspx" rel="nofollow noreferrer">a great series</a> on the topic of automated builds, VS folder structure, and getting developers up and running quickly.</p>\n'}, {'answer_id': 16102, 'author': 'jhale', 'author_id': 1511, 'author_profile': 'https://Stackoverflow.com/users/1511', 'pm_score': 0, 'selected': False, 'text': '<p>Thanks to everyone who answered.  lomaxx, I spent the morning looking into using the external feature and it looks like this is the way to go.  I was not aware of it, probably because it is not exactly prominent in Tortoise.</p>\n'}, {'answer_id': 19557, 'author': 'Bert Huijben', 'author_id': 2094, 'author_profile': 'https://Stackoverflow.com/users/2094', 'pm_score': 0, 'selected': False, 'text': '<p>If you want to use the merge-tracking of Subversion 1.5 over more than one project at the same time you should use a single tree without externals.</p>\n\n<p>A tracked merge is (just like a commit) always over a directory and its children.</p>\n\n<p>The same rule applies on atomic commits. (Works only stable within a single workingcopy. It might work in some specific other cases but that behavior is not guaranteed)</p>\n'}]
['https://Stackoverflow.com/questions/15621', 'https://Stackoverflow.com', 'https://Stackoverflow.com/users/1511/']