Featured image of post Chezmoi: элегантное управление dot-файлами в Linux и Windows

Chezmoi: элегантное управление dot-файлами в Linux и Windows

Как безопасно и удобно синхронизировать пользовательские конфиги между разными ОС с помощью chezmoi, шаблонов Go и Git.

Управление конфигурационными файлами (dotfiles) на нескольких машинах рано или поздно превращается в хаос. Обычный Git-репозиторий в домашней директории быстро замусоривается, симлинки ломаются на Windows, а хранить в открытом доступе токены или имена пользователей крайне небезопасно.

Решением этой проблемы стал chezmoi — современный менеджер dotfiles, написанный на Go. Он позволяет безопасно и системно управлять настройками в Linux, WSL и Windows.


🚀 В чём преимущество Chezmoi?

В отличие от традиционного подхода с симлинками, chezmoi хранит целевые конфиги в отдельной директории (по умолчанию ~/.local/share/chezmoi) и применит изменения в реальную систему только по вашей команде.

  • Кроссплатформенность: Одинаково эффективно работает в Unix-подобных системах, WSL и Windows.
  • Шаблонизация на базе Go Templates: Позволяет динамически подставлять переменные (имя пользователя, hostname, email) в зависимости от текущего хоста.
  • Безопасность: Нативная поддержка шифрования секретных данных через age или GnuPG.
  • Автоматизация: Возможность выполнения run_once_ скриптов установки пакетов при первом развертывании системы.

📦 Структура и организация dotfiles

Пример структуры репозитория dotfiles, управляемого chezmoi:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
dotfiles/
├── .chezmoi.toml.tmpl                     # Шаблон конфигурации chezmoi
├── .chezmoiignore                         # Игнорируемые файлы и директории
├── dot_bashrc                             # Превратится в ~/.bashrc
├── dot_gitconfig.tmpl                     # Шаблон ~/.gitconfig с переменными
├── private_dot_config/                    # Превратится в ~/.config/
│   ├── helix/                             # Конфигурация редактора Helix
│   ├── starship/                          # Настройки промпта Starship
│   └── wezterm/                           # Кроссплатформенный терминал WezTerm
├── run_once_after_10-base-packages.sh.tmpl   # Установка CLI-пакетов (Linux/WSL)
└── run_once_after_20-windows-packages.ps1.tmpl # Установка пакетов (Windows)
Именование файлов

Префиксы в именах файлов chezmoi указывают на их атрибуты в целевой системе: dot_ превращается в точку (.bashrc), private_ создает приватную папку (chmod 700), а .tmpl включает генератор шаблонов.


⚡ Быстрый старт и инициализация

Linux / WSL

  1. Установка утилиты:

    1
    2
    
    sh -c "$(curl -fsLS get.chezmoi.io)" -- -b ~/.local/bin
    export PATH="$HOME/.local/bin:$PATH"
    
  2. Инициализация из репозитория GitHub:

    1
    
    chezmoi init --apply <ваш-username>
    

Windows

В Windows удобнее всего использовать менеджер пакетов Scoop:

1
2
3
4
5
6
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned -Force
iwr -useb get.scoop.sh | iex
scoop install main/chezmoi git gh

# Инициализация конфигурации в Git Bash:
chezmoi init --apply <ваш-username>

🔄 Шпаргалка по ежедневным командам

КомандаОписание
chezmoi edit ~/.bashrcОткрыть файл в редакторе по умолчанию.
chezmoi diffПоказать различия между репозиторием и текущей $HOME.
chezmoi apply -vПрименить изменения из исходников к рабочей системе.
chezmoi updateПодтянуть изменения из Git и сразу применить их.
chezmoi add ~/.config/helix/Добавить новую директорию под управление chezmoi.
chezmoi cdПерейти в локальную рабочую директорию chezmoi.

📊 Использование шаблонов (Templates)

Благодаря шаблонам Go вы можете использовать единый dot_gitconfig.tmpl для всех своих устройств:

1
2
3
[user]
    name = {{ .name }}
    email = {{ .email }}

Переменные считываются из вашего персонального файла .chezmoi.toml или вводятся через интерактивный промпт при инициализации.

Внимание при работе со скриптами

Скрипты с префиксом run_once_ запускаются автоматически только один раз. Перед их применением всегда проверяйте сгенерированный код командой chezmoi execute-template < <file>.

На Windows для исключения случайно запущенных Bash-скриптов рекомендую выполнять компиляцию с параметром: chezmoi apply --exclude=scripts.


📚 Источники и ссылки

Создано при помощи Hugo
Тема Stack, дизайн Jimmy