Skip to content

Tutorial


Выполняйте ежедневные операции#


Используйте размещенное репозиторий для управления файлами точек на нескольких компьютерах#

chezmoi полагается на вашу систему управления версиями и размещенное репозиторий для совместного использования изменений на нескольких компьютерах. Вы должны создать репо в репозитории исходного кода по вашему выбору (например, Bitbucket, GitHubили GitLab, многие люди называют их репо dotfiles) и поместить репо в исходный каталог здесь. Например:

chezmoi cd
git remote add origin https://github.com/${USER}/dotfiles.git
git push -u origin main
exit

На другой машине вы можете проверить это репо:

$ chezmoi init https://github.com/username/dotfiles.git

Затем вы можете увидеть, что будет изменено:

$ chezmoi diff

Если вы довольны изменениями, то примените их:

$ chezmoi apply

Вышеуказанные команды можно объединить в одну команду ввода, проверки и применения:

$ chezmoi init --apply --verbose https://github.com/username/dotfiles.git

Используйте частное репо для хранения ваших dot-файлов #

chezmoi поддерживает хранение ваших dot-файлов как в общедоступных, так и в частных репозиториях.

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

Если вы используете частное репо для своих файлов точек, то вам, как правило, потребуется вводить свои учетные данные (например, имя пользователя и пароль) каждый раз, когда вы взаимодействуете с репо, например, при внесении изменений. сам chezmoi не хранит никаких учетных данных, но вместо этого полагается на локальную конфигурацию git для этих операций.

При использовании частного РЕПО на GitHub при запросе пароля вам потребуется ввести личный токен доступа к GitHub. Для получения дополнительной информации об этих изменениях прочитайте сообщение в блоге GitHub о требованиях к аутентификации по токенам для операций Git


Извлеките последние изменения из своего репо и примените их#

Вы можете извлечь изменения из своего репозитория и применить их в одной команде:

$ chezmoi update

Это выполняется git pull --rebaseв вашем исходном каталоге, а затем chezmoi apply.


Извлеките последние изменения из своего репо и посмотрите, что изменится, фактически не применяя изменения#

Бежать:

$ chezmoi git pull -- --rebase && chezmoi diff

Это выполняется git pull --rebaseв исходном каталоге, а chezmoi diffзатем показывает разницу между целевым состоянием, вычисленным из исходного каталога, и фактическим состоянием.

Если вы довольны изменениями, то можете запустить

$ chezmoi apply

чтобы применить их.


Автоматическая фиксация и внесение изменений в ваше репо#

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

[git]
    autoCommit = true
    autoPush = true

Всякий раз, когда в ваш исходный каталог вносятся изменения, chezmoi фиксирует изменения с помощью автоматически сгенерированного сообщения о фиксации (если autoCommitэто правда) и отправляет их в ваше хранилище (если autoPushэто правда). autoPushподразумевает autoCommit, т. е. если autoPushэто правда, то chezmoi автоматически зафиксирует ваши изменения. Если вы установите только значение autoCommittrue, то изменения будут зафиксированы, но не будут перенесены.

Будьте осторожны при использовании autoPush. Если ваше репо dotfiles является общедоступным и вы случайно добавили секрет в виде обычного текста, этот секрет будет передан в ваше публичное репо.


Установите chezmoi и ваши файлы dot на новую машину с помощью одной команды#

сценарий установки chezmoi может выполняться chezmoi initдля вас, передавая дополнительные аргументы в недавно установленный двоичный файл chezmoi. Если ваше репо dotfiles github.com/<github-username>/dotfilesзатем устанавливает chezmoi, запуск chezmoi initи запуск chezmoi applyможно выполнить в одной строке оболочки:

$ sh -c "$(curl -fsLS git.io/chezmoi)" -- init --apply <github-username>

Если у вашего репозитория dotfiles другое имя dotfilesили если вы размещаете свои dotfiles в другой службе , обратитесь к справочному руководству chezmoi init.

Для настройки временных сред (например, недолговечных контейнеров Linux) вы можете установить chezmoi, установить свои файлы точек, а затем удалить все следы chezmoi, включая исходный каталог и каталог конфигурации chezmoi, с помощью одной команды:

$ sh -c "$(curl -fsLS git.io/chezmoi)" -- init --one-shot <github-username>

Управление различными типами файлов #


Попросите chezmoi создать каталог, но игнорируйте его содержимое#

Если вы хотите, чтобы chezmoi создал каталог, но проигнорировал его содержимое , скажем~/src, сначала запустите:

$ mkdir -p $(chezmoi source-path)/src

Это создает каталог в исходном состоянии, что означает, что chezmoi создаст его (если он еще не существует) при запуске chezmoi apply.

Однако, поскольку это пустой каталог, он будет проигнорирован git. Итак, создайте файл в каталоге в исходном состоянии, который будет виден git (чтобы git не игнорировал каталог), но игнорировался chezmoi (чтобы chezmoi не включал его в целевое состояние):

$ touch $(chezmoi source-path)/src/.keep

chezmoi автоматически создает .keepфайлы, когда вы добавляете пустой каталог с chezmoi add.


Убедитесь, что цель удалена#

Создайте файл с именем .chezmoiremoveв исходном каталоге, содержащий список шаблонов файлов для удаления. chezmoi удалит все, что в целевом каталоге соответствует шаблону. Поскольку эта команда потенциально опасна, вам следует заранее запустить chezmoi в подробном режиме сухого запуска, чтобы посмотреть, что будет удалено:

$ chezmoi apply --dry-run --verbose

.chezmoiremove интерпретируется как шаблон, поэтому вы можете удалять разные файлы на разных компьютерах. Отрицательные совпадения (шаблоны с префиксом a !) или цели, перечисленные в.chezmoiignore, никогда не будут удалены.


Управление частью, но не всем файлом#

по умолчанию chezmoi управляет целыми файлами, но есть два способа управлять только частями файла.

Во-первых, modify_скрипт получает текущее содержимое файла на стандартный ввод, а chezmoi считывает целевое содержимое файла из стандартного вывода скрипта. Это можно использовать для изменения частей файла, например, с помощью sed. Обратите внимание, что если файл не существует, то стандартный ввод в modify_сценарий будет пустым, и сценарий несет ответственность за запись полного файла в стандартный вывод.

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

current-context: {{ output "kubectl" "config" "current-context" | trim }}

Управление разрешениями файла, но не его содержимым #

create_атрибуты chezmoi позволяют вам указать chezmoi на создание файла, если он еще не существует. однако chezmoi будет применять любые изменения разрешений из атрибутовexecutable_,private_, и.readonly_ Это можно использовать для управления разрешениями файла без изменения его содержимого.

Например, если вы хотите убедиться, что ~/.kube/configу вас всегда есть разрешения 600, то, если вы создадите пустой файл с именем dot_kube/private_dot_configв исходном состоянии, chezmoi обеспечит~/.kube/config, чтобы при запуске разрешения были равны 0600chezmoi apply, не изменяя его содержимое.

У этого подхода есть недостаток в том, что chezmoi создаст файл, если он еще не существует. Если вы хотите chezmoi applyустановить права доступа к файлу только в том случае, если он уже существует, и не создавать файл в противном случае, вы можете использовать run_сценарий. Например, создайте файл в исходном состоянии под названием run_set_kube_config_permissions.shсодержащий:

#!/bin/sh

FILE="$HOME/.kube/config"
if [ -f "$FILE" ]; then
    if [ "$(stat -c %a "$FILE")" != "600" ] ; then
        chmod 600 "$FILE"
    fi
fi

chezmoi может получить ваши открытые SSH-ключи с GitHub, что может быть полезно для заполнения вашего ~/.ssh/authorized_keys. Введите следующее в свой ~/.local/share/chezmoi/dot_ssh/authorized_keys.tmpl, где usernameваше имя пользователя на GitHub:

{{ range (gitHubKeys "username") -}}
{{   .Key }}
{{ end -}}

Интегрируйте chezmoi с вашим редактором #


Используйте предпочитаемый вами редактор с chezmoi editиchezmoi edit-config #

По умолчанию chezmoi будет использовать предпочтительный редактор, определенный $VISUAL``$EDITORпеременными среды или, возвращаясь к редактору по умолчанию в зависимости от вашей операционной системы (vi в UNIX-подобных операционных системах, notepad.exeв Windows).

Вы можете настроить chezmoi на использование предпочтительного редактора, либо установив переменную $EDITORсреды, либо установив edit.commandпеременную в файле конфигурации.

Команда редактора должна вернуться только после того, как вы закончите редактирование файлов. chezmoi выдаст предупреждение, если ваша команда редактора вернется слишком быстро.

В конкретном случае использования VSCode или Codium в качестве редактора вы должны передать --waitфлаг, например, в конфигурации оболочки:

$ export EDITOR="code --wait"

Или в файле конфигурации chezmoi:

[edit]
    command = "code"
    args = ["--wait"]

Настройте VIM для запуска chezmoi applyпри каждом сохранении точечного файла #

Поместите следующее в свой.vimrc:

autocmd BufWritePost ~/.local/share/chezmoi/* ! chezmoi apply --source-path "%"

Включите точечные файлы из других источников #


Включите подкаталог из другого репозитория, например Oh My Zsh#

Чтобы включить подкаталог из другого репозитория, например Oh My Zsh, вы не можете использовать подмодули git, потому что chezmoi использует свой собственный формат для исходного состояния, а Oh My Zsh не распространяется в этом формате. Вместо этого вы можете использовать.chezmoiexternal.<format>, чтобы указать chezmoi импортировать файлы точек из внешнего источника.

Например, чтобы импортировать Oh My Zsh, плагин подсветки синтаксисаzsh и powerlevel10k, поместите следующее в~/.local/share/chezmoi/.chezmoiexternal.toml:

[".oh-my-zsh"]
    type = "archive"
    url = "https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz"
    exact = true
    stripComponents = 1
    refreshPeriod = "168h"
[".oh-my-zsh/custom/plugins/zsh-syntax-highlighting"]
    type = "archive"
    url = "https://github.com/zsh-users/zsh-syntax-highlighting/archive/master.tar.gz"
    exact = true
    stripComponents = 1
    refreshPeriod = "168h"
[".oh-my-zsh/custom/themes/powerlevel10k"]
    type = "archive"
    url = "https://github.com/romkatv/powerlevel10k/archive/v1.15.0.tar.gz"
    exact = true
    stripComponents = 1

Чтобы применить изменения, выполните:

$ chezmoi apply

chezmoi загрузит архивы и распакует их, как если бы они были частью исходного состояния. chezmoi кэширует загруженные архивы локально, чтобы избежать их повторной загрузки каждый раз, когда вы выполняете команду chezmoi, и будет загружать их не чаще, чем каждый refreshPeriodраз (по умолчанию никогда).

В приведенном выше примере refreshPeriodустановлено значение 168h(одна неделя) для .oh-my-zshи .oh-my-zsh/custom/plugins/zsh-syntax-highlightingпотому, что URL-адрес указывает на тарболы masterветви, которые меняются со временем. Период обновления не задан.oh-my-zsh/custom/themes/powerlevel10k, поскольку URL-адрес указывает на файл с тегами версии, который со временем не меняется. Чтобы повысить версию powerlevel10k, измените версию в URL-адресе.

Чтобы принудительно обновить загруженные архивы, используйте --refresh-externalsфлаг, чтобыchezmoi apply:

$ chezmoi --refresh-externals apply

--refresh-externals может быть сокращено до-R:

$ chezmoi -R apply

При использовании Oh My Zsh убедитесь, что вы отключили автоматическое обновление, установив DISABLE_AUTO_UPDATE="true"в.~/.zshrc Автоматическое обновление приведет ~/.oh-my-zshк тому, что каталог не будет синхронизирован с исходным состоянием chezmoi. Чтобы обновить Oh My Zsh и его плагины, обновите загруженные архивы.


Включите один файл из другого репозитория#

Включение отдельных файлов использует тот же механизм, что и включение подкаталога выше, за исключением внешнего типа fileвместо archive. Например, чтобы включить plug.vimиз github.com/junegunn/vim-plugв~/.vim/autoload/plug.vim, поместите следующее в~/.local/share/chezmoi/.chezmoiexternals.toml:

[".vim/autoload/plug.vim"]
    type = "file"
    url = "https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim"
    refreshPeriod = "168h"

Обрабатывайте файлы конфигурации, которые были изменены извне #

Некоторые программы изменяют свои файлы конфигурации. При следующем запуске chezmoi applyлюбые изменения , внесенные программой, будут утеряны.

Вы можете отслеживать изменения в этих файлах, заменив их символической ссылкой на файл в исходном каталоге, который находится под контролем версий. Вот рабочий пример для VSCode settings.jsonв Linux:

Скопируйте файл конфигурации в свой исходный каталог:

$ cp ~/.config/Code/User/settings.json $(chezmoi source-path)

Скажите чезмои, чтобы он проигнорировал этот файл:

$ echo settings.json >> $(chezmoi source-path)/.chezmoiignore

Скажите chezmoi, что ~/.config/Code/User/settings.jsonэто должна быть символическая ссылка на файл в вашем исходном каталоге:

$ mkdir -p $(chezmoi source-path)/private_dot_config/private_Code/User
$ echo -n "{{ .chezmoi.sourceDir }}/settings.json" > $(chezmoi source-path)/private_dot_config/private_Code/User/symlink_settings.json.tmpl

Префикс private_используется, потому ~/.config``~/.config/Code что каталоги и по умолчанию являются закрытыми.

Примените изменения:

$ chezmoi apply -v

Теперь, когда программа изменяет свой файл конфигурации, вместо этого она изменит файл в исходном состоянии.


Импорт архивов#

Иногда бывает полезно импортировать целые архивы конфигурации в исходное состояние. importКоманда делает это. Например, для импорта последней версии github.com/ohmyzsh/ohmyzshдля ~/.oh-my-zshзапуска:

$ curl -s -L -o ${TMPDIR}/oh-my-zsh-master.tar.gz https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz
$ mkdir -p $(chezmoi source-path)/dot_oh-my-zsh
$ chezmoi import --strip-components 1 --destination ~/.oh-my-zsh ${TMPDIR}/oh-my-zsh-master.tar.gz

Обратите внимание, что это обновляет только исходное состояние. Вам нужно будет бежать

$ chezmoi apply

чтобы обновить каталог назначения.


Управление различиями между машинами#


Используйте шаблоны#

Основная цель chezmoi-управлять файлами конфигурации на нескольких компьютерах, например, на вашем персональном ноутбуке macOS, рабочем рабочем столе Ubuntu и рабочем ноутбуке Linux. Вы захотите сохранить большую часть конфигурации одинаковой для них, но также вам потребуются конфигурации для конкретных компьютеров для адресов электронной почты, учетных данных и т. Д. chezmoi обеспечивает эту функциональность, используя text/templateдля исходного состояния, где это необходимо.

Например, ваш дом ~/.gitconfigна вашем персональном компьютере может выглядеть так:

[user]
    email = "me@home.org"

В то время как на работе это может быть:

[user]
    email = "firstname.lastname@company.com"

Чтобы справиться с этим, на каждой машине создайте файл конфигурации под названием ~/.config/chezmoi/chezmoi.toml определение переменных, которые могут варьироваться от машины к машине. Например, для вашей домашней машины:

[data]
    email = "me@home.org"

Обратите внимание, что все имена переменных будут преобразованы в нижний регистр. Это связано с особенностью библиотеки, используемой chezmoi.

Если вы собираетесь хранить личные данные (например , токены доступа)~/.config/chezmoi/chezmoi.toml, убедитесь, что у них есть разрешения 0600.

Если вы предпочитаете, вы можете использовать любой формат, поддерживаемый Viper, для вашего файла конфигурации. Это включает в себя JSON, YAML и TOML. Имена переменных должны начинаться с буквы и сопровождаться нулем или более букв или цифр.

Затем добавьте ~/.gitconfigв chezmoi, используя --autotemplateфлаг, чтобы превратить его в шаблон и автоматически определять переменные из dataраздела вашего ~/.config/chezmoi/chezmoi.tomlфайла:

$ chezmoi add --autotemplate ~/.gitconfig

Затем вы можете открыть шаблон (который будет сохранен в файле ~/.local/share/chezmoi/dot_gitconfig.tmpl):

$ chezmoi edit ~/.gitconfig

Файл должен выглядеть примерно так:

[user]
    email = {{ .email | quote }}

Чтобы отключить автоматическое определение переменных, используйте опцию --templateили -T chezmoi addвместо --autotemplate.

Шаблоны часто используются для фиксации различий, характерных для конкретной машины. Например, в вашем ~/.local/share/chezmoi/dot_bashrc.tmplслучае вы могли бы:

# common config
export EDITOR=vi

# machine-specific configuration
{{- if eq .chezmoi.hostname "work-laptop" }}
# this will only be included in ~/.bashrc on work-laptop
{{- end }}

Для получения полного списка переменных выполните:

$ chezmoi data

Для более продвинутого использования вы можете использовать всю мощь text/templateязыка. chezmoi включает в себя все текстовые функции sprig и собственные функции для взаимодействия с менеджерами паролей.

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

$ chezmoi execute-template "{{ .chezmoi.os }}/{{ .chezmoi.arch }}"

Это полезно при разработке или отладке шаблонов.

Некоторые менеджеры паролей позволяют хранить полные файлы. Файлы могут быть извлечены с помощью функций шаблона chezmoi. Например, если у вас есть файл, хранящийся в 1Password с идентификатором UUIDuuid, вы можете получить его с помощью шаблона:

{{- onepasswordDocument "uuid" -}}

Буквы -s в скобках удаляют любые пробелы до или после выражения шаблона, что полезно, если ваш редактор добавил какие-либо новые строки.

Если после выполнения шаблона содержимое файла окажется пустым, целевой файл будет удален. Это может быть использовано для обеспечения того, чтобы файлы присутствовали только на определенных машинах. Если вы все равно хотите создать пустой файл, вам нужно будет указать ему empty_префикс.


Игнорируйте файлы или каталог на разных машинах#

Для более детального управления файлами и целыми каталогами, управляемыми на разных компьютерах, или для полного исключения определенных файлов, вы можете создавать .chezmoiignoreфайлы в исходном каталоге. Они определяют список шаблонов, которые chezmoi следует игнорировать, и интерпретируются как шаблоны. Пример .chezmoiignoreфайла может выглядеть следующим образом:

README.md
{{- if ne .chezmoi.hostname "work-laptop" }}
.work # only manage .work on work-laptop
{{- end }}

Использование ne(не равнозначное) является преднамеренным. Чего мы хотим добиться, так это “ устанавливать только .workпри наличии имени хостаwork-laptop”, но chezmoi устанавливает все по умолчанию, поэтому мы должны изменить логику и вместо этого написать “игнорировать.work если только имя хоста work-laptopне ”.

Шаблоны можно исключить , добавив к ним префикс a!, например:

f*
!foo

будет игнорировать все файлы, начинающиеся с f"кромеfoo".


Используйте совершенно разные файлы точек на разных машинах#

функциональность шаблона chezmoi позволяет изменять содержимое файла на основе любой переменной. Например, если вы хотите ~/.bashrcотличаться в Linux и macOS, вы должны создать файл в исходном состоянии, называемый dot_bashrc.tmplсодержащим:

{{ if eq .chezmoi.os "darwin" -}}
# macOS .bashrc contents
{{ else if eq .chezmoi.os "linux" -}}
# Linux .bashrc contents
{{ end -}}

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

symlink_dot_bashrc.tmpl:

.bashrc_{{ .chezmoi.os }}

dot_bashrc_darwin:

  # macOS .bashrc contents

dot_bashrc_linux:

# Linux .bashrc contents

.chezmoiignore

{{ if ne .chezmoi.os "darwin" }}
.bashrc_darwin
{{ end }}
{{ if ne .chezmoi.os "linux" }}
.bashrc_linux
{{ end }}

Это создаст ~/.bashrcсимволическую ссылку на .bashrc_darwinвкл darwinи .bashrc_linuxвкл linux. .chezmoiignoreКонфигурация гарантирует, что .bashrc_osв каждой операционной системе будет установлен только файл, специфичный для конкретной операционной системы.

Без использования символических ссылок#

То же самое можно сделать с помощью функции включения.

dot_bashrc.tmpl

{{ if eq .chezmoi.os "darwin" }}
{{   include ".bashrc_darwin" }}
{{ end }}
{{ if eq .chezmoi.os "linux" }}
{{   include ".bashrc_linux" }}
{{ end }}

Автоматически создайте файл конфигурации на новой машине #

chezmoi init также можно автоматически создать файл конфигурации, если он еще не существует. Если ваше репозиторий содержит файл с именем.chezmoi.<format>.tmpl, где формат является одним из поддерживаемых форматов файлов конфигурации (напримерjson,toml, илиyaml), то chezmoi initбудет выполнен этот шаблон для создания исходного файла конфигурации.

В частности, если у вас есть .chezmoi.toml.tmplчто-то похожее на это:

{{- $email := promptString "email" -}}
[data]
    email = {{ $email | quote }}

Затем chezmoi initсоздадим инициалchezmoi.toml, используя этот шаблон. promptString это специальная функция, которая запрашивает у пользователя (вас) значение.

Чтобы протестировать этот шаблон, используйте chezmoi execute-templateс флагами --initи--promptString, например:

$ chezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl

Заново создайте свой конфигурационный файл #

Если вы измените шаблон файла конфигурации, chezmoi предупредит вас, если ваш текущий файл конфигурации не был создан на основе этого шаблона. Вы можете повторно сгенерировать свой конфигурационный файл, запустив:

$ chezmoi init

Если вы используете какиеprompt*-либо функции шаблона в шаблоне файла конфигурации , вам будет предложено повторить запрос. Однако этого можно избежать с помощью следующего примера логики шаблона:

{{- $email := "" -}}
{{- if (hasKey . "email") -}}
{{-   $email = .email -}}
{{- else -}}
{{-   $email = promptString "email" -}}
{{- end -}}

[data]
    email = {{ $email | quote }}

Это приведет к тому, что chezmoi сначала попытается повторно использовать существующую $emailпеременную и promptStringвернется к ней, только если она не установлена.


Обрабатывайте разные расположения файлов в разных системах с одинаковым содержимым#

Если вы хотите иметь одинаковое содержимое файла в разных местах в разных системах, но поддерживать только один файл в исходном состоянии, вы можете использовать общий шаблон.

Создайте общий файл в .chezmoitemplatesкаталоге в исходном состоянии. Например, создать .chezmoitemplates/file.conf. Содержимое этого файла доступно в шаблонах с template *name* .функцией, где name-это имя файла (. передает текущие данные в код шаблона file.conf; см. https://pkg.go.dev/text/template#hdr-Actions для получения более подробной информации).

Затем создайте файлы для каждой системы, например Library/Application Support/App/file.conf.tmplдля macOS и dot_config/app/file.conf.tmplLinux. Оба файла шаблона должны содержать {{- template "file.conf" . -}}.

Наконец, попросите chezmoi игнорировать файлы там, где они не нужны, добавив строки в свой .chezmoiignoreфайл, например:

{{ if ne .chezmoi.os "darwin" }}
Library/Application Support/App/file.conf
{{ end }}
{{ if ne .chezmoi.os "linux" }}
.config/app/file.conf
{{ end }}

Создайте архив своих dot-файлов #

chezmoi archive создает архив, содержащий целевое состояние. Это может быть полезно для создания целевого состояния для другой машины. Вы можете указать другой файл конфигурации (включая переменные шаблона) с помощью этой --configопции.


Сохраняйте конфиденциальность данных#

chezmoi автоматически определяет, являются ли файлы и каталоги закрытыми при их добавлении, проверяя их разрешения. Личные файлы и каталоги хранятся в ~/.local/share/chezmoiвиде обычных общедоступных файлов с разрешениями 0644и префиксом имени private_. Например:

$ chezmoi add ~/.netrc

создаст ~/.local/share/chezmoi/private_dot_netrc(при ~/.netrc условии, что он не читается в мире или группе, как это должно быть). Этот файл по - прежнему является закрытым , поскольку ~/.local/share/chezmoiон не доступен для чтения в группах или во всем мире и не является исполняемым. chezmoi проверяет наличие разрешений ~/.local/share/chezmoi``0700на каждый запуск и выводит предупреждение, если это не так.

Как правило, вам необходимо хранить токены доступа в файлах конфигурации, например, токен доступа на GitHub. Существует несколько способов обеспечить безопасность этих токенов и предотвратить их покидание вашей машины.


Используйте 1 пароль#

chezmoi включает поддержку 1Password с использованием интерфейса командной строки 1Password для предоставления данных в качестве функции шаблона.

Войдите в систему и получите сеанс с помощью:

$ eval $(op signin <subdomain>.1password.com <email>)

Вывод op get item <uuid>доступен в качестве функции onepasswordшаблона . chezmoi анализирует выходные данные JSON и возвращает их в виде структурированных данных. Например, если вывод op get item "<uuid>"является:

{
    "uuid": "<uuid>",
    "details": {
        "password": "xxx"
    }
}

Затем вы можете получить доступ details.passwordс помощью синтаксиса:

{{ (onepassword "<uuid>").details.password }}

Поля данных для входа можно получить с помощьюonepasswordDetailsFields функция, например:

{{- (onepasswordDetailsFields "uuid").password.value }}

Документы можно получить с помощью:

{{- onepasswordDocument "uuid" -}}

Обратите внимание на дополнительные -после открытия {{и перед закрытием }}. Это указывает языку шаблонов удалять любые пробелы до и после подстановки. Это удаляет любую завершающую новую строку, добавленную вашим редактором при сохранении шаблона.


Используйте Bitwarden#

chezmoi включает поддержку Bitwarden с использованием интерфейса командной строки Bitwarden для предоставления данных в качестве функции шаблона.

Войдите в Bitwarden с помощью:

$ bw login <bitwarden-email>

Разблокируйте свое хранилище Bitwarden:

$ bw unlock

Установите BW_SESSIONпеременную среды, как указано в инструкции.

Структурированные данные из bw getдоступны в качестве функции bitwardenшаблона в ваших файлах конфигурации, например:

username = {{ (bitwarden "item" "example.com").login.username }}
password = {{ (bitwarden "item" "example.com").login.password }}

Доступ к пользовательским полям можно получить с bitwardenFieldsпомощью функции шаблона. Например, если у вас есть пользовательское поле с именемtoken, вы можете получить его значение с помощью:

{{ (bitwardenFields "item" "example.com").token.value }}

Используйте gopass #

chezmoi включает поддержку gopass с использованием интерфейса командной строки gopass.

Первая строка вывода gopass show <pass-name>доступна в качестве функции gopassшаблона, например:

{{ gopass "<pass-name>" }}

Используйте KeePassXC #

chezmoi включает поддержку KeePassXC с использованием интерфейса командной строки KeePassXC (keepassxc-cli) для предоставления данных в качестве функции шаблона.

Укажите путь к базе данных KeePassXC в файле конфигурации:

[keepassxc]
    database = "/home/user/Passwords.kdbx"

Структурированные данные из keepassxc-cli show $databaseдоступны в качестве функции keepassxcшаблона в ваших файлах конфигурации, например:

username = {{ (keepassxc "example.com").UserName }}
password = {{ (keepassxc "example.com").Password }}

Дополнительные атрибуты доступны через keepassxcAttributeфункцию. Например, если у вас есть запись SSH Keyс вызовом дополнительного атрибута private-key, ее значение доступно как:

{{ keepassxcAttribute "SSH Key" "private-key" }}

Используйте связку ключей или Диспетчер учетных данных Windows #

chezmoi включает поддержку связки ключей (на macOS), связки ключей GNOME (в Linux) и диспетчера учетных данных Windows (в Windows) через zalando/go-keyringбиблиотеку.

Установите значения с помощью:

$ chezmoi secret keyring set --service=<service> --user=<user>
Value: xxxxxxxx

Затем значение может быть использовано в шаблонах с помощью keyringфункции, которая принимает службу и пользователя в качестве аргументов.

Например, сохраните токен доступа GitHub в связке ключей с:

$ chezmoi secret keyring set --service=github --user=<github-username>
Value: xxxxxxxx

а затем включите его в свой ~/.gitconfigфайл с:

[github]
    user = {{ .github.user | quote }}
    token = {{ keyring "github" .github.user | quote }}

Вы можете запросить связку ключей из командной строки:

$ chezmoi secret keyring get --service=github --user=<github-username>

Используйте LastPass #

chezmoi включает поддержку LastPass с использованием интерфейса командной строки LastPass для предоставления данных в качестве функции шаблона.

Войдите в LastPass с помощью:

$ lpass login <lastpass-username>

Проверьте правильность lpassработы, показав данные пароля:

$ lpass show --json <lastpass-entry-id>

где <lastpass-entry-id>находится запись LastPass Спецификация.

Структурированные данные из lpass show --json idдоступны в качестве функции lastpassшаблона. Значением будет массив объектов. Вы можете использовать indexфункцию и .Fieldсинтаксис text/templateязыка для извлечения нужного поля. Например, чтобы извлечь passwordполе из первой записи “GitHub”, используйте:

githubPassword = {{ (index (lastpass "GitHub") 0).password | quote }}

chezmoi автоматически анализирует noteзначение записи Lastpass в виде пар ключ-значение, разделенных двоеточием, поэтому, например, вы можете извлечь закрытый SSH -ключ следующим образом:

{{ (index (lastpass "SSH") 0).note.privateKey }}

Ключи в noteразделе, записанные какCamelCase Words, преобразуются в camelCaseWords.

Если noteзначение не содержит пар ключ-значение, разделенных двоеточием, то вы можете использовать lastpassRawего для получения исходного значения, например:

{{ (index (lastpassRaw "SSH Private Key") 0).note }}

Используйте пропуск #

chezmoi включает поддержку pass с помощью интерфейса командной строки pass.

Первая строка вывода pass show <pass-name>доступна в качестве функции passшаблона, например:

{{ pass "<pass-name>" }}

Используйте Хранилище #

chezmoi включает поддержку хранилища с использованием интерфейса командной строки хранилища для предоставления данных в качестве функции шаблона.

Интерфейс командной строки хранилища должен быть правильно настроен на вашем компьютере, напримерVAULT_ADDR, VAULT_TOKENпеременные среды и должны быть установлены правильно. Убедитесь, что это так, запустив:

$ vault kv get -format=json <key>

Структурированные данные из vault kv get -format=jsonдоступны в видеvault функция шаблона. Вы можете использовать .Fieldсинтаксисtext/template язык для извлечения нужных вам данных. Например:

{{ (vault "<key>").data.data.password }}

Используйте пользовательский менеджер паролей #

Вы можете использовать любой инструмент командной строки, который выводит секреты либо в виде строки, либо в формате JSON. Выберите двоичный secret.commandфайл, указав его в файле конфигурации. Затем вы можете вызвать эту команду с secret``secretJSONпомощью функций шаблона и, которые возвращают исходные данные и данные, декодированные в формате JSON, соответственно. Все вышеперечисленные секретные менеджеры могут быть поддержаны таким образом:

Секретный менеджер

secret.command

Каркас шаблона

1 Пароль

op

{{ secretJSON "get" "item" <id> }}

Битварден

bw

{{ secretJSON "get" <id> }}

Хранилище HashiCorp

vault

{{ secretJSON "kv" "get" "-format=json" <id> }}

Последний проход

lpass

{{ secretJSON "show" "--json" <id> }}

KeePassXC

keepassxc-cli

Невозможно (только интерактивная команда)

проходить

pass

{{ secret "show" <id> }}


Шифруйте целые файлы с помощью gpg#

chezmoi поддерживает шифрование файлов с помощью gpg. Зашифрованные файлы хранятся в исходном состоянии и автоматически расшифровываются при создании целевого состояния или печати содержимого файла chezmoi cat. chezmoi edit будет прозрачно расшифровывать файл перед редактированием и повторно шифровать его впоследствии.


Асимметричное шифрование (с закрытым/открытым ключом) #

Укажите ключ шифрования для использования в файле конфигурации (chezmoi.toml) вместе с gpg.recipientключом:

encryption = "gpg"
[gpg]
    recipient = "..."

Добавьте файлы, которые будут зашифрованы с --encryptпомощью флага, например:

$ chezmoi add --encrypt ~/.ssh/id_rsa

chezmoi зашифрует файл с помощью:

gpg --armor --recipient ${gpg.recipient} --encrypt

и сохраните зашифрованный файл в исходном состоянии. Файл будет автоматически расшифрован при создании целевого состояния.


Симметричное шифрование#

Укажите симметричное шифрование в файле конфигурации:

encryption = "gpg"
[gpg]
    symmetric = true

Добавьте файлы, которые будут зашифрованы с --encryptпомощью флага, например:

$ chezmoi add --encrypt ~/.ssh/id_rsa

chezmoi зашифрует файл с помощью:


Шифруйте целые файлы с возрастом #

chezmoi поддерживает шифрование файлов с возрастом. Зашифрованные файлы хранятся в исходном состоянии и автоматически расшифровываются при создании целевого состояния или печати содержимого файла chezmoi cat. chezmoi edit будет прозрачно расшифровывать файл перед редактированием и повторно шифровать его впоследствии.

Сгенерируйте ключ с помощьюage-keygen:

$ age-keygen -o $HOME/key.txt
Public key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p

Укажите шифрование возраста в файле конфигурации, обязательно указав по крайней мере личность и одного получателя:

encryption = "age"
[age]
    identity = "/home/user/key.txt"
    recipient = "age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p"

Добавьте файлы, которые будут зашифрованы с --encryptпомощью флага, например:

$ chezmoi add --encrypt ~/.ssh/id_rsa

chezmoi поддерживает несколько получателей и файлов получателей, а также несколько удостоверений личности.


Симметричное шифрование#

Чтобы использовать симметричное шифрование age, укажите один идентификатор и включите симметричное шифрование в файле конфигурации, например:

encryption = "age"
[age]
    identity = "~/.ssh/id_rsa"
    symmetric = true

Симметричное шифрование с парольной фразой #

Чтобы использовать симметричное шифрование age с парольной age.passphraseфразой, например, установите значение trueв файле конфигурации:

encryption = "age"
[age]
    passphrase = true

Вам будет предложено ввести кодовую фразу при каждом запуске chezmoi add --encrypt и всякий раз, когда chezmoi потребуется расшифровать файл, например, при запуске chezmoi apply, chezmoi diff, или chezmoi status.


Используйте частный файл конфигурации и переменные шаблона#

Как правило, ~/.config/chezmoi/chezmoi.tomlне регистрируется в системе управления версиями и имеет разрешения 0600. Вы можете хранить токены в качестве значений шаблона в этом dataразделе. Например, если ваш ~/.config/chezmoi/chezmoi.tomlсодержит:

[data.github]
    user = "<github-username>"
    token = "<github-token>"

~/.local/share/chezmoi/private_dot_gitconfig.tmplЗатем вы можете содержать:

{{- if (index . "github") }}
[github]
    user = {{ .github.user | quote }}
    token = {{ .github.token | quote }}
{{- end }}

Любые файлы конфигурации, содержащие токены в виде обычного текста, должны быть закрытыми (разрешения 0600).


Используйте сценарии для выполнения действий#


Понять, как работают сценарии#

chezmoi поддерживает сценарии, которые выполняются при запуске chezmoi apply. Сценарии могут запускаться либо при каждом запуске chezmoi apply, либо только после изменения их содержимого.

В подробном режиме содержимое скрипта будет распечатано перед его выполнением. В режиме сухого запуска сценарий не выполняется.

Сценарии представляют собой любой файл в исходном каталоге с префиксом run_и выполняются в алфавитном порядке. Сценарии, которые следует запускать только в том случае, если они не запускались ранее, имеют префикс run_once_. Сценарии, которые следует запускать всякий раз, когда их содержимое изменяется, имеют run_onchange_префикс.

Сценарии нарушают декларативный подход chezmoi, и поэтому их следует использовать экономно. Любой сценарий должен быть идемпотентным, даже run_once_и run_onchange_сценарии.

Сценарии должны создаваться вручную в исходном каталоге, как правило, путем запускаchezmoi cd, а затем создания файла с run_префиксом. Сценарии выполняются непосредственно с использованием execи должны включать строку shebang или быть исполняемыми двоичными файлами. Нет необходимости устанавливать исполняемый бит в сценарии.

Сценарии с суффиксом .tmplобрабатываются как шаблоны, при этом доступны обычные переменные шаблона. Если после выполнения шаблона результатом является только пробел или пустая строка, то сценарий не выполняется. Это полезно для отключения сценариев.


Установка пакетов со сценариями#

Перейдите в исходный каталог и создайте файл с именемrun_once_install-packages.sh:

$ chezmoi cd
$ $EDITOR run_once_install-packages.sh

В этом файле создайте сценарий установки пакета, например

#!/bin/sh
sudo apt install ripgrep

В следующий раз, когда вы запустите chezmoi applyили chezmoi updateэтот скрипт будет запущен. Поскольку у него есть run_once_префикс, он не будет запущен снова, если его содержимое не изменится, например, если вы добавите дополнительные пакеты для установки.

Этот скрипт также может быть шаблоном. Например, если вы создаете run_once_install-packages.sh.tmplс помощью содержимого:

{{ if eq .chezmoi.os "linux" -}}
#!/bin/sh
sudo apt install ripgrep
{{ else if eq .chezmoi.os "darwin" -}}
#!/bin/sh
brew install ripgrep
{{ end -}}

Это будет установлено ripgrepкак в системах Linux Debian/Ubuntu, так и в macOS.


Запуск сценария при изменении содержимого другого файла#

run_сценарии chezmoi запускаются при каждом запуске chezmoi apply, в то run_once_время как сценарии запускаются только тогда, когда их содержимое изменилось, после выполнения их в виде шаблонов. Это используется для run_once_запуска сценария при изменении содержимого другого файла путем включения контрольной суммы содержимого другого файла в сценарий.

Например, если ваши настройки dconf хранятся dconf.iniв вашем исходном каталоге, вы можете chezmoi applyзагрузить их только тогда, когда содержимое dconf.iniизменилось, добавив следующий сценарий в качествеrun_once_dconf-load.sh.tmpl:

#!/bin/bash

# dconf.ini hash: {{ include "dconf.ini" | sha256sum }}
dconf load / {{ joinPath .chezmoi.sourceDir "dconf.ini" | quote }}

Поскольку сумма SHA256 dconf.iniвключена в комментарий в сценарии, содержимое сценария будет меняться всякий dconf.ini раз, когда изменяется содержимое, поэтому chezmoi будет повторно запускать сценарий всякий раз, когда содержимоеdconf.ini менять.

В этом примере вы также должны добавитьdconf.ini``.chezmoiignore, чтобы chezmoi не создавался dconf.iniв вашем домашнем каталоге.


Используйте chezmoi на macOS#


Используйте brew bundleдля управления своими варами и бочонками#

brew bundleПодкоманда Homebrew позволяет указать список сортов пива и бочек, которые будут установлены. Вы можете интегрировать это с chezmoi, создав run_once_скрипт. Например, создайте файл в исходном каталоге с именемrun_once_before_install-packages-darwin.sh.tmpl, содержащим:

{{- if (eq .chezmoi.os "darwin") -}}
#!/bin/bash

brew bundle --no-lock --file=/dev/stdin <<EOF
brew "git"
cask "google-chrome"
EOF
{{ end -}}

Обратите внимание, что Brewfileон встроен непосредственно в скрипт с помощью документа bash here. chezmoi будет запускать этот скрипт всякий раз, когда его содержимое меняется, т. е. когда вы добавляете или удаляете пиво или бочки.


Используйте chezmoi в Windows#


Обнаружение подсистемы Windows для Linux (WSL) #

WSL можно обнаружить , выполнив поиск строки Microsoftили microsoftв /proc/sys/kernel/osrelease, которая доступна в переменной шаблона.chezmoi.kernel.osrelease, например:

{{ if (eq .chezmoi.os "linux") }}
{{   if (.chezmoi.kernel.osrelease | lower | contains "microsoft") }}
# WSL-specific code
{{   end }}
{{ end }}

Запустите сценарий PowerShell от имени администратора в Windows #

Поместите следующее в начало вашего сценария:

# Self-elevate the script if required
if (-Not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
  if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
    $CommandLine = "-NoExit -File `"" + $MyInvocation.MyCommand.Path + "`" " + $MyInvocation.UnboundArguments
    Start-Process -FilePath PowerShell.exe -Verb Runas -ArgumentList $CommandLine
    Exit
  }
}

Используйте chezmoi с кодовыми пространствами GitHub, кодовыми пространствами Visual Studio или удаленными контейнерами кода Visual Studio #

Ниже предполагается, что вы используете chezmoi 1.8.4 или более поздней версии. Он не работает с более ранними версиями chezmoi.

Вы можете использовать chezmoi для управления файлами точек в кодовых пространствах GitHub, кодовых пространствах Visual Studioи удаленных контейнерах кода Visual Studio.

Для быстрого начала вы можете клонировать chezmoi/dotfilesрепозиторий, который поддерживает кодовые пространства, прямо из коробки.

Рабочий процесс отличается от использования chezmoi на новой машине, в частности:

  • Эти системы автоматически клонируют ваше dotfilesрепо ~/dotfiles, поэтому нет необходимости клонировать ваше репо самостоятельно.
  • Сценарий установки должен быть неинтерактивным.
  • При запуске в кодовом пространстве переменная CODESPACESсреды будет установлена в trueзначение . Вы можете прочитать его значение с envпомощью функции шаблона.

Во-первых, если вы используете шаблон файла конфигурации chezmoi, убедитесь, что он не является интерактивным при запуске в кодовых пространствах, например, .chezmoi.toml.tmplможет содержать:

{{- $codespaces:= env "CODESPACES" | not | not -}}
sourceDir = {{ .chezmoi.sourceDir | quote }}

[data]
    name = "Your name"
    codespaces = {{ $codespaces }}
{{- if $codespaces }}{{/* Codespaces dotfiles setup is non-interactive, so set an email address */}}
    email = "your@email.com"
{{- else }}{{/* Interactive setup, so prompt for an email address */}}
    email = {{ promptString "email" | quote }}
{{- end }}

Это устанавливает переменную codespacesшаблона, поэтому вам не нужно повторять (env "CODESPACES")в своих шаблонах. Он также устанавливает sourceDirконфигурацию --sourceв соответствии с переданным аргументом chezmoi init.

Во-вторых, создайте install.shскрипт, который устанавливает chezmoi и ваши файлы точек:

#!/bin/sh

set -e # -e: exit on error

if [ ! "$(command -v chezmoi)" ]; then
  bin_dir="$HOME/.local/bin"
  chezmoi="$bin_dir/chezmoi"
  if [ "$(command -v curl)" ]; then
    sh -c "$(curl -fsLS https://git.io/chezmoi)" -- -b "$bin_dir"
  elif [ "$(command -v wget)" ]; then
    sh -c "$(wget -qO- https://git.io/chezmoi)" -- -b "$bin_dir"
  else
    echo "To install chezmoi, you must have curl or wget installed." >&2
    exit 1
  fi
else
  chezmoi=chezmoi
fi

# POSIX way to get script's dir: https://stackoverflow.com/a/29834779/12156188
script_dir="$(cd -P -- "$(dirname -- "$(command -v -- "$0")")" && pwd -P)"
# exec: replace current process with chezmoi init
exec "$chezmoi" init --apply "--source=$script_dir"

Убедитесь, что этот файл является исполняемым (chmod a+x install.sh), и добавьте install.sh в ваше .chezmoiignoreдосье.

При необходимости он устанавливает последнюю версию chezmoi~/.local/bin, а затем chezmoi init ...вызывает chezmoi, чтобы создать файл конфигурации и инициализировать ваши файлы точек. --apply говорит чезмою немедленно применить изменения и --source=...сообщает чезмою, где найти клонированное dotfilesрепозитарие, которое в данном случае является той же папкой, из которой выполняется сценарий.

Если вы не используете шаблон файла конфигурации chez moi, вы можете использовать chezmoi apply --source=$HOME/dotfilesего вместо chezmoi init ...in install.sh.

Наконец, измените любой из ваших шаблонов, чтобы codespacesпри необходимости использовать переменную. Например, для установки vim-gtkв Linux, но не в кодовых пространствах, вы run_once_install-packages.sh.tmplможете содержать:

{{- if (and (eq .chezmoi.os "linux") (not .codespaces)) -}}
#!/bin/sh
sudo apt install -y vim-gtk
{{- end -}}

Настройка chezmoi #


Не показывайте сценарии в выходных данных diff#

По умолчанию chezmoi diffбудут показаны все изменения, включая содержимое сценариев, которые будут запущены. Вы можете исключить сценарии из выходных данных diff, установив переменную diff.excludeконфигурации в файле конфигурации, например:

[diff]
    exclude = ["scripts"]

Вы можете изменить формат diff и/или передать вывод на пейджер по вашему выбору, установив diff.pagerпеременную конфигурации. Например, для использования diff-so-fancyукажите:

[diff]
    pager = "diff-so-fancy"

Пейджер можно отключить с помощью --no-pagerфлага или установив diff.pager пустую строку.


Используйте пользовательский инструмент различий#

По умолчанию chezmoi использует встроенное различие. Вы можете использовать пользовательский инструмент, установив diff.command``diff.argsпеременные и конфигурации. Элементы diff.argsинтерпретируются как шаблоны с переменными .Destinationи .Targetсодержат имена файлов файла в состоянии назначения и целевом состоянии соответственно. Например, чтобы использовать meld, укажите:

[diff]
    command = "meld"
    args = ["--diff", "{{ .Destination }}", "{{ .Target }}"]

Используйте пользовательский инструмент слияния #

По умолчанию chezmoi использует vimdiff. Вы можете использовать пользовательский инструмент, установив merge.command``merge.argsпеременные и конфигурации. Элементы merge.argsинтерпретируются как шаблоны с переменными.Destination``.Source, и .Targetсодержат имена файлов файла в состоянии назначения, исходном состоянии и целевом состоянии соответственно. Например, чтобы использовать режим различийneovim, укажите:

[merge]
    command = "nvim"
    args = ["-d", "{{ .Destination }}", "{{ .Source }}", "{{ .Target }}"]

Переход на chezmoi из другого менеджера dotfile #


Миграция из диспетчера точечных файлов, использующего символические ссылки#

Многие менеджеры файлов точек заменяют файлы точек символическими ссылками на файлы в общем каталоге. Если у вас chezmoi addтакая символическая ссылка, chezmoi добавит символическую ссылку, а не файл. Чтобы помочь с переходом с систем, основанных на символических ссылках , используйте --followопциюchezmoi add, например:

$ chezmoi add --follow ~/.bashrc

Это покажетchezmoi add, что целевое состояние ~/.bashrcявляется целью ~/.bashrcсимволической ссылки, а не самой символической ссылкой. Когда ты бежишь chezmoi apply, chezmoi заменит ~/.bashrcсимволическую ссылку содержимым файла.


Мигрируйте подальше от чезмои#

chezmoi предоставляет несколько механизмов, которые помогут вам перейти к альтернативному менеджеру dotfile (или даже вообще не использовать менеджер dotfile) в будущем:

  • chezmoi создает ваши файлы точек так же, как если бы вы вообще не использовали менеджер файлов точек. Ваши точечные файлы-это обычные файлы, каталоги и символические ссылки. Вы можете запуститьchezmoi purge, чтобы удалить все следы chezmoi, а затем, если вы переходите на новый менеджер файлов точек, вы можете использовать любой механизм, который он предоставляет, для добавления ваших файлов точек в вашу новую систему.
  • У chezmoi есть chezmoi archiveкоманда, которая генерирует tar-файл ваших точечных файлов. Вы можете заменить содержимое вашего репозитория dotfiles содержимым архива, и вы фактически сразу же перешли из chezmoi.
  • У chezmoi есть chezmoi dumpкоманда, которая выводит интерпретируемое (целевое) состояние в машиночитаемую форму, поэтому вы можете писать сценарии вокруг chezmoi. ###### tags: []
Back to top