Close

Dotfiles: a melhor maneira de armazenar em um repositório do Git simples

Isenção de responsabilidade: o título é um pouco hiperbólico, existem outras soluções comprovadas para o problema. Eu acho que a técnica abaixo é muito elegante.

Há pouco tempo, li sobre essa técnica incrível em um tópico do Hacker News sobre as soluções das pessoas para armazenar seus dotfiles. O usuário StreakyCobra mostrou sua configuração elegante e... fazia muito sentido! Estou mudando meu próprio sistema para a mesma técnica. O único pré-requisito é instalar o Git.

Em suas palavras, a técnica abaixo requer:

Ausência de ferramentas extras, sem links simbólicos, os arquivos são rastreados em um sistema de controle de versão, você pode usar branches diferentes para computadores diferentes, pode replicar sua configuração com facilidade em uma nova instalação.

A técnica consiste em armazenar um repositório simples do Git em uma pasta "secundária" (como $HOME/.cfg ou $HOME/.myconfig) usando um alias especialmente criado para que os comandos sejam executados nesse repositório e não na pasta local .git usual, o que interferiria com quaisquer outros repositórios Git ao redor.


Começando do zero


Se você não estava rastreando suas configurações em um Repositório do Git antes, você pode começar a usar essa 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 simples do Git que vai rastrear nossos arquivos.
  • Em seguida, criamos uma configuração de alias que vamos usar em vez do git normal quando quisermos interagir com nosso repositório de configuração.
  • Definimos uma marcação — local para o repositório — para ocultar arquivos que ainda não estamos rastreando explicitamente. Essa marcação ocorre para que, quando você digitar config status e outros comandos posteriormente, os arquivos que você não está interessado em rastrear não apareçam como não rastreados.
  • Além disso, você pode adicionar a definição de alias manualmente ao seu .bashrc ou usar a quarta linha mostrada para sua conveniência.

Agrupei as linhas acima em um snippet no Bitbucket e o vinculei a partir de uma URL curta. Para que você possa configurar as coisas com:

bancos de dados
Material relacionado

Como mover um Repositório do Git completo

Logotipo do Bitbucket
VER SOLUÇÃO

Aprenda a usar o Git com o Bitbucket Cloud

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

Depois de executar a configuração, qualquer arquivo dentro da pasta $HOME pode usar o controle de versões com comandos normais, substituindo o git pelo seu alias de configuração recém-criado, como:

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

Instale seus dotfiles em um novo sistema (ou migre para essa configuração)


Se você já armazena suas configurações/dotfiles em um repositório do Git, em um novo sistema, você pode migrar para essa configuração com as seguintes etapas:

  • Antes da instalação, garanta que tenha feito o commit do alias no .bashrc ou .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • E que seu repositório de origem ignora a pasta onde você vai cloná-lo, para que você não crie problemas estranhos de recursão:
echo ".cfg" >> .gitignore
  • Agora clone seus dotfiles em um repositório vazio em uma pasta "dot" de $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Defina o alias no escopo atual do shell:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Faça o checkout do conteúdo real do repositório vazio para sua $HOME:
config checkout
  • A etapa 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

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

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
  • Execute o checkout de novo se você tiver problemas:
config checkout
  • Defina a marcação showUntrackedFiles como no neste repositório (local) específico:
config config --local status.showUntrackedFiles no
  • Você está pronto, a partir de agora você pode digitar comandos de configuração para adicionar e atualizar seus dotfiles:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

De novo, como um atalho para não ter que lembrar todas essas etapas em qualquer nova máquina que você quer configurar, você pode criar um script simples, armazená-lo como snippet do Bitbucket como eu fiz, criar uma URL curta para ele e chamá-lo assim:

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

Para concluir, foi assim que terminei (testado em muitos contêineres Alpine Linux recém-criados para testá-lo):

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 [ $? = 0 ]; then
  echo "Checked out config.";
  else
    echo "Backing up pre-existing dot files.";
    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Encerrando


Espero que você ache essa técnica útil para rastrear sua configuração. Se está curioso, meus dotfiles estão aqui. Além disso, fique conectado seguindo @durdn ou minha equipe incrível em @atlassiandev.


Compartilhar este artigo
Próximo tópico

Leitura recomendada

Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.

Pessoas colaborando usando uma parede cheia de ferramentas

Blog do Bitbucket

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Demonstrações de funções no Demo Den com parceiros da Atlassian

Como o Bitbucket Cloud funciona com o Atlassian Open DevOps

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up