Disclaimer: o título é ligeiramente hiperbólico, existem outras soluções comprovadas para o problema. Eu acho a técnica abaixo muito elegante, no entanto.

Recentemente eu li sobre esta técnica incrível em um tópico Hacker News sobre as soluções das pessoas para armazenar seus arquivos de pontos. O usuário StreakyCobra mostrou sua elegante configuração e … Fazia tanto sentido! Eu estou no processo de mudar o meu próprio sistema para a mesma técnica. O único pré-requisito é instalar Git.

Em suas palavras a técnica abaixo requer:

Sem ferramentas extras, sem links simbólicos, os arquivos são rastreados em um sistema de controle de versão, você pode usar ramificações diferentes para computadores diferentes, você pode replicar sua configuração facilmente em uma nova instalação.

A técnica consiste em armazenar um repositório Git bare em uma pasta “lateral” (como $HOME/.cfg ou $HOME/.myconfig) usando um alias especialmente criado para que os comandos sejam executados contra esse repositório e não contra o usual .git pasta local, o que interferiria com quaisquer outros repositórios Git ao redor.

Começando do zero

Se você não tem rastreado suas configurações em um repositório Git antes, você pode começar usando esta técnica facilmente com estas linhas:

git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • A primeira linha cria uma pasta ~/.cfg que é um repositório Git nu que irá rastrear nossos arquivos.
  • Então criamos um alias config que usaremos ao invés do normal git quando queremos interagir com nosso repositório de configuração.
  • Pomos uma bandeira – local para o repositório – para esconder arquivos que ainda não estamos rastreando explicitamente. Isto é para que quando você digitar config status e outros comandos mais tarde, arquivos que você não está interessado em rastrear não aparecerão como untracked.
  • Também você pode adicionar a definição do apelido à mão no seu .bashrc ou usar a quarta linha fornecida por conveniência.

Eu empacotei as linhas acima em um snippet no Bitbucket e o liguei a partir de um short-url. Para que você possa configurar as coisas com:

curl -Lks http://bit.do/cfg-init | /bin/bash

Após ter executado a configuração, qualquer arquivo dentro da pasta $HOME pode ser versionado com comandos normais, substituindo git pelo seu recém criado config alias, como:

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Instale seus arquivos de pontos em um novo sistema (ou migre para esta configuração)

Se você já armazenou sua configuração/dofiles em um repositório Git, em um novo sistema você pode migrar para esta configuração com os seguintes passos:

  • Prior para a instalação certifique-se de que você tenha comprometido o alias para seu .bashrc ou .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • E que seu repositório de código fonte ignore a pasta onde você irá cloná-lo, para que você não crie problemas estranhos de recursividade:
echo ".cfg" >> .gitignore
  • Agora clone seus arquivos de pontos em um repositório nu em uma pasta “dot” do seu $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Definir o pseudônimo no escopo da shell atual:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Verifica o conteúdo real do repositório vazio para o teu $HOME:
config checkout
  • O passo acima pode falhar com uma mensagem como:
error: The following untracked working tree files would be overwritten by checkout:
.bashrc
.gitignore
Please move or remove them before you can switch branches.
Aborting

Isto é porque a sua pasta $HOME pode já ter alguns ficheiros de configuração de stock que seriam substituídos pelo Git. A solução é simples: faça backup dos arquivos se você se importa com eles, remova-os se você não se importa. Eu lhe forneço um possível atalho para mover todos os arquivos ofensivos automaticamente para uma pasta de backup:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | \
xargs -I{} mv {} .config-backup/{}
  • Realize o check out se você tiver problemas:
config checkout
  • Definir a bandeira showUntrackedFiles a no neste repositório (local) específico:
config config --local status.showUntrackedFiles no
  • Você está pronto, de agora em diante você pode digitar config comandos para adicionar e atualizar seus arquivos de pontos:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Ganha como um atalho para não ter de se lembrar de todos estes passos em qualquer máquina nova que queira configurar, pode criar um script simples, guardá-lo como Bitbucket snippet como eu fiz, criar uma url curta para ele e chamá-lo assim:

curl -Lks http://bit.do/cfg-install | /bin/bash

Para completar isto é o que acabei por fazer (testado em muitos contentores Alpine Linux recém cunhados para o testar):

git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if ; then
echo "Checked out config.";
else
echo "Backing up pre-existing dot files.";
config checkout 2>&1 | egrep "\s+\." | awk {'print '} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Wrapping up

Espero que ache esta técnica útil para seguir a sua configuração. Se você está curioso, meus arquivos de pontos vivem aqui. Também por favor mantenha-se ligado seguindo @durdn ou a minha fantástica equipa em @atlassiandev.

Deixe uma resposta

O seu endereço de email não será publicado.