22 de janeiro de 2014

Outra versão do mesmo programa

Eu sempre digo que o git é como o vim. Sempre você descobre um comando novo ou um recurso legal em comandos que você já usava.

Esses dias eu precisei de um programa na versão que eu estava mexendo em outro branch. Como fazer? A primeira opção que me veio à mente foi:
  1. clonar o repositório;
  2. dar checkout no branch (feature-x) que tinha o arquivo (nova-regra.py) na versão que eu precisava;
  3. copiar o programa para meu diretório de trabalho atual;
  4. apagar o clone temporário do repositório.
Isso faria sentido se eu não estivesse usando o git. Porque o comando git show aceita receber a revisão onde está o arquivo que eu quero listar. Era isso que eu precisava! Com isso, consegui pegar o arquivo rapidinho com o seguinte comando:
$ git show feature-x:./src/clientes/nova-regra.py > minha_nova_regra.py


O legal é que além de um branch, você pode informar uma tag ou o hash de um commit. Ou seja, qualquer "treeish". No exemplo acima, ele pegou o HEAD (commit mais recente) do branch feature-x. Mas por que o redirecionamento do output para um arquivo? Porque o git show sempre mostra na saída padrão.

Caso você não saiba exatamente qual o nome do arquivo desejado e precise listar o conteúdo do diretório antes, existe um comando para isso:

$ git ls-files --with-tree=feature-x -- src/clientes


O git ls-files também me permite informar um "treeish" no argumento --with-tree.