<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jony dos Santos Kostetzer &#187; git</title>
	<atom:link href="http://jonysk.net/blog/category/git/feed/" rel="self" type="application/rss+xml" />
	<link>http://jonysk.net/blog</link>
	<description>ruby on rails and some other stuffs...</description>
	<lastBuildDate>Sun, 30 Aug 2009 17:03:03 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Gerenciando seus plugins Rails com GIT + braid</title>
		<link>http://jonysk.net/blog/2008/03/09/gerenciando-seus-plugins-rails-com-git-braid/</link>
		<comments>http://jonysk.net/blog/2008/03/09/gerenciando-seus-plugins-rails-com-git-braid/#comments</comments>
		<pubDate>Sun, 09 Mar 2008 15:49:30 +0000</pubDate>
		<dc:creator>Jony dos Santos Kostetzer</dc:creator>
				<category><![CDATA[git]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[braid]]></category>
		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://jonysk.net/blog/2008/03/09/gerenciando-seus-plugins-rails-com-git-braid/</guid>
		<description><![CDATA[Este cenário surgiu da necessidade de sincronizar o desenvolvimento de mais pessoas num projeto Rails (usando GIT), no que diz respeito a vendor branches externos (plugins). Quando se usa SVN, instalar plugins no Rails com ./script/plugin install -x parece uma maravilha até o momento que você começa a alterar seus plugins.. Quando faz isso, não [...]]]></description>
			<content:encoded><![CDATA[<p>Este cenário surgiu da necessidade de sincronizar o desenvolvimento de mais pessoas num projeto Rails (usando GIT), no que diz respeito a vendor branches externos (plugins). Quando se usa SVN, instalar plugins no Rails com <em>./script/plugin install -x</em> parece uma maravilha <strong>até o momento que você começa a alterar seus plugins.</strong>. Quando faz isso, não pode comitá-los, e fica no impasse sobre o que fazer. Nem preciso comentar o quão estranho seria mandar patchs para equipe&#8230;</p>
<p>As premissas, antes de tudo, eram: </p>
<ol>
<li><strong>Não usar SVN.</strong></li>
<li><strong>Flexibilidade para SVN e GIT como repositórios remotos.</strong></li>
<li><strong>Possibilidade de trabalhar em ambiente multiusuário, ou seja, vários desenvolvedores.</strong></li>
</ol>
<p>Deixe-me explicar a primeira premissa: Usar Subversion implicaria em merges a cada atualização dos plugins. Independente da solução que fosse usada para o merge de um plugin (<a href="http://piston.rubyforge.org/">piston</a>, <a href="http://www.dellroad.org/svnmerge/index">svnmerge</a>, <a href="http://svnbook.red-bean.com/en/1.0/ch07s04.html">svn_load_dirs</a>), o Subversion não trabalha bem com arquivos removidos/renomeados/movidos. Seja qual for a estratégia, o fato de fazer merge em repositórios <strong>diferentes</strong> no Subversion é um &#8220;tiro no escuro&#8221;: você nunca sabe está realmente idêntico ao repositório que você sincronizou, principalmente quando há mudanças drásticas neles (arquivos removidos/renomeados/movidos), e vai deixando seu rastro de desorganização com o tempo. <a href="http://piston.rubyforge.org/caveats.html#copies-and-renames">No site do Piston eles também comentam sobre isso.</a></p>
<p><span id="more-20"></span></p>
<p>Passei horas e horas pesquisando e rascunhando no papel estratégias com repositório central. A solução que mais se aproximou àquela que eu gostaria foi <a href="http://panthersoftware.com/articles/view/3/svn-s-svn-externals-to-git-s-submodule-for-rails-plugins"> esta aqui, que trabalha com git-submodule</a>.<br />
  Fantástica por sinal! Adorei o git-submodule. Como o GIT não permite fazer clones parciais, apenas de repositórios inteiros, achei que fosse a solução. Fiz vários testes, e quando eu havia compreendido muito bem o seu funcionamento, percebi que o git-submodule era <a href="http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#id280316">muito peculiar para trabalhar com alterações,</a> e certamente causaria confusões na equipe.<br />
Mas essa solução é muito bacana. <strong>Se o objetivo for centralizar um repositório de plugins</strong>, essa solução pode muito bem ser avaliada.</p>
<p>Mas ela já mata a primeira e a segunda premissa: tem em sua base um servidor Subversion. Ao passo que alguns plugins vêm sendo gerenciados por GIT, já começariamos aqui a ter que colocar repositórios GIT no Subversion! Um retrocesso à nossa meta, na minha opinião <img src='http://jonysk.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h2>Enfim, o braid!</h2>
<p>Até que encontrei o <a href="http://evil.che.lu/projects/braid">braid</a> (O Fábio Akita já havia comentado sobre ele no Rails Podcast Brasil). O braid é uma ferramenta simples pra gerenciar vendor branches (no nosso caso, plugins do Rails) de repositórios diferentes. Mais ou menos um Piston para GIT.</p>
<p> Resumindo o funcionamento do braid: ele faz uma branch chamada braid/track e nela adiciona clones (git-svn init) para os seus plugins, e ainda faz o merge nesta branch. Quando julgar necessário, você faz merge com sua branch principal.</p>
<h2>Experimentando</h2>
<p>Para instalar o braid, faça:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">$ git clone git:<span style="color:#006600; font-weight:bold;">//</span>github.<span style="color:#9900CC;">com</span><span style="color:#006600; font-weight:bold;">/</span>evilchelu<span style="color:#006600; font-weight:bold;">/</span>braid.<span style="color:#9900CC;">git</span>
$ cd braid
$ sudo gem install main open4
$ sudo ruby setup.<span style="color:#9900CC;">rb</span></pre></td></tr></table></div>

<p>Com o braid instalado, inicie um projeto apenas para teste:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">mkdir</span> testing
$ <span style="color: #7a0874; font-weight: bold;">cd</span> testing
$ git init
$ <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;test&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">file</span>
$ git add <span style="color: #c20cb9; font-weight: bold;">file</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> git commit <span style="color: #660033;">-m</span> <span style="color: #ff0000;">&quot;import inicial&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Jabá brazuca como exemplo: adicionar o plugin feito pelo Carlos Brando</span>
$ braid add  http:<span style="color: #000000; font-weight: bold;">//</span>plugins.nomedojogo.com<span style="color: #000000; font-weight: bold;">/</span>custom_resource_name <span style="color: #660033;">--type</span> <span style="color: #c20cb9; font-weight: bold;">svn</span> vendor<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>custom_resource_name</pre></td></tr></table></div>

<p>Isto cria a seguinte estrutura:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ git branch <span style="color: #660033;">-a</span>
  braid<span style="color: #000000; font-weight: bold;">/</span>track
<span style="color: #000000; font-weight: bold;">*</span> master
  braid<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>custom-resource-name</pre></td></tr></table></div>

<p>Quando houver modificação no plugin, basta fazer:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ braid update  <span style="color: #666666; font-style: italic;"># atualiza o plugin</span>
$ git merge braid<span style="color: #000000; font-weight: bold;">/</span>track <span style="color: #666666; font-style: italic;"># merge com sua branch principal (master)</span></pre></td></tr></table></div>

<h2>Bacana, mas e a equipe?</h2>
<p>Num cenário real (como o que motivou essa estratégia), o repositório está num servidor central que os outros desenvolvedores fazem seus clones. Mas nesse repositório não ficarão os dados da branch recém criada. Então, como os desenvolvedores atualizarão os plugins?</p>
<p>Uma maneira é passar aos demais desenvolvedores os repositórios remotos para que eles adicionem manualmente no .git/config dos seus clones.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> .git<span style="color: #000000; font-weight: bold;">/</span>config 
<span style="color: #7a0874; font-weight: bold;">&#91;</span>core<span style="color: #7a0874; font-weight: bold;">&#93;</span>
        repositoryformatversion = <span style="color: #000000;">0</span>
        filemode = <span style="color: #c20cb9; font-weight: bold;">true</span>
        bare = <span style="color: #c20cb9; font-weight: bold;">false</span>
        logallrefupdates = <span style="color: #c20cb9; font-weight: bold;">true</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># esta parte aqui e mais eventuais outros plugins instalados:</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span>svn-remote <span style="color: #ff0000;">&quot;braid/svn/vendor/plugins/custom-resource-name&quot;</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
        url = http:<span style="color: #000000; font-weight: bold;">//</span>plugins.nomedojogo.com<span style="color: #000000; font-weight: bold;">/</span>custom_resource_name
        fetch = :refs<span style="color: #000000; font-weight: bold;">/</span>remotes<span style="color: #000000; font-weight: bold;">/</span>braid<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>custom-resource-name</pre></td></tr></table></div>

<p>Sim, isto funciona. Depois basta fazer um <strong>braid update</strong>.</p>
<p>Mas não é uma forma muito interessante. Ótimo seria explorar o arquivo que o braid cria automaticamente, chamado .braids, que mantém os dados dos vendor branches adicionados:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">cat</span> .braids 
<span style="color: #660033;">---</span> 
vendor<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>custom_resource_name: 
  local_branch: braid<span style="color: #000000; font-weight: bold;">/</span>svn<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>plugins<span style="color: #000000; font-weight: bold;">/</span>custom-resource-name
  <span style="color: #7a0874; font-weight: bold;">type</span>: <span style="color: #c20cb9; font-weight: bold;">svn</span>
  branch: master
  remote: http:<span style="color: #000000; font-weight: bold;">//</span>plugins.nomedojogo.com<span style="color: #000000; font-weight: bold;">/</span>custom_resource_name</pre></td></tr></table></div>

<p>Uma maneira seria modificar o braid e adicionar a funcionalidade de ler este arquivo e adicioná-lo com comandos do GIT. O criador do braid <a href="http://evil.che.lu/2008/2/14/ann-braid-0-3-2#comment-926">já havia comentado que isso seria feito.</a> Como ainda não foi feito e eu queria testar essa solução, <a href="http://jonysk.net/blog/files/2008/03/patch.diff">criei um patch e enviei a ele.<br />
</a></p>
<p>Com este patch, um desenvolvedor pode fazer um clone do repositório e, em seguida, executar <strong>git rebuild</strong>, que reconstruiria a branch e os links remotos a partir do arquivo .braids.<br />
Em breve será feito algo semelhante no braid, seja a partir deste patch ou um novo <img src='http://jonysk.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>É isso!<br />
Vale lembrar que o braid ainda está amadurecendo. O gem, por exemplo, ainda nem foi publicado.<br />
Se você tiver alguma outra idéia ou modelo, fique à vontade em comentar <img src='http://jonysk.net/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://jonysk.net/blog/2008/03/09/gerenciando-seus-plugins-rails-com-git-braid/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
