Commit parcial no Git

Sabe quando você quer fazer o commit de apenas parte de um arquivo?
Usando o parâmetro -i o git irá executar o add no modelo interativo.

No exemplo irei usar o arquivo vimrc.

git add <vimrc> -i

Como resposta ele irá apresentar os comandos disponíveis:

           staged     unstaged path
  1:    unchanged       +15/-4 vimrc

*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now>

Escolhendo o comando 5, ele irá perguntar qual arquivo você quer adicionar, parcialmente, no stage.

           staged     unstaged path
  1:    unchanged       +15/-4 vimrc
Patch update>>

Selecione o arquivo que você irá adicionar, no stage, informando o número do arquivo. No caso, só tenho um arquivo para adicionar.
Selecionado o arquivo o git apresenta a primeira diferença do arquivo e pergunta o que fazer com ela.

diff --git a/vimrc b/vimrc
index 5199dfd..aa2b489 100644
--- a/vimrc
+++ b/vimrc
@@ -17,15 +17,16 @@ Bundle 'scrooloose/nerdcommenter.git'
 Bundle 'scrooloose/nerdtree.git'
 Bundle 'kien/ctrlp.vim'
 Bundle 'tpope/vim-endwise.git'
-Bundle 'claco/jasmine.vim.git'
-Bundle 'groenewege/vim-less'
+"Bundle 'claco/jasmine.vim.git'
+"Bundle 'groenewege/vim-less'
 Bundle 'tpope/vim-ragtag.git'
-Bundle 'tpope/vim-rails.git'
 Bundle 'vim-ruby/vim-ruby.git'
+Bundle 'tpope/vim-rails.git'
+"Bundle 'm2ym/rsense'
 "Bundle 'tpope/vim-pathogen.git'
+"Bundle 'm2ym/rsense'
 " ==========================================
 
-
 filetype on           " Enable filetype detection
 filetype plugin on    " Enable filetype-specific plugins
 filetype indent on    " Enable filetype-specific indenting
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?

Para:
– n: ignorar esta diferença e ir para a próxima e vai para a próxima diferença
– y: adiciona a diferença no stage e vai para a próxima diferença
– q: termina a interação com esse arquivo

Ao final das diferenças no arquivo ele volta para o estado inicial do add. Use 7 para sair.

Feito isso, se você não tiver adicionado todas as diferenças no stage, o git status irá informar que o arquivo vimrc está no stage e está modificado.

Pronto!

Agora temos apenas parte do arquivo adicionado no stage, usando o commit interativo do git.

Fonte: http://git-scm.com/book/en/Git-Tools-Interactive-Staging

Git para SVN de forma manual

Tem esse projeto que eu comecei usando o Git, mas tenho que entregar em um SVN.

Daí para não bagunçar o checkout que fiz do SVN resolvi continuar usando o Git e copiar os arquivos para o diretório onde está o checkout do SVN.

Para saber quais arquivos tenho que copiar uso o

git diff <id_do_commit_que_ainda_não_copiei> --name-only

Para copiar os arquivos listados eu uso o xargs* com cp.

xargs -I {} cp {} ../projeto_no_svn/{}

Assim, para cada arquivo listado pelo git diff, o xargs vai executar um comando:

cp diretorio/arquivo.algumacoisa ../projeto_no_svn/diretorio/arquivo.algumacoisa

O comando completo fica:

git diff <id_do_commit_que_ainda_não_copiei> --name-only | xargs -I {} cp {} ../projeto_no_svn/{}

* Fonte: http://www.cyberciti.biz/faq/linux-unix-bsd-xargs-construct-argument-lists-utility/

Configurar ambiente de QA e Produção no Heroku.

Estou com um projeto pessoal no Heroku.
Recentemente surgiu a necessidade de criar um ambiente para demonstração. Como todo meu desenvolvimento está sendo feito no master tenho que informar qual o branch remoto que desejo fazer o push.

Criar o branch de qa e produção:

git checkout -b qa
git remote add heroku-qa git@heroku.com:appname-qa.git
git fetch heroku-qa
git branch qa --set-upstream-to=heroku-qa/master

git checkout master
git branch production --set-upstream-to=heroku-production/master

Isso resolve a questão de qual código está em cada ambiente. Mas, me gera o problema de, sempre que quero fazer um push preciso usar:

git push heroku-qa HEAD:master

Para resolver isso, mudo o local de onde o git vai procurar no servidor remoto. Ao invés de procurar um branch, remoto, com o mesmo nome do local, ele usa o branch configurado como upstream.

git config push.default upstream

Mais informações sobre o destino do push em: http://git-scm.com/docs/git-config.html:

push.default
Defines the action git push should take if no refspec is given on the command line, no refspec is configured in the remote, and no refspec is implied by any of the options given on the command line.[…]

Agora, já posso fazer apenas um git push, que o git sabe para qual branch remoto mandar, de acordo com o branch local.

Gostaria de saber mais?
http://longair.net/blog/2011/02/27/an-asymmetry-between-git-pull-and-git-push/
http://stackoverflow.com/questions/13148066/warning-push-default-is-unset-its-implicit-value-is-changing-in-git-2-0

Recuperando a lista de commiters do CVS

Alguns dos projetos, em que estou trabalhando, ficam no CVS. Estou tentando convertê-lo para o Maven sem causar impacto no trabalho dos outros desenvolvedores da equipe. Para isso preciso conseguir fazer o trabalho off-line e só publicar para os outros quando já estiver pronto.

Isso me levou a uma cruzada pessoal para mostrar as vantagens de se usar um Git da vida. No momento, consegui, junto com outros desenvolvedores, adotar o Git em uns projetos mais novos da equipe.

Para que eu consiga usar o Git neste projeto, preciso conseguir fazer uma importação do repositório. E, nesta importação, converter os nomes dos autores do commit para o formato do git.

Minha primeira dificuldade foi conseguir a lista de autores do CVS. Na falta de uma ferramenta melhor, fui para o Terminal:
export CVS_ROOT=:pserver:nome_usuario_cvs@servidor:path_repo
cvs login
cvs checkout MeuProjeto
cvs log > dump_do_log.txt
less dump_do_log.txt | grep "author: ." | awk '{sub(/\;/,"= <>",$5); print $5}' | sort -u > autores_do_meuprojeto.txt

No final eu terei um arquivo assim:
cvs_acdesouza= <>

Agora vem o trabalho de mapear os nomes e emails. Mas isso vai ter que ser manual 😦

Agradeço aos autores dos tutoriais e fóruns que me ajudaram:
Tutorial do Awk
Ordenar a lista de usuários e remover as entradas duplicadas;
Remover o ; no nome do usuário.

Tutorial Git

Algum tempo atrás eu estava estudando os SCMs distribuídos mais conhecidos: Git, Hg, Bazaar. E, na época tinha me decidido pelo Bazaar.

Claro, que o mais simples(Bazaar) de usar, instalar no Windows e com ferramenta gráfica não tem metade da aceitação que o Git apresenta. Atribuo todo o sucesso do Git ao GitHub. Ele é imbatível.

Portanto, me vi obrigado a aprender sobre o Git e lendo o Reddit, hoje, encontrei isso: A guided tour that walks through the fundamentals of Git

Poxa! Custava ter encontrado esse tutorial antes?


[],
AC

Eclispse não funciona com o Bazaar 1.6 quando instalado com o Windows standalone installer

Se você estava tentando usar a nova versão do Bazaar, e optou pelo Windows standalone installer, acredito que terá o mesmo problema que eu ao tentar usar o plugin para o Eclipse:

A incapacidade de instalar o plugin XML-Output na versão 1.6 do Bazaar, quando usado o Windows standalone installer.

Tem outra mensagem, no Lanuchpad, do XML-Output falando do problema quando o Bazaar 1.6 foi instalando usando o Windows standalone installer.

O problema ocorre porque o instalador veio sem o arquivo SimpleXMLRPCServer.py, para resolver basta seguir os passos abaixo:

  1. Baixar o Bazaar 1.6 – Windows standalone installer;
  2. Executar o instalador;
  3. Baixar o plugin XML-Output 0.6.2, que é a versão mais atual quando eu escrevi este post.
  4. Descompactar o arquivo, bzr-xmloutput-0.6.2.tar.gz, para uma pasta na sua máquina;
  5. Copie o conteúdo da pasta para %BAZAAR_HOME%\plugins\xmloutput, onde %BAZAAR_HOME% é o lugar onde você instalou o Bazaar.
  6. Baixe o arquivo SimpleXMLRPCServer.py e copie-o para a pasta %BAZAAR_HOME%\plugins\xmloutput

Para confirmar que deu tudo certo abre um console e digite o comando: bzr plugins


O resultado deve ser algo parecido com:

————————————————————————————–

D:\Documents and Settings\acdesouza>bzr plugins
bzrtools 1.6.0
    Various useful plugins for working with bzr.

launchpad
    Launchpad.net integration plugin for Bazaar.

qbzr 0.9.3
    QBzr - Qt-based front end for Bazaar

svn 0.4.11
    Support for Subversion branches

xmloutput 0.6.2
    This plugin provides xml output for status, log, annotate, missing, info, version and plugins

————————————————————————————–

Pronto, seu Bazaar 1.6 já está funcionado e pronto para ser usado com o Eclipse.

Dúvidas e sugestões, espero nos comentários.

Instalação do Subversion no Ubuntu 7.04 – Feisty Fawn

Terminei de instalar o servidor, dos meus freelances, com o Subversion. E para ter certeza de que não vou esquecer como fazer isso, estou escrevendo o que eu fiz dos dois tutoriais que eu segui.

  1. Instalar o Ubuntu Server sem selecionar as opções de LAMP ou DNS Server
  2. No meu caso, que tem um HD de 40GB, dividi as partições da seguinte forma:
    • 255MB, swap
    • 05GB, /
    • 04GB, /usr
    • 10GB, /srv
    • 20GB, /home

    A primeira informação é o tamanho da partição e a segunda o ponto de montagem. Tirando a partição swap, estou usando o sistema de arquivos EXT3 em todas elas.

  3. Instalar o Apache e o SVN:
    • sudo apt-get install apache2 subversion libapache2-svn
  4. Criar o diretório onde ficarão os repositórios do SVN:
    • sudo mkdir /srv/svn
  5. Criar o repositório. Aqui seria um bom momento para restaurar o backup, quando for o caso:
    • sudo svnadmin create /srv/svn/{repositorio}
  6. Dar acesso ao Apache para esses diretórios:
    • sudo chown -R www-data:www-data /srv/svn
  7. Configurar o módulo webdav do subversion
    1. sudo vim /etc/apache2/mods-enabled/dav_svn.conf
    2. Descomentar a tag <Location /svn>. No início e no fim do arquivo.
    3. Descomentar a opção DAV svn
    4. Descomentar a opção SVNParentPath /var/lib/svn e mudar o caminho para a localização do repositório: /srv/svn. Foi escolhido essa ao invés da SVNPath para termos mais de um repositório nesta mesma pasta.
    5. Descomentar a opção AuthzSVNAccessFile /etc/apache2/dav_svn.authz. Para habilitar o controle de acesso aos projetos usando o arquivo informado. Mais informação sobre como criar o arquivo podem ser vistas no livro vermelho do Subversion, na seção Per-Directory Access Control. Infelizmente, na versão em português este capítulo ainda não foi traduzido.
    6. Descomentar, para habilitar a autenticação, as três linhas:
      1. AuthType Basic
      2. AuthName “Subversion Repository”
      3. AuthUserFile /etc/apache2/dav_svn.passwd
      4. Adicione a linha: Require valid-user
      5. Salve o arquivo. Para isso, aperte a tecla ESC digite “:wq” sem as aspas e pressione enter
  8. Crie um usuário para acessr o SVN:
    • sudo htpasswd -cm /etc/apache2/dav_svn.passwd <username>
    • O parâmetro -c só é necessário para o primeiro usuário, pois é usado para criar o arquivo. Para os seguintes apenas o -m resolve, que é usado para criptografar a senha com o MD5.
  9. Reiniciar o apache
    • sudo /etc/init.d/apache2 restart

Estou querendo fazer melhorias como:

Alguém teria alguma sugestão ou correção para esse tutorial ou para o script?

Fontes: