Когда количество файлов конфигураций для различных программ достаточно разрастается, очевидным решением становится хранение их в отдельном репозитории, чтобы ничего не потерять. Однако с этим возникает другая проблема — если потребовалось внести какие-то изменения в конфиг, то нужно после этого внести их и в соответствующие файлы репозитория.

Такой подход, разумеется, никуда не годится. Хочется иметь единый источник правды в виде репозитория, изменения из которого будут автоматически отражаться на системе. Можно, конечно, вручную насоздавать симлинков на каждый конфигурационный файл, но для этих целей есть инструмент куда удобнее — GNU Stow.

Эта утилита помогает более удобно создавать симлинки, как бы проецируя нужные директории со всей их структурой и файлами в домашнюю, либо другую указанную. И в репозитории с dotfiles для использования stow можно либо полностью воссоздать всю структуру директории .config и одной командой создавать её в домашней директории, либо же для каждого конфига создать свою директорию, например zellij/.config/zellij/, и в таком случае .config можно собирать как конструктор, запуская stow для каждого конфига по отдельности.

Для себя я выбрал второй подход, так как он позволяет гибко собирать конфиг в install.sh скрипте под нужную систему. Вот как это реализовано:

# Common config dirs
packages=("bat" "fzf-git" "yazi" "zellij" "zsh")

if [[ "$OSTYPE" == "darwin"* ]]; then
  packages+=("ghostty-macos")
else
  if [ "$WITH_GUI_INSTALL" = true ]; then
    packages+=("ghostty-arch")
  fi
fi

echo "Is your device a laptop? [y/n]"
read -r is_laptop
if [ "$is_laptop" = "y" ]; then
  packages+=("p10k-laptop")
else
  packages+=("p10k-desktop")
fi

mv ~/.zshrc ~/.zshrc-backup

# Apply configs with stow
for pkg in "${packages[@]}"; do
  stow -R -v -t "$HOME" "$pkg"
done

Также можно сделать удобный алиас, позволяющий, находясь в любой директории, быстро открыть репозиторий со всеми конфигами в Neovim:

# Dark magic of zsh to get absolute path of dotfiles directory
DOTFILES_DIR="${${(%):-%x}:A:h:h}"
alias ndot="cd $DOTFILES_DIR && nvim && cd -"
  • vasthecat
    link
    fedilink
    arrow-up
    2
    ·
    13 days ago

    Я вообще не понимаю зачем ещё и с симлинками возиться… У меня просто bare репа ~/.dotfiles на весь ~, с вот таким gitignore:

    *
    !.gitignore
    !.config
    !.local
    

    Да, чтобы развернуть на новой тачке конфиг надо помнить пару флагов гита. Но после развёртывания есть алиас dot. Тупее подхода к дотфайлам быть не может, но зачем сложнее…

    • mcherniginA
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      11 days ago

      Со Stow ты можешь по сути, в своих дотфайлах хранить несколько конфликтующих конфигов и после клона репозитория симлинкать конкретно те конфиги, которые тебе нужны на этой машине

      • Ëжкин КотOPM
        link
        fedilink
        arrow-up
        1
        ·
        11 days ago

        В моём случае это одна из основных причин его использования, так как конфиг в install.sh должен гибко собираться как под MacOS/Arch, так и под ноутбук/десктоп.