Cet article fait partie d’une longue série en cours d’écriture consacrée à git.

Je suis en train de revoir toutes mes configurations et de les versionner alors je partage la méthode qui est relativement simple mais moyennement connue. Elle ne nécessite pas d’outils particuliers (le seul prérequis étant git) et pas de liens symboliques. Les fichiers sont versionnés, utilisables sur différentes machines. Il est possible d’avoir différentes configurations, il suffit pour cela de travailler sur différentes branches.

Créer son dépôt

On crée notre dépôt vide dans $HOME/.mydotfiles avec l’option --bare car nous n’aurons pas besoin de la copie de travail. On le préfixe d’un point afin qu’il soit caché.

git init --bare $HOME/.mydotfiles.git

Créer un alias de commodité

Ensuite, on ajoute un alias à son ~/.bashrc, son ~/.zshrc, etc. Cet alias va permettre d’agir plus simplement sur le dépôt, quel que soit l’endroit où l’on se trouve. L’alias définit également un work-tree qui pointe sur le dossier $HOME. C’est ce work-tree qui permet de s’affranchir de tous les liens symboliques.

# définition de l'alias dans la session courante
alias mydotfiles='git --git-dir=$HOME/.mydotfiles.git/ --work-tree=$HOME'
# enregistrement de l'alias dans le fichier de configuration du shell afin de pouvoir l'utiliser plus tard
# zshrc
printf "\nalias mydotfiles='git --git-dir=%s/.mydotfiles.git/ --work-tree=%s'\n" "\$HOME" "\$HOME" >> $HOME/.zshrc

# bashrc et bash_profile
printf "\nalias mydotfiles='git --git-dir=%s/.mydotfiles.git/ --work-tree=%s'\n" "\$HOME" "\$HOME" >> $HOME/.bashrc
printf "\nif [ -f ~/.bashrc ]; then\n" >> $HOME/.bash_profile
printf "    source ~/.bashrc\n" >> $HOME/.bash_profile
printf "fi\n" >> $HOME/.bash_profile

Configurer git status pour ne pas afficher les fichiers non suivis

On définit la propriété status.showUntrackedFiles à no. De cette façon, dans le work-tree, on ne verra pas les fichiers qui ne sont pas suivis dans notre dépôt. Le nombre de fichiers peut être très élevé si l’utilisateur en possède beaucoup, notamment sous macOS, où le dossier ~/Library est énorme.

mydotfiles config --local status.showUntrackedFiles no

Notez qu’il est tout de même possible de lister les fichiers non suivis en utilisant la commande suivante :

mydotfiles status -u

Ajouter des fichiers au dépôt

Depuis le répertoire $HOME, on peut ajouter directement des fichiers en utilisant l’alias défini précédemment. Il est important que bashrc et / ou zshrc contiennent l’alias défini plus haut.

mydotfiles add .vimrc
mydotfiles commit -m "Add vimrc"
mydotfiles add .bashrc .bash_profile
mydotfiles commit -m "Add bashrc and sourcing from bash_profile"
mydotfiles add .zshrc
mydotfiles commit -m "Add zshrc"

# ajout du remote pour indiquer où on pousse les commits, mon dépôt github, dans mon cas
mydotfiles remote add origin git@github.com:ardeidae/mydotfiles.git
# on pousse vers le dépôt dans master
mydotfiles push --set-upstream origin master

On pourra utiliser les commandes classiques de git, mais il faudra le faire au moyen de l’alias mydotfiles. Ainsi, on pourra créer des branches, pour des machines différentes, par exemple, utiliser la branche develop pour les phases de test, etc. À vous de décider en fonction de vos besoins.

Déployer la configuration sur une nouvelle machine

Il faut bien sûr disposer de git sur la machine sur laquelle on veut déployer la configuration et le dépôt central devra être joignable depuis la machine en question.

Ensuite, on redéfinit l’alias pour la session courante. Il est inutile de le redéfinir dans bashrc ou zshrc puisqu’il a déjà été commité dans notre dépôt.

# définition de l'alias dans la session courante
alias mydotfiles='git --git-dir=$HOME/.mydotfiles.git/ --work-tree=$HOME'

On clone le dépôt en mode --bare depuis github et on le stocke dans $HOME/.mydotfiles.

git clone --bare git@github.com:ardeidae/mydotfiles.git $HOME/.mydotfiles.git

On désactive l’affichage des fichiers non suivis.

mydotfiles config --local status.showUntrackedFiles no

On fait un checkout de la configuration dans $HOME. On peut le faire depuis n’importe quel répertoire étant donné que l’alias précise que le work-tree se trouve dans $HOME.

mydotfiles checkout master

Si un des fichiers commités est déjà présent dans $HOME, vous verrez apparaitre ce message d’erreur.

mydotfiles checkout master
error: The following untracked working tree files would be overwritten by checkout:
    .bashrc
    .vimrc
    .zshrc
Please move or remove them before you switch branches.
Aborting

Par sécurité, git n’écrasera pas vos fichiers et vous avertira. Vous devrez supprimer ces fichiers après les avoir au préalable sauvegardés avant de relancer le checkout.

mydotfiles checkout master

Si vous voulez tout écraser, vous pouvez ajouter l’option --force.

Voilà, vous connaissez la méthode. Plus qu’à ajouter vos fichiers de configuration dedans et de déployer vos configurations un peu partout…