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 dogit
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 comonã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:
Material relacionado
Como mover um Repositório do Git completo
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
comono
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.