Regrouper ses fichiers de settings avec stow


Sous Linux, le dossier utilisateur est blindé de fichiers de configuration. Les fameux .machins. Par exemple le .bashrc pour la config du bash, le .mozilla qui contient toutes vos données Firefox, le .ssh avec toutes vos clés privées, le .local/share/virtualenvs avec les envs virtuels Python créés par pew ou .config/sublime-text-3 pour la configuration de Sublime text, etc.

Au final, voici tous les fichiers de conf qui sont importants pour moi de près ou de loin:

├── .autoenv
├── .bashrc
├── .config
│   ├── autostart
│   ├── Code
│   ├── copyq
│   ├── fish
│   ├── gtg
│   ├── liferea
│   ├── pulse
│   ├── stremio
│   ├── sublime-text-3
│   ├── transmission
│   ├── user-dirs.dirs
│   ├── user-dirs.locale
│   ├── variety
│   ├── VeraCrypt
│   ├── Zeal
│   └── zim
├── .django-completion.bash
├── .editorconfig
├── .git-aware-prompt
├── .git-completion.bash
├── .gitconfig
├── .gitignore
├── .git-prompt.sh
├── .git.scmbrc
├── .jupyter
├── .lastpass
├── .liferea_1.8
├── .local
│   └── share
        ├── gtg
        ├── keyrings
        ├── liferea
        ├── omf
        ├── TowerFall
        ├── virtualenvs
        └── Zeal
├── .mozilla
├── .netrc
├── .oh-my-zsh
├── .openambit
├── .pypirc
├── .scmbrc
├── .scm_breeze
├── .sshplus
├── .vscode
│   └── extensions
└── .zshrc

Quand on bidouille, on les change souvent. On les backup aussi, pour pouvoir les porter d’un laptop à un autre, les synchroniser, les uploader sur un serveur ou les récup lors d’une réinstallation. Parce que quand on a tuné ses terminaux et éditeurs aux petits oignons, on a pas envie de recommencer à poil.

Pour bien faciliter les choses, ils sont éparpillés un peu partout, dans des sous-dossiers différents.

Et je sais pas quel vil individu a suggéré une fois que faire une partition séparée pour /home était la solution de Skippy à tous les soucis, mais perso, ça me cause plus de bugs qu’autre chose quand on change de versions d’OS.

Bref, laissez tomber vos vieilles croyances issues de charlatans de sectes. Moi, j’ai vu la lumière (lien de don bitcoin en bas à droite de la page), et elle s’appelle GNU stow.

Stow est un vieil utilitaire (donc sagesse millénaire des anciens, vous pouvez avoir confiance, prenez ce cristal aussi il est en promo), qui est grosso merdo un ln -s récursive. C’est-à-dire que ça fait des symlinks des fichiers et des dossiers que vous lui passez.

On peut l’utiliser pour plein de choses, mais l’usage sacré implique le sacrifice d’une vierge à Max, puis de déplacer tous les fichiers de settings qu’on souhaite gérer dans un seul dossier.

Par exemple, moi j’ai:

/home/user/church/settings/

    ├── .autoenv
    ├── .bashrc
    ├── .config
    │   ├── autostart
    │   ├── Code
    │   ├── copyq
    │   ├── fish
    │   ├── gtg
    ...

Au lieu de les avoir éparpillées partout, toutes les brebis sont maintenant regroupées dans une seule église.

Il est très important de garder l’organisation des dossiers et des sous-dossiers d’origine. Ici vous voyez que j’ai le dossier Code, qui est le dossier de settings de VSCode. Mais il est DANS un dossier .config, car avant mon regroupement il était dans /home/user/.config/.

En revanche, il n’est pas du tout nécessaire que .config contienne tous les dossiers qu’il avait précédemment. Seuls ceux qui vous intéressent. Le reste peut rester à sa place initiale, dans le /home/user/.config/.

Donc je résume:

  • Listez les fichiers et dossiers de settings qui vous intéressent.
  • Déplacez les tous dans un dossier commun en gardant une arborescence similaire.
  • Laissez les fichiers qui ne vous intéressent pas là où ils sont.
  • Priez (une bonne pratique avant toute opération informatique).

Arrive le messie, Stow.

D’abord, il faut l’installer, mais comme c’est un outil vénérable, il est dans les dépôts. Sous Ubuntu, le psaume “apt install stow” fera l’affaire.

Ensuite, on prêche. Je me perds dans mes propres paraboles, mais les voies du seigneur sont impénétrables, contrairement à celles d’Abella Anderson. Bref on demande à stow de traiter récursivement tout le contenu du dossier settings qui est dans /home/user/church afin de le linker vers /home/user/:

stow -d /home/user/church -t /home/user/ settings

Stow va prendre récursivement tous les dossiers qui sont dans /home/user/church/settings, et les comparer à ceux dans /home/user. Si ils existent, il va ne rien faire, mais si ils n’existent pas, il va créer un lien vers chacun de ceux manquants. Pour les fichiers, si ils n’existent pas, il va créer un lien, sinon il va vous afficher une erreur, afin de ne pas écraser quelque chose d’important et vous signalez qu’il y un souci.

Le but de tout ça ?

Pour votre système et tous vos logiciels, ça ne change rien. Ils vont tomber sur les liens et avoir l’impression que tous les fichiers de configs sont à leur place et vont continuer à fonctionner dans la joie et le gospel.

Et pour vous, ben vous avez un seul endroit où tous les fichiers importants sont regroupés. Plus besoin de les chercher. Facile à backuper et à restaurer. On peut même tout foutre sous Git.

Loué soit le sauveur.

Vive moi.

15 thoughts on “Regrouper ses fichiers de settings avec stow

  • foxmask

    Yeah maaaan, amen !

    tjs rien à dire sur l’article c’est tjs pareil

    ahhh si , l’image d’illustration est EXCELLENTE !

  • Brice

    Et quand tu passes sur une nouvelle machine, faut quand même supprimer à la main les fichiers de conf d’origine du coup, ou y’a moyen de faire un forçage (suppression du fichier dans ~ et création du ls) ou de l’interactif ? (désolé, j’ai eu la flemme de chercher le man).

  • François

    Toujours un vrai plaisir de parcourir ta prose, cher Max. Vénération éternelle au grand Guru. Ton humble disciple François

  • fpp

    Ah, et c’est maintenant que tu dis ça, alors que je viens juste de me faire ch**r à transférer douze brouettes de dotfiles d’un portable à l’autre ?! Grrrrr… :-)

    Non mais sérieux, c’est aussi simple que génial que totalement méconnu, merci !!

  • Sam Post author

    @foxmask: yo foxi. J’ai entendu des gens parler de trigger happy ce mois-ci :)

    @Brice: je suis comme toi j’ai la flemme de man

    @François: c’est sam mais je ferai suivre :)

    @fpp: oui je comprends pas qu’on en parle pas plus.

    @Anne Onyme \o/

  • mothsart

    He,j, je ne connaissais pas!

    Perso, j’ai gité mon .config avec le gitignore qui va bien.

    Tous les trucs hors du .config, je les ai déplacé à la main + un script deploy.sh qui s’occupe de créer les liens.

    Créer le script m’a mis quelques heures tout cumulé pour des années de loyaux services et c’est, à mon sens, plus rapide à déployer et étendre que ce que je vois de stow.

    J’imagine que tu dois refaire la manip pour chaque nouvelle machine ? alors que je fais uniquement ceci : cd ~/.config && git clone masuperconfig.git && ./deploy.sh

    Parce que avec stow, quand tu finis par adopter après coup un nouvel outil et son fichier de config, tu fais comment pour que toutes tes machines en profite rapidement?

    Dans mon cas, ma backup mensuel m’indique que j’ai des nouveaux fichiers de conf (si il sont dans .config, ce qui est vrai dans 90% des cas), sinon, je les plug à la main.

    Dans le cas de stow, il se passe quoi : t’es soit obligé de refaire la manip de synchro en entier, soit de linker les trucs en plus à la main… c’est donc au final, plus long, non ?

    Enfin, ce qui me pèse le plus n’est pas la config en elle-même mais bien les dépendances correspondantes!

    ex :

    – cette config ne fonctionne bien que dans tmux >= version.

    – ce bundle VIM, non présent dans les dépôts, a été installé via un wget mais je m’en souvenais plus…

    Bref, j’ai presque résolu les choses en étendant mon script pour qu’il installe les dépendances tradionnelles via un sources.list + packages.list (ça reste ubuntu exclusive) et l’exotique à l’arrache (pip install, cargo install, npm prout, wget etc.)

  • mothsart

    Que tu git le dossier church, je conçois bien : t’as tous tes fichiers de conf au même endroit, ok.

    Mais imaginons, tu veux la déployer sur une nouvelle machine flambant neuve : Tu clones ta conf dans ton dépôt dans /home/user je suppose.

    Et du coup, tu peux pas rajouter, éditer de fichiers de ton nouveau poste… bref, git te sert plus que pour du pull.

  • mothsart

    Désolé, mais y’a pour moi toujours des trous dans la manip de a-z d’un partage d’une config d’un poste à un autre.

    Parce que, de ce que j’en comprend : autant faire un git directement dans ton /home/user avec des règles d’exclusion dans ton .gitignore (déjà tous les dossiers/fichiers qui ne commence pas par “.”).

    Ca évite de la gymnastique pour rien.

    Stow reprend la config de ton /home/user pour les rassembler dans un autre dossier avec la même arborescence : pour moi, c’est un non-sens : elles sont justement pas éparpillés, elles sont déjà toute au même endroit.

  • Fred

    Article sympa, outil sympa.

    Ceci dit, moi j’ai une partition dédiée pour /home et je n’ai jamais eu de souci de portabilité. Tiens hier j’ai installé une Xubuntu64 bits. Ensuite j’ai récupéré mon home depuis mon autre xubuntu et ça a fonctionné nickel…

  • Rififi

    Article vraiment très sympa et très utile. J’ai deux machines, une à la maison et une au boulot, j’ai les mêmes programmes installés et c’est très ennuyeux de faire une conf aux petits oignons sur une machine et de ne pas l’avoir sur l’autre.

    Du coup j’ai mis le dossier church/settings dans mon dossier Dropbox et j’ai toutes mes confs synchronisées. Vraiment très cool.

    Je me pose une question par contre: est-ce que c’est possible de faire ça pour des programmes comme Firefox ? Qu’est ce qu’il se passerait si Firefox sur une machine modifie des fichiers synchronisés via Dropbox, ouverts en même temps sur une autre machine par Firefox ?

  • Sam Post author

    Je me pose une question par contre: est-ce que c’est possible de faire ça pour des programmes comme Firefox ? Qu’est ce qu’il se passerait si Firefox sur une machine modifie des fichiers synchronisés via Dropbox, ouverts en même temps sur une autre machine par Firefox ?

    Mauvaise idée car y a des bases de données sqlite la dedans qui vont pas apprécier.

    Mieux vaut utiliser firefox sync.

  • thierrybo

    Bonjour,

    il y a plus simple pour “raccourcir” la commande :

    Mettre tout dans ~/stow/settings/ à la place de ~/settings/

    cd ~/stow/

    stow settings

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.