<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://codeprairie.net/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>chrisortman : git</title><link>http://codeprairie.net/blogs/chrisortman/archive/tags/git/default.aspx</link><description>Tags: git</description><dc:language>en</dc:language><generator>CommunityServer 2007.1 (Build: 20917.1142)</generator><item><title>Follow Up: How do you manage your open source software</title><link>http://codeprairie.net/blogs/chrisortman/archive/2008/04/06/follow-up-how-do-you-manage-your-open-source-software.aspx</link><pubDate>Sun, 06 Apr 2008 15:50:39 GMT</pubDate><guid isPermaLink="false">73a4aa19-1c0c-4438-a31e-8c1402e1ba60:402</guid><dc:creator>chrisortman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/rsscomments.aspx?PostID=402</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/commentapi.aspx?PostID=402</wfw:comment><comments>http://codeprairie.net/blogs/chrisortman/archive/2008/04/06/follow-up-how-do-you-manage-your-open-source-software.aspx#comments</comments><description>&lt;p&gt;
A while ago I asked: &lt;a href="http://codeprairie.net/blogs/chrisortman/archive/2008/02/19/how-do-you-manage-your-open-source-software.aspx"&gt;How do you manage your open source software?&lt;/a&gt;. It seems like &lt;a href="http://blechie.com/WPierce/archive/2008/04/03/RFI-Keeping-Open-Source-Dependencies-Up-To-Date.aspx"&gt;Bill Pierce&lt;/a&gt; had the same question, so I thought I should get to writing my follow up.
&lt;/p&gt;

&lt;p&gt;
I also asked this same question on the &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/"&gt;alt.net mailing list&lt;/a&gt; (whole thread is &lt;a href="http://tech.groups.yahoo.com/group/altdotnet/msearch?query=managing+open+source+software&amp;amp;submit=Search&amp;amp;charset=ISO-8859-1"&gt;here&lt;/a&gt;).
&lt;/p&gt;

&lt;p&gt; A lot of folks suggest not updating once you have picked some library to use. That is a fine approach in some cases, but in my opinion things like &lt;a href="http://www.castleproject.org"&gt;Castle&lt;/a&gt; and &lt;a href="http://www.nhibernate.org"&gt;NHibernate&lt;/a&gt; are never &lt;i&gt;done&lt;/i&gt; and I want to be able to update and take advantage of new features.
&lt;/p&gt;

&lt;p&gt;
	So, how do I handle this today?
&lt;/p&gt;

&lt;ol&gt;
	&lt;li&gt; 
		Import the open source project subversion repository into a &lt;a href="http://git.or.cz"&gt;git&lt;/a&gt; repository. 
	&lt;/li&gt;
	&lt;li&gt;
		Build the project and copy its outputs to MyProject/Lib/OpenSourceProjectName using a rakefile I wrote.
	&lt;/li&gt;
	&lt;li&gt;
		Commit the changes to MyProject noting the sha1 (from git) and the svn revision of the open source project.
	&lt;/li&gt;
	&lt;li&gt;
		Create a git tag in the open source project git repository that ties it to the branch in my other project.
	&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;
What does this look like in practice?
&lt;pre&gt;
	cd /cygdrive/q/castle
	git svn fetch #gets changes from castle svn
	cd ..
	rake build:castle libcopy:castle_to_myproject
	cd myproject
	git add lib/castle
	git commit -m &amp;quot;Updated castle libs to sha xxxxxxxxxxxxxx svn revision 4000&amp;quot;
	cd ../castle
	git tag -f -a myproject-trunk
&lt;/pre&gt;

&lt;p&gt;
So far I have been pretty happy with this approach. It could definitely be a little more automated, but it is doing the job.
&lt;/p&gt;

&lt;p&gt;
The link between the open source code and myproject is maybe a bit too fragile. I think I can do better using either &lt;a href="http://www.kernel.org/pub/software/scm/git/docs/git-submodule.html"&gt;git submodules&lt;/a&gt; or &lt;a href="http://evil.che.lu/projects/braid"&gt;braid&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
	I&amp;#39;ve been experimenting with  &lt;a href="http://evil.che.lu/projects/braid"&gt;braid&lt;/a&gt; on my rails projects, I&amp;#39;m not sure yet if it will make sense to use it with for this though.
&lt;/p&gt;

&lt;p&gt;
If you are interested here&amp;#39;s the rakefile I use:
&lt;/p&gt;

&lt;pre class="textmate-source vibrant_ink"&gt;&lt;span class="source source_ruby"&gt;&lt;span class="meta meta_require meta_require_ruby"&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;require&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;rake&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;

&lt;span class="meta meta_class meta_class_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_class keyword_control_class_ruby"&gt;class&lt;/span&gt; &lt;span class="entity entity_name entity_name_type entity_name_type_class entity_name_type_class_ruby"&gt;LibCopy&lt;/span&gt;&lt;/span&gt;

  &lt;span class="meta meta_function meta_function_method meta_function_method_with-arguments meta_function_method_with-arguments_ruby"&gt;&lt;span class="keyword keyword_control keyword_control_def keyword_control_def_ruby"&gt;def&lt;/span&gt; &lt;span class="entity entity_name entity_name_function entity_name_function_ruby"&gt;copy&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;(&lt;/span&gt;&lt;span class="variable variable_parameter variable_parameter_function variable_parameter_function_ruby"&gt;lib_files&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; lib_build_dir&lt;/span&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_ruby"&gt;)&lt;/span&gt;&lt;/span&gt;
    libs_in_use &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; lib_files
    libs_in_use&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;each &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;lib&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
      puts &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;Check for &lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; lib
      lib_file &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; lib_build_dir &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;/&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt;  lib&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;pathmap&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;%f&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt; 
      &lt;span class="keyword keyword_control keyword_control_ruby"&gt;if&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;exists?&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;lib_file&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
        puts &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;Found &lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; lib_file
        cp lib_file&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;File&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;expand_path&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;lib&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;pathmap&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;%p&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;))&lt;/span&gt;
      &lt;span class="keyword keyword_control keyword_control_ruby"&gt;else&lt;/span&gt;
        puts &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;lib not found:&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_arithmetic keyword_operator_arithmetic_ruby"&gt;+&lt;/span&gt; lib_file 
      &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
    &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

namespace &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;build&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;

  &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;CASTLE_BUILD_DIR&lt;/span&gt; &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;q:/castle/build/net-3.5/debug&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;

  task &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;castle&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;t&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
    cd &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;castle&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
    puts &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;Building Castle....&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts sh&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;&lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;c:&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;tools&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;nant-0.86-beta1&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;bin&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;nant.exe -t:net-3.5 -D:common.testrunner.enabled=false -D:mbunit-console=c:&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;progra~1&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;mbunit&lt;span class="constant constant_character constant_character_escape constant_character_escape_ruby"&gt;\\&lt;/span&gt;mbunit.cons.exe&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
    puts &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;Build Finished&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    cd &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;..&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

  task &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;rhino&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do &lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;&lt;span class="variable variable_other variable_other_block variable_other_block_ruby"&gt;t&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_variable punctuation_separator_variable_ruby"&gt;|&lt;/span&gt;
&lt;span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"&gt;    &lt;span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby"&gt;#&lt;/span&gt;Seems like i may need to do an MSBUILD using the generator sln file before the whole build will work
&lt;/span&gt;    cd &lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;rhino-tools&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
    puts &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;Building Rhino-tools&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    puts &lt;span class="string string_interpolated string_interpolated_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;`&lt;/span&gt;msbuild.exe BuildAll.build&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;`&lt;/span&gt;&lt;/span&gt;
    puts &lt;span class="string string_quoted string_quoted_double string_quoted_double_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;quot;&lt;/span&gt;Done building rhino&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;

  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

  task &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;update_rhino_from_castle&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;    rhino_castle_libs &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;FileList&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;./rhino-tools/SharedLibs/Castle/*&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
    &lt;span class="support support_class support_class_ruby"&gt;LibCopy&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;copy&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;rhino_castle_libs&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt; &lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;CASTLE_BUILD_DIR&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

namespace &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;libcopy&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do 
&lt;/span&gt;
  task &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;castle_to_api&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;    api_castle_libs &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;FileList&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;./OmniaAPI/DependentFiles/Castle/*&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
    &lt;span class="support support_class support_class_ruby"&gt;LibCopy&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;copy&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;api_castle_libs&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;CASTLE_BUILD_DIR&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

  task &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;castle_to_mrrest&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;    dest_castle_libs &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;FileList&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;./MRRestSupport/lib/*&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
    &lt;span class="support support_class support_class_ruby"&gt;LibCopy&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;copy&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;dest_castle_libs&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;CASTLE_BUILD_DIR&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

  task &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;castle_to_myproject&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;    dest_castle_libs &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;FileList&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;./myproject/DependentFiles/Castle/*&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
    &lt;span class="support support_class support_class_ruby"&gt;LibCopy&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;copy&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;dest_castle_libs&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;CASTLE_BUILD_DIR&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

  task &lt;span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby"&gt;:&lt;/span&gt;castle_to_codegenerator&lt;/span&gt; &lt;span class="keyword keyword_control keyword_control_start-block keyword_control_start-block_ruby"&gt;do
&lt;/span&gt;    dest_castle_libs &lt;span class="keyword keyword_operator keyword_operator_assignment keyword_operator_assignment_ruby"&gt;=&lt;/span&gt; &lt;span class="support support_class support_class_ruby"&gt;FileList&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;[&lt;/span&gt;&lt;span class="string string_quoted string_quoted_single string_quoted_single_ruby"&gt;&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby"&gt;&amp;#39;&lt;/span&gt;./Castle.MonoRail.CodeGenerator/Libraries/*.dll&lt;span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby"&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_array punctuation_section_array_ruby"&gt;]&lt;/span&gt;
    &lt;span class="support support_class support_class_ruby"&gt;LibCopy&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;&lt;span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby"&gt;new&lt;/span&gt;&lt;span class="punctuation punctuation_separator punctuation_separator_method punctuation_separator_method_ruby"&gt;.&lt;/span&gt;copy&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;(&lt;/span&gt;dest_castle_libs&lt;span class="punctuation punctuation_separator punctuation_separator_object punctuation_separator_object_ruby"&gt;,&lt;/span&gt;&lt;span class="variable variable_other variable_other_constant variable_other_constant_ruby"&gt;CASTLE_BUILD_DIR&lt;/span&gt;&lt;span class="punctuation punctuation_section punctuation_section_function punctuation_section_function_ruby"&gt;)&lt;/span&gt;
  &lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;
&lt;span class="keyword keyword_control keyword_control_ruby"&gt;end&lt;/span&gt;

&lt;/span&gt;&lt;/pre&gt;



&lt;p&gt;Technorati Tags:
&lt;a href="http://technorati.com/tag/git" rel="tag"&gt;git&lt;/a&gt;, &lt;a href="http://technorati.com/tag/castle" rel="tag"&gt;castle&lt;/a&gt;
&lt;/p&gt;
&lt;img src="http://codeprairie.net/aggbug.aspx?PostID=402" width="1" height="1"&gt;</description><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/Build/default.aspx">Build</category><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/Castle/default.aspx">Castle</category><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/Ruby/default.aspx">Ruby</category><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/git/default.aspx">git</category></item><item><title>Why frequent commits are important</title><link>http://codeprairie.net/blogs/chrisortman/archive/2008/02/14/why-frequent-commits-are-important.aspx</link><pubDate>Thu, 14 Feb 2008 15:40:49 GMT</pubDate><guid isPermaLink="false">73a4aa19-1c0c-4438-a31e-8c1402e1ba60:387</guid><dc:creator>chrisortman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/rsscomments.aspx?PostID=387</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/commentapi.aspx?PostID=387</wfw:comment><comments>http://codeprairie.net/blogs/chrisortman/archive/2008/02/14/why-frequent-commits-are-important.aspx#comments</comments><description>&lt;p&gt;Something I have noticed has changed about the way I work now that I use git instead of subversion is that I make a lot more commits.&lt;/p&gt; &lt;p&gt;Let&amp;#39;s say that in order to add feature X I need to make the following changes&lt;/p&gt; &lt;p&gt;Add migration&lt;br /&gt;Add ActiveRecord model Foo&lt;br /&gt;Add PersistanceTests for model&lt;br /&gt;Write Tests for feature X&lt;br /&gt;Rename an existing class&lt;br /&gt;Change the way some other model class works&lt;br /&gt;implement some behavior in Foo&lt;br /&gt;Ensure that tests pass&lt;/p&gt; &lt;p&gt;In a lot of code I&amp;#39;ve seen all these changes would be grouped into a single SVN commit&lt;/p&gt; &lt;p&gt;svn commit -m &amp;quot;Implemented feature X&amp;quot;&lt;/p&gt; &lt;p&gt;But when that is the case&amp;nbsp;a lot of information gets lost about how feature X got implemented.&lt;/p&gt; &lt;p&gt;I think that each of those changes should be their own commit with their own explanation. Centralized version control doesn&amp;#39;t help this though because I would get impatient with making 3 minutes worth of changes and waiting 30 seconds to make the commit. I also think that pushing each change out to everyone else before the whole feature is ready would be a bad thing.&lt;/p&gt; &lt;p&gt;Using a DVCS (such as git) it is painless to do this. The commits are fast, and I just because I commit doesn&amp;#39;t mean I need to share. I also have the freedom to go back and rewrite history if I realize while I&amp;#39;m implementing some behavior in Foo that I forgot a column that should have been part of my initial migration.&lt;/p&gt;&lt;img src="http://codeprairie.net/aggbug.aspx?PostID=387" width="1" height="1"&gt;</description><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/git/default.aspx">git</category></item><item><title>Why I &lt;3 git rebase</title><link>http://codeprairie.net/blogs/chrisortman/archive/2008/02/14/why-i-lt-3-git-rebase.aspx</link><pubDate>Thu, 14 Feb 2008 15:27:07 GMT</pubDate><guid isPermaLink="false">73a4aa19-1c0c-4438-a31e-8c1402e1ba60:386</guid><dc:creator>chrisortman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/rsscomments.aspx?PostID=386</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/commentapi.aspx?PostID=386</wfw:comment><comments>http://codeprairie.net/blogs/chrisortman/archive/2008/02/14/why-i-lt-3-git-rebase.aspx#comments</comments><description>&lt;p&gt;I recently started adding a new feature to one of my projects. The first thing I typically do in this scenario:&lt;/p&gt; &lt;p&gt;git checkout -b &lt;em&gt;name-of-feature&lt;/em&gt; &lt;em&gt;current-version&lt;/em&gt; (replacing name-of-feature and current-version appropriately)&lt;/p&gt; &lt;p&gt;Now as I&amp;#39;m working on this I may bump into something that if I were to refactor would make this new feature a lot a lot simpler to implement.&lt;/p&gt; &lt;p&gt;If I were using only subversion and I started on this refactoring I would have a source history that looks something like:&lt;/p&gt; &lt;p&gt;Added migration for table x&lt;/p&gt; &lt;p&gt;Created new models + tests for feature X&lt;/p&gt; &lt;p&gt;Renamed class foo to bar&lt;/p&gt; &lt;p&gt;Refactored some service into separate services&lt;/p&gt; &lt;p&gt;next change for feature x&lt;/p&gt; &lt;p&gt;fixed bug 370 reported by QA&lt;/p&gt; &lt;p&gt;another change for feature X&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Which isn&amp;#39;t bad persay, but it &lt;em&gt;would &lt;/em&gt;be better if things were in their proper order. I also don&amp;#39;t like that I would have to commit some incomplete implementation of feature X just to fix a bug. If I had a little better foresight and planning I might have fixed the bug first, then done that refactoring that will make feature X simpler then actually implemented feature X. Fortunately git makes this pretty easy to do.&lt;/p&gt; &lt;p&gt;Here&amp;#39;s what my output of git branch might be:&lt;br /&gt;v1.2&lt;br /&gt;add-feature-x&lt;br /&gt;refactor-some-service&lt;br /&gt;fix-bug-370&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;v1.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------add-feature-x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------refactor-some-service-----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;----fix-bug-370&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;In my graph here a - represents a commit and&amp;nbsp;| a branch point&lt;br /&gt;What this says is that I started adding feature x, did some refactoring, stopped to fix a bug and continued my refactoring after. &lt;/p&gt; &lt;p&gt;Just because things happened in this order is no reason that history must say they did. I guess I like the Back to the Future theory of time travel better than Terminator.&lt;/p&gt; &lt;p&gt;Since I haven&amp;#39;t shared these changes yet, I can fix up my history.&lt;/p&gt; &lt;p&gt;git co fix-bug-370&lt;br /&gt;git rebase v1.2&lt;/p&gt; &lt;p&gt;I now have&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;v1.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------add-feature-x&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------refactor-some-service-----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|------fix-bug-370&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;And a couple more times:&lt;/p&gt; &lt;p&gt;git co refactor-some-service&lt;br /&gt;git rebase&amp;nbsp;fix-bug-370&lt;br /&gt;git co add-feature-x&lt;br /&gt;git rebase refactor-some-service&lt;/p&gt; &lt;p&gt;So that I now have&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;v1.2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-------fix-bug-370&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ---------refactor-some-service-----&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; |&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;---- add-feature-x&lt;/p&gt; &lt;p&gt;Which when I eventually do &lt;/p&gt; &lt;p&gt;git co v1.2&lt;br /&gt;git merge add-feature-x&lt;/p&gt; &lt;p&gt;Will produce a nice linear history in the order things should have happened.&lt;/p&gt;&lt;img src="http://codeprairie.net/aggbug.aspx?PostID=386" width="1" height="1"&gt;</description><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/git/default.aspx">git</category></item><item><title>Creating Subversion patches with git</title><link>http://codeprairie.net/blogs/chrisortman/archive/2008/01/14/creating-subversion-patches-with-git.aspx</link><pubDate>Tue, 15 Jan 2008 06:26:58 GMT</pubDate><guid isPermaLink="false">73a4aa19-1c0c-4438-a31e-8c1402e1ba60:375</guid><dc:creator>chrisortman</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/rsscomments.aspx?PostID=375</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/commentapi.aspx?PostID=375</wfw:comment><comments>http://codeprairie.net/blogs/chrisortman/archive/2008/01/14/creating-subversion-patches-with-git.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://abombss.com/blog/2007/12/10/creating-patches-for-subversion-from-git/"&gt;Adam expressed his frustration&lt;/a&gt; with creating &lt;a href="http://tortoisesvn.net"&gt;tortoise&lt;/a&gt; compatible patches using &lt;a href="http://git.or.cz"&gt;git&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;He mentions a script that will do the job, which I have not yet tried. However if you are using git on windows you most likely have &lt;a href="http://www.cygwin.org"&gt;cygwin&lt;/a&gt; installed which you can use to install the patch.exe program.&lt;/p&gt; &lt;p&gt;But first you need a patch file.&lt;/p&gt; &lt;p&gt;This is pretty simple&lt;/p&gt; &lt;p&gt;In my example I&amp;#39;m going to be creating a patch to fix FACILITIES-97 in &lt;a href="http://www.castleproject.org"&gt;castle project&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;First I need my local git repo ready&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git co -b bugs/facilities-97 castle-svn/trunk&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Now edit / test&lt;/p&gt; &lt;p&gt;When you&amp;#39;re all done prepare your index and commit&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git add .&lt;/font&gt;&lt;br /&gt;&lt;font face="Courier New" color="#ff0000"&gt;git commit -m &amp;quot;fixes (FACILITIES-97)&amp;quot;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Now create your patch&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git format-patch castle-svn/trunk&lt;/font&gt;&lt;/p&gt; &lt;p&gt;That last command will create a patch file for every commit that is in &lt;font color="#ff0000"&gt;bugs/facilities-97&lt;/font&gt; but not in &lt;font color="#ff0000"&gt;castle-svn/trunk&lt;/font&gt;&lt;br /&gt;In this case I have a single commit so it creates 0001-fixes-FACILITIES-97.patch&lt;/p&gt; &lt;p&gt;Now that you&amp;#39;ve got your patches they can be applied to svn like this&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;patch -p1 -i 0001-fixes-FACILITIES-97.patch&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Now here&amp;#39;s the gotcha. patch.exe can either read stdin or take a named file. My patches would always fail if I used stdin, so using &lt;font color="#ff0000"&gt;-i&lt;/font&gt; to specify the filename is important.&lt;br /&gt;The &lt;font color="#ff0000"&gt;-p1&lt;/font&gt; switch tells patch to strip the first part of the path in the patch file because git generates file paths like&lt;br /&gt;/a/InversionOfControl/MicroKernel.....&lt;/p&gt; &lt;p&gt;That&amp;#39;s it, you&amp;#39;re all done.&lt;/p&gt;&lt;img src="http://codeprairie.net/aggbug.aspx?PostID=375" width="1" height="1"&gt;</description><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/git/default.aspx">git</category></item><item><title>Limitations of svn branching</title><link>http://codeprairie.net/blogs/chrisortman/archive/2008/01/09/limitations-of-svn-branching.aspx</link><pubDate>Wed, 09 Jan 2008 17:53:41 GMT</pubDate><guid isPermaLink="false">73a4aa19-1c0c-4438-a31e-8c1402e1ba60:359</guid><dc:creator>chrisortman</dc:creator><slash:comments>0</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/rsscomments.aspx?PostID=359</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/commentapi.aspx?PostID=359</wfw:comment><comments>http://codeprairie.net/blogs/chrisortman/archive/2008/01/09/limitations-of-svn-branching.aspx#comments</comments><description>&lt;p&gt;I generally run all my projects that use castle off the trunk. However it has been several months since I&amp;#39;ve taken any updates, mostly due to lack of time on my part.&lt;/p&gt; &lt;p&gt;As I&amp;#39;m upgrading there are many many changes which require me to update my code. Most due to the introduction of IController and changes from IRailsEngineContext.&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;One such instance is IResponse.BinaryWrite which seems to no longer be available.&lt;/p&gt; &lt;p&gt;As I dig through svn to try to find if there is a replacement method or why it was removed etc I am hit right in the face with how poorly svn handles branching and merging. The only log message in the trunk is that all these changes were merged back in in one giant commit. If you want to go see what those changes were you need to go look through the branch that was merged, but even then there&amp;#39;s no way of knowing exactly which changes were pulled ( I just assume all.)&lt;/p&gt; &lt;p&gt;With git I would be able to see these sort of things and save myself a lot of time.&lt;/p&gt;&lt;img src="http://codeprairie.net/aggbug.aspx?PostID=359" width="1" height="1"&gt;</description><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/Castle/default.aspx">Castle</category><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/git/default.aspx">git</category></item><item><title>Getting started with the Castle git repo</title><link>http://codeprairie.net/blogs/chrisortman/archive/2007/10/17/getting-started-with-the-castle-git-repo.aspx</link><pubDate>Wed, 17 Oct 2007 15:35:09 GMT</pubDate><guid isPermaLink="false">73a4aa19-1c0c-4438-a31e-8c1402e1ba60:271</guid><dc:creator>chrisortman</dc:creator><slash:comments>3</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/rsscomments.aspx?PostID=271</wfw:commentRss><wfw:comment xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://codeprairie.net/blogs/chrisortman/commentapi.aspx?PostID=271</wfw:comment><comments>http://codeprairie.net/blogs/chrisortman/archive/2007/10/17/getting-started-with-the-castle-git-repo.aspx#comments</comments><description>&lt;p&gt;Before we dive into commands I feel the need for a little rationale. I&amp;#39;m not going to explain all the virtues of GIT as google will happily do that for you, I am however going to explain why I need to use it.&lt;/p&gt; &lt;p&gt;I have 5 separate projects that all use something from Castle. Keeping track of which project uses which build can be very difficult espcially since I always run from castle trunk. Subversion would have me create a separate vendor branch in each project and stick mirror the castle repo there. That is all well and good until I start fixing bugs or making enhancements. As soon as that happens things get hairy.&lt;/p&gt; &lt;p&gt;My solution is to have a git repository that mirrors the castle svn but contains separate branches for each product that is using it.&lt;/p&gt; &lt;p&gt;On my system &lt;font face="Courier New" color="#ff0000"&gt;git branch -a&lt;/font&gt; will list something like&lt;/p&gt; &lt;p&gt;castle-svn/trunk&lt;/p&gt; &lt;p&gt;castle-svn/branches&lt;/p&gt; &lt;p&gt;castle-svn/tags&lt;/p&gt; &lt;p&gt;Product1/current&lt;/p&gt; &lt;p&gt;Product2/current&lt;/p&gt; &lt;p&gt;MyPatches/MR-XXX&lt;/p&gt; &lt;p&gt;MR-Restsupport&lt;/p&gt; &lt;p&gt;.....&lt;/p&gt; &lt;p&gt;Now when I need to jump between projects and dig into castle source it is as simple as &lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git checkout Product1/current&lt;/font&gt;&lt;/p&gt; &lt;p&gt;I can also freely move patches around and stay up to date with the latest and greatest being produced by the castle community.&lt;/p&gt; &lt;p&gt;Setting up the git mirror can be a time consuming process. You do have the option of only pulling history up to the last N revisions, but I like full history so I can visualize how things have changed. Pulling the full history takes a while and puts an increased load on Hammett&amp;#39;s servers. &lt;/p&gt; &lt;p&gt;That is why I did the full import and published the mirror to &lt;a href="http://repo.or.cz"&gt;http://repo.or.cz&lt;/a&gt;&amp;nbsp;which provides public git hosting.&lt;/p&gt; &lt;p&gt;Now the good stuff. To get started you want to install &lt;a href="http://www.cygwin.com"&gt;cygwin&lt;/a&gt; + git. Git is&amp;nbsp;a cygwin package so this is easy. I believe there is a MinGW port in progress, but I already had cygwin so this was easy for me.&lt;/p&gt; &lt;p&gt;Now to clone the repo simply do&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git clone -n --origin castle-svn git://repo.or.cz/castle.git&lt;/font&gt;&lt;/p&gt; &lt;p&gt;These are not the standard options, so let me explain. &lt;/p&gt; &lt;p&gt;-n tells git to not checkout anything after it copies. I like this because a master branch isn&amp;#39;t very meaningful to me in this context.&lt;/p&gt; &lt;p&gt;&amp;nbsp;--origin castle-svn tells git to place branches in from the remote repository into /refs/remotes/castle-svn instead of /refs/remotes/origin (the default). This again is just for simplicity on my part. I like doing git checkout trunk castle-svn/trunk better than git checkout trunk origin/trunk&lt;/p&gt; &lt;p&gt;What you have at this point is a git repo that has all the SVN history. On my machine this actually takes up less space than the svn checkout&lt;/p&gt; &lt;p&gt;That is all well and good but you only have the snapshot of the trunk as of when I created the git repo.&lt;/p&gt; &lt;p&gt;At some point I will setup up an automated pull to keep history up to date, if you want to be able send a commit to the castle server you will need svn metadata anyway. To do that we use:&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git svn init &lt;/font&gt;&lt;a href="https://svn.castleproject.org/svn/castle"&gt;&lt;font face="Courier New" color="#ff0000"&gt;https://svn.castleproject.org/svn/castle&lt;/font&gt;&lt;/a&gt;&lt;font face="Courier New" color="#ff0000"&gt; -T trunk -t tags -b branches&lt;/font&gt;&lt;/p&gt; &lt;p&gt;This will create a new .git/svn folder and add some options to your .git/config file.&lt;/p&gt; &lt;p&gt;Because we&amp;#39;re doing things a little custom from the default behaviour of git-svn we need to edit this .git/config file to tell it where our subversion revisions go.&lt;/p&gt; &lt;p&gt;Open up .git/config in &lt;a href="http://www.vim.org"&gt;your favorite text editor&lt;/a&gt; and make the svn-remote section look like this&lt;/p&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;[svn-remote &amp;quot;svn&amp;quot;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url = &lt;a href="https://svn.castleproject.org/svn/castle"&gt;https://svn.castleproject.org/svn/castle&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fetch = trunk:refs/remotes/castle-svn/trunk&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; branches = branches/*:refs/remotes/castle-svn/branches/* &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; tags = tags/*:refs/remotes/castle-svn/tags/*&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The stuff to the right of the equals sign is called a refspec and it tells git-svn that heads from svn under trunk goto refs/remotes/castle-svn/trunk (not the wildcard for branches and tags). This is creating remote-tracking branches in git. &lt;p&gt;With this in place you can now do git svn fetch and git will check your history against all the castle revisions. This does take a minute or so, but it is much faster than having to pull all the svn file data. &lt;p&gt;So now you want to work with RC3? &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git checkout -b RC3 castle-svn/tags/1.0.x-RC3&lt;/font&gt; &lt;p&gt;What about the trunk? &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git checkout -b trunk castle-svn/trunk&lt;/font&gt; &lt;p&gt;Maybe you need RC2 &lt;p&gt;&lt;font face="Courier New" color="#ff0000"&gt;git checkout -b RC2 castle-svn/tags/1.0.x-RC2&lt;/font&gt; &lt;p&gt;Try switching between RC2 and RC3 and see how it compares to the paultry svn-switch. &lt;p&gt;In our next installment we&amp;#39;ll look at fixing a bug and creating the patch. &lt;p&gt;Cheers &lt;p&gt;PS: Trouble committing? &lt;a href="http://www.dont-panic.cc/capi/2007/07/13/git-on-windows-you-have-some-suspicious-patch-lines/"&gt;Check here&lt;/a&gt;&lt;br /&gt;PPS: My list of git resources so far &lt;a href="http://del.icio.us/chrisortman/git"&gt;http://del.icio.us/chrisortman/git&lt;/a&gt; &lt;a href="http://del.icio.us/chrisortman/git-svn"&gt;http://del.icio.us/chrisortman/git-svn&lt;/a&gt;&lt;img src="http://codeprairie.net/aggbug.aspx?PostID=271" width="1" height="1"&gt;</description><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/Castle/default.aspx">Castle</category><category domain="http://codeprairie.net/blogs/chrisortman/archive/tags/git/default.aspx">git</category></item></channel></rss>