Conteúdos

Use o git para gerenciar dotfiles

A técnica de versionamento de dotfiles consiste em criar um repositório Git do tipo bare dentro de $HOME, que, ao contrário de um repositório Git padrão, não possui um diretório de trabalho associado. Sendo assim, é necessário definir explicitamente o que o repositório bare deve rastrear. Por fim, é necessário um alias para interagir com esse repositório de forma exclusiva.

Vantagens:

  • Não há necessidade de usar ferramentas externas
  • Não há uso de links simbólicos
  • Os arquivos são rastreados pelo Git
  • É possível usar branches diferentes para computadores diferentes
  • É possível replicar a configuração facilmente em uma nova instalação

Configuração inicial

Para iniciar a configuração do seu repositório bare, execute os seguintes comandos no terminal:

  1. Cria o repositório ~/.dotfiles
1
git init --bare $HOME/.dotfiles
  1. Define o alias dotfiles
1
alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'
  1. Configura o Git para ignorar a $HOME inteira
1
dotfiles config --local status.showUntrackedFiles no
  1. Adiciona o alias no ~/.bashrc
1
echo "alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'" >> $HOME/.bashrc

Depois de executar a configuração inicial, qualquer arquivo dentro da pasta $HOME pode ser versionado através do alias dotfiles com as opções normais do comando git, conforme mostrado abaixo:

1
2
3
4
5
6
dotfiles status
dotfiles add .vimrc
dotfiles commit -m "Add vimrc"
dotfiles add .bashrc
dotfiles commit -m "Add bashrc"
dotfiles push

Configurando repositório remoto

Para configurar o repositório remoto, primeiro crie um repositório no seu Gitlab ou GitHub e siga os passos a seguir, substituindo o <username> pelo seu usuário no remoto.

  1. Adicione o remoto
1
2
dotfiles remote add origin git@gitlab.com:<username>/dotfiles.git
dotfiles remote -v 
  1. Envie os arquivos para o remoto
1
dotfiles push -uf origin main

Instalar os dotfiles em um novo sistema

Primeiro, verifique se o alias foi adicionado ao seu .bashrc ou .zshrc. Certifique-se também de adicionar a pasta onde você irá clonar o repositório no arquivo .gitignore, para evitar problemas de recursão.

1
echo ".dotfiles" >> .gitignore

Agora, clone seus dotfiles em um repositório bare em uma pasta oculta do seu $HOME:

1
git clone --bare <git-repo-url> $HOME/.dotfiles

Defina o alias no escopo do shell atual:

1
alias dotfiles='/usr/bin/git --git-dir=$HOME/.dotfiles/ --work-tree=$HOME'

Faça o checkout do conteúdo real do repositório vazio para o seu $HOME:

1
dotfiles checkout

Nota: O passo anterior pode falhar e retornar uma mensagem de erro:

1
2
3
4
5
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

Isso ocorre porque sua pasta $HOME pode conter alguns arquivos de configurações locais, que serão substituídos pelos do Git. A solução é simples: faça backup dos arquivos se você se importa com eles, ou remova-os. Segue abaixo um possível atalho para mover todos os arquivos incorretos para uma pasta.

1
2
3
mkdir -p .dotfiles-backup && \
dotfiles checkout 2>&1 | grep -e "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .dotfiles-backup/{}

Nota: Se você teve o problema mencionado anteriormente, após mover os arquivos, execute novamente o dotfiles checkout.

Agora defina o valor de showUntrackedFiles como no para este repositório:

1
dotfiles config --local status.showUntrackedFiles no

Pronto, a partir de agora você pode usar o alias definido anteriormente para gerenciar seus dotfiles na sua nova maquina:

1
2
3
4
5
6
dotfiles status
dotfiles add .vimrc
dotfiles commit -m "Add vimrc"
dotfiles add .bashrc
dotfiles commit -m "Add bashrc"
dotfiles push