From cc981300548712a4ec5f14c864f375d032e1e4a1 Mon Sep 17 00:00:00 2001 From: <> Date: Tue, 28 Jan 2025 03:59:16 +0000 Subject: [PATCH] Deployed 500c677cc with MkDocs version: 1.6.1 --- 404.html | 23 + __pycache__/hooks.cpython-310.pyc | Bin 2119 -> 2119 bytes comparison-table/index.html | 23 + developer-guide/architecture/index.html | 23 + .../building-on-top-of-chezmoi/index.html | 23 + .../contributing-changes/index.html | 23 + developer-guide/index.html | 23 + developer-guide/install-script/index.html | 23 + developer-guide/packaging/index.html | 23 + developer-guide/releases/index.html | 23 + developer-guide/security/index.html | 23 + developer-guide/testing/index.html | 23 + developer-guide/using-make/index.html | 23 + developer-guide/website/index.html | 23 + index.html | 25 +- install/index.html | 199 +- license/index.html | 23 + links/articles/index.html | 41 + links/dotfile-repos/index.html | 23 + links/podcasts/index.html | 23 + links/related-software/index.html | 23 + links/social-media/index.html | 23 + links/videos/index.html | 23 + .../index.html | 23 + quick-start/index.html | 7 + reference/application-order/index.html | 23 + .../command-line-flags/common/index.html | 23 + .../command-line-flags/developer/index.html | 23 + .../command-line-flags/global/index.html | 23 + reference/command-line-flags/index.html | 23 + reference/commands/add/index.html | 23 + reference/commands/age/index.html | 23 + reference/commands/apply/index.html | 23 + reference/commands/archive/index.html | 23 + reference/commands/cat-config/index.html | 23 + reference/commands/cat/index.html | 23 + reference/commands/cd/index.html | 23 + reference/commands/chattr/index.html | 23 + reference/commands/completion/index.html | 23 + reference/commands/data/index.html | 23 + reference/commands/decrypt/index.html | 23 + reference/commands/destroy/index.html | 23 + reference/commands/diff/index.html | 23 + reference/commands/doctor/index.html | 23 + reference/commands/dump-config/index.html | 23 + reference/commands/dump/index.html | 23 + .../commands/edit-config-template/index.html | 23 + reference/commands/edit-config/index.html | 23 + reference/commands/edit/index.html | 23 + reference/commands/encrypt/index.html | 23 + .../commands/execute-template/index.html | 23 + reference/commands/forget/index.html | 23 + reference/commands/generate/index.html | 23 + reference/commands/git/index.html | 23 + reference/commands/help/index.html | 23 + reference/commands/ignored/index.html | 23 + reference/commands/import/index.html | 23 + reference/commands/index.html | 23 + reference/commands/init/index.html | 23 + reference/commands/license/index.html | 23 + reference/commands/list/index.html | 23 + reference/commands/manage/index.html | 23 + reference/commands/managed/index.html | 23 + reference/commands/merge-all/index.html | 23 + reference/commands/merge/index.html | 23 + reference/commands/purge/index.html | 23 + reference/commands/re-add/index.html | 23 + reference/commands/remove/index.html | 23 + reference/commands/rm/index.html | 23 + reference/commands/secret/index.html | 23 + reference/commands/source-path/index.html | 23 + reference/commands/state/index.html | 23 + reference/commands/status/index.html | 23 + reference/commands/target-path/index.html | 23 + reference/commands/unmanage/index.html | 23 + reference/commands/unmanaged/index.html | 23 + reference/commands/update/index.html | 23 + reference/commands/upgrade/index.html | 23 + reference/commands/verify/index.html | 23 + reference/concepts/index.html | 23 + .../configuration-file/editor/index.html | 23 + reference/configuration-file/hooks/index.html | 35 +- reference/configuration-file/index.html | 23 + .../interpreters/index.html | 23 + .../configuration-file/pinentry/index.html | 23 + .../configuration-file/textconv/index.html | 23 + reference/configuration-file/umask/index.html | 23 + .../configuration-file/variables/index.html | 23 + .../configuration-file/warnings/index.html | 23 + reference/index.html | 23 + reference/plugins/index.html | 23 + reference/release-history/index.html | 64 +- reference/source-state-attributes/index.html | 23 + .../chezmoidata/index.html | 23 + .../chezmoiexternals/index.html | 23 + .../chezmoiscripts/index.html | 23 + .../chezmoitemplates/index.html | 23 + reference/special-directories/index.html | 23 + .../chezmoi-format-tmpl/index.html | 23 + .../chezmoidata-format/index.html | 23 + .../chezmoiexternal-format/index.html | 23 + .../special-files/chezmoiignore/index.html | 23 + .../special-files/chezmoiremove/index.html | 23 + .../special-files/chezmoiroot/index.html | 23 + .../special-files/chezmoiversion/index.html | 23 + reference/special-files/index.html | 23 + reference/target-types/index.html | 23 + .../templates/1password-functions/index.html | 23 + .../onepassword/index.html | 23 + .../onepasswordDetailsFields/index.html | 23 + .../onepasswordDocument/index.html | 23 + .../onepasswordItemFields/index.html | 23 + .../onepasswordRead/index.html | 23 + .../1password-sdk-functions/index.html | 23 + .../onepasswordSDKItemsGet/index.html | 23 + .../onepasswordSDKSecretsResolve/index.html | 23 + .../awsSecretsManager/index.html | 23 + .../awsSecretsManagerRaw/index.html | 23 + .../aws-secrets-manager-functions/index.html | 23 + .../azureKeyVault/index.html | 23 + .../bitwarden-functions/bitwarden/index.html | 23 + .../bitwardenAttachment/index.html | 23 + .../bitwardenAttachmentByRef/index.html | 23 + .../bitwardenFields/index.html | 23 + .../bitwardenSecrets/index.html | 23 + .../templates/bitwarden-functions/index.html | 23 + .../bitwarden-functions/rbw/index.html | 23 + .../bitwarden-functions/rbwFields/index.html | 23 + .../dashlaneNote/index.html | 23 + .../dashlanePassword/index.html | 23 + .../templates/dashlane-functions/index.html | 23 + reference/templates/directives/index.html | 23 + .../doppler-functions/doppler/index.html | 23 + .../dopplerProjectJson/index.html | 23 + .../templates/doppler-functions/index.html | 23 + .../ejson-functions/ejsonDecrypt/index.html | 23 + .../ejsonDecryptWithKey/index.html | 23 + .../templates/ejson-functions/index.html | 23 + .../templates/functions/comment/index.html | 23 + .../templates/functions/completion/index.html | 23 + .../templates/functions/decrypt/index.html | 23 + .../functions/deleteValueAtPath/index.html | 23 + .../templates/functions/encrypt/index.html | 23 + .../templates/functions/eqFold/index.html | 23 + .../functions/findExecutable/index.html | 23 + .../functions/findOneExecutable/index.html | 23 + .../templates/functions/fromIni/index.html | 23 + .../templates/functions/fromJson/index.html | 23 + .../templates/functions/fromJsonc/index.html | 23 + .../templates/functions/fromToml/index.html | 23 + .../templates/functions/fromYaml/index.html | 23 + reference/templates/functions/glob/index.html | 23 + .../templates/functions/hexDecode/index.html | 23 + .../templates/functions/hexEncode/index.html | 23 + .../templates/functions/include/index.html | 23 + .../functions/includeTemplate/index.html | 23 + reference/templates/functions/index.html | 23 + .../templates/functions/ioreg/index.html | 23 + .../functions/isExecutable/index.html | 23 + .../templates/functions/joinPath/index.html | 23 + reference/templates/functions/jq/index.html | 23 + .../templates/functions/lookPath/index.html | 23 + .../templates/functions/lstat/index.html | 23 + .../functions/mozillaInstallHash/index.html | 23 + .../templates/functions/output/index.html | 23 + .../functions/pruneEmptyDicts/index.html | 25 +- .../templates/functions/quoteList/index.html | 23 + .../functions/replaceAllRegex/index.html | 23 + .../functions/setValueAtPath/index.html | 23 + reference/templates/functions/stat/index.html | 23 + .../templates/functions/toIni/index.html | 23 + .../functions/toPrettyJson/index.html | 23 + .../templates/functions/toToml/index.html | 23 + .../templates/functions/toYaml/index.html | 25 +- .../templates/functions/warnf/index.html | 8613 +++++++++++++++++ .../github-functions/gitHubKeys/index.html | 23 + .../gitHubLatestRelease/index.html | 23 + .../gitHubLatestReleaseAssetURL/index.html | 23 + .../gitHubLatestTag/index.html | 23 + .../github-functions/gitHubRelease/index.html | 23 + .../gitHubReleaseAssetURL/index.html | 23 + .../gitHubReleases/index.html | 23 + .../github-functions/gitHubTags/index.html | 23 + .../templates/github-functions/index.html | 25 +- .../gopass-functions/gopass/index.html | 23 + .../gopass-functions/gopassRaw/index.html | 23 + .../templates/gopass-functions/index.html | 23 + .../hcpVaultSecret/index.html | 23 + .../hcpVaultSecretJson/index.html | 23 + .../hcp-vault-secrets-functions/index.html | 23 + reference/templates/index.html | 23 + .../templates/init-functions/exit/index.html | 23 + reference/templates/init-functions/index.html | 23 + .../init-functions/promptBool/index.html | 23 + .../init-functions/promptBoolOnce/index.html | 23 + .../init-functions/promptChoice/index.html | 23 + .../promptChoiceOnce/index.html | 23 + .../init-functions/promptInt/index.html | 23 + .../init-functions/promptIntOnce/index.html | 23 + .../init-functions/promptString/index.html | 23 + .../promptStringOnce/index.html | 23 + .../init-functions/stdinIsATTY/index.html | 23 + .../init-functions/writeToStdout/index.html | 23 + .../templates/keepassxc-functions/index.html | 23 + .../keepassxc-functions/keepassxc/index.html | 23 + .../keepassxcAttachment/index.html | 23 + .../keepassxcAttribute/index.html | 23 + .../templates/keeper-functions/index.html | 23 + .../keeper-functions/keeper/index.html | 23 + .../keeperDataFields/index.html | 23 + .../keeperFindPassword/index.html | 23 + .../keyring-functions/keyring/index.html | 23 + .../templates/lastpass-functions/index.html | 23 + .../lastpass-functions/lastpass/index.html | 23 + .../lastpass-functions/lastpassRaw/index.html | 23 + reference/templates/pass-functions/index.html | 23 + .../templates/pass-functions/pass/index.html | 23 + .../pass-functions/passFields/index.html | 23 + .../pass-functions/passRaw/index.html | 23 + .../templates/passhole-functions/index.html | 23 + .../passhole-functions/passhole/index.html | 23 + .../templates/secret-functions/index.html | 23 + .../secret-functions/secret/index.html | 23 + .../secret-functions/secretJSON/index.html | 23 + reference/templates/variables/index.html | 23 + .../vault-functions/vault/index.html | 23 + search/search_index.json | 2 +- sitemap.xml | 552 +- sitemap.xml.gz | Bin 2218 -> 2224 bytes .../index.html | 23 + .../install-packages-declaratively/index.html | 23 + .../index.html | 23 + .../migrate-away-from-chezmoi/index.html | 23 + .../use-chezmoi-with-watchman/index.html | 23 + user-guide/command-overview/index.html | 7 + user-guide/daily-operations/index.html | 7 + user-guide/encryption/age/index.html | 23 + user-guide/encryption/gpg/index.html | 23 + user-guide/encryption/index.html | 23 + user-guide/encryption/rage/index.html | 23 + .../design/index.html | 23 + .../encryption/index.html | 23 + .../general/index.html | 23 + .../troubleshooting/index.html | 23 + .../usage/index.html | 23 + .../include-files-from-elsewhere/index.html | 23 + .../machines/containers-and-vms/index.html | 23 + user-guide/machines/general/index.html | 23 + user-guide/machines/linux/index.html | 23 + user-guide/machines/macos/index.html | 23 + user-guide/machines/windows/index.html | 23 + .../manage-different-types-of-file/index.html | 23 + .../index.html | 23 + .../password-managers/1password/index.html | 23 + .../aws-secrets-manager/index.html | 23 + .../azure-key-vault/index.html | 23 + .../password-managers/bitwarden/index.html | 23 + .../password-managers/custom/index.html | 23 + .../password-managers/dashlane/index.html | 23 + .../password-managers/doppler/index.html | 23 + user-guide/password-managers/ejson/index.html | 23 + .../password-managers/gopass/index.html | 23 + .../hcp-vault-secrets/index.html | 23 + user-guide/password-managers/index.html | 23 + .../password-managers/keepassxc/index.html | 23 + .../password-managers/keeper/index.html | 23 + .../index.html | 23 + .../password-managers/lastpass/index.html | 23 + user-guide/password-managers/pass/index.html | 23 + .../password-managers/passhole/index.html | 23 + user-guide/password-managers/vault/index.html | 23 + user-guide/setup/index.html | 7 + user-guide/templating/index.html | 23 + user-guide/tools/diff/index.html | 23 + user-guide/tools/editor/index.html | 23 + .../tools/http-or-socks5-proxy/index.html | 23 + user-guide/tools/merge/index.html | 23 + .../use-scripts-to-perform-actions/index.html | 23 + what-does-chezmoi-do/index.html | 23 + why-use-chezmoi/index.html | 23 + 280 files changed, 15313 insertions(+), 370 deletions(-) create mode 100644 reference/templates/functions/warnf/index.html diff --git a/404.html b/404.html index fbc759ff0ce..6dc58578d65 100644 --- a/404.html +++ b/404.html @@ -4382,6 +4382,8 @@ + + @@ -5165,6 +5167,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/__pycache__/hooks.cpython-310.pyc b/__pycache__/hooks.cpython-310.pyc index 7e6018155abfdf716363277f09a1bc21a2e8a39f..22c5df106bc50fd4224a44df578e20c43d42bd2e 100644 GIT binary patch delta 20 acmX>ua9n^ppO=@50SMlN&e+Ip!vO#{wFM>s delta 20 acmX>ua9n^ppO=@50SGpwwQS_J;Q# + + + + + warnf + + + + + + + + + diff --git a/developer-guide/architecture/index.html b/developer-guide/architecture/index.html index 2717663fd8c..d7915591b3b 100644 --- a/developer-guide/architecture/index.html +++ b/developer-guide/architecture/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/building-on-top-of-chezmoi/index.html b/developer-guide/building-on-top-of-chezmoi/index.html index ac4ad0e1669..739d6d1b655 100644 --- a/developer-guide/building-on-top-of-chezmoi/index.html +++ b/developer-guide/building-on-top-of-chezmoi/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/contributing-changes/index.html b/developer-guide/contributing-changes/index.html index f8590eeb462..cdb68985787 100644 --- a/developer-guide/contributing-changes/index.html +++ b/developer-guide/contributing-changes/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/index.html b/developer-guide/index.html index 4fe10a3df39..eb92813f953 100644 --- a/developer-guide/index.html +++ b/developer-guide/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/install-script/index.html b/developer-guide/install-script/index.html index 2a0de0ef479..8ffd1b15277 100644 --- a/developer-guide/install-script/index.html +++ b/developer-guide/install-script/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/packaging/index.html b/developer-guide/packaging/index.html index b6113078144..4749efc0110 100644 --- a/developer-guide/packaging/index.html +++ b/developer-guide/packaging/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/releases/index.html b/developer-guide/releases/index.html index 74a58eef1e6..b2551652f5a 100644 --- a/developer-guide/releases/index.html +++ b/developer-guide/releases/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/security/index.html b/developer-guide/security/index.html index 50f2ee9edd1..48682dc60d7 100644 --- a/developer-guide/security/index.html +++ b/developer-guide/security/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/testing/index.html b/developer-guide/testing/index.html index 47f828a627c..5d8b1555920 100644 --- a/developer-guide/testing/index.html +++ b/developer-guide/testing/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/using-make/index.html b/developer-guide/using-make/index.html index eb7bfc890e9..a4b9297c825 100644 --- a/developer-guide/using-make/index.html +++ b/developer-guide/using-make/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/developer-guide/website/index.html b/developer-guide/website/index.html index dee8f7ddae9..1285bb4d583 100644 --- a/developer-guide/website/index.html +++ b/developer-guide/website/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/index.html b/index.html index 6e953063b19..4e3013b9d6b 100644 --- a/index.html +++ b/index.html @@ -4396,6 +4396,8 @@ + + @@ -5179,6 +5181,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + @@ -8543,7 +8566,7 @@

    chezmoi

    Manage your dotfiles across multiple diverse machines, securely.

    -

    The latest version of chezmoi is 2.58.0 (release notes, release history).

    +

    The latest version of chezmoi is 2.59.0 (release notes, release history).

    What does chezmoi do?

    chezmoi helps you manage your personal configuration files (dotfiles, like ~/.gitconfig) across multiple machines.

    diff --git a/install/index.html b/install/index.html index a93d9710352..ce716dd4e14 100644 --- a/install/index.html +++ b/install/index.html @@ -4492,6 +4492,8 @@ + + @@ -5275,6 +5277,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + @@ -8647,7 +8670,7 @@

    Install

    -

    The latest version of chezmoi is 2.58.0 (release notes, release history).

    +

    The latest version of chezmoi is 2.59.0 (release notes, release history).

    One-line package install

    Install chezmoi with your package manager with a single command:

    @@ -8732,7 +8755,7 @@

    One-line package install

    -
    asdf plugin add chezmoi && asdf install chezmoi 2.58.0
    +
    asdf plugin add chezmoi && asdf install chezmoi 2.59.0
     
    @@ -8861,45 +8884,45 @@

    Download a pre-built binary

    @@ -8910,23 +8933,23 @@

    Install from source

    make install-from-git-working-copy

    Verify your download

    -

    chezmoi's release process signs the SHA256 checksums of all released +

    chezmoi's release process signs the SHA256 checksums of all released assets with cosign.

    To verify an asset that you have downloaded:

    -

    Download the checksum -file, checksum file -signature, and public signing +

    Download the checksum +file, checksum file +signature, and public signing key.

    curl --location --remote-name-all \
    -       https://github.com/twpayne/chezmoi/releases/download/v2.58.0/chezmoi_2.58.0_checksums.txt \
    -       https://github.com/twpayne/chezmoi/releases/download/v2.58.0/chezmoi_2.58.0_checksums.txt.sig \
    -       https://github.com/twpayne/chezmoi/releases/download/v2.58.0/chezmoi_cosign.pub
    +       https://github.com/twpayne/chezmoi/releases/download/v2.59.0/chezmoi_2.59.0_checksums.txt \
    +       https://github.com/twpayne/chezmoi/releases/download/v2.59.0/chezmoi_2.59.0_checksums.txt.sig \
    +       https://github.com/twpayne/chezmoi/releases/download/v2.59.0/chezmoi_cosign.pub
     

    Verify the signature of the checksum file with cosign.

    cosign verify-blob --key=chezmoi_cosign.pub \
    -                     --signature=chezmoi_2.58.0_checksums.txt.sig \
    -                     chezmoi_2.58.0_checksums.txt
    +                     --signature=chezmoi_2.59.0_checksums.txt.sig \
    +                     chezmoi_2.59.0_checksums.txt
     

    Important

    @@ -8938,11 +8961,11 @@

    Verify your download

    -
    sha256sum --check chezmoi_2.58.0_checksums.txt --ignore-missing
    +
    sha256sum --check chezmoi_2.59.0_checksums.txt --ignore-missing
     
    -
    shasum --algorithm 256 --check chezmoi_2.58.0_checksums.txt --ignore-missing
    +
    shasum --algorithm 256 --check chezmoi_2.59.0_checksums.txt --ignore-missing
     
    diff --git a/license/index.html b/license/index.html index 743497f8999..a44031359bc 100644 --- a/license/index.html +++ b/license/index.html @@ -4393,6 +4393,8 @@ + + @@ -5176,6 +5178,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/links/articles/index.html b/links/articles/index.html index 7ce98722e12..3a2caad7292 100644 --- a/links/articles/index.html +++ b/links/articles/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + @@ -8516,6 +8539,24 @@

    Articles

    +2025-01-26 +2.58.0 +JP +chezmoi で macOS の user defaults も管理する + + +2025-01-19 +2.58.0 +EN +Managing dotfiles with chezmoi + + +2025-01-03 +2.57.0 +EN +Frictionless Dotfile Management With Chezmoi + + 2024-12-19 2.56.0 JP diff --git a/links/dotfile-repos/index.html b/links/dotfile-repos/index.html index 3cc63896096..6605dcf9a61 100644 --- a/links/dotfile-repos/index.html +++ b/links/dotfile-repos/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/links/podcasts/index.html b/links/podcasts/index.html index ebcbfd4493a..a221aa70d02 100644 --- a/links/podcasts/index.html +++ b/links/podcasts/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/links/related-software/index.html b/links/related-software/index.html index dcc441cd6e6..46c422d1f67 100644 --- a/links/related-software/index.html +++ b/links/related-software/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/links/social-media/index.html b/links/social-media/index.html index 60123092028..df4ed3c0132 100644 --- a/links/social-media/index.html +++ b/links/social-media/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/links/videos/index.html b/links/videos/index.html index 5d835748b33..5fe03b91e3d 100644 --- a/links/videos/index.html +++ b/links/videos/index.html @@ -4395,6 +4395,8 @@ + + @@ -5178,6 +5180,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/migrating-from-another-dotfile-manager/index.html b/migrating-from-another-dotfile-manager/index.html index 80050e1b46d..d70e240659c 100644 --- a/migrating-from-another-dotfile-manager/index.html +++ b/migrating-from-another-dotfile-manager/index.html @@ -4447,6 +4447,8 @@ + + @@ -5230,6 +5232,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/quick-start/index.html b/quick-start/index.html index 65c26b1bb62..9fac1ff7e83 100644 --- a/quick-start/index.html +++ b/quick-start/index.html @@ -1703,6 +1703,13 @@ +
  • + + + warnf + + +
  • diff --git a/reference/application-order/index.html b/reference/application-order/index.html index 132491a2305..d4220e7630f 100644 --- a/reference/application-order/index.html +++ b/reference/application-order/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/command-line-flags/common/index.html b/reference/command-line-flags/common/index.html index d8339617774..6155c0c8145 100644 --- a/reference/command-line-flags/common/index.html +++ b/reference/command-line-flags/common/index.html @@ -4561,6 +4561,8 @@ + + @@ -5344,6 +5346,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/command-line-flags/developer/index.html b/reference/command-line-flags/developer/index.html index 51b860b6d93..06fc296fd54 100644 --- a/reference/command-line-flags/developer/index.html +++ b/reference/command-line-flags/developer/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/command-line-flags/global/index.html b/reference/command-line-flags/global/index.html index 46c784f710d..a963c1227e3 100644 --- a/reference/command-line-flags/global/index.html +++ b/reference/command-line-flags/global/index.html @@ -4687,6 +4687,8 @@ + + @@ -5470,6 +5472,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/command-line-flags/index.html b/reference/command-line-flags/index.html index 884f4ba81d7..f3d394e4695 100644 --- a/reference/command-line-flags/index.html +++ b/reference/command-line-flags/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/add/index.html b/reference/commands/add/index.html index a9513962d1b..38d4b2cef9a 100644 --- a/reference/commands/add/index.html +++ b/reference/commands/add/index.html @@ -4630,6 +4630,8 @@ + + @@ -5413,6 +5415,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/age/index.html b/reference/commands/age/index.html index 4e5eeb2e87e..628763b61ec 100644 --- a/reference/commands/age/index.html +++ b/reference/commands/age/index.html @@ -4528,6 +4528,8 @@ + + @@ -5311,6 +5313,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/apply/index.html b/reference/commands/apply/index.html index 3ab954d889b..693324cc781 100644 --- a/reference/commands/apply/index.html +++ b/reference/commands/apply/index.html @@ -4534,6 +4534,8 @@ + + @@ -5317,6 +5319,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/archive/index.html b/reference/commands/archive/index.html index 12e02c5db5b..6e377e2eb48 100644 --- a/reference/commands/archive/index.html +++ b/reference/commands/archive/index.html @@ -4558,6 +4558,8 @@ + + @@ -5341,6 +5343,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/cat-config/index.html b/reference/commands/cat-config/index.html index 09cb3c077bf..0b2bab08ad9 100644 --- a/reference/commands/cat-config/index.html +++ b/reference/commands/cat-config/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/cat/index.html b/reference/commands/cat/index.html index 1ddd82398e7..cfd21a7bfa4 100644 --- a/reference/commands/cat/index.html +++ b/reference/commands/cat/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/cd/index.html b/reference/commands/cd/index.html index 725d6bd2f30..dc59f35b0cc 100644 --- a/reference/commands/cd/index.html +++ b/reference/commands/cd/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/chattr/index.html b/reference/commands/chattr/index.html index 18c98eaaab8..fbbccf2e8ae 100644 --- a/reference/commands/chattr/index.html +++ b/reference/commands/chattr/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/completion/index.html b/reference/commands/completion/index.html index f69f8eeca93..010090da763 100644 --- a/reference/commands/completion/index.html +++ b/reference/commands/completion/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/data/index.html b/reference/commands/data/index.html index d2ab9e52811..2a2afec60e0 100644 --- a/reference/commands/data/index.html +++ b/reference/commands/data/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/decrypt/index.html b/reference/commands/decrypt/index.html index e5247a02857..599550ce301 100644 --- a/reference/commands/decrypt/index.html +++ b/reference/commands/decrypt/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/destroy/index.html b/reference/commands/destroy/index.html index a908792c183..3f467ae9243 100644 --- a/reference/commands/destroy/index.html +++ b/reference/commands/destroy/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/diff/index.html b/reference/commands/diff/index.html index acc9170af61..984c93c4068 100644 --- a/reference/commands/diff/index.html +++ b/reference/commands/diff/index.html @@ -4567,6 +4567,8 @@ + + @@ -5350,6 +5352,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/doctor/index.html b/reference/commands/doctor/index.html index e4626e6cf44..07a513146e8 100644 --- a/reference/commands/doctor/index.html +++ b/reference/commands/doctor/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/dump-config/index.html b/reference/commands/dump-config/index.html index d33e5627800..93a7b1da909 100644 --- a/reference/commands/dump-config/index.html +++ b/reference/commands/dump-config/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/dump/index.html b/reference/commands/dump/index.html index 2e07c9c8762..85287c175b0 100644 --- a/reference/commands/dump/index.html +++ b/reference/commands/dump/index.html @@ -4534,6 +4534,8 @@ + + @@ -5317,6 +5319,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/edit-config-template/index.html b/reference/commands/edit-config-template/index.html index 7305958c73a..75f40b6f8a3 100644 --- a/reference/commands/edit-config-template/index.html +++ b/reference/commands/edit-config-template/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/edit-config/index.html b/reference/commands/edit-config/index.html index d41ac9e9882..11c05cb0dec 100644 --- a/reference/commands/edit-config/index.html +++ b/reference/commands/edit-config/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/edit/index.html b/reference/commands/edit/index.html index 7a4dd6af5d6..379dc306635 100644 --- a/reference/commands/edit/index.html +++ b/reference/commands/edit/index.html @@ -4549,6 +4549,8 @@ + + @@ -5332,6 +5334,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/encrypt/index.html b/reference/commands/encrypt/index.html index 366eb0c8b98..1a8a248120a 100644 --- a/reference/commands/encrypt/index.html +++ b/reference/commands/encrypt/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/execute-template/index.html b/reference/commands/execute-template/index.html index d53700b214e..a59b7a4f824 100644 --- a/reference/commands/execute-template/index.html +++ b/reference/commands/execute-template/index.html @@ -4561,6 +4561,8 @@ + + @@ -5344,6 +5346,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/forget/index.html b/reference/commands/forget/index.html index 9f6a63d4a96..03dafca8066 100644 --- a/reference/commands/forget/index.html +++ b/reference/commands/forget/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/generate/index.html b/reference/commands/generate/index.html index a2ab24b5f9b..841fb1fe682 100644 --- a/reference/commands/generate/index.html +++ b/reference/commands/generate/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/git/index.html b/reference/commands/git/index.html index f75f12738af..d1a4d37533d 100644 --- a/reference/commands/git/index.html +++ b/reference/commands/git/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/help/index.html b/reference/commands/help/index.html index 9241c82f739..d0f6ec304e8 100644 --- a/reference/commands/help/index.html +++ b/reference/commands/help/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/ignored/index.html b/reference/commands/ignored/index.html index 7d5224c30f6..c5fc6a10cc6 100644 --- a/reference/commands/ignored/index.html +++ b/reference/commands/ignored/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/import/index.html b/reference/commands/import/index.html index 2b41a695372..0b66065fdc3 100644 --- a/reference/commands/import/index.html +++ b/reference/commands/import/index.html @@ -4549,6 +4549,8 @@ + + @@ -5332,6 +5334,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/index.html b/reference/commands/index.html index 671941c9ea8..f1ce5e49e9c 100644 --- a/reference/commands/index.html +++ b/reference/commands/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/init/index.html b/reference/commands/init/index.html index ef8b0e44cab..c54cc56f4c7 100644 --- a/reference/commands/init/index.html +++ b/reference/commands/init/index.html @@ -4675,6 +4675,8 @@ + + @@ -5458,6 +5460,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/license/index.html b/reference/commands/license/index.html index 5cac8d2c147..5caf4f73ffa 100644 --- a/reference/commands/license/index.html +++ b/reference/commands/license/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/list/index.html b/reference/commands/list/index.html index f83917bb80d..014689fbcd3 100644 --- a/reference/commands/list/index.html +++ b/reference/commands/list/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/manage/index.html b/reference/commands/manage/index.html index 723adee7f9c..4fcdd79fbd9 100644 --- a/reference/commands/manage/index.html +++ b/reference/commands/manage/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/managed/index.html b/reference/commands/managed/index.html index fbe4f3fbd12..09d3e881b18 100644 --- a/reference/commands/managed/index.html +++ b/reference/commands/managed/index.html @@ -4525,6 +4525,8 @@ + + @@ -5308,6 +5310,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/merge-all/index.html b/reference/commands/merge-all/index.html index fc7c3c147d8..ea0b9ff7304 100644 --- a/reference/commands/merge-all/index.html +++ b/reference/commands/merge-all/index.html @@ -4498,6 +4498,8 @@ + + @@ -5281,6 +5283,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/merge/index.html b/reference/commands/merge/index.html index 692189e2689..5bf4506f443 100644 --- a/reference/commands/merge/index.html +++ b/reference/commands/merge/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/purge/index.html b/reference/commands/purge/index.html index 7031f9fb1a4..c1a5156ad7f 100644 --- a/reference/commands/purge/index.html +++ b/reference/commands/purge/index.html @@ -4513,6 +4513,8 @@ + + @@ -5296,6 +5298,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/re-add/index.html b/reference/commands/re-add/index.html index 2aae7ef4af8..85fab94cf49 100644 --- a/reference/commands/re-add/index.html +++ b/reference/commands/re-add/index.html @@ -4516,6 +4516,8 @@ + + @@ -5299,6 +5301,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/remove/index.html b/reference/commands/remove/index.html index abfa8102e9b..29887249f24 100644 --- a/reference/commands/remove/index.html +++ b/reference/commands/remove/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/rm/index.html b/reference/commands/rm/index.html index 7eb39c9e21e..db3770843d6 100644 --- a/reference/commands/rm/index.html +++ b/reference/commands/rm/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/secret/index.html b/reference/commands/secret/index.html index e58fb9ed6c2..c717066a43b 100644 --- a/reference/commands/secret/index.html +++ b/reference/commands/secret/index.html @@ -4597,6 +4597,8 @@ + + @@ -5380,6 +5382,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/source-path/index.html b/reference/commands/source-path/index.html index 6fdb0276aca..f50de52dfff 100644 --- a/reference/commands/source-path/index.html +++ b/reference/commands/source-path/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/state/index.html b/reference/commands/state/index.html index 55e46ad15a8..dbaa90a6829 100644 --- a/reference/commands/state/index.html +++ b/reference/commands/state/index.html @@ -4552,6 +4552,8 @@ + + @@ -5335,6 +5337,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/status/index.html b/reference/commands/status/index.html index cd0f98872af..b7128817073 100644 --- a/reference/commands/status/index.html +++ b/reference/commands/status/index.html @@ -4534,6 +4534,8 @@ + + @@ -5317,6 +5319,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/target-path/index.html b/reference/commands/target-path/index.html index 68f7a88bd0d..a3da936c156 100644 --- a/reference/commands/target-path/index.html +++ b/reference/commands/target-path/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/unmanage/index.html b/reference/commands/unmanage/index.html index 5fdd057d2c3..ea3876e397a 100644 --- a/reference/commands/unmanage/index.html +++ b/reference/commands/unmanage/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/unmanaged/index.html b/reference/commands/unmanaged/index.html index 9983643c14f..ca90fb278ff 100644 --- a/reference/commands/unmanaged/index.html +++ b/reference/commands/unmanaged/index.html @@ -4498,6 +4498,8 @@ + + @@ -5281,6 +5283,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/update/index.html b/reference/commands/update/index.html index 98b601d750d..cf0d3d4ee99 100644 --- a/reference/commands/update/index.html +++ b/reference/commands/update/index.html @@ -4558,6 +4558,8 @@ + + @@ -5341,6 +5343,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/upgrade/index.html b/reference/commands/upgrade/index.html index 68be207ed86..8e730a52922 100644 --- a/reference/commands/upgrade/index.html +++ b/reference/commands/upgrade/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/commands/verify/index.html b/reference/commands/verify/index.html index 3d6819f5fd5..a2a1d4ddc35 100644 --- a/reference/commands/verify/index.html +++ b/reference/commands/verify/index.html @@ -4525,6 +4525,8 @@ + + @@ -5308,6 +5310,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/concepts/index.html b/reference/concepts/index.html index 0501c755d05..a844a1bd53f 100644 --- a/reference/concepts/index.html +++ b/reference/concepts/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/editor/index.html b/reference/configuration-file/editor/index.html index fbba771bc2e..01b2b26ac63 100644 --- a/reference/configuration-file/editor/index.html +++ b/reference/configuration-file/editor/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/hooks/index.html b/reference/configuration-file/hooks/index.html index 643115177a9..9bc6d2dc0ba 100644 --- a/reference/configuration-file/hooks/index.html +++ b/reference/configuration-file/hooks/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + @@ -8536,6 +8559,14 @@

    Hooks

    Running chezmoi command, e.g. chezmoi add +git-auto-commit +Generating an automatic git commit + + +git-auto-push +Running an automatic git push + + read-source-state Reading the source state @@ -8545,8 +8576,8 @@

    Hooks

    is executed before event occurs and the event.post command is executed after event has occurred.

    A command contains a command or script and an optional array of strings - args. commands are executed directly. scripts are executed with -configured interpreter for the script's extension, see the section on +args. commands are executed directly. scripts are executed with configured +interpreter for the script's extension, see the section on interpreters.

    Example

    diff --git a/reference/configuration-file/index.html b/reference/configuration-file/index.html index d37cb3fc8f4..158edce48c7 100644 --- a/reference/configuration-file/index.html +++ b/reference/configuration-file/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/interpreters/index.html b/reference/configuration-file/interpreters/index.html index 68eb2b3cd7a..9dada3aebfc 100644 --- a/reference/configuration-file/interpreters/index.html +++ b/reference/configuration-file/interpreters/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/pinentry/index.html b/reference/configuration-file/pinentry/index.html index 131855bb0b6..34ee1e5c2ee 100644 --- a/reference/configuration-file/pinentry/index.html +++ b/reference/configuration-file/pinentry/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/textconv/index.html b/reference/configuration-file/textconv/index.html index 74d9a4a1c74..b89ab64de59 100644 --- a/reference/configuration-file/textconv/index.html +++ b/reference/configuration-file/textconv/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/umask/index.html b/reference/configuration-file/umask/index.html index 7663dfdc773..70c1138ec39 100644 --- a/reference/configuration-file/umask/index.html +++ b/reference/configuration-file/umask/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/variables/index.html b/reference/configuration-file/variables/index.html index 939f2bc05de..03e679b7e65 100644 --- a/reference/configuration-file/variables/index.html +++ b/reference/configuration-file/variables/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/configuration-file/warnings/index.html b/reference/configuration-file/warnings/index.html index 3352b079f0b..ab8f2364438 100644 --- a/reference/configuration-file/warnings/index.html +++ b/reference/configuration-file/warnings/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/index.html b/reference/index.html index d003c5ec745..c6d0502f2d2 100644 --- a/reference/index.html +++ b/reference/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/plugins/index.html b/reference/plugins/index.html index 88e097150f4..23f60f51358 100644 --- a/reference/plugins/index.html +++ b/reference/plugins/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/release-history/index.html b/reference/release-history/index.html index acd7be518b9..bc236595a98 100644 --- a/reference/release-history/index.html +++ b/reference/release-history/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + @@ -7992,6 +8015,15 @@
      +
    • + + + 2.59.0 (2025-01-28) + + + +
    • +
    • @@ -10491,6 +10523,15 @@
        +
      • + + + 2.59.0 (2025-01-28) + + + +
      • +
      • @@ -12463,7 +12504,28 @@

        Release history

        -

        Upcoming changes

        +

        Upcoming changes

        +

        2.59.0 (2025-01-28)

        +

        Features

        +
          +
        • 500c677 feat: Add git-auto-commit and git-auto-push hooks
        • +
        • fcf2ced feat: Add warnf template function
        • +
        • 8540b4e feat: Show original URL in HTTP progress bars
        • +
        • 8b42ee8 feat: Support filenames containing # in ignore and remove files
        • +
        +

        Fixes

        +
          +
        • 5cbbd6e fix: Fix persistent state mode for commands that execute templates
        • +
        • 309d7fd fix: Warn, don't error, when generating git commit messages for unknown states
        • +
        +

        Documentation updates

        +
          +
        • 0185fb8 docs: Add link to article
        • +
        • 70546ad docs: Update pruneEmptyDicts example
        • +
        • bd026f6 docs: Add link to article
        • +
        • 8131e3f docs: Add link to article
        • +
        +

        Full changelog: v2.58.0...v2.59.0

        2.58.0 (2025-01-13)

        Features

          diff --git a/reference/source-state-attributes/index.html b/reference/source-state-attributes/index.html index d225758d782..a43967be552 100644 --- a/reference/source-state-attributes/index.html +++ b/reference/source-state-attributes/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
        • + + + + + warnf + + + + +
        • + + + +
        diff --git a/reference/special-directories/chezmoidata/index.html b/reference/special-directories/chezmoidata/index.html index 1532f208575..5b1e77d43cf 100644 --- a/reference/special-directories/chezmoidata/index.html +++ b/reference/special-directories/chezmoidata/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
      • + + + + + warnf + + + + +
      • + + + +
      diff --git a/reference/special-directories/chezmoiexternals/index.html b/reference/special-directories/chezmoiexternals/index.html index 75e56d09ebd..94bbd2c9eac 100644 --- a/reference/special-directories/chezmoiexternals/index.html +++ b/reference/special-directories/chezmoiexternals/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
    • + + + + + warnf + + + + +
    • + + + +
    diff --git a/reference/special-directories/chezmoiscripts/index.html b/reference/special-directories/chezmoiscripts/index.html index 963cca98f6a..998c31fb6ec 100644 --- a/reference/special-directories/chezmoiscripts/index.html +++ b/reference/special-directories/chezmoiscripts/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-directories/chezmoitemplates/index.html b/reference/special-directories/chezmoitemplates/index.html index f6340c94789..879aa187f42 100644 --- a/reference/special-directories/chezmoitemplates/index.html +++ b/reference/special-directories/chezmoitemplates/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-directories/index.html b/reference/special-directories/index.html index 093552fee01..4626e3502b8 100644 --- a/reference/special-directories/index.html +++ b/reference/special-directories/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/chezmoi-format-tmpl/index.html b/reference/special-files/chezmoi-format-tmpl/index.html index 126f7c46bf1..df8568859b8 100644 --- a/reference/special-files/chezmoi-format-tmpl/index.html +++ b/reference/special-files/chezmoi-format-tmpl/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/chezmoidata-format/index.html b/reference/special-files/chezmoidata-format/index.html index 8858f363fe4..2a341eb9ebe 100644 --- a/reference/special-files/chezmoidata-format/index.html +++ b/reference/special-files/chezmoidata-format/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/chezmoiexternal-format/index.html b/reference/special-files/chezmoiexternal-format/index.html index cd15ac5e044..5ec6a10e1c5 100644 --- a/reference/special-files/chezmoiexternal-format/index.html +++ b/reference/special-files/chezmoiexternal-format/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/chezmoiignore/index.html b/reference/special-files/chezmoiignore/index.html index 48725b777c7..b888d101849 100644 --- a/reference/special-files/chezmoiignore/index.html +++ b/reference/special-files/chezmoiignore/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/chezmoiremove/index.html b/reference/special-files/chezmoiremove/index.html index c858e8af5b4..a78cdc3214d 100644 --- a/reference/special-files/chezmoiremove/index.html +++ b/reference/special-files/chezmoiremove/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/chezmoiroot/index.html b/reference/special-files/chezmoiroot/index.html index 8c761ea7f26..ad8b9578817 100644 --- a/reference/special-files/chezmoiroot/index.html +++ b/reference/special-files/chezmoiroot/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/chezmoiversion/index.html b/reference/special-files/chezmoiversion/index.html index 2740faa7850..b54d4e74b94 100644 --- a/reference/special-files/chezmoiversion/index.html +++ b/reference/special-files/chezmoiversion/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/special-files/index.html b/reference/special-files/index.html index 67d7b3d9953..99e9e76e3bc 100644 --- a/reference/special-files/index.html +++ b/reference/special-files/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/target-types/index.html b/reference/target-types/index.html index de7b738e38a..0006f28314e 100644 --- a/reference/target-types/index.html +++ b/reference/target-types/index.html @@ -4534,6 +4534,8 @@ + + @@ -5317,6 +5319,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-functions/index.html b/reference/templates/1password-functions/index.html index 707d039683b..3664bbf45c2 100644 --- a/reference/templates/1password-functions/index.html +++ b/reference/templates/1password-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-functions/onepassword/index.html b/reference/templates/1password-functions/onepassword/index.html index 0ddfaeabdc3..2e679520a73 100644 --- a/reference/templates/1password-functions/onepassword/index.html +++ b/reference/templates/1password-functions/onepassword/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-functions/onepasswordDetailsFields/index.html b/reference/templates/1password-functions/onepasswordDetailsFields/index.html index 59247dc48a9..780a13d57a1 100644 --- a/reference/templates/1password-functions/onepasswordDetailsFields/index.html +++ b/reference/templates/1password-functions/onepasswordDetailsFields/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-functions/onepasswordDocument/index.html b/reference/templates/1password-functions/onepasswordDocument/index.html index a2e7a0144d7..d1c73d9d6cf 100644 --- a/reference/templates/1password-functions/onepasswordDocument/index.html +++ b/reference/templates/1password-functions/onepasswordDocument/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-functions/onepasswordItemFields/index.html b/reference/templates/1password-functions/onepasswordItemFields/index.html index 95f423996d5..ec3b2d41502 100644 --- a/reference/templates/1password-functions/onepasswordItemFields/index.html +++ b/reference/templates/1password-functions/onepasswordItemFields/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-functions/onepasswordRead/index.html b/reference/templates/1password-functions/onepasswordRead/index.html index 4044b8d62b8..d9bc8af610b 100644 --- a/reference/templates/1password-functions/onepasswordRead/index.html +++ b/reference/templates/1password-functions/onepasswordRead/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-sdk-functions/index.html b/reference/templates/1password-sdk-functions/index.html index ea724392301..7d6a3183d33 100644 --- a/reference/templates/1password-sdk-functions/index.html +++ b/reference/templates/1password-sdk-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-sdk-functions/onepasswordSDKItemsGet/index.html b/reference/templates/1password-sdk-functions/onepasswordSDKItemsGet/index.html index 933208c3bc3..f5bd74968a1 100644 --- a/reference/templates/1password-sdk-functions/onepasswordSDKItemsGet/index.html +++ b/reference/templates/1password-sdk-functions/onepasswordSDKItemsGet/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/1password-sdk-functions/onepasswordSDKSecretsResolve/index.html b/reference/templates/1password-sdk-functions/onepasswordSDKSecretsResolve/index.html index 2eac91c4291..1d625a5adcd 100644 --- a/reference/templates/1password-sdk-functions/onepasswordSDKSecretsResolve/index.html +++ b/reference/templates/1password-sdk-functions/onepasswordSDKSecretsResolve/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/aws-secrets-manager-functions/awsSecretsManager/index.html b/reference/templates/aws-secrets-manager-functions/awsSecretsManager/index.html index 691af91d3b3..705d1badcfe 100644 --- a/reference/templates/aws-secrets-manager-functions/awsSecretsManager/index.html +++ b/reference/templates/aws-secrets-manager-functions/awsSecretsManager/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/aws-secrets-manager-functions/awsSecretsManagerRaw/index.html b/reference/templates/aws-secrets-manager-functions/awsSecretsManagerRaw/index.html index 406fd9602da..4398679b255 100644 --- a/reference/templates/aws-secrets-manager-functions/awsSecretsManagerRaw/index.html +++ b/reference/templates/aws-secrets-manager-functions/awsSecretsManagerRaw/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/aws-secrets-manager-functions/index.html b/reference/templates/aws-secrets-manager-functions/index.html index eb86ed4a167..312fb031233 100644 --- a/reference/templates/aws-secrets-manager-functions/index.html +++ b/reference/templates/aws-secrets-manager-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/azure-key-vault-functions/azureKeyVault/index.html b/reference/templates/azure-key-vault-functions/azureKeyVault/index.html index 50acac73191..75206ab6975 100644 --- a/reference/templates/azure-key-vault-functions/azureKeyVault/index.html +++ b/reference/templates/azure-key-vault-functions/azureKeyVault/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/bitwarden/index.html b/reference/templates/bitwarden-functions/bitwarden/index.html index a327122a4ac..7d92b45fcf2 100644 --- a/reference/templates/bitwarden-functions/bitwarden/index.html +++ b/reference/templates/bitwarden-functions/bitwarden/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/bitwardenAttachment/index.html b/reference/templates/bitwarden-functions/bitwardenAttachment/index.html index 5db13d993a5..ee76c8362ed 100644 --- a/reference/templates/bitwarden-functions/bitwardenAttachment/index.html +++ b/reference/templates/bitwarden-functions/bitwardenAttachment/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/bitwardenAttachmentByRef/index.html b/reference/templates/bitwarden-functions/bitwardenAttachmentByRef/index.html index dc4cf363dfb..e6c6a8f6d53 100644 --- a/reference/templates/bitwarden-functions/bitwardenAttachmentByRef/index.html +++ b/reference/templates/bitwarden-functions/bitwardenAttachmentByRef/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/bitwardenFields/index.html b/reference/templates/bitwarden-functions/bitwardenFields/index.html index 4af90f39acd..ceccbf1ea92 100644 --- a/reference/templates/bitwarden-functions/bitwardenFields/index.html +++ b/reference/templates/bitwarden-functions/bitwardenFields/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/bitwardenSecrets/index.html b/reference/templates/bitwarden-functions/bitwardenSecrets/index.html index 93405a8b072..dec2880fddb 100644 --- a/reference/templates/bitwarden-functions/bitwardenSecrets/index.html +++ b/reference/templates/bitwarden-functions/bitwardenSecrets/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/index.html b/reference/templates/bitwarden-functions/index.html index 09ebc0406a6..eec4d7f3c77 100644 --- a/reference/templates/bitwarden-functions/index.html +++ b/reference/templates/bitwarden-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/rbw/index.html b/reference/templates/bitwarden-functions/rbw/index.html index 17ee0a9c648..6915f700ee0 100644 --- a/reference/templates/bitwarden-functions/rbw/index.html +++ b/reference/templates/bitwarden-functions/rbw/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/bitwarden-functions/rbwFields/index.html b/reference/templates/bitwarden-functions/rbwFields/index.html index 23ed4d548e0..5aededf118d 100644 --- a/reference/templates/bitwarden-functions/rbwFields/index.html +++ b/reference/templates/bitwarden-functions/rbwFields/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/dashlane-functions/dashlaneNote/index.html b/reference/templates/dashlane-functions/dashlaneNote/index.html index 53dbcda2e15..fac276864a3 100644 --- a/reference/templates/dashlane-functions/dashlaneNote/index.html +++ b/reference/templates/dashlane-functions/dashlaneNote/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/dashlane-functions/dashlanePassword/index.html b/reference/templates/dashlane-functions/dashlanePassword/index.html index 3d009a77003..b503ebcb224 100644 --- a/reference/templates/dashlane-functions/dashlanePassword/index.html +++ b/reference/templates/dashlane-functions/dashlanePassword/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/dashlane-functions/index.html b/reference/templates/dashlane-functions/index.html index 984d614ac45..7c605088506 100644 --- a/reference/templates/dashlane-functions/index.html +++ b/reference/templates/dashlane-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/directives/index.html b/reference/templates/directives/index.html index 3ea4bab921a..f4e1293f9d7 100644 --- a/reference/templates/directives/index.html +++ b/reference/templates/directives/index.html @@ -4492,6 +4492,8 @@ + + @@ -5275,6 +5277,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/doppler-functions/doppler/index.html b/reference/templates/doppler-functions/doppler/index.html index b97e974ba13..eaeb89d660f 100644 --- a/reference/templates/doppler-functions/doppler/index.html +++ b/reference/templates/doppler-functions/doppler/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/doppler-functions/dopplerProjectJson/index.html b/reference/templates/doppler-functions/dopplerProjectJson/index.html index 382ae533b99..b6455a07b75 100644 --- a/reference/templates/doppler-functions/dopplerProjectJson/index.html +++ b/reference/templates/doppler-functions/dopplerProjectJson/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/doppler-functions/index.html b/reference/templates/doppler-functions/index.html index b3037dbcd9b..09533b0047a 100644 --- a/reference/templates/doppler-functions/index.html +++ b/reference/templates/doppler-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/ejson-functions/ejsonDecrypt/index.html b/reference/templates/ejson-functions/ejsonDecrypt/index.html index a9acba47550..39941b9095c 100644 --- a/reference/templates/ejson-functions/ejsonDecrypt/index.html +++ b/reference/templates/ejson-functions/ejsonDecrypt/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/ejson-functions/ejsonDecryptWithKey/index.html b/reference/templates/ejson-functions/ejsonDecryptWithKey/index.html index 7a83f9a89d1..7eaf0b39cc6 100644 --- a/reference/templates/ejson-functions/ejsonDecryptWithKey/index.html +++ b/reference/templates/ejson-functions/ejsonDecryptWithKey/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/ejson-functions/index.html b/reference/templates/ejson-functions/index.html index 7523a9c1d08..1640d763db6 100644 --- a/reference/templates/ejson-functions/index.html +++ b/reference/templates/ejson-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/comment/index.html b/reference/templates/functions/comment/index.html index 6ee1d131b15..849ee8cc443 100644 --- a/reference/templates/functions/comment/index.html +++ b/reference/templates/functions/comment/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/completion/index.html b/reference/templates/functions/completion/index.html index 655fc1959f0..9a9b9313fa1 100644 --- a/reference/templates/functions/completion/index.html +++ b/reference/templates/functions/completion/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/decrypt/index.html b/reference/templates/functions/decrypt/index.html index 5dbd8eb37da..0f46fd25a3d 100644 --- a/reference/templates/functions/decrypt/index.html +++ b/reference/templates/functions/decrypt/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/deleteValueAtPath/index.html b/reference/templates/functions/deleteValueAtPath/index.html index f4de0d4149b..060a009e4a1 100644 --- a/reference/templates/functions/deleteValueAtPath/index.html +++ b/reference/templates/functions/deleteValueAtPath/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/encrypt/index.html b/reference/templates/functions/encrypt/index.html index b992883cfd0..23da1dee153 100644 --- a/reference/templates/functions/encrypt/index.html +++ b/reference/templates/functions/encrypt/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/eqFold/index.html b/reference/templates/functions/eqFold/index.html index 04c71ffad80..819f3be0310 100644 --- a/reference/templates/functions/eqFold/index.html +++ b/reference/templates/functions/eqFold/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/findExecutable/index.html b/reference/templates/functions/findExecutable/index.html index 94a838504ba..63f379f3de3 100644 --- a/reference/templates/functions/findExecutable/index.html +++ b/reference/templates/functions/findExecutable/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/findOneExecutable/index.html b/reference/templates/functions/findOneExecutable/index.html index d415b2b23d2..1fa5e504a20 100644 --- a/reference/templates/functions/findOneExecutable/index.html +++ b/reference/templates/functions/findOneExecutable/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/fromIni/index.html b/reference/templates/functions/fromIni/index.html index 3b2b1f7d6a1..a843c063653 100644 --- a/reference/templates/functions/fromIni/index.html +++ b/reference/templates/functions/fromIni/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/fromJson/index.html b/reference/templates/functions/fromJson/index.html index 9cd26b2c458..5869ab95d29 100644 --- a/reference/templates/functions/fromJson/index.html +++ b/reference/templates/functions/fromJson/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/fromJsonc/index.html b/reference/templates/functions/fromJsonc/index.html index 42849e58368..ca345699f36 100644 --- a/reference/templates/functions/fromJsonc/index.html +++ b/reference/templates/functions/fromJsonc/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/fromToml/index.html b/reference/templates/functions/fromToml/index.html index 5606e86b891..9201f44f84a 100644 --- a/reference/templates/functions/fromToml/index.html +++ b/reference/templates/functions/fromToml/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/fromYaml/index.html b/reference/templates/functions/fromYaml/index.html index 16ad761f334..e23a635ca31 100644 --- a/reference/templates/functions/fromYaml/index.html +++ b/reference/templates/functions/fromYaml/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/glob/index.html b/reference/templates/functions/glob/index.html index 8baf2beadea..505869550ad 100644 --- a/reference/templates/functions/glob/index.html +++ b/reference/templates/functions/glob/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/hexDecode/index.html b/reference/templates/functions/hexDecode/index.html index a37fde35677..9cf7be886bd 100644 --- a/reference/templates/functions/hexDecode/index.html +++ b/reference/templates/functions/hexDecode/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/hexEncode/index.html b/reference/templates/functions/hexEncode/index.html index 64f2154e6dd..1cb8d1b0606 100644 --- a/reference/templates/functions/hexEncode/index.html +++ b/reference/templates/functions/hexEncode/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/include/index.html b/reference/templates/functions/include/index.html index 0ccf6c246a0..2f51a2ea24d 100644 --- a/reference/templates/functions/include/index.html +++ b/reference/templates/functions/include/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/includeTemplate/index.html b/reference/templates/functions/includeTemplate/index.html index a6f051ccc20..a4240330e6e 100644 --- a/reference/templates/functions/includeTemplate/index.html +++ b/reference/templates/functions/includeTemplate/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/index.html b/reference/templates/functions/index.html index 4408fb0bcd0..23b73452f15 100644 --- a/reference/templates/functions/index.html +++ b/reference/templates/functions/index.html @@ -4418,6 +4418,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/ioreg/index.html b/reference/templates/functions/ioreg/index.html index 915968a1e09..4c4460447d1 100644 --- a/reference/templates/functions/ioreg/index.html +++ b/reference/templates/functions/ioreg/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/isExecutable/index.html b/reference/templates/functions/isExecutable/index.html index b52b55df550..a2bbef72ecd 100644 --- a/reference/templates/functions/isExecutable/index.html +++ b/reference/templates/functions/isExecutable/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/joinPath/index.html b/reference/templates/functions/joinPath/index.html index 74fe3ad741f..c72abd118df 100644 --- a/reference/templates/functions/joinPath/index.html +++ b/reference/templates/functions/joinPath/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/jq/index.html b/reference/templates/functions/jq/index.html index 240a65b4523..5d09c524065 100644 --- a/reference/templates/functions/jq/index.html +++ b/reference/templates/functions/jq/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/lookPath/index.html b/reference/templates/functions/lookPath/index.html index 6b06769194d..e45cca40d35 100644 --- a/reference/templates/functions/lookPath/index.html +++ b/reference/templates/functions/lookPath/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/lstat/index.html b/reference/templates/functions/lstat/index.html index 8bdc757de6f..e43e5395f9e 100644 --- a/reference/templates/functions/lstat/index.html +++ b/reference/templates/functions/lstat/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/mozillaInstallHash/index.html b/reference/templates/functions/mozillaInstallHash/index.html index 108b4a9c932..1647c4ba762 100644 --- a/reference/templates/functions/mozillaInstallHash/index.html +++ b/reference/templates/functions/mozillaInstallHash/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/output/index.html b/reference/templates/functions/output/index.html index 19dc98b398f..522a6f84ec4 100644 --- a/reference/templates/functions/output/index.html +++ b/reference/templates/functions/output/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/pruneEmptyDicts/index.html b/reference/templates/functions/pruneEmptyDicts/index.html index 8bac7feb38c..f1027c7ef59 100644 --- a/reference/templates/functions/pruneEmptyDicts/index.html +++ b/reference/templates/functions/pruneEmptyDicts/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + @@ -8524,7 +8547,7 @@

    pruneEmptyDicts dict

    empty dicts are pruned.

    Example

    -
    {{ dict "key" "value" inner (dict) | pruneEmptyDicts | toJson }}
    +
    {{ dict "key" "value" "inner" (dict) | pruneEmptyDicts | toJson }}
     
    diff --git a/reference/templates/functions/quoteList/index.html b/reference/templates/functions/quoteList/index.html index 534852de702..dadc58f4d61 100644 --- a/reference/templates/functions/quoteList/index.html +++ b/reference/templates/functions/quoteList/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/replaceAllRegex/index.html b/reference/templates/functions/replaceAllRegex/index.html index 94b9badf9e9..ecdd6de8b87 100644 --- a/reference/templates/functions/replaceAllRegex/index.html +++ b/reference/templates/functions/replaceAllRegex/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/setValueAtPath/index.html b/reference/templates/functions/setValueAtPath/index.html index 816291636a8..855e10b9c81 100644 --- a/reference/templates/functions/setValueAtPath/index.html +++ b/reference/templates/functions/setValueAtPath/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/stat/index.html b/reference/templates/functions/stat/index.html index ee080f41b29..c6db145b908 100644 --- a/reference/templates/functions/stat/index.html +++ b/reference/templates/functions/stat/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/toIni/index.html b/reference/templates/functions/toIni/index.html index 9a42cb3e013..cc52ac8c4a2 100644 --- a/reference/templates/functions/toIni/index.html +++ b/reference/templates/functions/toIni/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/toPrettyJson/index.html b/reference/templates/functions/toPrettyJson/index.html index 0e3875b9e81..b0572a5e8f2 100644 --- a/reference/templates/functions/toPrettyJson/index.html +++ b/reference/templates/functions/toPrettyJson/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/toToml/index.html b/reference/templates/functions/toToml/index.html index 0d677bb3b17..2f17fbda88b 100644 --- a/reference/templates/functions/toToml/index.html +++ b/reference/templates/functions/toToml/index.html @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/toYaml/index.html b/reference/templates/functions/toYaml/index.html index 09f4dbbfb5d..a028adfe102 100644 --- a/reference/templates/functions/toYaml/index.html +++ b/reference/templates/functions/toYaml/index.html @@ -18,7 +18,7 @@ - + @@ -4418,6 +4418,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/functions/warnf/index.html b/reference/templates/functions/warnf/index.html new file mode 100644 index 00000000000..395c45717f9 --- /dev/null +++ b/reference/templates/functions/warnf/index.html @@ -0,0 +1,8613 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + warnf - chezmoi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + +
    + + +
    + +
    + + + + + + + + + +
    +
    + + + +
    +
    +
    + + + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + + + + +

    warnf format [arg...]

    +

    warnf prints a message to stderr prefixed by chezmoi: warning: and returns +the empty string. format is interpreted as a printf-style format +string with the given args.

    + + + + + + + + + + + + + +
    +
    + + + +
    + + + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + \ No newline at end of file diff --git a/reference/templates/github-functions/gitHubKeys/index.html b/reference/templates/github-functions/gitHubKeys/index.html index 903c6200fd3..1b6602ed3c7 100644 --- a/reference/templates/github-functions/gitHubKeys/index.html +++ b/reference/templates/github-functions/gitHubKeys/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/gitHubLatestRelease/index.html b/reference/templates/github-functions/gitHubLatestRelease/index.html index 61bd962bb0c..eaa68ce6d42 100644 --- a/reference/templates/github-functions/gitHubLatestRelease/index.html +++ b/reference/templates/github-functions/gitHubLatestRelease/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/gitHubLatestReleaseAssetURL/index.html b/reference/templates/github-functions/gitHubLatestReleaseAssetURL/index.html index 11cc4fb6ea0..05027ace9f5 100644 --- a/reference/templates/github-functions/gitHubLatestReleaseAssetURL/index.html +++ b/reference/templates/github-functions/gitHubLatestReleaseAssetURL/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/gitHubLatestTag/index.html b/reference/templates/github-functions/gitHubLatestTag/index.html index 09b676f0dd1..058294642fd 100644 --- a/reference/templates/github-functions/gitHubLatestTag/index.html +++ b/reference/templates/github-functions/gitHubLatestTag/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/gitHubRelease/index.html b/reference/templates/github-functions/gitHubRelease/index.html index ba853f71cac..885adf470e4 100644 --- a/reference/templates/github-functions/gitHubRelease/index.html +++ b/reference/templates/github-functions/gitHubRelease/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/gitHubReleaseAssetURL/index.html b/reference/templates/github-functions/gitHubReleaseAssetURL/index.html index ebd2d3a0e62..db65a664367 100644 --- a/reference/templates/github-functions/gitHubReleaseAssetURL/index.html +++ b/reference/templates/github-functions/gitHubReleaseAssetURL/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/gitHubReleases/index.html b/reference/templates/github-functions/gitHubReleases/index.html index d8723613237..6a41e213d67 100644 --- a/reference/templates/github-functions/gitHubReleases/index.html +++ b/reference/templates/github-functions/gitHubReleases/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/gitHubTags/index.html b/reference/templates/github-functions/gitHubTags/index.html index c0c1a4f3c8b..6e90407d163 100644 --- a/reference/templates/github-functions/gitHubTags/index.html +++ b/reference/templates/github-functions/gitHubTags/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/github-functions/index.html b/reference/templates/github-functions/index.html index 24a9b623f79..e1fb689585e 100644 --- a/reference/templates/github-functions/index.html +++ b/reference/templates/github-functions/index.html @@ -15,7 +15,7 @@ - + @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/gopass-functions/gopass/index.html b/reference/templates/gopass-functions/gopass/index.html index 644fd606547..b4b3bd8b07f 100644 --- a/reference/templates/gopass-functions/gopass/index.html +++ b/reference/templates/gopass-functions/gopass/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/gopass-functions/gopassRaw/index.html b/reference/templates/gopass-functions/gopassRaw/index.html index 63b16662cc3..df19ad35288 100644 --- a/reference/templates/gopass-functions/gopassRaw/index.html +++ b/reference/templates/gopass-functions/gopassRaw/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/gopass-functions/index.html b/reference/templates/gopass-functions/index.html index 46b3b0e53af..ea3126432b3 100644 --- a/reference/templates/gopass-functions/index.html +++ b/reference/templates/gopass-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret/index.html b/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret/index.html index fa90d60e8e2..269735e32c8 100644 --- a/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret/index.html +++ b/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson/index.html b/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson/index.html index 9ba181664a3..39ef5586d87 100644 --- a/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson/index.html +++ b/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/hcp-vault-secrets-functions/index.html b/reference/templates/hcp-vault-secrets-functions/index.html index 1267ecd18a7..87636e85f3a 100644 --- a/reference/templates/hcp-vault-secrets-functions/index.html +++ b/reference/templates/hcp-vault-secrets-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/index.html b/reference/templates/index.html index a2cd851bc2b..1bbccec1f5e 100644 --- a/reference/templates/index.html +++ b/reference/templates/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/exit/index.html b/reference/templates/init-functions/exit/index.html index 299ed8b5df9..4d3ed1b29a5 100644 --- a/reference/templates/init-functions/exit/index.html +++ b/reference/templates/init-functions/exit/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/index.html b/reference/templates/init-functions/index.html index 8c69962596c..49b28a64e25 100644 --- a/reference/templates/init-functions/index.html +++ b/reference/templates/init-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptBool/index.html b/reference/templates/init-functions/promptBool/index.html index bfad0a9c0c7..339d97468d8 100644 --- a/reference/templates/init-functions/promptBool/index.html +++ b/reference/templates/init-functions/promptBool/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptBoolOnce/index.html b/reference/templates/init-functions/promptBoolOnce/index.html index 59b8f232b46..c0307531ed7 100644 --- a/reference/templates/init-functions/promptBoolOnce/index.html +++ b/reference/templates/init-functions/promptBoolOnce/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptChoice/index.html b/reference/templates/init-functions/promptChoice/index.html index f37ac52509a..34ce847e431 100644 --- a/reference/templates/init-functions/promptChoice/index.html +++ b/reference/templates/init-functions/promptChoice/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptChoiceOnce/index.html b/reference/templates/init-functions/promptChoiceOnce/index.html index 265da9051c7..7a56b47fb4f 100644 --- a/reference/templates/init-functions/promptChoiceOnce/index.html +++ b/reference/templates/init-functions/promptChoiceOnce/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptInt/index.html b/reference/templates/init-functions/promptInt/index.html index ebec9bf2a35..f6f0f9e125a 100644 --- a/reference/templates/init-functions/promptInt/index.html +++ b/reference/templates/init-functions/promptInt/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptIntOnce/index.html b/reference/templates/init-functions/promptIntOnce/index.html index d42ceaaaec1..481b6a53776 100644 --- a/reference/templates/init-functions/promptIntOnce/index.html +++ b/reference/templates/init-functions/promptIntOnce/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptString/index.html b/reference/templates/init-functions/promptString/index.html index cc1ce13503d..34e1bfc93eb 100644 --- a/reference/templates/init-functions/promptString/index.html +++ b/reference/templates/init-functions/promptString/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/promptStringOnce/index.html b/reference/templates/init-functions/promptStringOnce/index.html index 8f18197282d..ab48845118d 100644 --- a/reference/templates/init-functions/promptStringOnce/index.html +++ b/reference/templates/init-functions/promptStringOnce/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/stdinIsATTY/index.html b/reference/templates/init-functions/stdinIsATTY/index.html index 6799eb8bbf5..70c3b91844d 100644 --- a/reference/templates/init-functions/stdinIsATTY/index.html +++ b/reference/templates/init-functions/stdinIsATTY/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/init-functions/writeToStdout/index.html b/reference/templates/init-functions/writeToStdout/index.html index 47248729af7..83b231d537d 100644 --- a/reference/templates/init-functions/writeToStdout/index.html +++ b/reference/templates/init-functions/writeToStdout/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keepassxc-functions/index.html b/reference/templates/keepassxc-functions/index.html index d48215c8d24..0c193c447c4 100644 --- a/reference/templates/keepassxc-functions/index.html +++ b/reference/templates/keepassxc-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keepassxc-functions/keepassxc/index.html b/reference/templates/keepassxc-functions/keepassxc/index.html index ebea69e2d46..df4e17d8da3 100644 --- a/reference/templates/keepassxc-functions/keepassxc/index.html +++ b/reference/templates/keepassxc-functions/keepassxc/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keepassxc-functions/keepassxcAttachment/index.html b/reference/templates/keepassxc-functions/keepassxcAttachment/index.html index d91891f0165..d8748677f7c 100644 --- a/reference/templates/keepassxc-functions/keepassxcAttachment/index.html +++ b/reference/templates/keepassxc-functions/keepassxcAttachment/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keepassxc-functions/keepassxcAttribute/index.html b/reference/templates/keepassxc-functions/keepassxcAttribute/index.html index e6c05cff1f9..584103e699e 100644 --- a/reference/templates/keepassxc-functions/keepassxcAttribute/index.html +++ b/reference/templates/keepassxc-functions/keepassxcAttribute/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keeper-functions/index.html b/reference/templates/keeper-functions/index.html index 2f4dd0e5a06..5066fd4f1e5 100644 --- a/reference/templates/keeper-functions/index.html +++ b/reference/templates/keeper-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keeper-functions/keeper/index.html b/reference/templates/keeper-functions/keeper/index.html index 8d1552486da..0c0a71ac0a3 100644 --- a/reference/templates/keeper-functions/keeper/index.html +++ b/reference/templates/keeper-functions/keeper/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keeper-functions/keeperDataFields/index.html b/reference/templates/keeper-functions/keeperDataFields/index.html index 674537d9016..a6373a4b505 100644 --- a/reference/templates/keeper-functions/keeperDataFields/index.html +++ b/reference/templates/keeper-functions/keeperDataFields/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keeper-functions/keeperFindPassword/index.html b/reference/templates/keeper-functions/keeperFindPassword/index.html index de39609e328..389b2a0754e 100644 --- a/reference/templates/keeper-functions/keeperFindPassword/index.html +++ b/reference/templates/keeper-functions/keeperFindPassword/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/keyring-functions/keyring/index.html b/reference/templates/keyring-functions/keyring/index.html index 384cbf5cc44..c66de23c5c2 100644 --- a/reference/templates/keyring-functions/keyring/index.html +++ b/reference/templates/keyring-functions/keyring/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/lastpass-functions/index.html b/reference/templates/lastpass-functions/index.html index ce16244bd40..a29f673922c 100644 --- a/reference/templates/lastpass-functions/index.html +++ b/reference/templates/lastpass-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/lastpass-functions/lastpass/index.html b/reference/templates/lastpass-functions/lastpass/index.html index 5067a998618..6873a1694b3 100644 --- a/reference/templates/lastpass-functions/lastpass/index.html +++ b/reference/templates/lastpass-functions/lastpass/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/lastpass-functions/lastpassRaw/index.html b/reference/templates/lastpass-functions/lastpassRaw/index.html index 96b06c2aea1..510977e556a 100644 --- a/reference/templates/lastpass-functions/lastpassRaw/index.html +++ b/reference/templates/lastpass-functions/lastpassRaw/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/pass-functions/index.html b/reference/templates/pass-functions/index.html index 6a922daa868..b26385abe27 100644 --- a/reference/templates/pass-functions/index.html +++ b/reference/templates/pass-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/pass-functions/pass/index.html b/reference/templates/pass-functions/pass/index.html index bc501b81da7..1487ca91d97 100644 --- a/reference/templates/pass-functions/pass/index.html +++ b/reference/templates/pass-functions/pass/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/pass-functions/passFields/index.html b/reference/templates/pass-functions/passFields/index.html index d1799c00346..1ba7a5e0f46 100644 --- a/reference/templates/pass-functions/passFields/index.html +++ b/reference/templates/pass-functions/passFields/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/pass-functions/passRaw/index.html b/reference/templates/pass-functions/passRaw/index.html index 75612eee12e..4fb5970874e 100644 --- a/reference/templates/pass-functions/passRaw/index.html +++ b/reference/templates/pass-functions/passRaw/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/passhole-functions/index.html b/reference/templates/passhole-functions/index.html index 71406a92102..ddd819ecbcc 100644 --- a/reference/templates/passhole-functions/index.html +++ b/reference/templates/passhole-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/passhole-functions/passhole/index.html b/reference/templates/passhole-functions/passhole/index.html index 72ad40068cb..ae339c3bb20 100644 --- a/reference/templates/passhole-functions/passhole/index.html +++ b/reference/templates/passhole-functions/passhole/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/secret-functions/index.html b/reference/templates/secret-functions/index.html index 1ad7391fc57..7911e84ee2b 100644 --- a/reference/templates/secret-functions/index.html +++ b/reference/templates/secret-functions/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/secret-functions/secret/index.html b/reference/templates/secret-functions/secret/index.html index 53434adb23b..01ead955b77 100644 --- a/reference/templates/secret-functions/secret/index.html +++ b/reference/templates/secret-functions/secret/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/secret-functions/secretJSON/index.html b/reference/templates/secret-functions/secretJSON/index.html index 1da7d0b2a2d..be71a1771f6 100644 --- a/reference/templates/secret-functions/secretJSON/index.html +++ b/reference/templates/secret-functions/secretJSON/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/variables/index.html b/reference/templates/variables/index.html index 652c4f3db0a..084172e1538 100644 --- a/reference/templates/variables/index.html +++ b/reference/templates/variables/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/reference/templates/vault-functions/vault/index.html b/reference/templates/vault-functions/vault/index.html index 86b3a294954..cb73d83610e 100644 --- a/reference/templates/vault-functions/vault/index.html +++ b/reference/templates/vault-functions/vault/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/search/search_index.json b/search/search_index.json index f80978f1bc9..1a3dc9356ae 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"chezmoi","text":"

    Manage your dotfiles across multiple diverse machines, securely.

    The latest version of chezmoi is 2.58.0 (release notes, release history).

    "},{"location":"#what-does-chezmoi-do","title":"What does chezmoi do?","text":"

    chezmoi helps you manage your personal configuration files (dotfiles, like ~/.gitconfig) across multiple machines.

    chezmoi provides many features beyond symlinking or using a bare git repo including:

    • templates (to handle small differences between machines)
    • password manager support (to store your secrets securely)
    • importing files from archives (great for shell and editor plugins)
    • full file encryption (using gpg or age)
    • running scripts (to handle everything else)

    With chezmoi, pronounced /\u0283e\u026a mwa/ (shay-mwa), you can install chezmoi and your dotfiles from your GitHub dotfiles repo on a new, empty machine with a single command:

    sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply $GITHUB_USERNAME\n

    As well as the curl | sh installation, you can install chezmoi with your favorite package manager.

    Updating your dotfiles on any machine is a single command:

    chezmoi update\n

    chezmoi runs on all popular operating systems, is distributed as a single statically-linked binary with no dependencies, and does not require root access.

    "},{"location":"#how-do-i-start-with-chezmoi","title":"How do I start with chezmoi?","text":"

    Install chezmoi then read the quick start guide. The user guide covers most common tasks. For a full description, consult the reference.

    "},{"location":"#should-i-use-chezmoi","title":"Should I use chezmoi?","text":"

    See what other people think about chezmoi by reading articles, listening to podcasts, and watching videos about chezmoi. Read how chezmoi compares to other dotfile managers. Explore other people's dotfile repos that use chezmoi.

    "},{"location":"#how-do-i-get-help-using-chezmoi","title":"How do I get help using chezmoi?","text":"

    chezmoi has extensive documentation. First, use the search bar at the top of this page using a few, short, and specific keywords related to your problem.

    chezmoi is an open source project with tens of thousands of users, so it is very likely that someone else has already encountered and solved your problem. Search chezmoi's GitHub repo for issues and discussions with keywords related to your problem.

    If your question is still unanswered, please open a GitHub issue for support.

    "},{"location":"#i-like-chezmoi-how-do-i-say-thanks","title":"I like chezmoi. How do I say thanks?","text":"

    Please give chezmoi a star on GitHub.

    Share chezmoi and, if you're happy to share your public dotfiles repo, then tag your repo with chezmoi.

    Contributions are very welcome and every bug report, support request, and feature request helps make chezmoi better. Thank you :)

    chezmoi does not accept financial contributions. Instead, please make a donation to a charity or cause of your choice.

    "},{"location":"comparison-table/","title":"Comparison table","text":"chezmoi dotbot rcm vcsh yadm bare git Distribution Single binary Python package Multiple files Single script or package Single script - Install method Many git submodule Many Many Many Manual Non-root install on bare system \u2705 \u2049\ufe0f \u2705 \u2705 \u2705 \u2705 Windows support \u2705 \u2705 \u274c \u274c \u2705 \u2705 Bootstrap requirements None Python, git Perl sh, git git git Source repos Single Single Multiple Multiple Single Single dotfiles are... Files Symlinks Files Files Files Files Config file Optional Required Optional None Optional Optional Private files \u2705 \u274c \u274c \u274c \u2705 \u274c Show differences without applying \u2705 \u274c \u274c \u2705 \u2705 \u2705 Whole file encryption \u2705 \u274c \u274c \u274c \u2705 \u274c Password manager integration \u2705 \u274c \u274c \u274c \u274c \u274c Machine-to-machine file differences Templates Alternative files Alternative files Branches Alternative files, templates \u2049\ufe0f Custom variables in templates \u2705 \u274c \u274c \u274c \u274c \u274c Executable files \u2705 \u2705 \u2705 \u2705 \u2705 \u2705 File creation with initial contents \u2705 \u274c \u274c \u2705 \u274c \u274c Externals \u2705 \u274c \u274c \u274c \u274c \u274c Manage partial files \u2705 \u274c \u274c \u2049\ufe0f \u2705 \u2049\ufe0f File removal \u2705 \u274c \u274c \u2705 \u2705 \u274c Directory creation \u2705 \u2705 \u2705 \u2705 \u2705 \u2705 Run scripts \u2705 \u2705 \u2705 \u2705 \u2705 \u274c Run once scripts \u2705 \u274c \u274c \u2705 \u2705 \u274c Machine-to-machine symlink differences \u2705 \u274c \u274c \u2049\ufe0f \u2705 \u2049\ufe0f Shell completion \u2705 \u274c \u274c \u2705 \u2705 \u2705 Archive import \u2705 \u274c \u274c \u2705 \u274c \u2705 Archive export \u2705 \u274c \u274c \u2705 \u274c \u2705 Implementation language Go Python Perl POSIX Shell Bash C

    \u2705 Supported, \u2049\ufe0f Possible with significant manual effort, \u274c Not supported

    For more comparisons, visit dotfiles.github.io/utilities.

    "},{"location":"install/","title":"Install","text":"

    The latest version of chezmoi is 2.58.0 (release notes, release history).

    "},{"location":"install/#one-line-package-install","title":"One-line package install","text":"

    Install chezmoi with your package manager with a single command:

    LinuxmacOSWindowsFreeBSDOpenIndiana AlpineArchNixOSopenSUSE TumbleweedTermuxVoid
    apk add chezmoi\n
    pacman -S chezmoi\n
    nix-env -i chezmoi\n
    zypper install chezmoi\n
    pkg install chezmoi\n
    xbps-install -S chezmoi\n
    HomebrewMacPortsNix
    brew install chezmoi\n
    port install chezmoi\n
    nix-env -i chezmoi\n
    ChocolateyScoopWinget
    choco install chezmoi\n
    scoop install chezmoi\n
    winget install twpayne.chezmoi\n
    pkg install chezmoi\n
    pkg install application/chezmoi\n

    chezmoi is available in many cross-platform package managers:

    asdfHomebrewNixsnap
    asdf plugin add chezmoi && asdf install chezmoi 2.58.0\n
    brew install chezmoi\n
    nix-env -i chezmoi\n
    snap install chezmoi --classic\n

    For more packages, see chezmoi on repology.org.

    "},{"location":"install/#one-line-binary-install","title":"One-line binary install","text":"

    Install the correct binary for your operating system and architecture in ./bin with a single command:

    curlwgetPowerShell
    sh -c \"$(curl -fsLS get.chezmoi.io)\"\n
    sh -c \"$(wget -qO- get.chezmoi.io)\"\n
    iex \"&{$(irm 'https://get.chezmoi.io/ps1')}\"\n

    To provide the script with arguments, place them at the end of the quote:

    iex \"&{$(irm 'https://get.chezmoi.io/ps1')} -b '~/bin'\"\n

    Hint

    If you already have a dotfiles repo using chezmoi on GitHub at https://github.com/$GITHUB_USERNAME/dotfiles then you can install chezmoi and your dotfiles with the single command:

    sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply $GITHUB_USERNAME\n

    Private GitHub repos require other authentication methods:

    sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply git@github.com:$GITHUB_USERNAME/dotfiles.git\n

    Hint

    If you want to install chezmoi in ./.local/bin instead of ./bin you can use get.chezmoi.io/lb or chezmoi.io/getlb instead.

    Hint

    To install the chezmoi binary in a different directory, use the -b option, for example:

    sh -c \"$(curl -fsLS get.chezmoi.io)\" -- -b $HOME/.local/bin\n
    "},{"location":"install/#download-a-pre-built-linux-package","title":"Download a pre-built Linux package","text":"

    Download a package for your distribution and architecture.

    debrpmapkArch Linux

    amd64 arm64 armel i386 loong64 mips64 mips64le ppc64 ppc64le riscv64 s390x

    aarch64 armhfp i686 loong64 mips64 mips64le ppc64 ppc64le s390x riscv64 x86_64

    386 amd64 arm arm64 loong64 mips64_hardfloat mips64le_hardfloat ppc64 ppc64le riscv64 s390x

    386 amd64 arm arm64 loong64 mips64_hardfloat mips64le_hardfloat ppc64 ppc64le riscv64 s390x

    "},{"location":"install/#download-a-pre-built-binary","title":"Download a pre-built binary","text":"

    Download an archive for your operating system and architecture containing a pre-built binary and shell completions.

    LinuxmacOSWindowsFreeBSDOpenBSD

    amd64 arm arm64 i386 loong64 mips64 mips64le ppc64 ppc64le riscv64 s390x amd64 (glibc) amd64 (musl) arm64 (Termux)

    amd64 arm64

    amd64 arm arm64 i386

    amd64 arm arm64 i386 riscv64

    amd64 arm arm64 i386 ppc64 riscv64

    "},{"location":"install/#install-from-source","title":"Install from source","text":"

    Download, build, and install chezmoi for your system with Go 1.23 or later:

    git clone https://github.com/twpayne/chezmoi.git\ncd chezmoi\nmake install-from-git-working-copy\n
    "},{"location":"install/#verify-your-download","title":"Verify your download","text":"

    chezmoi's release process signs the SHA256 checksums of all released assets with cosign.

    To verify an asset that you have downloaded:

    Download the checksum file, checksum file signature, and public signing key.

    curl --location --remote-name-all \\\n       https://github.com/twpayne/chezmoi/releases/download/v2.58.0/chezmoi_2.58.0_checksums.txt \\\n       https://github.com/twpayne/chezmoi/releases/download/v2.58.0/chezmoi_2.58.0_checksums.txt.sig \\\n       https://github.com/twpayne/chezmoi/releases/download/v2.58.0/chezmoi_cosign.pub\n

    Verify the signature of the checksum file with cosign.

    cosign verify-blob --key=chezmoi_cosign.pub \\\n                     --signature=chezmoi_2.58.0_checksums.txt.sig \\\n                     chezmoi_2.58.0_checksums.txt\n

    Important

    cosign should print Verified OK

    Verify the that the SHA256 sum of your downloads matches the SHA256 sum in the verified checksum file. All the downloaded files must be in the current directory.

    LinuxmacOS
    sha256sum --check chezmoi_2.58.0_checksums.txt --ignore-missing\n
    shasum --algorithm 256 --check chezmoi_2.58.0_checksums.txt --ignore-missing\n

    For more information on chezmoi's release signing process, see the developer documentation on chezmoi's releases.

    "},{"location":"license/","title":"License","text":"

    The MIT License (MIT)

    Copyright (c) 2018-2025 Tom Payne

    Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

    The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    "},{"location":"migrating-from-another-dotfile-manager/","title":"Migrating from another dotfile manager","text":""},{"location":"migrating-from-another-dotfile-manager/#migrate-from-a-dotfile-manager-that-uses-symlinks","title":"Migrate from a dotfile manager that uses symlinks","text":"

    Many dotfile managers replace dotfiles with symbolic links to files in a common directory. If you chezmoi add such a symlink, chezmoi will add the symlink, not the file. To assist with migrating from symlink-based systems, use the --follow option to chezmoi add, for example:

    chezmoi add --follow ~/.bashrc\n

    This will tell chezmoi add that the target state of ~/.bashrc is the target of the ~/.bashrc symlink, rather than the symlink itself. When you run chezmoi apply, chezmoi will replace the ~/.bashrc symlink with the file contents.

    "},{"location":"quick-start/","title":"Quick start","text":""},{"location":"quick-start/#concepts","title":"Concepts","text":"

    Roughly speaking, chezmoi stores the desired state of your dotfiles in the directory ~/.local/share/chezmoi. When you run chezmoi apply, chezmoi calculates the desired contents for each of your dotfiles and then makes the minimum changes required to make your dotfiles match your desired state. chezmoi's concepts are described more accurately in the reference manual.

    "},{"location":"quick-start/#start-using-chezmoi-on-your-current-machine","title":"Start using chezmoi on your current machine","text":"

    Assuming that you have already installed chezmoi, initialize chezmoi with:

    chezmoi init\n

    This will create a new git local repository in ~/.local/share/chezmoi where chezmoi will store its source state. By default, chezmoi only modifies files in the working copy.

    Manage your first file with chezmoi:

    chezmoi add ~/.bashrc\n

    This will copy ~/.bashrc to ~/.local/share/chezmoi/dot_bashrc.

    Edit the source state:

    chezmoi edit ~/.bashrc\n

    This will open ~/.local/share/chezmoi/dot_bashrc in your $EDITOR. Make some changes and save the file.

    Hint

    You don't have to use chezmoi edit to edit your dotfiles. See this FAQ entry for more details.

    See what changes chezmoi would make:

    chezmoi diff\n

    Apply the changes:

    chezmoi -v apply\n

    All chezmoi commands accept the -v (verbose) flag to print out exactly what changes they will make to the file system, and the -n (dry run) flag to not make any actual changes. The combination -n -v is very useful if you want to see exactly what changes would be made.

    Next, open a shell in the source directory, to commit your changes:

    chezmoi cd\ngit add .\ngit commit -m \"Initial commit\"\n

    Create a new repository on GitHub called dotfiles and then push your repo:

    git remote add origin git@github.com:$GITHUB_USERNAME/dotfiles.git\ngit branch -M main\ngit push -u origin main\n

    Hint

    chezmoi can be configured to automatically add, commit, and push changes to your repo.

    chezmoi can also be used with GitLab, or BitBucket, Source Hut, or any other git hosting service.

    Finally, exit the shell in the source directory to return to where you were:

    exit\n

    These commands are summarized in this sequence diagram:

    sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo H->>L: chezmoi init H->>W: chezmoi add <file> W->>W: chezmoi edit <file> W-->>H: chezmoi diff W->>H: chezmoi apply H-->>W: chezmoi cd W->>L: git add W->>L: git commit L->>R: git push W-->>H: exit"},{"location":"quick-start/#using-chezmoi-across-multiple-machines","title":"Using chezmoi across multiple machines","text":"

    On a second machine, initialize chezmoi with your dotfiles repo:

    chezmoi init https://github.com/$GITHUB_USERNAME/dotfiles.git\n

    Hint

    Private GitHub repos require other authentication methods:

    chezmoi init git@github.com:$GITHUB_USERNAME/dotfiles.git\n

    This will check out the repo and any submodules and optionally create a chezmoi config file for you.

    Check what changes that chezmoi will make to your home directory by running:

    chezmoi diff\n

    If you are happy with the changes that chezmoi will make then run:

    chezmoi apply -v\n

    If you are not happy with the changes to a file then either edit it with:

    chezmoi edit $FILE\n

    Or, invoke a merge tool (by default vimdiff) to merge changes between the current contents of the file, the file in your working copy, and the computed contents of the file:

    chezmoi merge $FILE\n

    On any machine, you can pull and apply the latest changes from your repo with:

    chezmoi update -v\n

    These commands are summarized in this sequence diagram:

    sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init <repo> W-->>H: chezmoi diff W->>H: chezmoi apply W->>W: chezmoi edit <file> W->>W: chezmoi merge <file> R->>H: chezmoi update"},{"location":"quick-start/#set-up-a-new-machine-with-a-single-command","title":"Set up a new machine with a single command","text":"

    You can install your dotfiles on new machine with a single command:

    chezmoi init --apply https://github.com/$GITHUB_USERNAME/dotfiles.git\n

    If you use GitHub and your dotfiles repo is called dotfiles then this can be shortened to:

    chezmoi init --apply $GITHUB_USERNAME\n

    Hint

    Private GitHub repos require other authentication methods:

    chezmoi init --apply git@github.com:$GITHUB_USERNAME/dotfiles.git\n

    This command is summarized in this sequence diagram:

    sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>H: chezmoi init --apply <repo>"},{"location":"quick-start/#next-steps","title":"Next steps","text":"

    For a full list of commands run:

    chezmoi help\n

    chezmoi has much more functionality. Good starting points are reading what other people say about chezmoi, adding more dotfiles, and using templates to manage files that vary from machine to machine and retrieve secrets from your password manager. Read the user guide to explore and see how people use chezmoi for inspiration.

    "},{"location":"what-does-chezmoi-do/","title":"What does chezmoi do?","text":"

    chezmoi helps you manage your personal configuration files (dotfiles, like ~/.gitconfig) across multiple machines.

    chezmoi is helpful if you have spent time customizing the tools you use (e.g. shells, editors, and version control systems) and want to keep machines running different accounts (e.g. home and work) and/or different operating systems (e.g. Linux, macOS, and Windows) in sync, while still being able to easily cope with differences from machine to machine.

    chezmoi scales from the trivial (e.g. copying a few dotfiles onto a Raspberry Pi, development container, or virtual machine) to complex long-lived multi-machine development environments (e.g. keeping any number of home and work, Linux, macOS, and Windows machines in sync). In all cases you only need to maintain a single source of truth (a single branch in git) and getting started only requires adding a single binary to your machine (which you can do with curl, wget, or scp).

    chezmoi has strong support for security, allowing you to manage secrets (e.g. passwords, access tokens, and private keys) securely and seamlessly using a password manager and/or encrypt whole files with your favorite encryption tool.

    If you do not personalize your configuration or only ever use a single operating system with a single account and none of your dotfiles contain secrets then you don't need chezmoi. Otherwise, read on...

    "},{"location":"what-does-chezmoi-do/#what-are-chezmois-key-features","title":"What are chezmoi's key features?","text":""},{"location":"what-does-chezmoi-do/#flexible","title":"Flexible","text":"

    You can share as much configuration across machines as you want, while still being able to control machine-specific details.Your dotfiles can be templates (using text/template syntax). Predefined variables allow you to change behavior depending on operating system, architecture, and hostname. chezmoi runs on all commonly-used platforms, like Linux, macOS, and Windows. It also runs on less commonly-used platforms, like FreeBSD, OpenBSD, and Termux.

    "},{"location":"what-does-chezmoi-do/#personal-and-secure","title":"Personal and secure","text":"

    Nothing leaves your machine, unless you want it to. Your configuration remains in a git repo under your control. You can write the configuration file in the format of your choice. chezmoi can retrieve secrets from 1Password, AWS Secrets Manager, Azure Key Vault, Bitwarden, Dashlane, Doppler, gopass, HCP Vault Secrets, KeePassXC, Keeper, LastPass, pass, passage, passhole, Vault, Keychain, Keyring, or any command-line utility of your choice. You can encrypt individual files with GnuPG or age. You can checkout your dotfiles repo on as many machines as you want without revealing any secrets to anyone.

    "},{"location":"what-does-chezmoi-do/#transparent","title":"Transparent","text":"

    chezmoi includes verbose and dry run modes so you can review exactly what changes it will make to your home directory before making them. chezmoi's source format uses only regular files and directories that map one-to-one with the files, directories, and symlinks in your home directory that you choose to manage. If you decide not to use chezmoi in the future, it is easy to move your data elsewhere.

    "},{"location":"what-does-chezmoi-do/#declarative-and-robust","title":"Declarative and robust","text":"

    You declare the desired state of files, directories, and symbolic links in your source of truth and chezmoi updates your home directory to match that state. What you want is what you get. chezmoi updates all files and symbolic links atomically. You will never be left with incomplete files that could lock you out, even if the update process is interrupted.

    "},{"location":"what-does-chezmoi-do/#fast-and-easy-to-use","title":"Fast and easy to use","text":"

    Using chezmoi feels like using git: the commands are similar and chezmoi runs in fractions of a second. chezmoi makes most day-to-day operations one line commands, including installation, initialization, and keeping your machines up-to-date. chezmoi can pull and apply changes from your dotfiles repo in a single command, and automatically commit and push changes.

    "},{"location":"why-use-chezmoi/","title":"Why use chezmoi?","text":""},{"location":"why-use-chezmoi/#why-should-i-use-a-dotfile-manager","title":"Why should I use a dotfile manager?","text":"

    Dotfile managers give you the combined benefit of a consistent environment everywhere with an undo command and a restore from backup.

    As the core of our development environments become increasingly standardized (e.g. using git at both home and work), and we further customize them, at the same time we increasingly work in ephemeral environments like Docker containers, virtual machines, and GitHub Codespaces.

    In the same way that nobody would use an editor without an undo command, or develop software without a version control system, chezmoi brings the investment that you have made in mastering your tools to every environment that you work in.

    "},{"location":"why-use-chezmoi/#i-already-have-a-system-to-manage-my-dotfiles-why-should-i-use-chezmoi","title":"I already have a system to manage my dotfiles, why should I use chezmoi?","text":"

    Quote

    I\u2019ve been using Chezmoi for more than a year now, across at least 3 computers simultaneously, and I really love it. Most of all, I love how fast I can configure a new machine when I use it. In just a couple minutes of work, I can kick off a process on a brand-new computer that will set up my dotfiles and install all my usual software so it feels like a computer I\u2019ve been using for years. I also appreciate features like secrets management, which allow me to share my dotfiles while keeping my secrets safe. Overall, I love the way Chezmoi fits so perfectly into the niche of managing dotfiles.

    \u2014 @mike_kasberg

    Quote

    I had initially been turned off when I first encountered [chezmoi], because [chezmoi] seemed overkill for (what appeared to me) a simple task.

    But the problem of managing a relatively small number of dotfiles across a relatively small number of machines with small differences between them and keeping them up to date proved to be MUCH more complex than I imagined. Copy things around by hand, and then later distributing them via source control got hairy very quickly.

    I finally realized all those features were absolutely necessary to manage things sanely, and once I took some time to learn how to do things with chezmoi, I have never looked back.

    \u2014 njt

    Quote

    Regular reminder that chezmoi is the best dotfile manager utility I've used and you can too

    \u2014 @mbbroberg

    If you're using any of the following methods:

    • A custom shell script.

    • An existing dotfile manager like dotbot, rcm, homesick, vcsh, yadm, or GNU Stow.

    • A bare git repo.

    Then you've probably run into at least one of the following problems.

    "},{"location":"why-use-chezmoi/#if-coping-with-differences-between-machines-requires-extra-effort","title":"...if coping with differences between machines requires extra effort","text":"

    If you want to synchronize your dotfiles across multiple operating systems or distributions, then you may need to manually perform extra steps to cope with differences from machine to machine. You might need to run different commands on different machines, maintain separate per-machine files or branches (with the associated hassle of merging, rebasing, or copying each change), or hope that your custom logic handles the differences correctly.

    chezmoi uses a single source of truth (a single branch) and a single command that works on every machine. Individual files can be templates to handle machine to machine differences, if needed.

    "},{"location":"why-use-chezmoi/#if-you-have-to-keep-your-dotfiles-repo-private","title":"...if you have to keep your dotfiles repo private","text":"

    Quote

    And regarding dotfiles, I saw that. It's only public dotfiles repos so I have to evaluate my dotfiles history to be sure. I have secrets scanning and more, but it was easier to keep it private for security, I'm ok mostly though. I'm using chezmoi and it's easier now

    \u2014 @sheldon_hull

    If your system stores secrets in plain text, then you must be very careful about where you clone your dotfiles. If you clone them on your work machine then anyone with access to your work machine (e.g. your IT department) will have access to your home secrets. If you clone it on your home machine then you risk leaking work secrets.

    With chezmoi you can store secrets in your password manager or encrypt them, and even store passwords in different ways on different machines. You can clone your dotfiles repository anywhere, and even make your dotfiles repo public, without leaving personal secrets on your work machine or work secrets on your personal machine.

    "},{"location":"why-use-chezmoi/#if-you-have-to-maintain-your-own-tool","title":"...if you have to maintain your own tool","text":"

    Quote

    I've offloaded my dotfiles deployment from a homespun shell script to chezmoi. I'm quite happy with this decision.

    \u2014 @gotgenes

    Quote

    I discovered chezmoi and it's pretty cool, just migrated my old custom multi-machine sync dotfile setup and it's so much simpler now

    in case you're wondering I have written 0 code

    \u2014 @buritica

    Quote

    Chezmoi is like what you might get if you re-wrote my bash script in Go, came up with better solutions than diff for managing config on multiple machines, added in secrets management and other useful dotfile tools, and tweaked and perfected it over years.

    • @mike_kasberg

    If your system was written by you for your personal use, then it probably has the functionality that you needed when you wrote it. If you need more functionality then you have to implement it yourself.

    chezmoi includes a huge range of battle-tested functionality out-of-the-box, including dry-run and diff modes, script execution, conflict resolution, Windows support, and much, much more. chezmoi is used by thousands of people and has a rich suite of both unit and integration tests. When you hit the limits of your existing dotfile management system, chezmoi already has a tried-and-tested solution ready for you to use.

    "},{"location":"why-use-chezmoi/#if-setting-up-your-dotfiles-requires-more-than-one-short-command","title":"...if setting up your dotfiles requires more than one short command","text":"

    If your system is written in a scripting language like Python, Perl, or Ruby, then you also need to install a compatible version of that language's runtime before you can use your system.

    chezmoi is distributed as a single stand-alone statically-linked binary with no dependencies that you can simply copy onto your machine and run. You don't even need git installed. chezmoi provides one-line installs, pre-built binaries, packages for Linux and BSD distributions, Homebrew formulae, Scoop and Chocolatey support on Windows, and a initial config file generation mechanism to make installing your dotfiles on a new machine as painless as possible.

    "},{"location":"developer-guide/","title":"Developer guide","text":"

    Warning

    If you use an LLM (Large Language Model, like ChatGPT, Claude, Gemini, GitHub Copilot, or Llama) to make a contribution then you must say so in your contribution and you must carefully review your contribution for correctness before sharing it. If you share un-reviewed LLM-generated content then you will be immediately banned. See CODE_OF_CONDUCT.md for more information.

    chezmoi is written in Go and development happens on GitHub. chezmoi is a standard Go project, using standard Go tooling. chezmoi requires Go 1.23 or later.

    Checkout chezmoi:

    git clone https://github.com/twpayne/chezmoi.git\ncd chezmoi\n

    Build chezmoi:

    go build\n

    Run all tests:

    go test ./...\n

    chezmoi's tests include integration tests with other software. If the other software is not found in $PATH the tests will be skipped. Running the full set of tests requires age, base64, bash, bzip2, git, gpg, gzip, perl, python3, rage, ruby, sed, sha256sum, tr, true, unzip, xz, zip, and zstd.

    Run chezmoi:

    go run .\n

    Run a set of smoke tests, including cross-compilation, tests, and linting:

    make smoke-test\n

    Test building chezmoi for all architectures:

    make test-release\n

    Hint

    If you use fish as your primary shell, you may get warnings from Fish during tests:

    error: can not save history\nwarning-path: Unable to locate data directory derived from $HOME: '/home/user/.local/share/fish'.\nwarning-path: The error was 'Operation not supported'.\nwarning-path: Please set $HOME to a directory where you have write access.\n

    These can be avoided with by running tests with SHELL=bash or SHELL=zsh:

    SHELL=bash make test\nSHELL=zsh make smoke-test\nSHELL=bash go test ./...\n
    "},{"location":"developer-guide/architecture/","title":"Architecture","text":"

    This document gives a high-level overview of chezmoi's source code for anyone interested in contributing to chezmoi.

    You can generate Go documentation for chezmoi's source code with go doc, for example:

    go doc -all -u github.com/twpayne/chezmoi/v2/internal/chezmoi\n

    You can also browse chezmoi's generated documentation online.

    "},{"location":"developer-guide/architecture/#directory-structure","title":"Directory structure","text":"

    The important directories in chezmoi are:

    Directory Contents assets/chezmoi.io/docs/ The documentation single source of truth. Help text, examples, and the chezmoi.io website are generated from the files in this directory internal/chezmoi/ chezmoi's core functionality internal/cmd/ Code for the chezmoi command internal/cmd/testdata/scripts/ High-level tests of chezmoi's commands using testscript"},{"location":"developer-guide/architecture/#key-concepts","title":"Key concepts","text":"

    As described in the reference manual, chezmoi evaluates the source state to compute a target state for the destination directory (typically your home directory). It then compares the target state to the actual state of the destination directory and performs any changes necessary to update the destination directory to match the target state. These concepts are represented directly in chezmoi's code.

    chezmoi uses the generic term entry to describe something that it manages. Entries can be files, directories, symlinks, scripts, amongst other things.

    "},{"location":"developer-guide/architecture/#internalchezmoi-directory","title":"internal/chezmoi/ directory","text":"

    All of chezmoi's interaction with the operating system is abstracted through the System interface. A System includes functionality to read and write files and directories and execute commands. chezmoi makes a distinction between idempotent commands that can be run multiple times without modifying the underlying system and arbitrary commands that may modify the underlying system.

    The real underlying system is implemented via a RealSystem struct. Other Systems are composed on top of this to provide further functionality. For example, the --debug flag is implemented by wrapping the RealSystem with a DebugSystem that logs all calls to the underlying RealSystem. --dry-run is implemented by wrapping the RealSystem with a DryRunSystem that allows reads to pass through but silently discards all writes.

    The SourceState struct represents a source state, including reading a source state from the source directory, executing templates, applying the source state (i.e. updating a System to match the desired source state), and adding more entries to the source state.

    Entries in the source state are abstracted by the SourceStateEntry interface implemented by the SourceStateFile and SourceStateDir structs, as the source state only consists of regular files and directories.

    A SourceStateFile includes a FileAttr struct describing the attributes parsed from its file name. Similarly, a SourceStateDir includes a DirAttr struct describing the directory attributes parsed from a directory name.

    SourceStateEntrys can compute their target state entries, i.e. what the equivalent entry should be in the target state, abstracted by the TargetStateEntry interface.

    Actual target state entries include TargetStateFile structs, representing a file with contents and permissions, TargetStateDir structs, representing a directory, TargetStateSymlink for symlinks, TargetStateRemove for entries that should be removed, and TargetStateScript for scripts that should be run.

    The actual state of an entry in the target state is abstracted via the ActualStateEntry interface, with ActualStateAbsent, ActualStateDir, ActualStateFile, ActualStateSymlink structs implementing this interface.

    Finally, an EntryState struct represents a serialization of an ActualEntryState for storage in and retrieval from chezmoi's persistent state. It stores a SHA256 of the entry's contents, rather than the full contents, to avoid storing secrets in the persistent state.

    With these concepts, chezmoi's apply command is effectively:

    1. Read the source state from the source directory.

    2. For each entry in the source state (SourceStateEntry), compute its TargetStateEntry and read its actual state in the destination state (ActualStateEntry).

    3. If the ActualStateEntry is not equivalent to the TargetStateEntry then apply the minimal set of changes to the ActualStateEntry so that they are equivalent.

    Furthermore, chezmoi stores the EntryState of each entry that it writes in its persistent state. chezmoi can then detect if a third party has updated a target since chezmoi last wrote it by comparing the actual state entry in the target state with the entry state in the persistent state.

    "},{"location":"developer-guide/architecture/#internalcmd-directory","title":"internal/cmd/ directory","text":"

    internal/cmd/*cmd.go files contain the code for each individual command. internal/cmd/*templatefuncs.go files contain the template functions.

    Commands are defined as methods on the Config struct. The Config struct is large, containing all configuration values read from the config file, command line arguments, and computed and cached values.

    The Config.persistentPreRunRootE and Config.persistentPostRunRootE methods set up and tear down state for individual commands based on the command's Annotations field, which defines how the command interacts with the file system and persistent state.

    "},{"location":"developer-guide/architecture/#path-handling","title":"Path handling","text":"

    chezmoi uses separate types for absolute paths (AbsPath) and relative paths (RelPath) to avoid errors where paths are combined (e.g. joining two absolute paths is an error). The type SourceRelPath is a relative path within the source directory and handles file and directory attributes.

    Internally, chezmoi normalizes all paths to use forward slashes with an optional upper-cased Windows volume so they can be compared with string comparisons. Paths read from the user may include tilde (~) to represent the user's home directory, use forward or backward slashes, and are treated as external paths (ExtPath). These are normalized to absolute paths. chezmoi is case-sensitive internally and makes no attempt to handle case-insensitive or case-preserving filesystems.

    "},{"location":"developer-guide/architecture/#persistent-state","title":"Persistent state","text":"

    Persistent state is treated as a two-level key-value store with the pseudo-structure map[Bucket]map[Key]Value, where Bucket, Key, and Value are all []bytes. The PersistentState interface defines interaction with them. Sometimes temporary persistent states are used. For example, in dry run mode (--dry-run) the actual persistent state is copied into a temporary persistent state in memory which remembers writes but does not persist them to disk.

    "},{"location":"developer-guide/architecture/#encryption","title":"Encryption","text":"

    Encryption tools are abstracted by the Encryption interface that contains methods of encrypting and decrypting files and []bytes. Implementations are the AGEEncryption and GPGEncryption structs. A DebugEncryption struct wraps an Encryption interface and logs the methods called.

    "},{"location":"developer-guide/architecture/#run_once_-and-run_onchange_-scripts","title":"run_once_ and run_onchange_ scripts","text":"

    The execution of a run_once_ script is recorded by storing the SHA256 of its contents in the scriptState bucket in the persistent state. On future invocations the script is only run if no matching contents SHA256 is found in the persistent state.

    The execution of a run_onchange_ script is recorded by storing its target name in the entryState bucket along with its contents SHA256 sum. On future invocations the script is only run if its contents SHA256 sum has changed, and its contents SHA256 sum is then updated in the persistent state.

    "},{"location":"developer-guide/architecture/#testing","title":"Testing","text":"

    chezmoi has a mix of, unit, integration, and end-to-end tests. Unit and integration tests use the github.com/alecthomas/assert/v2 framework. End-to-end tests use github.com/rogpeppe/go-internal/testscript with the test scripts themselves in internal/cmd/testdata/scripts/$TEST_NAME.txtar.

    You can run individual end-to-end tests with

    go test ./internal/cmd -run=TestScript/$TEST_NAME\n

    Tests should, if at all possible, run unmodified on all operating systems tested in CI (Linux, macOS, Windows, and FreeBSD). Windows will sometimes need special handling due to its path separator and lack of POSIX-style file permissions.

    "},{"location":"developer-guide/building-on-top-of-chezmoi/","title":"Building on top of chezmoi","text":"

    chezmoi is designed with UNIX-style composability in mind, and the command line tool is semantically versioned. Building on top of chezmoi should primarily be done by executing the chezmoi binary with arguments and the standard input and output configured appropriately. The chezmoi dump and chezmoi state commands allows the inspection of chezmoi's internal state.

    "},{"location":"developer-guide/contributing-changes/","title":"Contributing changes","text":"

    Bug reports, bug fixes, and documentation improvements are always welcome. Please open an issue or create a pull request with your report, fix, or improvement.

    If you want to make a more significant change, please first open an issue to discuss the change that you want to make. Dave Cheney gives a good rationale as to why this is important.

    All changes are made via pull requests. In your pull request, please make sure that:

    • All existing tests pass. You can ensure this by running make test.

    • There are appropriate additional tests that demonstrate that your PR works as intended.

    • The documentation is updated, if necessary. For new features you should add an entry in assets/chezmoi.io/docs/user-guide/ and a complete description in assets/chezmoi.io/docs/reference/. See website for instructions on how to build and view a local version of the documentation.

    • All generated files are up to date. You can ensure this by running make generate and including any modified files in your commit.

    • The code is correctly formatted, according to gofumpt. You can ensure this by running make format.

    • The code passes golangci-lint. You can ensure this by running make lint.

    • The commit messages follow the conventional commits specification. chezmoi's release notes are generated directly from the commit messages. For trivial or user-invisible changes, please use the prefix chore:.

    • Commits are logically separate, with no merge or \"fixup\" commits.

    • The branch applies cleanly to master.

    "},{"location":"developer-guide/install-script/","title":"Install script","text":"

    chezmoi generates the install script from a single source of truth. You must run

    go generate\n

    if your change includes any of the following:

    • Modifications to the install script template.

    • Additions or modifications to the list of supported OSs and architectures.

    chezmoi's continuous integration verifies that all generated files are up to date. Changes to generated files should be included in the commit that modifies the source of truth.

    "},{"location":"developer-guide/packaging/","title":"Packaging","text":"

    If you're packaging chezmoi for an operating system or distribution:

    chezmoi has no build dependencies other than the standard Go toolchain.

    chezmoi has no runtime dependencies, but is usually used with git, so many packagers choose to make git an install dependency or recommended package.

    Please set the version number, git commit, and build time in the binary. This greatly assists debugging when end users report problems or ask for help. You can do this by passing the following flags to go build:

    -ldflags \"-X main.version=$VERSION\n          -X main.commit=$COMMIT\n          -X main.date=$DATE\n          -X main.builtBy=$BUILT_BY\"\n

    $VERSION should be the chezmoi version, e.g. 1.7.3. Any v prefix is optional and will be stripped, so you can pass the git tag in directly.

    Hint

    The command git describe --abbrev=0 --tags will return a suitable value for $VERSION.

    $COMMIT should be the full git commit hash at which chezmoi is built, e.g. 4d678ce6850c9d81c7ab2fe0d8f20c1547688b91.

    Hint

    The assets/scripts/generate-commit.go script will return a suitable value for $COMMIT. You can run it with go run assets/scripts/generate-commit.go.

    Hint

    The source archive contains a file called COMMIT containing the commit hash.

    $DATE should be the date of the build as a UNIX timestamp or in RFC3339 format.

    Hint

    The command git show -s --format=%ct HEAD returns the UNIX timestamp of the last commit, e.g. 1636668628.

    The command date -u +%Y-%m-%dT%H:%M:%SZ returns the current time in RFC3339 format, e.g. 2019-11-23T18:29:25Z.

    $BUILT_BY should be a string indicating what system was used to build the binary. Typically it should be the name of your packaging system, e.g. homebrew.

    Please enable cgo, if possible. chezmoi can be built and run without cgo, but the .chezmoi.username and .chezmoi.group template variables may not be set correctly on some systems.

    chezmoi includes an upgrade command which attempts to self-upgrade. You can remove this command completely by building chezmoi with the noupgrade build tag.

    chezmoi includes shell completions in the completions directory. Please include these in the package and install them in the shell-appropriate directory, if possible.

    If the instructions for installing chezmoi in chezmoi's install guide are absent or incorrect, please open an issue or submit a PR to correct them.

    "},{"location":"developer-guide/releases/","title":"Releases","text":"

    Releases are managed with goreleaser.

    "},{"location":"developer-guide/releases/#testing","title":"Testing","text":"

    To build a test release, without publishing, (Ubuntu Linux only) first ensure that the musl-tools and snapcraft packages are installed:

    sudo apt-get install musl-tools snapcraft\n

    Then run:

    make test-release\n
    "},{"location":"developer-guide/releases/#publishing","title":"Publishing","text":"

    Publish a new release by creating and pushing a tag, for example:

    git tag v1.2.3\ngit push --tags\n

    This triggers a GitHub Action that builds and publishes archives, packages, and snaps, creates a new GitHub Release, and deploys the website.

    Note

    Publishing Snaps requires a SNAPCRAFT_STORE_CREDENTIALS repository secret.

    Snapcraft store credentials periodically expire. Create new snapcraft store credentials by running:

    snapcraft export-login --snaps=chezmoi --channels=stable,candidate,beta,edge --acls=package_upload -\n

    Note

    brew automation will automatically detect new releases of chezmoi within a few hours and open a pull request in github.com/Homebrew/homebrew-core to bump the version.

    If needed, the pull request can be created with:

    brew bump-formula-pr --tag=v1.2.3 chezmoi\n

    Note

    chezmoi is in Scoop's Main bucket. Scoop's automation will automatically detect new releases within a few hours.

    "},{"location":"developer-guide/releases/#signing","title":"Signing","text":"

    chezmoi uses GoReleaser's support for signing to sign the checksums of its release assets with cosign.

    Details:

    • The cosign private key was generated with cosign v1.12.1 on a private recently-installed Ubuntu 22.04.1 system with a single user and all available updates applied.

    • The private key uses a long (more than 32 character) password generated locally by a password manager.

    • The password-protected private key is stored in chezmoi's public GitHub repo.

    • The private key's password is stored as a GitHub Actions secret and only available to the release step of release job of the main workflow.

    • The cosign public key is included in the release assets and also uploaded to https://chezmoi.io/cosign.pub. Since https://chezmoi.io is served by GitHub pages, it probably has equivalent security to chezmoi's GitHub Releases page, which is also managed by GitHub.

    "},{"location":"developer-guide/security/","title":"Security","text":""},{"location":"developer-guide/security/#supported-versions","title":"Supported versions","text":"

    Only the most recent version of chezmoi is supported with security updates.

    "},{"location":"developer-guide/security/#virus-scanner-false-positives","title":"Virus scanner false positives","text":"

    Virus scanning software, especially on Windows machines, occasionally report viruses or trojans in the chezmoi binary. This is almost certainly a false positive.

    For more information see Why does my virus-scanning software think my Go distribution or compiled binary is infected? in the Go FAQ.

    "},{"location":"developer-guide/security/#reporting-a-vulnerability","title":"Reporting a vulnerability","text":"

    Please report vulnerabilities by opening a GitHub issue or sending an email to twpayne+chezmoi-security@gmail.com.

    "},{"location":"developer-guide/testing/","title":"Testing","text":"

    chezmoi uses multiple levels of testing:

    1. Unit testing, using testing, and github.com/alecthomas/assert/v2, tests that functions and small components behave as expected for a wide range of inputs, especially edge cases. These are generally found in internal/chezmoi/*_test.go.

    2. Filesystem integration tests, using testing and github.com/twpayne/go-vfs/v5, test chezmoi's effects on the filesystem. This include some tests in internal/chezmoi/*_test.go, and higher level command tests in internal/cmd/*cmd_test.go.

    3. High-level integration tests using github.com/rogpeppe/go-internal/testscript are in internal/cmd/testdata/scripts/*.txtar and are run by internal/cmd/main_test.go.

    4. Linux distribution and OS tests run the full test suite using Docker for different Linux distributions (in assets/docker) and Vagrant for different OSes (in assets/vagrant). Windows tests are run in GitHub Actions.

    "},{"location":"developer-guide/using-make/","title":"Building and installing with make","text":"

    chezmoi can be built with GNU make, assuming you have the Go toolchain installed.

    Running make will build a chezmoi binary in the current directory for the host OS and architecture. To embed version information in the binary and control installation the following variables are available:

    Variable Example Purpose $VERSION v2.0.0 Set version $COMMIT 3895680a... Set the git commit at which the code was built $DATE 2019-11-23T18:29:25Z The time of the build $BUILT_BY homebrew The packaging system performing the build $PREFIX /usr Installation prefix $DESTDIR install-root Fake installation root

    Running make install will install the chezmoi binary in ${DESTDIR}${PREFIX}/bin.

    "},{"location":"developer-guide/website/","title":"Website","text":"

    The website is generated with Material for MkDocs from the contents of the assets/chezmoi.io/docs/ directory. It is hosted by GitHub pages from the gh-pages branch.

    To build the website locally, Go 1.23 (or later) and uv 0.4.15 (or later) must be installed. Python 3.10 (or later) is required, but may be installed with uv:

    If Python 3.10 (or later) is not currently installed, install it with uv:

    uv python install 3.10\n

    Install the dependencies (the --frozen is optional but recommended):

    uv sync --frozen\n

    Test the website locally by running:

    uv run task serve-docs\n

    and visiting http://127.0.0.1:8000/.

    "},{"location":"developer-guide/website/#maintainers","title":"Maintainers","text":"

    The website is automatically deployed when new releases are created, but manual deployments can be triggered by maintainers with appropriate access using:

    uv run task mkdocs gh-deploy\n
    "},{"location":"links/articles/","title":"Articles","text":"

    Tip

    Recommended article: Fedora Magazine: Take back your dotfiles with Chezmoi

    Date Version Language Title 2024-12-19 2.56.0 JP chezmoi\u3067dotfiles\u3092\u7ba1\u7406\u3059\u308b 2024-12-18 2.56.0 EN Exploring Tools For Managing Your Dotfiles 2024-12-02 2.55.0 JP chezmoi\u3092\u4f7f\u3063\u305f\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\u7206\u901f\u69cb\u7bc9 2024-11-19 2.54.0 AR \u0634\u064a\u0645\u0648\u0627 (chezmoi) \u0628\u0628\u0633\u0627\u0637\u0629 2024-11-16 2.54.0 EN Swapping to Chezmoi 2024-11-07 2.53.1 EN dotfiles management: chezmoi 2024-01-07 2.52.3 EN How I manage Neovim configuration with Chezmoi 2024-09-15 2.52.2 EN Cross-Platform Dotfiles with Chezmoi, Nix, Brew, and Devpod 2024-09-09 2.52.2 EN Keeping your Dotfiles in Sync and your Secrets in Gopass 2024-09-08 2.52.1 EN Managing dotfiles with chezmoi 2024-08-30 2.52.1 JP dotfiles\u7ba1\u7406\u3092chezmoi\u306b\u79fb\u884c\u3059\u308b 2024-07-31 2.51.0 EN Managing dotfiles with chezmoi 2024-07-28 2.51.0 EN Development Environment Setup with Chezmoi 2024-06-26 2.49.1 EN Automate Your Dotfiles with Chezmoi 2024-05-27 2.48.1 EN Managing Dotfiles with Chezmoi 2024-05-01 2.48.0 TH \u0e08\u0e31\u0e14\u0e01\u0e32\u0e23 dotfiles \u0e14\u0e49\u0e27\u0e22 chezmoi 2024-04-27 2.48.0 CN \u4f7f\u7528 chezmoi & vscode, \u7ba1\u7406\u4f60\u7684 dotfiles 2024-04-24 2.47.4 EN Chezmoi: Manage Your Dotfiles Across Multiple Linux Systems 2024-03-25 2.47.2 EN Whatever happened to dotfiles? 2024-03-23 2.47.2 EN A tour around chezmoi 2024-03-23 2.47.2 CN \u4f7f\u7528 chezmoi & vscode, \u7ba1\u7406\u4f60\u7684 dotfiles 2024-03-11 2.47.1 CN Chezmoi\uff1a\u512a\u96c5\u7ba1\u7406Linux\u7684dotfile\uff0c\u4f7f\u7528Git\u5132\u5b58\u5eab\u5099\u4efd\uff0c\u985e\u4f3cGNU Stow 2024-03-02 2.47.0 EN The Ultimate Dotfiles Management Tool 2024-02-25 2.47.0 EN Atuin and chezmoi are the dog's bollocks 2024-01-07 2.43.0 EN Chezmore Chezmoi 2023-12-23 2.42.3 DE Lokale Kofigurationsdateien sicher mit chezmoi und Git synchronisieren 2023-12-18 2.42.3 JP chezmoi \u7ba1\u7406\u306edotfiles \u3067\u30de\u30b7\u30f3\u6bce\u306b\u8a2d\u5b9a\u3092\u5909\u3048\u305f\u3044 2023-12-17 2.42.3 JP chezmoi \u3092 \u30b5\u30d6\u30de\u30b7\u30f3\u306b\u3082\u5c0e\u5165\u3059\u308b 2023-12-16 2.42.3 JP chezmoi \u3092\u4f7f\u3063\u305f dotfiles \u306e\u7ba1\u7406\u65b9\u6cd5 2023-12-10 2.42.2 JP chezmoi \u3067 dotfiles \u3092\u7ba1\u7406\u3059\u308b\u3068\u304d\u306b\u4fbf\u5229\u306a\u6a5f\u80fd\u306b\u3064\u3044\u3066\u307e\u3068\u3081\u308b 2023-10-29 2.40.4 CN \u7528 chezmoi \u7ba1\u7406 dotfiles 2023-09-13 2.39.1 JP \u8907\u6570OS\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u308bchezmoi\u3092\u4f7f\u3063\u3066dotfiles\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3059\u308b 2023-09-07 2.39.1 JP \u3010chezmoi\u3011dotfile\u306e\u30bb\u30ad\u30e5\u30a2\u306a\u5024\u3092dashlane\u304b\u3089\u53c2\u7167\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b 2023-08-05 2.36.1 EN Dotfiles with chezmoi 2023-06-14 2.34.1 RU chezmoi 2023-05-16 2.33.6 JP chezmoi 2023-04-29 2.33.1 JP chezmoi \u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u6a5f\u80fd\u3092\u4f7f\u3063\u3066\u30b7\u30a7\u30eb\u306e\u8d77\u52d5\u3092\u9ad8\u901f\u5316\u3059\u308b 2023-04-26 2.33.1 EN Managing my /home directory 2023-04-15 2.33.1 JP dotfiles \u306e\u7ba1\u7406\u306b chezmoi \u3092\u5c0e\u5165\u3057\u3066 fswatch \u3067\u81ea\u52d5 apply \u3067\u304d\u308b\u3088\u3046\u306b\u3057\u305fg 2023-04-08 2.33.1 KR chezmoi, \ubcf8\uaca9\uc801\uc73c\ub85c \ud65c\uc6a9\ud558\uae30 2023-03-25 2.33.0 KR chezmoi, \uc138\uc0c1 \ud3b8\ub9ac\ud558\uac8c dotfile \uad00\ub9ac\ud558\uae30 2023-03-17 2.32.0 EN Automating the Setup of a New Mac With All Your Apps, Preferences, and Development Tools 2023-03-21 2.32.0 JP AWS CLI \u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092 chezmoi \u3068Bitwarden \u3067\u7ba1\u7406\u3059\u308b 2023-02-26 2.31.0 EN Managing dotfiles with chezmoi 2023-01-22 2.29.3 EN Managing dotfiles 2023-01-22 2.29.3 JP dotfile manager \u306e chezmoi \u306b\u79fb\u884c\u3057\u3066\u307f\u308b 2023-01-13 2.29.1 EN Making the most out of distrobox and toolbx 2023-01-12 2.29.1 JP Chezmoi\u3067\u304b\u3093\u305f\u3093\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0dotfiles\u7ba1\u7406\u306e\u30b9\u30b9\u30e1 2023-01-05 2.29.1 JP \u65e2\u5b58\u306e dotfiles \u3092 chezmoi \u3067\u7ba1\u7406\u3059\u308b 2022-09-28 2.24.0 EN Shit Hot Dotfiles 2022-09-13 2.22.1 IT Come installare Chezmoi: gestisci in modo sicuro i dotfile su pi\u00f9 macchine 2022-08-11 2.20.0 EN Chezmoi - a very cool tool to manage your dotfiles 2022-08-05 2.20.0 CN \u4f7f\u7528chezmoi\u7ba1\u7406dotfiles 2022-06-11 2.17.1 JP chezmoi \u3067 Linux \u3068 macOS \u4e21\u65b9\u3067\u4f7f\u3048\u308b dotfiles \u3092\u4f5c\u308b 2022-06-02 2.17.1 EN Local Env as Code: Is it possible yet 2022-05-16 2.16.0 EN Chezmoi for DotFiles 2022-04-25 2.15.1 EN Easily moving Linux installs 2022-03-13 2.14.0 EN Tools I love: Chezmoi 2022-03-03 2.13.0 EN Local Environment-as-Code: Is It Possible Yet? 2022-02-22 2.12.1 JP chezmoi \u3092\u4f7f\u3063\u3066 VSCode devcontainer \u5bfe\u5fdc dotfiles \u3092\u4f5c\u308b 2022-02-17 2.12.0 ES Qu\u00e9 son y c\u00f3mo gestionar archivos dotfiles con chezmoi 2022-02-12 2.11.2 EN How To Manage Dotfiles With Chezmoi 2022-02-02 2.11.0 FR Controler ses dotfiles en environnement \u00e9ph\u00e9m\u00e8re 2022-02-01 2.10.1 JP chezmoi \u3067 dotfiles \u3092\u624b\u8efd\u306b\u67d4\u8edf\u306b\u30bb\u30ad\u30e5\u30a2\u306b\u7ba1\u7406\u3059\u308b 2022-01-26 2.10.1 JP chezmoi \u3067 dotfiles \u3092\u7ba1\u7406\u3059\u308b 2022-01-12 2.9.5 IT Come funzionano i miei Mac 2021-12-23 2.9.3 EN Use Chezmoi to guarantee idempotency of terminal 2021-12-20 2.9.3 EN How chezmoi Implements Cross-Platform CI 2021-12-13 2.9.3 EN Managing Dotfiles With Chezmoi 2021-12-04 2.9.2 EN Advanced features of Chezmoi 2021-12-01 2.9.1 EN Chezmoi 2 2021-11-26 2.8.0 EN Weekly Journal 47 - chezmoi, neovim 2021-10-26 2.7.3 RU \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a 2021-10-25 2.7.3 EN Share credentials across machines using chezmoi and bitwarden 2021-09-18 2.1.2 EN PBS 125 of X \u2014 Chezmoi on Multiple Computers 2021-09-14 2.2.0 EN Managing preference plists under Chezmoi 2021-09-06 2.2.0 EN chezmoi dotfile management 2021-09-04 2.2.0 EN Configuration Management 2021-09-04 2.1.2 EN PBS 124 of X \u2014 Chezmoi Templates 2021-08-22 2.1.2 EN PBS 123 of X \u2014 Backing up and Syncing Dot Files with Chezmoi 2021-08-08 2.1.2 EN PBS 122 of X \u2014 Managing Dot Files with Chezmoi 2021-08-04 2.1.2 PT Como instalar o Chezmoi, um gerenciador de dotfiles, no Ubuntu, Linux Mint, Fedora, Debian 2021-07-23 2.1.2 EN PBS 121 of X \u2014 Managing Dot Files and an Introduction to Chezmoi 2021-07-15 2.1.2 CN \u4f7f\u7528Chezmoi\u7ba1\u7406\u914d\u7f6e\u6587\u4ef6 2021-05-14 2.0.12 EN A brief history of my dotfile management 2021-05-12 2.0.12 EN My Dotfiles Story: A Journey to Chezmoi 2021-05-10 2.0.11 EN Development Environment (2021) 2021-04-08 2.0.9 FR Bienvenue chez moi 2021-04-01 2.0.7 EN ChezMoi 2021-02-17 1.8.11 JP chezmoi \u3067 dotfiles \u3092\u624b\u8efd\u306b\u67d4\u8edf\u306b\u30bb\u30ad\u30e5\u30a2\u306b\u7ba1\u7406\u3059\u308b 2021-02-07 1.8.10 JP chezmoi\u59cb\u3081\u305f 2021-01-29 1.8.10 CN \u7528 Chezmoi \u7ba1\u7406\u914d\u7f6e\u6587\u4ef6 2021-01-12 1.8.10 EN Automating the Setup of a New Mac With All Your Apps, Preferences, and Development Tools 2020-11-06 1.8.8 EN Chezmoi \u2013 Securely Manage dotfiles across multiple machines 2020-11-05 1.8.8 EN Using chezmoi to manage dotfiles 2020-10-05 1.8.6 EN Dotfiles with Chezmoi 2020-10-03 1.8.6 EN Chezmoi Merging 2020-08-13 1.8.3 EN Using BitWarden and Chezmoi to manage SSH keys 2020-08-09 1.8.3 EN Automating and testing dotfiles 2020-08-03 1.8.3 EN Automating a Linux in Windows Dev Setup 2020-07-03 1.8.3 EN Feeling at home in a LXD container 2020-06-15 1.8.2 EN Dotfiles management using chezmoi - How I Use Linux Desktop at Work Part5 2020-04-27 1.8.0 EN Managing my dotfiles with chezmoi 2020-04-20 1.8.0 FR Gestion des dotfiles et des secrets avec chezmoi 2020-04-19 1.7.19 FR Git & dotfiles : versionner ses fichiers de configuration 2020-04-16 1.7.19 FR Chezmoi, visite guid\u00e9e 2020-04-17 1.7.17 CN \u7528 Chezmoi \u53d6\u56de\u4f60\u7684\u70b9\u6587\u4ef6 2020-04-03 1.7.17 EN Fedora Magazine: Take back your dotfiles with Chezmoi 2020-04-01 1.7.17 EN Managing dotfiles and secret with chezmoi 2019-01-10 0.0.11 EN Linux Fu: The kitchen sync"},{"location":"links/dotfile-repos/","title":"Dotfile repos","text":"
    • GitHub

    • GitLab

    • Codeberg

    "},{"location":"links/podcasts/","title":"Podcasts","text":"

    Tip

    Recommended podcast: Managing Dot Files and an Introduction to Chezmoi

    Date Version Language Title 2024-10-17 2.52.4 EN Releasing more BSDs 2023-05-22 2.33.6 ES 491 - Tres herramientas que han revolucionado mi terminal Linux 2023-01-30 2.29.3 ES 459 - Soy un zoquete, otra vez hice un rm -rf 2022-05-27 2.17.0 EN F\u00e9d\u00e9rer une communaut\u00e9 technique autour d'un projet Open Source 2022-03-11 2.14.0 EN The Real Python Podcast: Episode 101: Tools for Setting Up Python on a New Machine 2021-09-18 2.1.2 EN CCATP #699 \u2013 Bart Busschots on PBS 125 of X \u2013 Chezmoi on Multiple Computers 2021-09-04 2.1.2 EN CCATP #698 \u2013 Bart Busschots on PBS 124 of X \u2013 Chezmoi Templates 2021-08-22 2.1.2 EN CCATP #696 \u2013 Bart Busschots on PBS 123 of X \u2014 Backing up and Syncing Dot Files with Chezmoi 2021-08-08 2.1.2 EN CCATP #695 \u2013 Bart Busschots on PBS 122 \u2013 Managing Dot Files with Chezmoi 2021-07-23 2.1.2 EN CCATP #693 \u2013 Bart Busschots on PBS 121 of X \u2014 Managing Dot Files and an Introduction to Chezmoi 2019-11-20 1.7.2 EN FLOSS weekly episode 556: chezmoi"},{"location":"links/related-software/","title":"Related software","text":""},{"location":"links/related-software/#editor-integration","title":"Editor integration","text":""},{"location":"links/related-software/#githubcomandre-kotakenvim-chezmoi","title":"github.com/andre-kotake/nvim-chezmoi","text":"

    A NeoVim plugin that integrates with chezmoi.

    "},{"location":"links/related-software/#githubcomalker0chezmoivim","title":"github.com/alker0/chezmoi.vim","text":"

    Intelligent VIM syntax highlighting when editing files in your source directory. Works with both chezmoi edit and editing files directly.

    "},{"location":"links/related-software/#githubcomtuh8888chezmoiel","title":"github.com/tuh8888/chezmoi.el","text":"

    Convenience functions for interacting with chezmoi in Emacs.

    "},{"location":"links/related-software/#githubcomliljavim-chezmoi","title":"github.com/Lilja/vim-chezmoi","text":"

    A plugin for VIM to apply the dotfile you are editing on :w.

    "},{"location":"links/related-software/#githubcomxvzcchezmoinvim","title":"github.com/xvzc/chezmoi.nvim","text":"

    Edit your chezmoi-managed files and automatically apply.

    "},{"location":"links/related-software/#httpsgithubcomgiannibyoungchezmoi-telescopenvim","title":"https://github.com/GianniBYoung/chezmoi-telescope.nvim","text":"

    Custom Telescope Picker for Chez Moi Managed Dot files.

    "},{"location":"links/related-software/#other","title":"Other","text":""},{"location":"links/related-software/#atuinsh","title":"atuin.sh","text":"

    Sync, search and backup shell history .

    "},{"location":"links/related-software/#githubcomb3nj5m1nxdg-ninja","title":"github.com/b3nj5m1n/xdg-ninja","text":"

    A shell script which checks your $HOME for unwanted files and directories.

    "},{"location":"links/related-software/#githubcomhussainwebansible-role-chezmoi","title":"github.com/hussainweb/ansible-role-chezmoi","text":"

    Installs chezmoi on Ubuntu and Debian servers.

    "},{"location":"links/related-software/#githubcomjohan-weitnerchezmoi-ui","title":"github.com/johan-weitner/chezmoi-ui","text":"

    A web UI for managing a list of apps to seed/feed a chezmoi setup.

    "},{"location":"links/related-software/#githubcomjokeasdf-chezmoi","title":"github.com/joke/asdf-chezmoi","text":"

    chezmoi plugin for asdf version manager.

    "},{"location":"links/related-software/#githubcomtcaxledrapeau","title":"github.com/tcaxle/drapeau","text":"

    An add-on to synchronize your colorschemes across systems and allow easy colorscheme switching using chezmoi templates.

    "},{"location":"links/related-software/#githubcomvorpalbladechezmoi_modify_manager","title":"github.com/VorpalBlade/chezmoi_modify_manager","text":"

    An add-on to deal with config files that contain a mix of settings and transient state, such as with GUI program settings files also containing recently used files and window positions.

    "},{"location":"links/related-software/#installdoctor","title":"install.doctor","text":"

    Desktop provisioning system.

    "},{"location":"links/social-media/","title":"Social media","text":"Platform Search term Hacker News chezmoi LinkedIn chezmoi dotfiles Reddit chezmoi Stack Overflow chezmoi YouTube chezmoi dotfiles"},{"location":"links/videos/","title":"Videos","text":"

    Tip

    Recommended video: chezmoi: manage your dotfiles across multiple, diverse machines, securely

    Date Version Language Title 2024-11-18 2.54.0 AR Chezmoi, Dotfiles, Workflow, Templates and Encryption Arabic \u0634\u0631\u062d 2024-06-22 2.47.1 EN Automating Development Environments with Ansible & Chezmoi 2024-02-17 2.47.0 EN 12 GREAT command line programs YOU recommended! 2024-01-14 2.24.0 EN managing dotfiles: a guided tour through my own setup 2023-12-03 2.42.2 EN The ultimate dotfiles setup 2022-12-15 2.27.3 ES Archivos de configuraci\u00f3n f\u00e1cil con chezmoi 2022-09-13 2.22.1 EN Using chezmoi to automate dotfiles / config files (+ my bashrc) 2022-04-27 2.15.1 EN Easily moving Linux installs 2021-12-08 2.9.3 EN How Go makes chezmoi possible 2021-11-27 2.8.0 TH Command \u0e44\u0e23 2021-11-27 : \u0e22\u0e49\u0e32\u0e22 dotfiles \u0e44\u0e1b chezmoi 2021-09-06 2.2.0 EN chezmoi: Organize your dotfiles across multiple computers 2021-02-06 1.8.10 EN chezmoi: manage your dotfiles across multiple, diverse machines, securely 2020-07-06 1.8.3 EN Conf42: chezmoi: Manage your dotfiles across multiple machines, securely 2020-03-12 1.7.16 EN Managing Dotfiles with ChezMoi 2019-11-20 1.7.2 EN FLOSS weekly episode 556: chezmoi"},{"location":"reference/","title":"Reference","text":"

    Welcome to the reference section of the chezmoi documentation.

    This reference covers the following topics:

    • Key concepts
    • Source state attributes
    • Target types
    • Application order of changes
    • Configuration file
    • Special files and special directories
    • Command line flags
    • Commands
    • Templates
    • Variables
    • Directives
    • Functions
    • Plugins support
    • Release history
    "},{"location":"reference/application-order/","title":"Application order","text":"

    chezmoi is deterministic in its order of application. The order is:

    1. Read the source state.
    2. Read the destination state.
    3. Compute the target state.
    4. Run run_before_ scripts in alphabetical order.
    5. Update entries in the target state (files, directories, externals, scripts, symlinks, etc.) in alphabetical order of their target name. Directories (including those created by externals) are updated before the files they contain.
    6. Run run_after_ scripts in alphabetical order.

    Target names are considered after all attributes are stripped.

    Example

    Given create_alpha and modify_dot_beta in the source state, .beta will be updated before alpha because .beta sorts before alpha.

    chezmoi assumes that the source or destination states are not modified while chezmoi is being executed. This assumption permits significant performance improvements, including allowing chezmoi to only read files from the source and destination states if they are needed to compute the target state.

    chezmoi's behavior when the above assumptions are violated is undefined. For example, using a run_before_ script to update files in the source or destination states violates the assumption that the source and destination states do not change while chezmoi is running.

    Note

    External sources are updated during the update phase; it is inadvisable for a run_before_ script to depend on an external applied during the update phase. run_after_ scripts may freely depend on externals.

    "},{"location":"reference/concepts/","title":"Concepts","text":"

    chezmoi computes the target state for the current machine and then updates the destination directory, where:

    • The destination directory is the directory that chezmoi manages, usually your home directory, ~.

    • A target is a file, directory, or symlink in the destination directory.

    • The destination state is the current state of all the targets in the destination directory.

    • The source state declares the desired state of your home directory, including templates that use machine-specific data. It contains only regular files and directories.

    • The source directory is where chezmoi stores the source state. By default it is ~/.local/share/chezmoi.

    • The config file contains machine-specific data. By default it is ~/.config/chezmoi/chezmoi.toml.

    • The target state is the desired state of the destination directory. It is computed from the source state, the config file, and the destination state. The target state includes regular files and directories, and may also include symbolic links, scripts to be run, and targets to be removed.

    • The working tree is the git working tree. Normally it is the same as the source directory, but can be a parent of the source directory.

    "},{"location":"reference/plugins/","title":"Plugins","text":"

    chezmoi supports plugins, similar to git.

    If you run chezmoi command where command is not a builtin chezmoi command then chezmoi will look for a binary called chezmoi-command in your $PATH. If such a binary is found then chezmoi will execute it. Otherwise, chezmoi will report an unknown command error.

    "},{"location":"reference/release-history/","title":"Release history","text":"

    Upcoming changes

    "},{"location":"reference/release-history/#2580-2025-01-13","title":"2.58.0 (2025-01-13)","text":"

    Features

    • 621379b feat: Add --git-lfs option to init command
    • 82e5c67 feat: Add builtin mode for gopass
    • 21ef186 feat: Improve placeholders in password prompts
    • 48e23ff feat: Show all contributors in README.md

    Fixes

    • 940cc30 fix: Fix doctor command when --config is specified
    • fc8c20f fix: Correct nested groups for keepassxc builtin mode
    • dda2816 fix: Suppress gitleaks logspam

    Documentation updates

    • 6c4431e docs: Tidy up formatting as suggested by markdownlint

    Full changelog: v2.57.0...v2.58.0

    "},{"location":"reference/release-history/#2570-2024-12-30","title":"2.57.0 (2024-12-30)","text":"

    Features

    • de8efad feat: Add chezmoi:template:format-indent template directive
    • 8f6fea6 feat: Implement builtin mode for keepassxc
    • 0a0d607 feat: Add script hooks that use configured interpreters

    Documentation updates

    • d1cdcd2 docs: Add links to articles

    Full changelog: v2.56.0...v2.57.0

    "},{"location":"reference/release-history/#2560-2024-12-14","title":"2.56.0 (2024-12-14)","text":"

    Features

    • 3558b71 feat: Use textconv with external diff commands
    • 4cb1123 feat: Add interactive config variable
    • bddbf7f feat: Add initial policy on LLM-generated contributions
    • dac078f feat: Warn about future removal of insecure hashes
    • fa4e390 feat: Add .chezmoi.destDir template variable

    Fixes

    • 57ee74a fix: Replace Expand-Archive with System.IO.Compression.ZipFile
    • e038aad fix: More reliable arch detection in install.ps1
    • 23de447 fix: YAML parsing error by escaping | in title

    Documentation updates

    • 058a3c0 docs: Add link to article
    • 3739b0b docs: Describe how to use tools installed with Flatpak
    • ab1b31c docs: Add link to blog

    Full changelog: v2.55.0...v2.56.0

    "},{"location":"reference/release-history/#2550-2024-12-02","title":"2.55.0 (2024-12-02)","text":"

    Features

    • 5f5e106 feat: Add multiple URL support for externals
    • 01eef45 feat: Warn if the user is using the Helix editor with chezmoi edit
    • 4c4bfe9 feat: Support file:// URLs in externals

    Fixes

    • 9ce3b0b fix: Fix error when choice variables are set in flags and config file

    Documentation updates

    • cb86244 docs: Add article info
    • 1d5a3c5 docs: Add Youtube video info

    Full changelog: v2.54.0...v2.55.0

    "},{"location":"reference/release-history/#2540-2024-11-09","title":"2.54.0 (2024-11-09)","text":"

    Features

    • 6916263 feat: Add --path-style=all option to managed command
    • 5bc19ae feat: Inform user when to use get.chezmoi.io/lb

    Fixes

    • 5d568f2 fix: Perform post-run actions on error

    Documentation updates

    • 0837305 docs: Add link to article
    • ba12f36 docs: Add github.com/andre-kotake/nvim-chezmoi to related software
    • 8bfb59f docs: Remove extra 'o' from chezmoi external reference
    • a3193a8 docs: Move command line flags links closer to commands

    Full changelog: v2.53.1...v2.54.0

    "},{"location":"reference/release-history/#2531-2024-10-28","title":"2.53.1 (2024-10-28)","text":"

    Fixes

    • c6f5787 fix: Fix panic in commands that do not use persistent state

    Documentation updates

    • f514a7e docs: Add note that .chezmoiexternal files can be ignored

    Full changelog: v2.53.0...v2.53.1

    "},{"location":"reference/release-history/#2530-2024-10-26","title":"2.53.0 (2024-10-26)","text":"

    Features

    • 9be622a feat: Extend squote template func to handle more types
    • fe2dba7 feat: Extend quote and quoteList template funcs to handle more types
    • 35148c7 feat: Add common --parent-dirs/-P flag

    Fixes

    • 75e1a52 fix: Persist results of calls to GitHub API
    • a8dda78 fix: Fix completion for 'archive --format'
    • 3fd20e9 fix: Fix includeTemplate template func search path in init
    • 5b73a4d fix: Accept only supported values to 'unmanaged --path-style'
    • 264f34f fix: Fix incorrect config template change warnings
    • 8ba1988 fix: Fix panic when --keep-going is set
    • 2d0fa36 fix: Fix panic when running chattr on externals
    • d28823d fix: Use builtin age when encryption is unset

    Documentation updates

    • 554ff27 docs: Replace common flags descriptions with snippets
    • b8610d4 docs: Fill reference title page
    • 2a41aeb docs: Update \"how scripts work\" section
    • 6e9281d docs: Update shell completions section
    • 947e88e docs: Improvements for command flags description
    • 56729ce docs: Automatically check that all flags are documented
    • 0fb4392 docs: Split \"Special file and directories\"
    • efb3a14 docs: Split docs for commands into sections
    • e0c314f docs: Split docs into sections for age, secret and state
    • 23777d0 docs: Improve description for command arguments
    • 5b1dbb5 docs: Add example for running script on macOS update
    • 4cae323 docs: Add notes where to place 'encryption' setting

    Full changelog: v2.52.4...v2.53.0

    "},{"location":"reference/release-history/#2524-2024-10-10","title":"2.52.4 (2024-10-10)","text":"

    Documentation updates

    • 092dc65 docs: Add link to blogpost

    Full changelog: v2.52.3...v2.52.4

    "},{"location":"reference/release-history/#2523-2024-09-30","title":"2.52.3 (2024-09-30)","text":"

    Features

    • be16b73 feat: Set GOMAXPROCS based on available resources

    Fixes

    • 5644141 fix: Improve phonetic pronunciation of chezmoi

    Documentation updates

    • 7ed5c1d docs: Add link to article
    • 222aef8 docs: Improve developer documentation
    • 34f415c docs: Use uv for managing Python and dependencies
    • 895055a docs: Add link to blog
    • f84b8e5 docs: Add note on reporting viruses or trojans on Windows
    • 1fc8195 docs: Add note about website build dependencies
    • 353264c docs: Add sequence diagram for chezmoi init
    • dbde967 docs: Add daily usage entry on editing files

    Full changelog: v2.52.2...v2.52.3

    "},{"location":"reference/release-history/#2522-2024-09-10","title":"2.52.2 (2024-09-10)","text":"

    Features

    • 7aee332 feat: Support YubiKeys in KeePassXC open mode

    Documentation updates

    • f67e048 docs: Add home page section on getting help
    • ea8d95d docs: Add Stack Overflow to social media links
    • 37eab81 docs: Add FAQ entry on using delta as the diff tool
    • fdb2065 docs: Add FAQ entry on running scripts periodically
    • a3de4a8 docs: Add FAQ entry on running a script when a git-repo external changes
    • b56a600 docs: Add FAQ entry on literal {{ and }} in templates
    • d414e0f docs: Add warning on using externals for large files or archives
    • d9f4717 docs: Add how to use VSCode as the diff and merge tool
    • 2a64e42 docs: Make features and portability more prominent on home page
    • 3a17101 docs: Add links to articles
    • 0355a62 docs: Add link to blog
    • 1ac3014 docs: Add github.com/b3nj5m1n/xdg-ninja to related software

    Full changelog: v2.52.1...v2.52.2

    "},{"location":"reference/release-history/#2521-2024-08-15","title":"2.52.1 (2024-08-15)","text":"

    Features

    • ca0d133 feat: Add github.com/johan-weitner/chezmoi-ui to related software

    Fixes

    • cba7e40 fix: Set User-Agent header to chezmoi.io/version on all HTTP requests

    Documentation updates

    • 8e40c43 docs: Add link to video
    • 4843d55 docs: Add links to two articles

    Full changelog: v2.52.0...v2.52.1

    "},{"location":"reference/release-history/#2520-2024-08-07","title":"2.52.0 (2024-08-07)","text":"

    Features

    • 48f873b feat: Add gitHubRelease and gitHubReleaseAssetURL template functions

    Fixes

    • 28ebfec fix: Ignore permission changes in re-add command on Windows
    • 73893c1 fix: Don't modify ciphertext in edit command if plaintext did not change

    Documentation updates

    • d5579c7 docs: Clarify requirement to set sourceDir when used in Codespaces

    Full changelog: v2.51.0...v2.52.0

    "},{"location":"reference/release-history/#2510-2024-07-15","title":"2.51.0 (2024-07-15)","text":"

    Features

    • 2a7845f feat: Add 1Password SDK template funcs
    • 676a9a9 feat: Add decompression of file externals

    Fixes

    • 2615c52 fix: keep initFuncs when using 'includeTemplate' in config
    • f6ecfdb fix: Use scriptTempDir for modify_ scripts

    Documentation updates

    • 711534a docs: Add link to article

    Full changelog: v2.50.0...v2.51.0

    "},{"location":"reference/release-history/#2500-2024-07-02","title":"2.50.0 (2024-07-02)","text":"

    Features

    • 2808e7c feat: Add tempDir configuration variable
    • 4241393 feat: Allow private_ and readonly_ attrs to be set for externals
    • 217cdaa feat: Add --no-network flag to doctor command
    • 31b2060 feat: Embed fallback X.509 trusted roots

    Fixes

    • 2a75540 fix: Prevent chezmoi add from adding chezmoi's own executable

    Documentation updates

    • b7cf4ba docs: Add GianniBYoung/chezmoi-telescope.nvim to related software

    Full changelog: v2.49.1...v2.50.0

    "},{"location":"reference/release-history/#2491-2024-06-23","title":"2.49.1 (2024-06-23)","text":"

    Fixes

    • af65574 fix: Accept line-endings template directive as well as line-ending

    Full changelog: v2.49.0...v2.49.1

    "},{"location":"reference/release-history/#2490-2024-06-10","title":"2.49.0 (2024-06-10)","text":"

    Features

    • 0f45cb4 feat: Add stub for removed remove command
    • ca643ce feat: Rename remove command to destroy

    Fixes

    • f781976 fix: Fix panic when parsing some commands

    Documentation updates

    • bcd52b9 docs: Update comparison-table.md

    Full changelog: v2.48.2...v2.49.0

    "},{"location":"reference/release-history/#2482-2024-05-31","title":"2.48.2 (2024-05-31)","text":"

    Fixes

    • 788f805 fix: Don't panic on unexpected bubbletea messages
    • 5cf451a fix: Respect umask when creating files
    • 24a990d fix: fix error when determining GOARCH in install.ps1

    Documentation updates

    • 1a16b49 docs: Add link to article

    Full changelog: v2.48.1...v2.48.2

    "},{"location":"reference/release-history/#2481-2024-05-12","title":"2.48.1 (2024-05-12)","text":"

    Features

    • a396e3a feat: Add gitHubLatestReleaseAssetURL template function

    Fixes

    • 6a90b3e fix: Links section is broken in docs

    Documentation updates

    • 9d332c6 docs: Add link to article

    Full changelog: v2.48.0...v2.48.1

    "},{"location":"reference/release-history/#2480-2024-04-26","title":"2.48.0 (2024-04-26)","text":"

    Features

    • 2e04dcf feat: Add --tree flag to unmanaged command
    • 91823e3 feat: Add --tree flag to managed command
    • 278e2be feat: Add --tree flag to ignored command
    • 4a9d0e4 feat: Include name of target in error message

    Fixes

    • c758a1c fix: Apply .chezmoiignore to dirs in external archives
    • 7dfcfcf fix: Remove unmanaged files from exact_ directories containing external files
    • 153ff43 fix: Better detect username on Android/Termux systems

    Documentation updates

    • b1b40b2 docs: Add link to article
    • 9c817ce docs: Document --tree flag
    • 89fab4b docs: Fix origin URL in quick start guide

    Full changelog: v2.47.4...v2.48.0

    "},{"location":"reference/release-history/#2474-2024-04-12","title":"2.47.4 (2024-04-12)","text":"

    Fixes

    • d6ad485 fix: Fix potential panic when textconv interpreter is empty
    • b4df44d fix: Fix panic on empty external

    Documentation updates

    • 872c584 docs: Add troubleshooting entry on missing /bin/bash on Nix
    • 8b2a435 docs: Add install.doctor to related software
    • 3a3dd13 docs: Add links to articles

    Full changelog: v2.47.3...v2.47.4

    "},{"location":"reference/release-history/#2473-2024-03-31","title":"2.47.3 (2024-03-31)","text":"

    Fixes

    • 2e4236c fix: Don't traverse into ignored directories when adding files
    • 8a83dcc fix: Skip adding entries in external dirs instead of erroring
    • b366d0e fix: Fix panic when adding children in exact_ dirs
    • ad77158 fix: Increase range of types accepted by promptChoice template function

    Full changelog: v2.47.2...v2.47.3

    "},{"location":"reference/release-history/#2472-2024-03-17","title":"2.47.2 (2024-03-17)","text":"

    Fixes

    • f490429 fix: pass the --needed flag to pacman
    • 88b586d fix: Remove fig support
    • c8dc9a4 fix: Explicitly tell user when then should use a config file template
    • fccc759 fix: Handle copies in automatic commit messages
    • 3a0b19e fix: Add missing newlines in error messages

    Documentation updates

    • 490cc3a docs: Add link to article
    • eb62958 docs: Fix incomplete sentence in usage docs
    • ce46858 docs: Add link to article

    Full changelog: v2.47.1...v2.47.2

    "},{"location":"reference/release-history/#2471-2024-03-03","title":"2.47.1 (2024-03-03)","text":"

    Fixes

    • 59764c8 fix: Fix panic in unmanaged on some dir permission errors
    • dc99169 fix: Make splitList return []any
    • 0405763 fix: Set CHEZMOI_ environment variables for plugins
    • 1f44189 fix: Ensure that all .chezmoi.config template variables have simple types
    • 5bb87f1 fix: a grammar mistake

    Documentation updates

    • 85d015b docs: Refactor developer guide
    • 885487b docs: Add link to blog post
    • 18c99c3 docs: Add link to video

    Full changelog: v2.47.0...v2.47.1

    "},{"location":"reference/release-history/#2470-2024-02-25","title":"2.47.0 (2024-02-25)","text":"

    Features

    • 6788c54 feat: 1Password Secrets Automation Support

    Fixes

    • 3b3541c fix: Ensure default mode is set
    • c6b867b fix: Fix marshaling of severities
    • 523fd84 fix: Fix marshaling of autobools
    • 5224e11 fix: Fix marshaling of absolute paths
    • e925b0f fix: Fix --keep-going flag for unmanaged command
    • 5201ddc fix: Don't leak internal default sentinel values in template data
    • 1abcfa5 fix: Fix panic when merging unmanaged file
    • c0b7e92 fix: Don't attempt to add entries in external_ directories
    • d14bdd5 fix: Use uname -o to detect Android in install script
    • 302a3b8 fix: Move documentation of --output flag to correct section
    • ccde612 fix: Prioritize $HOME when Cygwin or msys2 is detected

    Documentation updates

    • 3e5f0c8 docs: Fix type of .chezmoi.kernel and .chezmoi.osRelease variables
    • 0269f80 docs: Update docs on auto applying changes on edit in VIM
    • b5fc7b6 docs: Document config vars for command-specific flags
    • f52062e docs: Cross link \"See REF\" in config variables doc

    Full changelog: v2.46.1...v2.47.0

    "},{"location":"reference/release-history/#2461-2024-02-11","title":"2.46.1 (2024-02-11)","text":"

    Features

    • 8a20f91 feat: Add update.apply configuration variable
    • 431ec39 feat: Set CHEZMOI_SOURCE_FILE env var for scripts

    Fixes

    • 0eb98a9 fix: Fix age/rage check in doctor command

    Documentation updates

    • baeaf6b docs: typo

    Other

    • deb5adf chore(deps-dev): bump ruff from 0.1.9 to 0.1.15 in /assets

    Full changelog: v2.46.0...v2.46.1

    "},{"location":"reference/release-history/#2460-2024-01-25","title":"2.46.0 (2024-01-25)","text":"

    Features

    • c7539b0 feat: Build for Android (Termux)
    • efcf32d feat: Support rage as an alternative age encryption command
    • 53f7b92 feat: Add re-add --recursive flag and make it the default
    • 85983f0 feat: Promote hooks to stable
    • 114030c feat: Promote HCP Vault Secrets template functions to stable
    • 24c0ea2 feat: Promote Doppler template functions to stable
    • c209c2a feat: Promote edit --watch to stable

    Fixes

    • 15f4eb1 fix: Defer lookup of git in $PATH for git-repo externals
    • 569601a fix: Change init to default to --config if --config-path is absent
    • 031b267 fix: Handle more keepassxc-cli errors
    • 74d6b2a fix: Reduce injection of terminal control characters into keepassxc-cli output

    Documentation updates

    • 1418f74 docs: Fix broken release history page
    • 2dffe64 docs: links to testing-templates
    • 8dd6c86 docs: combine testing and debugging templates
    • 5e7c295 docs: Add links to article and video
    • 2e3bd95 docs: add link
    • 80717f4 docs: Fix names of age recipients files config variables

    Full changelog: v2.45.0...v2.46.0

    "},{"location":"reference/release-history/#2450-2024-01-13","title":"2.45.0 (2024-01-13)","text":"

    Features

    • 7d915c0 feat: Scan for secrets with gitleaks when adding files
    • 404878c feat: Add add.encrypt configuration variable

    Fixes

    • 3436563 fix: Improve robustness of keepassxc-cli integration in open mode
    • 49791f9 fix: Handle keepassxc-cli localization
    • 85464dd fix: Restore user args to keepassxc-cli in cache password mode
    • 9437b62 fix: Always use forward slashes to separate Windows paths

    Full changelog: v2.44.0...v2.45.0

    "},{"location":"reference/release-history/#2440-2024-01-10","title":"2.44.0 (2024-01-10)","text":"

    Features

    • 6a5d4a3 feat: Add support for YubiKeys with KeePassXC

    Documentation updates

    • ff3deb9 docs: Add explanation of status characters

    Full changelog: v2.43.0...v2.44.0

    "},{"location":"reference/release-history/#2430-2024-01-02","title":"2.43.0 (2024-01-02)","text":"

    Features

    • d99e8bd feat: Extend rbw and rbwFields template funcs to take extra args
    • 7323f6a feat: Extend remove_ attribute to directories

    Fixes

    • 44b4c6d fix: Fix detection of changes to remove_ directories
    • 5f40268 fix: Only invoke diff pager if there is diff output
    • 084add0 fix: Handle implicit directories in externals
    • 54dce1b fix: add missing command annotations
    • d85b5e4 fix: Make execute-template --init not read .chezmoitemplates
    • db9b4dd fix: key.txt is not written to home, but home/.config

    Documentation updates

    • 774d053 docs: Add upcoming changes to release history
    • 9f9d2d9 docs: Add link to article
    • 6eb139b docs: Add links to articles
    • 08e9b0b docs: Fix guide on clearing state of run_onchange_ scripts

    Other

    • a450748 chore(deps-dev): bump ruff from 0.1.6 to 0.1.9 in /assets

    Full changelog: v2.42.3...v2.43.0

    "},{"location":"reference/release-history/#2423-2023-12-16","title":"2.42.3 (2023-12-16)","text":"

    Features

    • 538169a feat: Remove nested subshell check
    • 31780bf feat: Make mackupApplicationsDir func agnostic to mackup's installation method

    Documentation updates

    • ef01881 docs: Add github.com/xvzc/chezmoi.nvim to related software
    • e530e7c docs: Add link to article
    • 31e6207 docs: Add link to video
    • 854ea06 docs: Add entry on declarative package installation
    • 0cf9f29 docs: add warning for GitHub SSH key deletion

    Full changelog: v2.42.2...v2.42.3

    "},{"location":"reference/release-history/#2422-2023-12-02","title":"2.42.2 (2023-12-02)","text":"

    Features

    • a9d389e feat: Add CHEZMOI_COMMAND_DIR env var for hooks

    Fixes

    • 649c758 fix: Fix fromJson template function deserializing non-objects
    • c68ddac fix: Handle extra slashes in path arguments

    Full changelog: v2.42.1...v2.42.2

    "},{"location":"reference/release-history/#2421-2023-11-29","title":"2.42.1 (2023-11-29)","text":"

    Fixes

    • d07689e fix: Set env vars from config file when re-reading config

    Documentation updates

    • 0b38793 docs: Clarify prefix order for regular files

    Full changelog: v2.42.0...v2.42.1

    "},{"location":"reference/release-history/#2420-2023-11-26","title":"2.42.0 (2023-11-26)","text":"

    Features

    • 694977b feat: Preserve numeric types when reading from .chezmoidata JSON and JSONC files
    • 1f11386 feat: Preserve integer values in fromJson and fromJsonc template funcs
    • 711a39a feat: Add read-source-state hook

    Documentation updates

    • 47609a3 docs: Add admonitions linking remove and forget
    • 8784a67 docs: Add links to blog posts

    Full changelog: v2.41.0...v2.42.0

    "},{"location":"reference/release-history/#2410-2023-11-14","title":"2.41.0 (2023-11-14)","text":"

    Features

    • 26fd133 feat: Add git-commit-message to generate command
    • c6688d2 feat: Make commit message templates regular templates
    • f7c3745 feat: Add git.commitMessageTemplateFile config variable
    • 1f016e8 feat: Add edit-config-template command

    Fixes

    • d9cb6b0 fix: Don't escape HTML characters in JSON strings

    Documentation updates

    • b94f954 docs: Document support for the passage password manager
    • a1fba75 docs: add how-to for gpg \u2194 age migration
    • 8d58c3e docs: Fix default value of persistentState variable

    Other

    • e8ed4c4 refactor: Allow mkdocs build from any origin

    Full changelog: v2.40.4...v2.41.0

    "},{"location":"reference/release-history/#2404-2023-10-29","title":"2.40.4 (2023-10-29)","text":"

    Fixes

    • 797e3cf fix: Make stdinIsATTY return false if --no-tty is passed

    Full changelog: v2.40.3...v2.40.4

    "},{"location":"reference/release-history/#2403-2023-10-12","title":"2.40.3 (2023-10-12)","text":"

    Features

    • b64f2bc feat: Add env config var as an alternative to scriptEnv
    • f47c268 feat: Warn when overriding CHEZMOI_ env vars
    • 7203d6b feat: Set CHEZMOI_ and scriptEnv env vars for all invoked commands

    Documentation updates

    • 319dd20 docs: Tidy up release notes

    Full changelog: v2.40.2...v2.40.3

    "},{"location":"reference/release-history/#2402-2023-10-09","title":"2.40.2 (2023-10-09)","text":"

    Internal changes only

    Full changelog: v2.40.1...v2.40.2

    "},{"location":"reference/release-history/#2401-2023-10-09","title":"2.40.1 (2023-10-09)","text":"

    Features

    • fc56533 feat: Add Path Separator and Path List Separator to provided template values.
    • 61f7ed1 feat: Ignore AppleDouble files in externals
    • 4a52e5c feat: find[One]Executable in user-supplied paths
    • bb6f952 feat: Use Goreleaser's Chocolatey support

    Fixes

    • eecf015 fix: Only invoke diff pager if command modifies filesystem
    • 5c0140d fix: Don't use replace-executable for WinGet installations
    • 7976373 fix: Add chattr +remove support for files

    Documentation updates

    • 784d38b doc: Add information how to ignore cache files in external dependencies
    • 66070dc docs: Added an example for promptChoice
    • 5f14f10 docs: Added an example for promptChoiceOnce
    • c96a4b7 docs: Fix cross-function link references

    Full changelog: v2.40.0...v2.40.1

    "},{"location":"reference/release-history/#2400-2023-09-19","title":"2.40.0 (2023-09-19)","text":"

    Features

    • 2858a0c feat: Implement the path-style flag for status
    • 5918296 feat: Add plugin support
    • 63cda81 feat: Allow overlapping, non-conflicting externals
    • f15b158 feat: Add decryption of non-armored files to age command

    Fixes

    • cdd4f16 fix: Use diff pager for all diff output if configured
    • 3667788 fix: provide a consistent error for cd to file

    Documentation updates

    • 284baf6 docs: Add links to articles

    Full changelog: v2.39.1...v2.40.0

    "},{"location":"reference/release-history/#2391-2023-09-06","title":"2.39.1 (2023-09-06)","text":"

    Fixes

    • 46e13ed fix: Ensure default template data when reading .chezmoidata in subdir

    Documentation updates

    • fe10a69 docs: Improve developer experience under fish
    • 5b738bd docs: Fix documentation on dirs vs content in .chezmoiignore

    Full changelog: v2.39.0...v2.39.1

    "},{"location":"reference/release-history/#2390-2023-09-03","title":"2.39.0 (2023-09-03)","text":"

    Features

    • acb8937 feat: add .chezmoi.targetFile template variable
    • 205fd6c feat: Add age command
    • f6947d3 feat: Add bitwardenSecrets template function

    Fixes

    • 40b711d fix: Handle .chezmoidata files in subdirectories when template has already been executed
    • 6fa4fe4 fix: Update goreleaser changelog

    Documentation updates

    • a89e0e0 docs: Tweak location of private key in age onetime passphrase how-to
    • da9f3c6 docs: Use age command in onetime passphrase how-to
    • fe903d4 docs: Minor expansion of application order docs
    • 02ffbd7 docs: Add link to article

    Full changelog: v2.38.0...v2.39.0

    "},{"location":"reference/release-history/#2380-2023-08-21","title":"2.38.0 (2023-08-21)","text":"

    Other

    • 0ce82b3 chore: Update dependencies
    • 7b300e4 chore: Miscellaneous website improvements
    • 166feaf docs: Linuxbrew -> Homebrew
    • d00de72 feat: Add gitHubReleases and gitHubTags
    • a51179e feat: Support nushell scripts on Windows
    • 7d143c3 docs: Improve documentation on using separate source files
    • ba985c9 chore: Reformat long lines
    • 5e8d2b3 feat: Add promptChoice and promptChoiceOnce template functions
    • 29e8c30 fix: Fix minor issues with promptBool docs and errors
    • f0efc5c chore: Generate release notes from git log, not GitHub
    • 3c72387 chore: Remove dependency on go.uber.org/multierr
    • 424189b chore: Use io/fs.Skip{All,Dir} sentinel errors
    • dbc1b4b chore: Bump golangci-lint to version 1.54.0
    • 3f636c1 chore: Build with Go 1.21.0
    • 187f734 chore: Update dependencies
    • a028598 feat: Restore --autotemplate flag to add command
    • 4e67850 docs: Document --source-path flag
    • 4fc3203 fix: Fix race condition in concurrent parsing of externals

    Full changelog: v2.37.0...v2.38.0

    "},{"location":"reference/release-history/#2370-2023-08-06","title":"2.37.0 (2023-08-06)","text":"
    • feat: Read personal mackup config files by @twpayne in #3133
    • chore(deps): bump github/codeql-action from 2.20.1 to 2.21.2 by @dependabot in #3135
    • chore: Build with Go 1.20.7 by @twpayne in #3140
    • feat: Add support for Doppler by @equals03 in #3134
    • feat: Extend re-add command to accept an optional list of targets by @twpayne in #3146
    • chore: Update dependencies by @twpayne in #3150
    • fix: Avoid concurrent map access when evaluating multiple templates by @twpayne in #3155
    • feat: Add isExecutable template function by @twpayne in #3157
    • chore: Fix isExecutable tests on Windows by @twpayne in #3158
    • chore: Update dependencies by @twpayne in #3159

    New Contributors

    • @equals03 made their first contribution in #3134

    Full changelog: v2.36.1...v2.37.0

    "},{"location":"reference/release-history/#2361-2023-07-30","title":"2.36.1 (2023-07-30)","text":"
    • fix: Make detection of mackup config dir more robust by @twpayne in #3128
    • fix: Ensure that templates cannot modify each other's data by @twpayne in #3129
    • chore: Move core packages back to internal by @twpayne in #3130

    Full changelog: v2.36.0...v2.36.1

    "},{"location":"reference/release-history/#2360-2023-07-28","title":"2.36.0 (2023-07-28)","text":"
    • feat: Add .chezmoiexternals directory for multiple externals by @twpayne in #3108
    • fix: Respect setting diff.pager to the empty string as disabling the pager by @twpayne in #3117
    • chore: Update dependencies by @twpayne in #3124
    • feat: Add undocumented mackup command by @twpayne in #3121

    Full changelog: v2.35.2...v2.36.0

    "},{"location":"reference/release-history/#2352-2023-07-19","title":"2.35.2 (2023-07-19)","text":"

    Internal changes only

    Full changelog: v2.35.1...v2.35.2

    "},{"location":"reference/release-history/#2351-2023-07-18","title":"2.35.1 (2023-07-18)","text":"
    • feat: Allow executable bits to be overridden in archive-file externals by @twpayne in #3102
    • docs: Clarify use of exclude patterns in .chezmoiignore by @twpayne in #3103
    • feat: Add work-around for Docker Desktop breaking /etc/hosts by @twpayne in #3104
    • chore: Update dependencies by @twpayne in #3105

    Full changelog: v2.35.0...v2.35.1

    "},{"location":"reference/release-history/#2350-2023-07-16","title":"2.35.0 (2023-07-16)","text":"
    • feat: Add archive-file externals by @twpayne in #3080
    • fix: Never consider localhost.localdomain in /etc/hosts as the FQDN by @twpayne in #3082
    • chore: Miscellaneous fixes by @twpayne in #3091
    • chore: Use golang/govulncheck-action by @twpayne in #3094
    • feat: Add support for HCP Vault Secrets by @twpayne in #3067
    • chore: Use Goreleaser's WinGet support by @twpayne in #3059

    Full changelog: v2.34.3...v2.35.0

    "},{"location":"reference/release-history/#2343-2023-07-03","title":"2.34.3 (2023-07-03)","text":"
    • fix: Check .chezmoiignore before protected paths by @twpayne in #3052
    • chore: Add actionlint linter by @twpayne in #3053
    • fix: Parse hostnames from all loopback addresses in /etc/hosts by @twpayne in #3055
    • chore: Update dependencies by @twpayne in #3058
    • fix: Respect persistentState config variable by @twpayne in #3066
    • chore: Miscellaneous fixes by @twpayne in #3068
    • docs: Remove reference to tar and /dev/stdin so code works on Windows by @Sacro in #3069
    • chore: Update goreleaser config for version 1.19 by @twpayne in #3071
    • fix: Drop Solaris and Illumos support by @twpayne in #3060
    • chore(deps): bump github.com/rogpeppe/go-internal from 1.10.1-0.20230524175051-ec119421bb97 to 1.11.0 by @dependabot in #3073
    • chore(deps): bump sigstore/cosign-installer from 3.0.5 to 3.1.1 by @dependabot in #3074
    • chore(deps): bump reviewdog/action-misspell from 1.12.4 to 1.13.1 by @dependabot in #3075
    • chore(deps): bump github/codeql-action from 2.20.0 to 2.20.1 by @dependabot in #3076

    New Contributors

    • @Sacro made their first contribution in #3069

    Full changelog: v2.34.2...v2.34.3

    "},{"location":"reference/release-history/#2342-2023-06-17","title":"2.34.2 (2023-06-17)","text":"
    • chore: Simplify code by using strings.EqualFold, time.Before by @twpayne in #3038
    • chore: Use http.NoBody instead of nil by @alexandear in #3040
    • chore: Miscellaneous clean-ups by @twpayne in #3041
    • fix: Handle multiple files in .chezmoidata directory by @twpayne in #3042
    • chore: Update dependencies by @twpayne in #3043
    • chore(deps): bump golangci/golangci-lint-action from 3.4.0 to 3.6.0 by @dependabot in #3044
    • chore(deps): bump dessant/lock-threads from 4.0.0 to 4.0.1 by @dependabot in #3045
    • chore(deps): bump github/codeql-action from 2.3.5 to 2.20.0 by @dependabot in #3046
    • chore(deps): bump goreleaser/goreleaser-action from 4.2.0 to 4.3.0 by @dependabot in #3047
    • chore(deps): bump actions/checkout from 3.5.2 to 3.5.3 by @dependabot in #3048

    Full changelog: v2.34.1...v2.34.2

    "},{"location":"reference/release-history/#2341-2023-06-10","title":"2.34.1 (2023-06-10)","text":"
    • chore: Build with Go 1.20.5 by @twpayne in #3030
    • feat: Add git.commitMessageTemplate configuration variable by @twpayne in #3032

    Full changelog: v2.34.0...v2.34.1

    "},{"location":"reference/release-history/#2340-2023-06-05","title":"2.34.0 (2023-06-05)","text":"
    • feat: Add support for .chezmoidata directory by @twpayne in #3009
    • chore(deps): bump github/codeql-action from 2.3.3 to 2.3.5 by @dependabot in #3010
    • chore(deps): bump actions/setup-go from 4.0.0 to 4.0.1 by @dependabot in #3012
    • chore: Misc fixes by @twpayne in #3019
    • chore: Update dependencies by @twpayne in #3018
    • chore(deps): bump sigstore/cosign-installer from 3.0.3 to 3.0.5 by @dependabot in #3011
    • chore: Bump golangci-lint to version 1.53.1 by @twpayne in #3020
    • fix: Fix init --debug flag by @twpayne in #3021
    • feat: Add get.chezmoi.io/lb and chezmoi.io/getlb install scripts by @twpayne in #3024
    • chore: Update dependencies by @twpayne in #3026
    • fix: Fix parsing of flags to secret keyring delete command by @twpayne in #3027

    Full changelog: v2.33.6...v2.34.0

    "},{"location":"reference/release-history/#2336-2023-05-15","title":"2.33.6 (2023-05-15)","text":"
    • chore(deps): bump github.com/cloudflare/circl from 1.3.2 to 1.3.3 by @dependabot in #2991
    • fix: Only create empty files if they have the empty_ attribute by @twpayne in #2997
    • chore: Refactor internal handling of remove_ directories by @twpayne in #2999
    • chore(editorconfig): Remove quotes from editorconfig file by @aarondill in #3000
    • fix: Set CHEZMOI_SOURCE_DIR env var in init when using .chezmoiroot by @twpayne in #3001
    • chore: Update dependencies by @twpayne in #3002

    New Contributors

    • @aarondill made their first contribution in #3000

    Full changelog: v2.33.5...v2.33.6

    "},{"location":"reference/release-history/#2335-2023-05-11","title":"2.33.5 (2023-05-11)","text":"
    • chore: Build with Go 1.20.4 by @twpayne in #2970
    • chore: Use github.com/alecthomas/assert instead of github.com/stretchr/testify by @twpayne in #2974
    • fix: Fix commands for managed files in exact_ directories by @twpayne in #2980
    • docs: Improved Bitwarden login documentation by @halostatue in #2955
    • chore: Update dependencies by @twpayne in #2983
    • chore(deps): bump github/codeql-action from 2.3.2 to 2.3.3 by @dependabot in #2986
    • chore(deps): bump cpina/github-action-push-to-another-repository from 1.6 to 1.7 by @dependabot in #2987
    • chore(deps): bump reviewdog/action-misspell from 1.12.3 to 1.12.4 by @dependabot in #2985
    • fix: Ensure the sourceDir is updated before creating config file by @twpayne in #2989

    Full changelog: v2.33.4...v2.33.5

    "},{"location":"reference/release-history/#2334-2023-05-02","title":"2.33.4 (2023-05-02)","text":"
    • fix: Fix init --promptBool for promptBoolOnce template function by @twpayne in #2950
    • docs: update encryption md to account for chezmoiroot by @danielo515 in #2952
    • chore(deps): bump sigstore/cosign-installer from 3.0.1 to 3.0.3 by @dependabot in #2957
    • chore(deps): bump github/codeql-action from 2.2.9 to 2.3.2 by @dependabot in #2958
    • chore(deps): bump actions/checkout from 3.5.0 to 3.5.2 by @dependabot in #2959
    • fix: Respect executable file modes in external_ directories by @twpayne in #2966
    • fix: Fix chezmoi rm with files in exact_ directories by @twpayne in #2967

    New Contributors

    • @danielo515 made their first contribution in #2952

    Full changelog: v2.33.3...v2.33.4

    "},{"location":"reference/release-history/#2333-2023-04-21","title":"2.33.3 (2023-04-21)","text":"
    • fix: Correct capitalization of .chezmoi.config template variables by @twpayne in #2943

    Full changelog: v2.33.2...v2.33.3

    "},{"location":"reference/release-history/#2332-2023-04-21","title":"2.33.2 (2023-04-21)","text":"
    • chore: Add test for reported .chezmoiroot issue by @twpayne in #2930
    • chore: Update dependencies by @twpayne in #2932
    • fix: Set CHEZMOI_ environment variables for modify_ scripts by @twpayne in #2935
    • fix: Don't download ignored git-repo externals by @twpayne in #2939
    • feat: Add .chezmoi.config template variable by @twpayne in #2940
    • chore: Update dependencies by @twpayne in #2941

    Full changelog: v2.33.1...v2.33.2

    "},{"location":"reference/release-history/#2331-2023-04-07","title":"2.33.1 (2023-04-07)","text":"
    • chore: Update dependencies by @twpayne in #2889
    • chore: Add rbw version check to doctor command by @twpayne in #2893
    • chore(deps): bump sigstore/cosign-installer from 2.8.1 to 3.0.1 by @dependabot in #2897
    • chore(deps): bump actions/cache from 3.2.6 to 3.3.1 by @dependabot in #2898
    • chore(deps): bump github/codeql-action from 2.2.5 to 2.2.9 by @dependabot in #2899
    • chore(deps): bump actions/checkout from 3.3.0 to 3.5.0 by @dependabot in #2900
    • chore: Update dependencies by @twpayne in #2903
    • chore: Update dependencies by @twpayne in #2908
    • fix: Allow source dir to be a git worktree by @twpayne in #2911
    • fix: Change where fish completions are installed by @J-M0 in #2912
    • chore: Tidy up persistent state tests by @twpayne in #2914
    • chore: Update dependencies by @twpayne in #2915

    New Contributors

    • @J-M0 made their first contribution in #2912

    Full changelog: v2.33.0...v2.33.1

    "},{"location":"reference/release-history/#2330-2023-03-24","title":"2.33.0 (2023-03-24)","text":"
    • chore(deps): bump google.golang.org/protobuf from 1.29.0 to 1.29.1 by @dependabot in #2856
    • docs: Miscellaneous fixes by @twpayne in #2860
    • fix: Don't list entries in git-repo externals as unmanaged by @twpayne in #2862
    • chore: Minor fixes by @twpayne in #2863
    • feat: Add support for ejson by @XaF in #2857
    • chore: Tidy up ejson default key dir by @twpayne in #2870
    • feat: Add jq template function by @twpayne in #2833
    • Update dependencies by @twpayne in #2874
    • docs: Add missing jsonc to some formats by @bradenhilton in #2876
    • docs: Wait for elevated PS process to return by @alexvy86 in #2872
    • chore: Deprecate --autotemplate by @halostatue in #2877
    • Update build infrastructure by @twpayne in #2881
    • feat: Set $CHEZMOI_VERBOSE based on --verbose by @halostatue in #2875
    • fix: Only set $CHEZMOI_VERBOSE when --verbose is set by @twpayne in #2883

    Full changelog: v2.32.0...v2.33.0

    "},{"location":"reference/release-history/#2320-2023-03-12","title":"2.32.0 (2023-03-12)","text":"
    • chore: Add test for target-path, .chezmoiscripts, and .chezmoiroot by @twpayne in #2811
    • fix: Allow underscores and dots in GitHub dotfile repo name guesses by @twpayne in #2817
    • Improve chezmoi cd command by @twpayne in #2823
    • docs: Fix typo by @hezhizhen in #2829
    • feat: Add support for the JSONC format by @twpayne in #2827
    • chore: Add test that diff.exclude excludes dirs from external diff tool by @twpayne in #2830
    • feat: Refuse to add chezmoi files to chezmoi by @twpayne in #2822
    • feat: Add pre- and post-command hooks by @twpayne in #2832
    • chore: Update dependencies by @twpayne in #2834
    • chore: Tidy up nolint directives by @twpayne in #2842
    • docs: Updated config / flags documentation information by @halostatue in #2843
    • chore: Miscellaneous password manager cleanups by @twpayne in #2845
    • chore: Remove +build comments from modules by @alexandear in #2846
    • chore: Use run.go instead of deprecated lang-version by @alexandear in #2847
    • feat: Add rbw template function for Bitwarden by @twpayne in #2841
    • chore: Miscellaneous fixes by @twpayne in #2848

    New Contributors

    • @hezhizhen made their first contribution in #2829

    Full changelog: v2.31.1...v2.32.0

    "},{"location":"reference/release-history/#2311-2023-03-02","title":"2.31.1 (2023-03-02)","text":"
    • chore: Bump golangci-lint to v1.51.2 by @twpayne in #2782
    • docs: Improve documentation on git-repo externals by @twpayne in #2785
    • chore: Update dependencies by @twpayne in #2788
    • chore: Enable most govet linters by @twpayne in #2794
    • chore: Update dependencies by @twpayne in #2795
    • feat: Add Dashlane password manager support by @twpayne in #2792
    • fix: Detect absolute paths in externals on Windows by @twpayne in #2796
    • feat: Add Dashlane secure notes support by @XaF in #2797
    • chore(deps): bump cpina/github-action-push-to-another-repository from 9e487f29582587eeb4837c0552c886bb0644b6b9 to 0a14457bb28b04dfa1652e0ffdfda866d2845c73 by @dependabot in #2802
    • chore(deps): bump github/codeql-action from 2.2.1 to 2.2.5 by @dependabot in #2803
    • chore(deps): bump actions/cache from 3.2.4 to 3.2.6 by @dependabot in #2804
    • chore: Update dependencies by @twpayne in #2809

    New Contributors

    • @XaF made their first contribution in #2797

    Full changelog: v2.31.0...v2.31.1

    "},{"location":"reference/release-history/#2310-2023-02-17","title":"2.31.0 (2023-02-17)","text":"
    • feat: Print a warning when chezmoi add is called with an ignored entry by @twpayne in #2762
    • feat: Cache GitHub API results by default to stay under rate limit by @twpayne in #2763
    • feat: Display progress bars by default when stdout is a TTY by @twpayne in #2767
    • feat(bitwarden): Grab attachment by object name by @cawaltrip in #2765
    • fix: Eliminate [DEFAULT] section for fromIni map by @halostatue in #2770
    • chore: Update dependencies by @twpayne in #2772
    • feat: Add --with-stdin flag to execute-template command by @twpayne in #2774
    • docs: Fix typo, improve grammar in init doc page by @bradenhilton in #2776
    • docs: Improve documentation on externals by @twpayne in #2775
    • chore: Update dependencies by @twpayne in #2781

    New Contributors

    • @cawaltrip made their first contribution in #2765

    Full changelog: v2.30.1...v2.31.0

    "},{"location":"reference/release-history/#2301-2023-02-11","title":"2.30.1 (2023-02-11)","text":"
    • Add deleteValueAtPath and pruneEmptyDicts template functions by @twpayne in #2750
    • feat: Extend toPrettyJson template function to take indent by @twpayne in #2751
    • fix: Fix chezmoi target-path when using .chezmoiroot by @twpayne in #2755
    • chore: Use strings.Cut{Prefix,Suffix} by @twpayne in #2756

    Full changelog: v2.30.0...v2.30.1

    "},{"location":"reference/release-history/#2300-2023-02-06","title":"2.30.0 (2023-02-06)","text":"
    • feat: Add zstd compression support by @twpayne in #2715
    • feat: Add external_ attribute for directories by @twpayne in #2716
    • chore(deps): bump golangci/golangci-lint-action from 3.3.1 to 3.4.0 by @dependabot in #2720
    • chore(deps): bump actions/checkout from 3.2.0 to 3.3.0 by @dependabot in #2721
    • chore(deps): bump github/codeql-action from 2.1.37 to 2.2.1 by @dependabot in #2722
    • chore(deps): bump actions/upload-artifact from 3.1.1 to 3.1.2 by @dependabot in #2723
    • chore: Miscellaneous fixes by @twpayne in #2719
    • chore(deps): bump ludeeus/action-shellcheck from 1.1.0 to 2.0.0 by @dependabot in #2724
    • chore(deps): bump actions/cache from 3.2.2 to 3.2.4 by @dependabot in #2726
    • chore(deps): bump goreleaser/goreleaser-action from 4.1.0 to 4.2.0 by @dependabot in #2727
    • feat: Build with Go 1.20 by @twpayne in #2731
    • fix: Make chezmoi init --purge-binary always remove binary by @twpayne in #2729
    • chore: Bump golangci-lint to version 1.51.0 by @twpayne in #2732
    • docs: Add install command for winget by @bradenhilton in #2735
    • Miscellaneous fixes by @twpayne in #2737
    • Set CHEZMOI* environment variables when running cd command by @twpayne in #2743
    • docs: Improve documentation on scripts by @twpayne in #2745

    Full changelog: v2.29.4...v2.30.0

    "},{"location":"reference/release-history/#2294-2023-01-24","title":"2.29.4 (2023-01-24)","text":"
    • fix: Revert buggy diff library by @twpayne in #2707
    • docs: note about actual auth types for GitHub private repos by @Avendattor in #2690

    New Contributors

    • @Avendattor made their first contribution in #2690

    Full changelog: v2.29.3...v2.29.4

    "},{"location":"reference/release-history/#2293-2023-01-19","title":"2.29.3 (2023-01-19)","text":"
    • feat: Add --recursive flag to chattr command by @twpayne in #2697
    • feat: Check config file format in doctor command by @twpayne in #2696
    • docs: Fix typo in merge user guide by @mumumumu in #2698
    • fix: Support .zip files with empty internal directories by @szinn in #2701
    • fix: Only prompt once for KeePassXC password by @twpayne in #2704
    • fix: Remove problematic username guessing in init command by @twpayne in #2705

    New Contributors

    • @mumumumu made their first contribution in #2698
    • @szinn made their first contribution in #2701

    Full changelog: v2.29.2...v2.29.3

    "},{"location":"reference/release-history/#2292-2023-01-15","title":"2.29.2 (2023-01-15)","text":"
    • chore: Update goreleaser config for v1.14 by @twpayne in #2667
    • feat: Add keepassxc.prompt config variable by @jcapiitao in #2677
    • docs: Update documentation on encryption by @twpayne in #2683
    • chore: Update dependencies by @twpayne in #2679
    • chore: Fix umask tests by @twpayne in #2688
    • chore: Update dependencies by @twpayne in #2694

    New Contributors

    • @jcapiitao made their first contribution in #2677

    Full changelog: v2.29.1...v2.29.2

    "},{"location":"reference/release-history/#2291-2023-01-02","title":"2.29.1 (2023-01-02)","text":"
    • fix: Fix init --ssh by @twpayne in #2666

    Full changelog: v2.29.0...v2.29.1

    "},{"location":"reference/release-history/#2290-2023-01-01","title":"2.29.0 (2023-01-01)","text":"
    • feat: Allow .chezmoi{external,ignore,remove} files to have a .tmpl suffix by @twpayne in #2632
    • feat: Add support for source paths in managed command by @twpayne in #2633
    • chore: Update dependencies by @twpayne in #2634
    • docs: Fix passphrase-once encryption instructions by @twpayne in #2636
    • chore: Update dependencies by @twpayne in #2639
    • chore(deps): bump actions/cache from 3.0.11 to 3.2.2 by @dependabot in #2641
    • chore(deps): bump github/codeql-action from 2.1.29 to 2.1.37 by @dependabot in #2642
    • chore(deps): bump goreleaser/goreleaser-action from 3.2.0 to 4.1.0 by @dependabot in #2643
    • chore(deps): bump actions/setup-go from 3.3.1 to 3.5.0 by @dependabot in #2644
    • chore(deps): bump dessant/lock-threads from 3.0.0 to 4.0.0 by @dependabot in #2645
    • feat: Allow cd command to take the destination directory as an argument by @twpayne in #2648
    • fix: Improve error message when state database cannot be locked by @twpayne in #2651
    • fix: Fix authentication when git is not installed by @twpayne in #2650
    • fix: Fix bug where edit --watch only applied the first change by @twpayne in #2654
    • chore: Miscellaneous updates by @twpayne in #2655
    • feat: Add hexDecode and hexEncode template functions by @twpayne in #2658
    • chore(deps): bump actions/checkout from 3.1.0 to 3.2.0 by @dependabot in #2659

    Full changelog: v2.28.0...v2.29.0

    "},{"location":"reference/release-history/#2280-2022-12-18","title":"2.28.0 (2022-12-18)","text":"
    • feat: Add lstat template function by @twpayne in #2616
    • feat: Add --path-style option to managed and unmanaged commands by @twpayne in #2617
    • chore: Build with Go 1.19.4 by @twpayne in #2619
    • feat: Add verification of external checksums by @twpayne in #2621
    • chore: Update dependencies by @twpayne in #2623

    Full changelog: v2.27.3...v2.28.0

    "},{"location":"reference/release-history/#2273-2022-12-05","title":"2.27.3 (2022-12-05)","text":"
    • chore: Move GitHub Actions off soon-to-be-deprecated Ubuntu 18.04 by @twpayne in #2604
    • chore(deps): bump golangci/golangci-lint-action from 3.3.0 to 3.3.1 by @dependabot in #2605
    • chore(deps): bump github.com/Masterminds/sprig/v3 from 3.2.2 to 3.2.3 by @dependabot in #2607
    • chore(deps): bump reviewdog/action-misspell from 1.12.2 to 1.12.3 by @dependabot in #2606
    • chore: Update dependencies by @twpayne in #2611
    • fix: Don't attempt to run empty scripts by @twpayne in #2612
    • fix: Respect config file umask setting when creating entries by @twpayne in #2613

    Full changelog: v2.27.2...v2.27.3

    "},{"location":"reference/release-history/#2272-2022-11-25","title":"2.27.2 (2022-11-25)","text":"
    • fix: Make re-add command respect --interactive flag by @twpayne in #2569
    • feat: Add an optional path argument to the cd command by @twpayne in #2579
    • feat: Make it easier to use non-git VCSes by @twpayne in #2580
    • fix: Allow underscores in SourceHut usernames by @twpayne in #2582
    • fix: Respect diff filter in removes with external diff tool by @twpayne in #2592
    • chore: Release fixes by @twpayne in #2593
    • chore: Update dependencies by @twpayne in #2596

    Full changelog: v2.27.1...v2.27.2

    "},{"location":"reference/release-history/#2271-2022-11-13","title":"2.27.1 (2022-11-13)","text":"
    • fix: Don't show always scripts in apply --verbose when excluded from diffs by @twpayne in #2565
    • feat: Remember HTTP username in URL in init command by @twpayne in #2562
    • chore: Make generation of versioninfo.json work without tags or git repo by @twpayne in #2566

    Full changelog: v2.27.0...v2.27.1

    "},{"location":"reference/release-history/#2270-2022-11-09","title":"2.27.0 (2022-11-09)","text":"
    • fix: Revert cpina/github-action-push-to-another-repository version bump by @bradenhilton in #2527
    • chore: Install Go in test-website and deploy-website jobs by @twpayne in #2528
    • feat: Suppress newlines from onepasswordRead by @halostatue in #2532
    • chore(deps): bump golangci/golangci-lint-action from 3.2.0 to 3.3.0 by @dependabot in #2533
    • feat: Allow modify_ scripts to be executed as templates by @twpayne in #2529
    • chore: Blacklist buggy version of github.com/bmatcuk/doublestar/v4 by @twpayne in #2537
    • chore: Build with Go 1.19.3 by @twpayne in #2541
    • feat: Add line ending template directive by @twpayne in #2540
    • feat: Add setValueAtPath template function by @twpayne in #2542
    • fix: Don't merge non-files in merge-all command by @twpayne in #2543
    • feat: Add --script-contents flag to diff command by @twpayne in #2544
    • docs: Add line endings directive documentation by @bradenhilton in #2547
    • docs: Fix typos in Sourcehut repo patterns by @kjerstadius in #2552
    • chore: Better handle errors when globbing by @twpayne in #2538
    • feat: Add cat-config and dump-config commands by @twpayne in #2553
    • chore: Remove unused field by @twpayne in #2554
    • chore: Refactor handling of annotations by @twpayne in #2555
    • feat: Allow prompt*Once template functions to take paths by @twpayne in #2557
    • fix: Fix exclusion of externals by @twpayne in #2558
    • chore: Update dependencies by @twpayne in #2559
    • feat: Add completion template function by @twpayne in #2560

    New Contributors

    • @kjerstadius made their first contribution in #2552

    Full changelog: v2.26.0...v2.27.0

    "},{"location":"reference/release-history/#2260-2022-10-31","title":"2.26.0 (2022-10-31)","text":"
    • feat: Improve handling of include and exclude for externals and encrypted files by @twpayne in #2451
    • feat: Extend --include and --exclude flags to include templates by @twpayne in #2455
    • feat: Add per-template configurable delimiters by @twpayne in #2457
    • chore: Fix user guide link in support issue template by @bradenhilton in #2464
    • chore(deps): bump github/codeql-action from 2.1.26 to 2.1.27 by @dependabot in #2459
    • docs: Update homepage by @twpayne in #2458
    • chore(deps): bump dorny/paths-filter from 2.10.2 to 2.11.1 by @dependabot in #2460
    • chore(deps): bump actions/cache from 3.0.9 to 3.0.11 by @dependabot in #2461
    • chore(deps): bump sigstore/cosign-installer from 2.7.0 to 2.8.0 by @dependabot in #2462
    • chore(deps): bump cpina/github-action-push-to-another-repository from 9e487f29582587eeb4837c0552c886bb0644b6b9 to 940a2857e598a6392bd336330b07416c1ae8ea1f by @dependabot in #2466
    • chore: Update dependencies by @twpayne in #2465
    • chore(deps): bump actions/checkout from 3.0.2 to 3.1.0 by @dependabot in #2463
    • chore: Tweak template directive implementation by @twpayne in #2467
    • chore: Miscellaneous fixes by @twpayne in #2469
    • feat: Add option to exclude scripts that are always run by @twpayne in #2473
    • fix: Extend template directives functionality by @halostatue in #2471
    • chore: Update dependencies by @twpayne in #2474
    • docs: Add faq entry for templates pre-requisites by @felipecrs in #2476
    • docs: Add release notes and release history by @twpayne in #2477
    • docs: Add note on setting .ps1 interpreter to pwsh by @bradenhilton in #2478
    • chore: Fix comments that start from an incorrect name by @alexandear in #2481
    • chore: Add package descriptions by @twpayne in #2485
    • fix: Include git repo external state in state dump output by @twpayne in #2487
    • docs: Add FAQ entry on snap stdin/stdout redirect bug by @twpayne in #2488
    • chore: Use fs.ModePerm instead of 0o777 for all permissions by @twpayne in #2489
    • chore: GitHub Actions fixes by @twpayne in #2492
    • docs(bitwarden): Correct bitwardenFields example by @choznerol in #2493
    • feat: Populate VERSIONINFO on Windows builds by @bradenhilton in #2479
    • chore: Update dependencies by @twpayne in #2494
    • docs: Remove duplicate words by @bradenhilton in #2497
    • chore: Improve error messages from git-repo externals by @twpayne in #2501
    • fix: Construct templateDataMap manually by @halostatue in #2503
    • feat: Add --recurse-submodules flag to init command by @twpayne in #2511
    • feat: Add --recurse-submodules flag to update command by @twpayne in #2512
    • chore: Reorder eqFold template function reference page by @bradenhilton in #2513
    • chore: Fix refactored --include and --exclude flags by @twpayne in #2514
    • chore: Add test for .chezmoiignore and scripts by @twpayne in #2515
    • chore: Update dependencies by @twpayne in #2516
    • chore: Minor documentation tweaks by @twpayne in #2518
    • chore: Release improvements by @twpayne in #2517
    • chore(deps): bump goreleaser/goreleaser-action from 3.1.0 to 3.2.0 by @dependabot in #2519
    • chore(deps): bump actions/upload-artifact from 3.1.0 to 3.1.1 by @dependabot in #2520
    • chore(deps): bump actions/setup-go from 3.3.0 to 3.3.1 by @dependabot in #2522
    • chore(deps): bump github/codeql-action from 2.1.27 to 2.1.29 by @dependabot in #2523
    • chore(deps): bump sigstore/cosign-installer from 2.8.0 to 2.8.1 by @dependabot in #2521

    Full changelog: v2.25.0...v2.26.0

    "},{"location":"reference/release-history/#2250-2022-10-13","title":"2.25.0 (2022-10-13)","text":"
    • docs: Add FAQ entry on multiple source states by @twpayne in #2391
    • chore: Separate out test-release step by @twpayne in #2392
    • chore: Add check for keepassxc-cli version in keepassxcAttachment by @twpayne in #2397
    • chore: Fix typo in entrytypeset.go by @sm1999 in #2400
    • chore: Add test that chezmoi apply uses textconv by @twpayne in #2401
    • fix: Use textconv in interactive diffs by @twpayne in #2402
    • chore(deps): bump actions/cache from 3.0.8 to 3.0.9 by @dependabot in #2410
    • chore(deps): bump github/codeql-action from 2.1.21 to 2.1.26 by @dependabot in #2411
    • feat: Add shell completion for --include and --exclude flags by @twpayne in #2419
    • chore: Bump Go and golangci-lint versions by @twpayne in #2420
    • chore: Update dependencies by @twpayne in #2421
    • chore: Copy github.com/twpayne/go-shell into module by @twpayne in #2422
    • feat: Add eqFold template function by @bradenhilton in #2409
    • feat: Add scriptEnv configuration variable by @twpayne in #2423
    • chore: Set Go version in govulncheck by @twpayne in #2428
    • chore: Only read .chezmoiroot once by @twpayne in #2431
    • feat: Sign release assets by @twpayne in #2394
    • chore: Use build info to set commit and date, if available by @twpayne in #2434
    • chore: Use ReadDir to find config files and templates by @twpayne in #2435
    • chore: Use GitHub native changelogs for releases by @twpayne in #2438
    • feat: Use target paths in automatically generated commit messages by @twpayne in #2439
    • chore: Automatically deploy website after release by @twpayne in #2437
    • feat: 1Password account lookup table by @halostatue in #2425
    • chore: Refactor 1Password account map by @twpayne in #2440
    • docs: Use get.chezmoi.io for install links by @twpayne in #2441
    • feat: Add get.chezmoi.io/ps1 by @twpayne in #2443
    • chore: Fail if multiple config file templates or config files are found by @twpayne in #2444
    • fix: Make chattr {no,}encrypted decrypt and encrypt source file by @twpayne in #2447
    • chore: Update dependencies by @twpayne in #2448
    • feat: Expose template data in environment variables by @twpayne in #2429
    • chore: Use GitHub output in govulncheck workflow by @twpayne in #2450

    Full changelog: v2.24.0...v2.25.0

    "},{"location":"reference/release-history/#2240-2022-09-25","title":"2.24.0 (2022-09-25)","text":"
    • bb8d579 docs: Add FAQ entry on --verbose and --debug flags
    • fb595f2 docs: Add link to article
    • 0f58586 docs: Elaborate on once vs onchange attributes
    • b970bc1 feat: Add always/auto/never options to --refresh-externals flag
    • 21e99c7 feat: Add option to suppress warnings
    • a29abcf feat: Improve performance of the externals cache
    • da407b6 fix: Avoid double read of source state in merge-all and status commands
    • 1fbe862 fix: Preserve case in user template data
    • 9dda54a fix: Respect .chezmoiroot in source-path command with no arguments

    Full changelog: v2.23.0...v2.24.0

    "},{"location":"reference/release-history/#2230-2022-09-19","title":"2.23.0 (2022-09-19)","text":"
    • 6e49147 docs: Add hints about escaping diff and merge args in config file template
    • f1b404d docs: Add link to video
    • 2c3a349 docs: Change remote origin from ssh to https
    • 4d68612 docs: Update symlink design question with docs on edit --watch
    • 8b4b856 feat: Add --progress flag to show progress when downloading externals
    • ccb897c feat: Add passhole password manager support
    • 994a0c7 feat: Always set and restore Windows console
    • cf51259 feat: Use bubbletea for user input
    • 8054dff fix: Don't write file specified by --output atomically
    • 80576f5 fix: Ignore commands when creating archives
    • 83f01eb fix: Only read source state if needed in source-path command
    • c1a53e1 fix: Treat git-repo externals as directories of include/exclude purposes

    Full changelog: v2.22.1...v2.23.0

    "},{"location":"reference/release-history/#2221-2022-09-04","title":"2.22.1 (2022-09-04)","text":"
    • 64b9c1f fix: Fix handling of newlines in comment template function
    • 4950fc3 fix: Make includeTemplate function first search in .chezmoitemplates

    Full changelog: v2.22.0...v2.22.1

    "},{"location":"reference/release-history/#2220-2022-09-01","title":"2.22.0 (2022-09-01)","text":"
    • 6625f29 docs: Add FAQ entry on sharing shell history
    • 097a88c docs: Add note on script execution order
    • 3b6edaf docs: Fix a coloring issue that lines and texts in Mermaid diagrams are hardly visible in dark mode
    • 3e6e26d feat: Add includeTemplate template function
    • bf5b674 feat: Add initial fig support
    • 41644bb feat: Add support for loong64 architecture
    • 7a525b7 fix: Apply changes to directories recursively when editing directories
    • 03a91ca fix: Only use quotes if necessary in toIni template function

    Full changelog: v2.21.1...v2.22.0

    "},{"location":"reference/release-history/#2211-2022-08-29","title":"2.21.1 (2022-08-29)","text":"
    • f4be0e0 docs: Add link to package installation
    • 9f207f4 docs: Add summary paragraph
    • c60b406 feat: Add edit.apply configuration variable
    • 75b0569 feat: Add secret.args configuration variable
    • b59f127 fix: Detect SSH clones from URL when using builtin git
    • 4919c1a fix: Fix panic when absolute paths are used in externals
    • 8b420af fix: Respect format configuration variable in data, dump, and state commands

    Full changelog: v2.21.0...v2.21.1

    "},{"location":"reference/release-history/#2210-2022-08-23","title":"2.21.0 (2022-08-23)","text":"
    • c8399bc docs: Add FAQ entry on init template functions
    • e2ec7c5 docs: Add instructions for using chezmoi with Watchman
    • dc2ec23 docs: Add link to repology.org
    • 4d086c2 docs: Remove unmaintained Guix package
    • 485850f docs: Use install-from-git-working-copy in installation instructions
    • 9e4629f feat: Add --interactive flag
    • 8602622 feat: Add --prompt flag to init command
    • f98264b feat: Add --prompt* flags to init command
    • 02b8954 feat: Add fromIni template function
    • ffbb367 feat: Add gitHubLatestTag template function
    • ac0c759 feat: Add initial --watch flag to edit command
    • 3af5c7f feat: Add toIni template function
    • db4da31 feat: Improve support for external diff commands
    • 84afa19 fix: Handle .chezmoiroot in init command
    • 7583387 fix: Remove broken symbolic links in exact_ directories

    Full changelog: v2.20.0...v2.21.0

    "},{"location":"reference/release-history/#2200-2022-07-29","title":"2.20.0 (2022-07-29)","text":"
    • 5fdc580 docs: Add Termux package install instructions
    • 150144e docs: Add dark mode option
    • 24db084 docs: Prioritize package installation over curl | sh installation
    • 199d62e feat: Add comment template function
    • c0e2f53 feat: Add generate command to generate install script
    • 4dfd206 feat: Add onepasswordRead template function
    • 06b212b feat: Add promptBoolOnce, promptIntOnce, and promptStringOnce init template functions
    • ebeb8df feat: Add replaceAllRegex template function
    • 84e7a93 feat: Make managed command accept destination directory args
    • f8eabef feat: Make unmanaged command accept destination directory args
    • 9316c5a feat: Track source state origins more precisely
    • 851efe3 fix: Fix dropping of input when prompting for multiple values from piped stdin

    Full changelog: v2.19.0...v2.20.0

    "},{"location":"reference/release-history/#2190-2022-07-17","title":"2.19.0 (2022-07-17)","text":"
    • 47db454 docs: Add section on muting gpg output
    • 9dea4ea feat: Add fromToml and toToml template functions
    • ac6af02 feat: Add support for AWS Secrets Manager
    • 074899d feat: Allow dashes in keys in template data in config file
    • 132d184 fix: Fix FQDN hostname on FreeBSD
    • 03eb672 fix: Fix forget command when asked to forget an external
    • 304f52a fix: Fix merge command for encrypted files in subdirectories
    • 50dd19c fix: make install creates the bin/ dir if necessary, and uses the unambiguous --target-directory form of install.

    Full changelog: v2.18.1...v2.19.0

    "},{"location":"reference/release-history/#2181-2022-06-23","title":"2.18.1 (2022-06-23)","text":"
    • b944a84 docs: Add CPU cores/threads template
    • 1c60734 docs: Improve documentation of chezmoi's concepts
    • 2ee341c feat: Re-enable building of snaps

    Full changelog: v2.18.0...v2.18.1

    "},{"location":"reference/release-history/#2180-2022-06-20","title":"2.18.0 (2022-06-20)","text":"
    • 817d3e7 feat: Stop building snaps\\n ab6bc8d feat: Make add command add empty files, remove --empty flag\\n 755e02f fix: Don't return an error when the user chooses quit from a prompt\\n b554329 feat: Implement documented add --prompt flag\\n b95449f docs: Remove stray whitespace\\n ebeebcb docs: Add extra documentation to autotemplate\\n 991a630 docs: Clarify what 'source state' means\\n 2421da8 fix: Check .chezmoiversion in init command\\n 25b32fb feat: Give more context in Windows errors\\n 9605e40 feat: Make --autotemplate escape template markers\\n 2c89541 feat: Support determining FQDN via /etc/myname\\n 281e770 feat: Support multiple GPG recipients\\n cbed719 feat: Include git working tree state in doctor output\\n 87c1a91 docs: Use modeline to set filetype in VIM\\n 1af0576 feat: Include last modified time of config file in doctor output\\n 44762fd feat: Add quoteList template function\\n 2bf1210 feat: Add textconv configuration for friendlier binary diffs\\n 814f1f2 docs: Refactor Windows chassisType template\\n 7199cb2 docs: Add link to blog\\n d29344f fix: Improve quality of POSIX shell scripts\\n f2f8d87 docs: Add link to blog post\\n

    Full changelog: v2.17.1...v2.18.0

    "},{"location":"reference/release-history/#2171-2022-05-30","title":"2.17.1 (2022-05-30)","text":"
    • 1f92965 docs: Add information about chezmoi_modify_manager
    • 8b78d2b docs: Add link to podcast
    • fdd29a5 docs: Fix typo in kubeconfig documentation
    • 7d2d629 docs: Organize related software page into sub-sections
    • 7084bd5 fix: Fix dump command in the presence of config file templates
    • 2d27229 fix: Include git repo commands in dump command output

    Full changelog: v2.17.0...v2.17.1

    "},{"location":"reference/release-history/#2170-2022-05-26","title":"2.17.0 (2022-05-26)","text":"
    • d178db4 feat: Add uid and gid template variables
    • 658be53 feat: Add windowsVersion to builtin template data
    • 21e2666 fix: Parse $EDITOR and $VISUAL environment variables as shell commands

    Full changelog: v2.16.0...v2.17.0

    "},{"location":"reference/release-history/#2160-2022-05-19","title":"2.16.0 (2022-05-19)","text":"
    • e0b3ace feat: Add support for Keeper password manager
    • c4a4779 feat: Build for mips64 and mips64le
    • 17c480b feat: Build for riscv64
    • 1a63dc2 feat: Complete auto bool, format, and mode flag values
    • 187112d fix: Connect password manager std{in,err} to os.Std{in,err}
    • 7485aea fix: Don't complete _chezmoi in zsh completion
    • ef2be28 fix: Fix use of slashes in glob on Windows

    Full changelog: v2.15.4...v2.16.0

    "},{"location":"reference/release-history/#2154-2022-05-09","title":"2.15.4 (2022-05-09)","text":"
    • 8168ab9 docs: Add chezmoiexternal related links to user-guide/reference docs
    • a0d699c docs: Add example of extracting selected files from external archive
    • 47a2940 docs: Add some additional details to contributing-changes.md
    • 1c11ff1 fix: Fix external archive, sub-directory include, no excludes

    Full changelog: v2.15.3...v2.15.4

    "},{"location":"reference/release-history/#2153-2022-05-08","title":"2.15.3 (2022-05-08)","text":"
    • ccb709c docs: Add hint on random access in modify_ scripts
    • b525c50 feat: Add --guess-repo option to init command

    Full changelog: v2.15.2...v2.15.3

    "},{"location":"reference/release-history/#2152-2022-05-01","title":"2.15.2 (2022-05-01)","text":"
    • cbfe388 docs: Add clarification about all lowercase custom data fields
    • 84ac2e2 docs: Add guide on encrypting files with GPG and a passphrase
    • 8552a4c docs: Add links to blog and video
    • 7b83a17 docs: Add troubleshooting entry on scripts on Termux
    • 4de3fdc docs: Document workaround for #1574
    • d507609 docs: Minor tweaks
    • 956b449 docs: Use index function to access an item in the example
    • 58f9f45 feat: Add glob template function
    • fe0b6cf feat: Build with Go 1.18.1
    • eaa27b3 fix: Don't cache negative results of path lookups

    Full changelog: v2.15.1...v2.15.2

    "},{"location":"reference/release-history/#2151-2022-04-10","title":"2.15.1 (2022-04-10)","text":"
    • d297409 docs: Add section on understanding chezmoi's files and directories
    • cd74d0c docs: Document KeepassXC with YubiKey limitations
    • f0817a0 docs: Fix path to config file template
    • 462e547 docs: Tidy up KeepassXC reference documentation
    • 6cd2766 feat: Use diff.command for all verbose output
    • 58c458c fix: Fix apply --verbose when diff.command is set
    • f45b73a fix: Fix concurrent map writes on sourcestate.ignoredRelPaths
    • 95d5298 fix: Ignore exit status 1 from external diff commands

    Full changelog: v2.15.0...v2.15.1

    "},{"location":"reference/release-history/#2150-2022-04-03","title":"2.15.0 (2022-04-03)","text":"
    • 2fa910f docs: Add command overview
    • d051e7a docs: Add link to blog post
    • d2a4417 docs: Add link to podcast
    • ecdb07b docs: Adjust documents for 1Password CLI 2.0.0 changes
    • 9b1b5fb docs: Document that the ioreg template function is deprecated
    • 8e7bbde docs: Factor out GitHub template functions into a separate section
    • 4cabbc2 docs: Factor out init template functions into a separate section
    • 19e6d00 docs: Factor out password manager functions into separate sections
    • f3ef8be docs: Improve FAQ entry on source state filenames
    • cb02477 docs: Improve docs on empty files in chezmoi edit
    • caa9120 docs: Update dconf example as dconf only reads stdin
    • 08138ab docs: Use $VARIABLE instead of
    • 3f035a6 feat: Add diff.reverse configuration variable
    • d1374cf feat: Add ignored command
    • 38be385 feat: Add keepassxcAttachment template function
    • 4e6b843 feat: Build for s390x architecture
    • 523fdb2 fix: Fix one line install instructions for Windows
    • 8d052c0 fix: Fix op signin for 1Password CLI 2.0.0
    • 8910adb fix: Fix parsing of multiline KeepassXC attributes
    • a08c891 fix: Fix use of drives as home directories on Windows
    • b999509 fix: Prefer id over label for onepasswordDetailsFields template function
    • Full changelog: v2.14.0...v2.15.0

      "},{"location":"reference/release-history/#2140-2022-03-09","title":"2.14.0 (2022-03-09)","text":"
      • a3a1e17 docs: Add contributors image
      • 28c2718 docs: Add license to website
      • 538b982 docs: Add link to article
      • 32c0f02 feat: Add include and exclude patterns to external archives
      • ebfd5b2 feat: Add license command
      • 5a14326 feat: Release raw binaries

      Full changelog: v2.13.1...v2.14.0

      "},{"location":"reference/release-history/#2131-2022-03-04","title":"2.13.1 (2022-03-04)","text":"
      • dd0037b feat: Add scriptTempDir config var for temporary scripts
      • 816e5ee feat: Change default Python interpreter to python3
      • a4d989b fix: Allow user and repo to set in install script
      • e2e199b fix: Fix confusing error message when using builtin git to init over SSH

      Full changelog: v2.13.0...v2.13.1

      "},{"location":"reference/release-history/#2130-2022-02-26","title":"2.13.0 (2022-02-26)","text":"
      • e8ee359 docs: Add link to article
      • 3f36946 docs: Document extracting a single file from an archive
      • 843ba33 docs: Improve scripts user guide
      • 585adb1 feat: Add initial git-repo external type
      • e299d90 feat: Add option to exclude externals
      • 5f39fec feat: Add status.exclude configuration variable
      • 2451314 feat: Add verify.exclude configuration variable
      • fd47686 feat: Allow overriding GitHub user in shell installer
      • 08991d1 feat: Enable GNOME Keyring support on FreeBSD
      • 881cb7e fix: Correctly cut hostname off at . character

      Full changelog: v2.12.1...v2.13.0

      "},{"location":"reference/release-history/#2121-2022-02-20","title":"2.12.1 (2022-02-20)","text":"
      • 1fbc2ae feat: Be more strict about presence of source directory
      • baac6fc feat: Support arguments in Windows SHELL environment variable

      Full changelog: v2.12.0...v2.12.1

      "},{"location":"reference/release-history/#2120-2022-02-15","title":"2.12.0 (2022-02-15)","text":"
      • e9342a8 feat: Add target-path command
      • d228a50 feat: add support for xz archives
      • 6228e09 fix: Fix bug where chezmoi init --apply did not configure encryption

      Full changelog: v2.11.2...v2.12.0

      "},{"location":"reference/release-history/#2112-2022-02-03","title":"2.11.2 (2022-02-03)","text":"
      • 13de45f fix: Disable problematic concurrent source dir read

      Full changelog: v2.11.1...v2.11.2

      "},{"location":"reference/release-history/#2111-2022-02-02","title":"2.11.1 (2022-02-02)","text":"
      • 46c6766 fix: Fix race condition with multiple .chezmoiignore files

      Full changelog: v2.11.0...v2.11.1

      "},{"location":"reference/release-history/#2110-2022-02-02","title":"2.11.0 (2022-02-02)","text":"
      • c1271ff feat: Add initial support for 1Password CLI 2.0
      • 86ec4b8 feat: Add remove_ attribute for directories
      • dc919e6 feat: Include removed directories in diff output of external diff command
      • 8a84b31 feat: Make chezmoi's core functionality available as a Go module

      Full changelog: v2.10.1...v2.11.0

      "},{"location":"reference/release-history/#2101-2022-01-23","title":"2.10.1 (2022-01-23)","text":"
      • b4841ec fix: Fix add command when parent dir permissions have changed
      • 71ca1f6 fix: Ignore files and directories beginning with . in .chezmoitemplates
      • 2fd7a02 fix: Make data and execute-commands not depend on valid source state

      Full changelog: v2.10.0...v2.10.1

      "},{"location":"reference/release-history/#2100-2022-01-16","title":"2.10.0 (2022-01-16)","text":"
      • 724227b feat: Add chezmoi.io/get install URL
      • 65b6cb3 feat: Add list command as an alias for managed
      • ed62bbf feat: Append / to completed directories
      • 5aca99a feat: Disable custom completions by default
      • 7cd21aa feat: Remove docs command
      • 3129886 feat: Switch to Material for MkDocs for website

      Full changelog: v2.9.5...v2.10.0

      "},{"location":"reference/release-history/#295-2022-01-05","title":"2.9.5 (2022-01-05)","text":"
      • b9aeae9 feat: Add passFields template function
      • 326b578 feat: Prompt for 1password password if no session token is set
      • 2b98c14 fix: Fix shell completion for relative paths
      • 35af862 fix: Make exit template function init only

      Full changelog: v2.9.4...v2.9.5

      "},{"location":"reference/release-history/#294-2021-12-19","title":"2.9.4 (2021-12-19)","text":"
      • e25d501 feat: Add exit template function
      • cdac464 feat: Add secret keyring delete command
      • e2899b8 feat: Improve inconsistent state error with removes
      • 05e94c6 fix: Add missing --value flag to secret keyring set command
      • 5b50963 fix: Avoid panic when unknown URL schemes are used
      • 68fff1c fix: Fix include template function on Windows with absolute path

      Full changelog: v2.9.3...v2.9.4

      "},{"location":"reference/release-history/#293-2021-12-13","title":"2.9.3 (2021-12-13)","text":"
      • 126cb0c feat: Add --cache option and .chezmoi.cacheDir template variable
      • 89aec79 feat: Add more intelligent completion of targets, attributes, and docs
      • 66728aa feat: Follow symlinks in .chezmoitemplates
      • e1f2d15 fix: Fix .chezmoiversion check when using dev version

      Full changelog: v2.9.2...v2.9.3

      "},{"location":"reference/release-history/#292-2021-12-02","title":"2.9.2 (2021-12-02)","text":"
      • 8e8ef0f fix: Don't mark .chezmoiscripts as suspicious in doctor command
      • a2c5685 fix: Read .chezmoiversion before other files

      Full changelog: v2.9.1...v2.9.2

      "},{"location":"reference/release-history/#291-2021-11-30","title":"2.9.1 (2021-11-30)","text":"
      • ecb6c1d feat: Add .chezmoi.configFile template variable
      • 3560b20 feat: Add .chezmoi.workingTree template variable
      • d70de7a feat: Extend upgrade command to work on more operating systems
      • d23b428 fix: Check for .chezmoiversion outside .chezmoiroot
      • ccf6971 fix: Fix use of .chezmoiroot in multiple commands

      Full changelog: v2.9.0...v2.9.1

      "},{"location":"reference/release-history/#290-2021-11-28","title":"2.9.0 (2021-11-28)","text":"
      • 219a09e feat: Add .chezmoiscripts directory
      • ec2b92a feat: Add edit.hardlink config var and edit --hardlink flag
      • 7d31ecb feat: Add fromYaml template function
      • 988fcdc feat: Add state delete-bucket command
      • ff1e81d feat: Add state get-bucket command
      • da41e0f feat: Add toYaml template function
      • 98b6a39 feat: Apply diff.exclude to all diffs
      • 33c3e97 feat: Make verbose settable in the config file
      • 5672e1f fix: .chezmoiremove with * when destDir is /
      • aac0fd6 fix: Handle symlinks in zip archives
      • e7e6932 fix: Respect .chezmoiroot when generating config file

      Full changelog: v2.8.0...v2.9.0

      "},{"location":"reference/release-history/#280-2021-11-20","title":"2.8.0 (2021-11-20)","text":"
      • 9cbfdf6 feat: Add --persistent-state option for location of persistent state file
      • cbac205 feat: Add --reverse option to diff command
      • dec8789 feat: Add .chezmoi.executable template variable
      • 8a6d4d7 feat: Add .chezmoiroot to allow source state to be subdir of source dir
      • 518313b feat: Add cache HTTP client to cache downloads in .chezmoiexternal.
      • 8e1d647 feat: Add gitHubLatestRelease template function
      • ebacee7 feat: Add support for Homebrew on Linux to upgrade command
      • 3a4c1d0 feat: Add upgrade method to doctor command output
      • 90120fe feat: Caching the response of the GitHub API
      • 240f7ec feat: Make .chezmoidata. and .chezmoitemplates available in .chezmoiignore
      • 53cfa6e fix: Return unparsed gopass output in gopassRaw template func
      • e9e4712 fix: Warn, don't fail, if age version cannot be parsed in doctor command
      • 016da7a fix: lookPath panics when file does not exists
      • Full changelog: v2.7.5...v2.8.0

        "},{"location":"reference/release-history/#275-2021-11-07","title":"2.7.5 (2021-11-07)","text":"
        • 2a39175 feat: Add pinentry as an option for reading passwords
        • 823836c feat: Extend chattr command to change target types
        • bf8a185 fix: Make chezmoi add command respect .chezmoiignore

        Full changelog: v2.7.4...v2.7.5

        "},{"location":"reference/release-history/#274-2021-11-02","title":"2.7.4 (2021-11-02)","text":"
        • 9d621f7 feat: Add .chezmoi.args template variable
        • 27938e6 feat: Allow equivalent directory entries in source state and externals
        • 6113528 feat: Create parent directories for externals if needed
        • 83bad0a fix: Fix upgrade command for non-amd64 packages

        Full changelog: v2.7.3...v2.7.4

        "},{"location":"reference/release-history/#273-2021-10-23","title":"2.7.3 (2021-10-23)","text":"
        • 5d2fb13 feat: Add Illumos support
        • 14a475d feat: Add Solaris support

        Full changelog: v2.7.2...v2.7.3

        "},{"location":"reference/release-history/#272-2021-10-19","title":"2.7.2 (2021-10-19)","text":"
        • 67e0806 fix: Fix promptString default on Windows

        Full changelog: v2.7.1...v2.7.2

        "},{"location":"reference/release-history/#271-2021-10-17","title":"2.7.1 (2021-10-17)","text":"
        • 35eb651 feat: Add default argument to promptBool template function
        • 7e2e64d feat: Add default argument to promptInt template function
        • 951fc7e feat: Add default argument to promptString template function
        • 87033e2 fix: Apply .chezmoiignore to externals

        Full changelog: v2.7.0...v2.7.1

        "},{"location":"reference/release-history/#270-2021-10-12","title":"2.7.0 (2021-10-12)","text":"
        • 91c91f0 docs: fix .chezmoiignore example
        • 92ce33c feat: Add decrypt and encrypt template functions
        • 42e8323 feat: Add merge-all command
        • c8f113f feat: Add onchange_ attribute for scripts
        • f54deef feat: Improve messages and logging when using builtin git init
        • 02abd9a fix: Allow create_ entries to be templates
        • 20abba4 fix: Clarify behavior of run_once_ scripts
        • ebc0149 fix: Fix status for onchange scripts

        Full changelog: v2.6.1...v2.7.0

        "},{"location":"reference/release-history/#261-2021-10-03","title":"2.6.1 (2021-10-03)","text":"
        • 8d9a89b feat: Re-enable building with Go 1.16

        Full changelog: v2.6.0...v2.6.1

        "},{"location":"reference/release-history/#260-2021-10-02","title":"2.6.0 (2021-10-02)","text":"
        • 29464c6 chore(deps): bump assets/chezmoi.io/themes/book
        • c189d22 docs: Improve docs on externals
        • 157b0b7 feat: Add --init flag to all relevant commands
        • 78ae6c6 feat: Add refreshPeriod option to externals
        • 3d18ae8 feat: Make chezmoi edit invoke editor with target filenames
        • 8fda89b fix: Fix upgrade command on non-amd64 Linux machines

        Full changelog: v2.5.1...v2.6.0

        "},{"location":"reference/release-history/#251-2021-09-30","title":"2.5.1 (2021-09-30)","text":"
        • cbc2f1e docs: Add FAQ entry on diff colors not working
        • fa09eff docs: fix error in HOWTO guide
        • 55a4b93 feat: Add --init option to update command
        • f42866b feat: Add working tree config option (#1459)
        • f86d7b5 feat: Make chezmoi edit with no args open working tree (#1455)
        • b7fb215 fix: Allow modify_ scripts to be encrypted

        Full changelog: v2.5.0...v2.5.1

        "},{"location":"reference/release-history/#250-2021-09-23","title":"2.5.0 (2021-09-23)","text":"
        • 48b8096 Add Vagrant-based tests to CI
        • d439e7f Add doctor check for multiple config files
        • a79ba2f Add example to onepasswordItemFields documentation
        • 167638f Add filter option for externals
        • ccf78c5 Add how-to entry on managing file permissions but not contents
        • 74c06e4 Add link to podcast
        • 9e26b17 Add readonly_ attribute for files and directories
        • 47936f6 Add support for .chezmoiexternal files in subdirectories
        • 22c3f68 Add support for readonly attribute to chattr command
        • a909463 Allow the format of external archives to be set explicitly
        • 6f40524 Cache Vagrant Boxes in CI
        • 6ec4d02 Change gitlab link for other people's dotfiles
        • 4f1a977 Detect archive format from content if needed
        • 9996849 Detect when the source directory is already in a git working copy
        • 4d76d93 Disable GPG tests on Windows
        • 402c8cb Enable age tests on Windows CI
        • e79bbb1 Expand FAQ entry on build from source errors
        • 0739933 Fix CLI flags not taking precedence over configuration
        • 0bf08f4 Fix more command line flags overriding config vars
        • cbc6b15 Fix permissions for CodeQL analysis
        • 89a66fa Fix permissions in diff output when user sets a stricter umask
        • 0fa5f5a Guess format of chezmoi archive from output filename
        • b43e26e Improve consistency of source state read from externals
        • 188bae9 Improve internal logging infrastructure
        • 47ce738 Improve logging in Windows CI
        • 717b5d1 Make Makefile more portable
        • a86ca9e Merge test-release job into test-ubuntu
        • 0695b0c Minor docs fixes
        • 59cfe21 Only create .keep files when adding empty directories
        • e653627 Only warn if version or commit are not set in doctor command
        • 839703d Propagate failures in Vagrant CI scripts
        • ab2fa72 Reduce duplication of Go version in CI
        • 69f6a33 Reduce duplication of versions in build and CI system
        • b5bbe67 Revert \"Disable GPG tests on Windows\"
        • e63d0e7 Separate OS-specific CI jobs
        • 420ec58 Skp whitespace linting of temporary Vagrant files
        • e94cd8b Support paths containing spaces in VIM integration
        • 5460876 Tidy up error message when doctor command cannot parse version
        • ea59267 Update Vagrant-based tests
        • eaad1f6 Update dependencies

        Full changelog: v2.4.0...v2.5.0

        "},{"location":"reference/release-history/#240-2021-09-10","title":"2.4.0 (2021-09-10)","text":"
        • 736aaa1 Add decrypt command
        • 0b2692a Add doc on detemining whether the machine is a laptop or desktop
        • ed65ef6 Add encrypt command
        • 98b92c2 Add initial --use-builtin-age flag
        • dd116f7 Build with Go 1.17.1
        • 63610a4 Extend init command to guess the user's username for private repos
        • 34ecd67 Fix internal capitalization of age
        • da04181 Simplify internal use of auto bools
        • 2ff4151 Update dependencies

        Full changelog: v2.3.1...v2.4.0

        "},{"location":"reference/release-history/#231-2021-09-08","title":"2.3.1 (2021-09-08)","text":"
        • 4fa36ee Add link to blog post
        • 778fd4c Add link to podcast
        • 89fd238 Add new media links
        • 60703f8 Add onepasswordItemFields template function
        • 57ab1f2 Append path arguments to diff command if not provided by user
        • a761f3f Append path arguments to merge command if not provided by user
        • 62e02ff Bump age to version 1.0.0
        • 8370209 Bump golangci-lint to version 1.42.1
        • 5a51c9e Conceal the user's username in doctor command output
        • a318652 Require Go 1.17 to build and log Go version in debug mode

        Full changelog: v2.3.0...v2.3.1

        "},{"location":"reference/release-history/#230-2021-09-04","title":"2.3.0 (2021-09-04)","text":"
        • 7cee590 Add how-to entry on using private dotfile repos
        • 9e77ea5 Add remove_ attribute
        • ad1c938 Add support for zip archives to .chezmoiexternal
        • 5c61b95 Add support for zip archives to import command
        • 433bdcc Add umask check to doctor command
        • 091979d Add undocumented --safe=false command line flag
        • 2ff4214 Bump assets/chezmoi.io/themes/book from 50147be to a656d71
        • 01ac1d0 Fix install from source documentation
        • 8ca5448 Improve contributing docs
        • 97a7e0e Log debug information in chezmoi apply
        • 0a2a40c Log version and args on startup in debug mode
        • 767e834 Remove accidentally unimplemented --remove option
        • 570f91a Remove stale FIXMEs

        Full changelog: v2.2.0...v2.3.0

        "},{"location":"reference/release-history/#220-2021-08-30","title":"2.2.0 (2021-08-30)","text":"
        • c03209f Add .chezmoiexternal for external files and archives
        • 0346200 Add support for encrypted externals
        • 49c34ea Add tests for multiple OSes using Vagrant
        • 08822e2 Check all shell scripts with shellcheck
        • 9a9d2f2 Fix bug when using custom diff tool on a file in a subdirectory
        • 0d82773 Make Makefile more consistent
        • d6f48f4 Pass context when reading source state
        • b06c2a6 Recognize .tbz2 files as archives
        • e946bf5 Reduce test verbosity on Cirrus CI
        • 3b84841 Remove Cirrus CI
        • 434c29f Rename internal variables for consistency
        • 78d52d2 Suppress initial branch name hints from git in chezmoi init
        • 00763d2 Tidy up code structure
        • 021eaf1 Tidy up documentation
        • 4937ea6 Update dependencies
        • a6e3d9a Update media links
        • 2cec38f Update tests for OpenBSD tar output

        Full changelog: v2.1.6...v2.2.0

        "},{"location":"reference/release-history/#216-2021-08-22","title":"2.1.6 (2021-08-22)","text":"
        • 3c476d9 Add --recursive flag to remove command
        • 461ea4a Add executable check to doctor command
        • 20b323c Add link to podcast and notes
        • bec5350 Add more explicit documentation on config file location
        • 994e633 Add more related software
        • 81094bf Add note on using -- in chattr
        • 70efaab Add test of the output and fromJson template functions
        • a25b911 Add windows/arm builds
        • 137e07e Build with Go 1.17
        • 11d84ed Bump golangci-lint to v1.42.0
        • 6d5f658 Create .keep files when adding directories
        • 4619b09 Fix bug where adding a dir with a trailing slash added it twice
        • 8eef5e4 Fix creation of .keep files when umask is 002
        • 5afe5a2 Improve how-to on diff and merge customization
        • de5cb42 Improve type safety in encryption code
        • f8d7368 Make remove command remove entries from persistent state
        • ed95a58 Miscellaneous Go 1.17 fixes
        • 5b0138a Tidy up suspicious entries list in doctor command
        • dc319c4 Tidy up test scripts
        • 5d2126b Tranparently decrypt files in merge command

        Full changelog: v2.1.5...v2.1.6

        "},{"location":"reference/release-history/#215-2021-08-11","title":"2.1.5 (2021-08-11)","text":"
        • 817e4d9 Add --config-type option so config file can be read from stdin
        • 7b3e307 Add function for running idempotent commands
        • 002742c Add initial suport for external diff tools
        • e4ac1b5 Add symlink mode
        • 7576466 Build with Go 1.16.7
        • 182b937 Fix chezmoi execute-template --init to not read chezmoidata
        • 60ae6b2 Fix spacing error in docs
        • 8144975 Fix the FreeBSD installation method
        • 0eb5348 Improve error messages for configurable merge tool arguments
        • 3304f6a Improve internal testing functions
        • 2726d9f Include .exe extension in Windows build artifact name
        • 70a85f0 Normalize symlinks on Windows
        • d79c30e Rename internal function for clarity
        • cb4ee88 Tweak doc formatting

        Full changelog: v2.1.4...v2.1.5

        "},{"location":"reference/release-history/#214-2021-08-04","title":"2.1.4 (2021-08-04)","text":"
        • a4eeff4 Add inital undocumented mackup add command
        • 1dfae81 Bump assets/chezmoi.io/themes/book from e939f40 to 50147be
        • 42e1f2f Fix crash when color was set to auto in config file
        • 49e9b46 Fix grammar
        • 43a0f1e Fix some minor internal inconsistencies
        • 91d10b0 Fix tag line in reference manual
        • dc6011b Make order of arguments to merge command configurable
        • b074718 Tidy up order of struct fields
        • 23059eb Update contributing doc
        • cdbc085 Update dependencies

        Full changelog: v2.1.3...v2.1.4

        "},{"location":"reference/release-history/#213-2021-07-31","title":"2.1.3 (2021-07-31)","text":"
        • 62bc51a Add VCSH to comparison chart
        • 69dc0f3 Add hidden internal-test command for internal testing
        • f9771a9 Add more media links
        • f0e7dce Allow entering username/password when using builtin git
        • e23dcc3 Bump golangci-lint to 1.41.1
        • bd9e485 Correct git archive import features
        • 1d433a2 Fix formatting in comparison table
        • bf77f76 Normalize cell length in Markdown table
        • 9820eb2 Reduce test verbosity in CI
        • 74811b2 Remove incorrectly documented short option
        • dde40d0 Set the record straight on some bare-git features
        • d4971ed Tidy up comparison table
        • cfe9084 Tidy up repo guessing code
        • 523496c Tidy up username and password requests when using builtin git
        • b51c080 Update dependencies
        • 4282879 Update dependencies
        • f00f6b5 Update recommended podcast
        • aae3a82 Use golang.org/x/sys/unix package where possible
        • 79d5348 Use target name when editing files
        • 47de173 Use terminal to read password on Windows

        Full changelog: v2.1.2...v2.1.3

        "},{"location":"reference/release-history/#212-2021-07-14","title":"2.1.2 (2021-07-14)","text":"
        • db62a0b Add FAQ entry on chezmoi cd
        • 80d925f Add link to blog
        • 4da300a Add more media entries
        • acc950d Allow install of chezmoi from a powershell where StrictMode is on
        • 19500e0 Allow source directory to be a symlink
        • 7b572a8 Build with Go 1.16.6
        • 1ba3727 Fix doctor check for suspicious entries
        • 7c688ef Make .chezmoi.kernel template variable more generic
        • dcf0ba1 Make .chezmoi.osRelease template variable more generic
        • 38d163d Make modify scripts always overwrite the target without prompting
        • 173ab68 Populate all default template variables
        • 35de5ad Remove .chezmoi.homedir template variable
        • bb0d23e Tidy up issue templates

        Full changelog: v2.1.1...v2.1.2

        "},{"location":"reference/release-history/#211-2021-07-11","title":"2.1.1 (2021-07-11)","text":"
        • 91c4031 Fix config file code snippet in HOWTO
        • 0b499d7 Fix panic when destination directory is /
        • 9660b12 Improve shell completions
        • 9d02a5a Tidy up onepassword template functions
        • f4e004a Update doc on how to migrate away from chezmoi
        • 5705e04 Use fs.WalkDir function
        • d1fef1c Use script extension to determine interpreter

        Full changelog: v2.1.0...v2.1.1

        "},{"location":"reference/release-history/#210-2021-07-02","title":"2.1.0 (2021-07-02)","text":"
        • d506456 Add .literal suffix to make all filenames representable
        • 0f8a0aa Add gopassRaw template function
        • 646f4f3 Add literal_ attribute to make more filenames representable
        • e872fa3 Add mozillaInstallHash template function
        • 7cac834 Add optional account arg to onepassword template functions
        • 79ad5fe Add passRaw template function
        • d84b0a7 Bump assets/chezmoi.io/themes/book from 4540d66 to e939f40
        • efc96d6 Tweak Go modules check

        Full changelog: v2.0.16...v2.1.0

        "},{"location":"reference/release-history/#2016-2021-06-27","title":"2.0.16 (2021-06-27)","text":"
        • 7b57397 Add --config-path option to init command
        • 12fbe0a Fix FreeBSD install instructions
        • 32d4a92 Improve documentation of chezmoi edit
        • 4100279 Include FreeBSD build in tests
        • c5cb349 Make osRelease and kernelInfo template vars available on all systems where present
        • 31a5fb7 Prioritize /etc/hosts over /etc/hostname for FQDN hostname
        • ef49f6a Tweak FAQ on chezmoi edit
        • a441236 Update dependencies
        • e9c2155 Update dependencies
        • 9bf5265 Update docs so that oh-my-zsh tarball goes to TMPDIR instead of HOME
        • af34a92 Update golangci-lint to v1.41.0

        Full changelog: v2.0.15...v2.0.16

        "},{"location":"reference/release-history/#2015-2021-06-17","title":"2.0.15 (2021-06-17)","text":"
        • d02e707 Update GoReleaser GitHub token

        Full changelog: v2.0.13...v2.0.15

        "},{"location":"reference/release-history/#2013-2021-05-27","title":"2.0.13 (2021-05-27)","text":"
        • fba2ec9 Add --ssh option to init command to guess SSH repo URLs
        • 6793811 Add .chezmoi.sourceFile template variable
        • 811fb19 Add age howto
        • 9efc082 Add findtypos check
        • 8b35f3d Add forgotten --include option to add command
        • a706029 Add how to for managing part of a file
        • 2b546b7 Add how to for using chezmoi with brew bundle
        • ca607a4 Add how to on running a script when another file's contents changes
        • 0342271 Add link to github.com/hussainweb/ansible-role-chezmoi
        • 56b3666 Add maximum width to docs output
        • 9fbaba1 Add more media links
        • 7839bfe Add re-add command
        • d8f8add Add test for template data in chezmoi init --apply
        • 7f8716a Add writeToStdout init template function
        • 5497b85 Bump age version to 1.0.0-rc.2 in tests
        • 918c2b7 Bump golangci-lint to v1.40.1
        • ca54fa3 Disable exhaustive linter
        • bfc32b2 Ensure that parent directory exists in import examples
        • c69e066 Fix security table of contents
        • a69d2ff Fix typos
        • bebdceb Fix typos and receiver names
        • 6c952eb Format code blocks in documentation
        • cdaa1d3 Improve code documentation
        • 3539609 Improve consistency
        • f0c11ce Improve consistency of reference documentation
        • 09c3530 Include Linux OS release name and version in doctor output, if available
        • 5023553 Make how to section on ignoring files easier to find
        • 5eb6def Move cmd package to internal/cmd
        • cf97df1 Move internal/cmd to internal/cmds
        • 320cb8d Move security policy into docs
        • 049d7e8 Move security policy into docs
        • 3ca09db Only create templates with chezmoi add --autotemplate if a replacement occurred
        • 98d9607 Reference .chezmoidata in template data documentation
        • 1c0e836 Remove stale FAQ entry
        • 802c6ca Remove stale docs on diff.format
        • df0ea51 Remove unnecessary SourceRelPaths type
        • ab16f1b Rename function argument for clarity
        • 883a5f0 Reword intro commands
        • c0a9fa4 Tidy up how to
        • 8eb212c Tidy up symlink documentation
        • 01c812b Tidy up tests
        • 009a796 Tweak documentation
        • 0e800ad Tweak examples and docs a little more
        • 35ea315 Update Go to 1.16.4
        • cce08bb Update Windows Subsystem for Linux detection how to
        • de341d2 Update dependencies
        • b33ca40 Update golangci-lint to 1.40.0
        • 2bededb Update link to path matching function
        • 034b8d3 Use io/fs package instead of os
        • 66fbcb6 Use neutral names in docs and tests
        • b6ab19e Use pager for docs and make pagers more configurable
        • 891e461 Use quote function instead of literal quotes in docs
        • 7526fa5 Use stringSets for known filenames
        • d858159 Use temporary files, instead of stdin/stdout, when calling gpg

        Full changelog: v2.0.12...v2.0.13

        "},{"location":"reference/release-history/#2012-2021-05-10","title":"2.0.12 (2021-05-10)","text":"
        • 1393e41 Add Architecture guide
        • 942d536 Add another method of detecting OS architecture for robustness
        • da611c9 Bump chezmoi.io/themes/book from 1e4bcc2 to 6200450
        • 3e562c5 Correct and template example in How To guide
        • 8bbf1b8 Don't atempt to use reverse DNS to determine FQDN hostname
        • ce2d86a Handle EINTR from syscall
        • f188ab5 Improve error message when persistent state is locked
        • 89d36ec Improve reliability of Powershell installer
        • 18cf1ef Increase verbosity of tests in CI
        • 06674ab Make chezmoi forget also remove entry from state
        • bc2a07c Move VIM tip from reference to how-to
        • aeb781e Remove debug code
        • 6eb89ab Remove unnecessary AbsPaths type
        • 155e53f Remove unnecessary RelPaths type
        • 361ce17 Remove unnecessary typecasts
        • f51fc68 Simplify EINTR handling
        • b3529bf Sort unexported variables after exported ones
        • fbf260f Suppress warnings in tests about git default branch name
        • 9ae0d58 Tidy up flag parsing and help output
        • bc48485 Update dependencies
        • 08336ad Update dependencies
        • 037a372 Update last written state when target and actual states are equivalent
        • 3c273d6 Update rpm zsh completion directory to match recent Fedora versions.
        • 3a06eb8 Use /etc/hostname to determine hostname, if available
        • 421d43b Use c.errorf instead of cmd.Printf
        • fb616d9 Validate generate config before writing it in init command

        Full changelog: v2.0.11...v2.0.12

        "},{"location":"reference/release-history/#2011-2021-04-26","title":"2.0.11 (2021-04-26)","text":"
        • dfd8145 Add Makefile targets for coverage
        • c2c5ff4 Add import --exclude option
        • 546070b Add related software documentation
        • 179cbfc Add wget one line install instructions
        • ba3c28d Bump Go version to 1.16.3 on Cirrus CI
        • 4a82d68 Do not follow symlinks if the file will be ignored anyway
        • 1a7d396 Explicitly document need for data in template action
        • 4ecd1db Extend include template function to handle absolute paths
        • 4503be6 Fix checksums.txt upload step
        • a7a8ae2 Fix panic when using diff --exclude
        • a19217f Fix typos in comments
        • 5d4f02c Fix typos in docs
        • 07127cf Fix typos in test comments
        • a48a9d8 Ignore whitespace errors in .vscode/settings.json
        • 173732f Improve parsing of auto bools
        • bdab05d Minor tidy-ups
        • b9dcd48 Tidy up path handling
        • 4c51578 Update dependencies
        • 91a2e9f Warn user when add command would remove encrypted, private, or template attribute
        • d2d96b0 Write prompts to stdout, even when --no-tty is specified
        • b1501ad fix typo

        Full changelog: v2.0.10...v2.0.11

        "},{"location":"reference/release-history/#2010-2021-04-15","title":"2.0.10 (2021-04-15)","text":"
        • 6a8855e Add add.templateSymlinks configuration variable
        • e1612f6 Add diff.exclude configuration variable
        • 9b7c35c Add editor config for PowerShell scripts
        • acfec8e Add infrastructure to read entry type sets from config
        • 1d42c99 Add init --data option
        • c3b8073 Add mitigation for when actual state does not match persistent state
        • e8229a9 Add state data, delete, get, and set subcommands
        • 4459193 Add test for re-adding file with and without --encrypt
        • 5331014 Add tests with different umask values
        • 5f47aaa Added --template-symlinks-home and --template-symlinks-source
        • 804e135 Consolidate symlink tests
        • 93c53da Document one-line chezmoi and dotfiles install
        • d41951f Don't assume that gpg is installed in tests
        • 992b923 Make --exclude option per command instead of global
        • b00710b Make --template-symlinks option a bool that checks source dir and home dir
        • 8322943 Make chezmoi init --one-shot also include --purge-binary
        • 38cb1d2 Only install glibc/musl-specific binaries when they are available
        • 3782e93 Re-enable passing test
        • e50575c Release both checksums.txt and chezmoi_${VERSION}_checksums.txt
        • 141a9b1 Replace --template-symlinks-home and --template-symlinks-source with --template-symlinks=value
        • 5920345 Revert to standard actions/cache
        • 2436c92 Store actual umasks in state file
        • 703be4e Tidy up table of configuration variables
        • 45f6429 Tweak documentation
        • 865c379 Update Go module version to match tag
        • 8090122 Update dependencies
        • c48de4c Update prefix documentation
        • 8755cb6 Use default checksums file in install scripts

        Full changelog: v2.0.9...v2.0.10

        "},{"location":"reference/release-history/#209-2021-04-04","title":"2.0.9 (2021-04-04)","text":"
        • 505ca6a Fix import command when destination already exists
        • d34a1b6 Update dependencies

        Full changelog: v2.0.8...v2.0.9

        "},{"location":"reference/release-history/#208-2021-04-03","title":"2.0.8 (2021-04-03)","text":"
        • 2cdbbd7 Add tests for symmetric GPG encryption
        • e444344 Build with Go 1.16.3
        • 6755586 Bump chezmoi.io/themes/book from 60dfd9a to 1e4bcc2
        • b6d33d9 Bump ludeeus/action-shellcheck from 1.0.0 to 1.1.0
        • 0c37c54 Fix absolute path check
        • 5e54964 Fix typo
        • b990f3d Fix typos
        • 7bce9fa Tidy up comparison doc
        • 040ef45 Update PowerShell install script to use checksums.txt
        • 351172f Update install script to use checksums.txt
        • 5976c07 fix: gpg symmetric passing wrong arguments

        Full changelog: v2.0.7...v2.0.8

        "},{"location":"reference/release-history/#207-2021-03-31","title":"2.0.7 (2021-03-31)","text":"
        • 1ce1944 Restore original checksums filename

        Full changelog: v2.0.6...v2.0.7

        "},{"location":"reference/release-history/#206-2021-03-30","title":"2.0.6 (2021-03-30)","text":"
        • de636f1 Add System.IdempotentCmdCombinedOutput
        • 2348d6a Check for libc version in upgrade command
        • 406cdc5 Rename variables for consistency
        • 58aac9b Restore build of non-libc-specific Linux archives
        • 75681a7 Use emojis in comparison

        Full changelog: v2.0.5...v2.0.6

        "},{"location":"reference/release-history/#205-2021-03-29","title":"2.0.5 (2021-03-29)","text":"
        • 1a2e4e9 Add -Force option to Move-Item command.
        • c1e5a8c Add darwin/arm64 to install script
        • 3e7bbde Add link to blog post
        • 5468d3d Add stdinIsATTY template function
        • 5135e06 Correct function name in documentation
        • 639adcf Fix issue in example for trying to use existing boolean vars first in How To section: First arg of get doesn't have to be in quotes.
        • c6271ad Improve install script error handling
        • d5e5afc Make .chezmoi.sourceDir template variable a string
        • 83a1b65 Make install script install glibc or musl libc version as appropriate
        • 382988d Only evaluate target states when needed
        • 03a3780 Reduce severity of doctor warning if gpg is not installed
        • b196247 Simplfy managed test
        • 67c57d5 Split large functions into smaller functions
        • f548ba3 Tidy up handling of script working directories
        • e996856 Tidy up make generate target
        • 30f1ab9 Unlock state when running editor or merge command
        • ff4bf5a Update dependencies
        • 0e824ff Update golangci-lint to 1.39.0
        • 731a622 Use the first existing parent directory for a script's working directory.

        Full changelog: v2.0.4...v2.0.5

        "},{"location":"reference/release-history/#204-2021-03-24","title":"2.0.4 (2021-03-24)","text":"
        • 6dca5aa Add age binary check to doctor command
        • 54ef893 Build libc-specific archives
        • 2eb70bf Fix noupgrade build tags
        • 1833b11 Make doctor command more friendly about missing binaries
        • ae2f0d2 Only update state if target was actually changed
        • b36175d Remove stale reference to go generate
        • f918459 Update howto to use main instead of master

        Full changelog: v2.0.3...v2.0.4

        "},{"location":"reference/release-history/#203-2021-03-22","title":"2.0.3 (2021-03-22)","text":"
        • 17e4976 Document empty_ for file target types
        • 0ee8476 Factor out GitHub client
        • bccd093 Fix editing of encrypted files in subdirectories
        • e35be17 Internal tidy-up
        • 237b3f5 Remove noembeddocs and nodocs build tags
        • 34782e1 Remove symlinks whose targets are empty
        • 20c63f1 Restore upgrade command

        Full changelog: v2.0.2...v2.0.3

        "},{"location":"reference/release-history/#202-2021-03-19","title":"2.0.2 (2021-03-19)","text":"
        • 8c66bbc Add new attributes to chattr reference documentation.
        • ded9ecc Add removeline test function
        • 700db6e Add tests for --exclude=encrypted option
        • 966d45a Connect stderr when invoking encryption tools
        • 058497e Detect encryption if group set in config file
        • 091028f Extend cat command to print scripts
        • 5e5f377 Improve encryption integration tests
        • 9bc28b7 Remove temporary version override

        Full changelog: v2.0.1...v2.0.2

        "},{"location":"reference/release-history/#201-2021-03-18","title":"2.0.1 (2021-03-18)","text":"
        • 0b8b5b0 Fix panic when displaying scripts in diffs
        • 2ba9aed Include scripts to be run in diffs by default
        • 316371f Use notepad.exe, not vi, as the default editor on Windows

        Full changelog: v2.0.0...v2.0.1

        "},{"location":"reference/release-history/#200-2021-03-17","title":"2.0.0 (2021-03-17)","text":"
        • ebdd6f4 Add chezmoi apply --source-path tests
        • 7caf314 Build with Go 1.16.2
        • 45f2ca4 Improve documentation of gitHubKeys template function
        • cb43820 Improve error messages from 1Password template functions
        • a665328 Initialize the keyring cache
        • e9022e5 Minor documentation fixes
        • 2ccc16a Only log when --debug is set
        • 784a08c Preserve homedir template variable for backwards compatibility
        • 09fb2cf Refresh github.com/actions/cache by changing key
        • a8eb3a9 Tidy up changes doc for v2
        • 6f459af Update FAQ for chezmoi v2
        • 4cbc07b Update comparison doc for v2
        • 1c68a53 Update dependencies
        • 08aff38 Update documentation and release process for v2 release
        • 9b6b8f1 Update quick start guide for chezmoi v2

        Full changelog: v1.8.11...v2.0.0

        "},{"location":"reference/release-history/#1811-2021-02-05","title":"1.8.11 (2021-02-05)","text":"

        Internal changes only

        Full changelog: v1.8.10...v1.8.11

        "},{"location":"reference/release-history/#1810-2020-12-20","title":"1.8.10 (2020-12-20)","text":"

        Internal changes only

        Full changelog: v1.8.9...v1.8.10

        "},{"location":"reference/release-history/#189-2020-11-20","title":"1.8.9 (2020-11-20)","text":"
        • 4fd06fa Merge pull request #936 from zb140/1password-cache-arg

        Full changelog: v1.8.8...v1.8.9

        "},{"location":"reference/release-history/#188-2020-10-31","title":"1.8.8 (2020-10-31)","text":"
        • 71e82db Merge pull request #924 from twpayne/templating-docs

        Full changelog: v1.8.7...v1.8.8

        "},{"location":"reference/release-history/#187-2020-10-10","title":"1.8.7 (2020-10-10)","text":"
        • 3b285d9 Fix release tests

        Full changelog: v1.8.6...v1.8.7

        "},{"location":"reference/release-history/#186-2020-09-28","title":"1.8.6 (2020-09-28)","text":"
        • cfa3fd2 Merge pull request #893 from twpayne/static-link-with-musl

        Full changelog: v1.8.5...v1.8.6

        "},{"location":"reference/release-history/#185-2020-08-22","title":"1.8.5 (2020-08-22)","text":"
        • c5dbedc Merge pull request #872 from twpayne/update-testscript

        Full changelog: v1.8.4...v1.8.5

        "},{"location":"reference/release-history/#184-2020-08-12","title":"1.8.4 (2020-08-12)","text":"
        • 99ef18b Merge pull request #834 from twpayne/codespaces

        Full changelog: v1.8.3...v1.8.4

        "},{"location":"reference/release-history/#183-2020-06-25","title":"1.8.3 (2020-06-25)","text":"
        • 6d2be34 Merge pull request #805 from twpayne/update-deps

        Full changelog: v1.8.2...v1.8.3

        "},{"location":"reference/release-history/#182-2020-06-09","title":"1.8.2 (2020-06-09)","text":"
        • 323cba5 Fix release job

        Full changelog: v1.8.1...v1.8.2

        "},{"location":"reference/release-history/#181-2020-05-06","title":"1.8.1 (2020-05-06)","text":"
        • 4def4f3 Fix typo
        • cbf8d4a Merge pull request #731 from twpayne/faq-tidy
        • d604fa5 Improve FAQ
        • b962e36 Merge pull request #729 from twpayne/strings-builder
        • 610701e Use strings.Builder instead of bytes.Buffer
        • 0bc0257 Merge pull request #728 from twpayne/execute-template-improvements
        • e3b3da1 Improve FAQ entry on managing files outside target directory
        • 11aad4d Add --output option to execute-template
        • d6b059c Merge pull request #724 from twpayne/octal-literals
        • 604dca2 Format octal literals consistently
        • b68bd53 Merge pull request #720 from twpayne/fix-git-diff-func-color
        • e16ebda Fix color of hunk context in git format diffs
        • 34fc1b5 Merge pull request #723 from twpayne/auto-escape-templates
        • 7d8c6d2 Auto escape template delimiters when --autotemplate is set
        • 36b1f44 Merge pull request #719 from twpayne/infrastructure-improvements
        • 0cee057 Merge pull request #718 from twpayne/howto-external-modified
        • e800dd0 Use Makefile for CI steps
        • 4e9e654 Separate out local imports
        • 09b38ce Improve how to for tracking externally modified files
        • 5752e26 Merge pull request #717 from twpayne/no-color
        • 519ec22 Update pull request template
        • 590c721 Add support for NO_COLOR environment variable
        • 70c4eda Merge pull request #714 from twpayne/improve-contributing
        • 30a2b81 Remove old linter suppressions
        • 57fbcb7 Make list of enabled linters explicit
        • ec44e08 Improve infrastructure for contributors
        • 3bad347 Add pull request template
        • 81bfc76 Merge pull request #715 from twpayne/fix-git-status-parser
        • 70e8e2c Enable autocommit and autopush for chattr command
        • 94c02a0 Fix git status parsing for renames
        • 175601e Merge pull request #709 from ihommani/master
        • 31c646d Merge pull request #698 from twpayne/color-git-diff
        • 810607c Add colored git diff support
        • 93c03e7 Make --color option accept boolean values
        • b640720 Merge pull request #712 from twpayne/generic-secret-string
        • 1e699ea Make secret template function return a string, not a []byte
        • c9081ac Merge pull request #710 from twpayne/gofumports-tidy
        • e458bed Compact type declarations
        • 6002344 Add images to illustrate chezmoi principles
        • 8b5b0f5 Merge pull request #687 from twpayne/golangci-lint-next
        • 9271f90 Merge pull request #707 from twpayne/no-dev-upgrade
        • f10697b Update golangci-lint to version 1.25.0
        • 1d7dc3d Don't attempt to upgrade dev versions without --force flag
        • 0796dd8 Merge pull request #704 from twpayne/doublestar-glob
        • ceb6307 Use doublestar for all globs
        • 9f0b03e Merge pull request #703 from twpayne/go-generate-completions
        • 0eb3917 Generate completions with go generate instead of make
        • 3ea95e5 Add --output option to completion
        • d256de8 Merge pull request #702 from twpayne/execute-template-init
        • cd42fb0 Add --init and --promptString options to execute-template
        • 1760187 Fix generated docs
        • dd7edf8 Merge pull request #697 from stephengroat/patch-1
        • 442c85d Merge pull request #699 from twpayne/gopass-version
        • f8bd952 Update gopass version detection
        • 124ab05 install from homebrew-core
        • d2d43e9 Merge pull request #695 from twpayne/umask-docs
        • f1cbbd6 Improve reference docs
        • 3e6700e Add more documentation on umask
        • 2d4f690 Merge pull request #689 from stephengroat/patch-1
        • bd72b50 Use goreleaser github action
        • e0c120c Merge pull request #693 from twpayne/doublestar
        • 67d5746 Use doublestar.PathMatch for path matching
        • fd29c6e Merge pull request #692 from twpayne/fix-media-page
        • fe13fc7 Fix media page

        Full changelog: v1.8.0...v1.8.1

        "},{"location":"reference/release-history/#180-2020-04-19","title":"1.8.0 (2020-04-19)","text":"
        • 017a83f Merge pull request #686 from twpayne/tidy-up-github-action
        • 91581ec Tidy up GitHub Actions
        • f642fb4 Merge pull request #685 from twpayne/media
        • 35cc601 Update README.md
        • 79b9ae0 Add media page
        • c02d8e3 Merge pull request #684 from twpayne/gpgrecipient-warning
        • 5e03393 Add warning when source version control system is not git
        • 56436ac Add warning when config file uses gpgRecipient
        • cc816d2 Merge pull request #679 from twpayne/fix-add-dir
        • 89dc01b Add how-to entry about creating empty directories
        • 8499f4d Create .keep files when adding directories non-recursively
        • aba694f Merge pull request #678 from twpayne/git-diff
        • cdb5a0a Add git diff format
        • ca9d8d9 Merge pull request #674 from twpayne/diff-pager
        • 14b1197 Add diff.pager config option
        • edc0d55 Merge pull request #675 from twpayne/autotemplate-implies-template
        • 5ba7692 Make --autotemplate imply --template
        • 0b56b08 Merge pull request #676 from twpayne/fix-snap-path
        • d2bb6fc Update path to goreleaser in GitHub action
        • c603bb3 Merge pull request #672 from twpayne/managed
        • 36bd3f4 Iterate on managed command
        • 1d2c1d1 Merge pull request #671 from twpayne/document-lowercasing
        • 08f2319 Document Viper's lowercasing of variable names
        • 709b141 Merge pull request #670 from twpayne/investigate-668
        • 854a931 Add test for adding empty directory without recursion
        • c1c19fb Merge pull request #669 from twpayne/upgrade-deps
        • 1489cac Upgrade dependencies
        • 987450b Merge pull request #665 from remigourdon/add-managed-command
        • 469ab7c Add managed command
        • f89a8c3 Merge pull request #667 from seberm/feature/add-gpg-command-into-config
        • 2fca0ae Add option to configure gpg command
        • ecb873b Remove stray debug code
        • 49fb084 List repos tagged with chezmoi by most recently updated first
        • 6675562 Merge pull request #658 from twpayne/update-readme
        • 8fc4d38 Update README.md
        • 76e7e03 Merge pull request #657 from twpayne/symlink-template
        • ba47581 Add separate config files how-to entry

        Full changelog: v1.7.19...v1.8.0

        "},{"location":"reference/release-history/#1719-2020-04-06","title":"1.7.19 (2020-04-06)","text":"
        • c4dd796 Merge pull request #656 from twpayne/non-hermetic-functions
        • 82f9922 Include non-hermetic text functions from Sprig
        • 8d538be Merge pull request #653 from twpayne/purge
        • e384392 Add purge command
        • e6b1424 Merge pull request #652 from twpayne/dont-compress-docs
        • 9e2879f Don't compress embedded assets
        • 1767ad7 Merge pull request #651 from twpayne/template-docs
        • 6914b1f Use TOML in reference manual example
        • 53f92d5 Improve template documentation
        • 4e46435 Merge pull request #649 from twpayne/fix-550
        • bcd0750 Fix behavior when adding an empty file without --empty
        • d6f80bb Merge pull request #647 from twpayne/umask
        • 42d04f7 Merge pull request #648 from twpayne/min-go-version
        • 9b2f286 Use umask when creating any file or directory
        • ca416df Ensure that chezmoi is built with Go version 1.13 or later
        • e607dc8 Merge pull request #646 from twpayne/fix-link
        • fced112 Fix link in quickstart guide

        Full changelog: v1.7.18...v1.7.19

        "},{"location":"reference/release-history/#1718-2020-03-29","title":"1.7.18 (2020-03-29)","text":"
        • 8284da7 Update contributing guide with new version embedding mechanism
        • 6ebf442 Merge pull request #644 from twpayne/fix-version
        • 1257ea8 Refactor version number embedding
        • f92a292 Bump golangci-lint to 1.24.0
        • 2db0aad Update chezmoi.io home page to match README.md
        • b1a341b Merge pull request #641 from ihommani/639_enhancement_documentation
        • f9ad39a [639_enhancement] Fix features part documentation
        • 453d152 Merge pull request #640 from twpayne/trim-space
        • bd78980 Strip leading and trailing space from values read from user
        • 96e0dea Merge pull request #635 from ptxmac/windows-trim
        • fe98dde Revert \"Only run CI on pushes\"
        • 7985de8 Regenerate documentation
        • da30f18 Merge pull request #638 from nawordar/patch-1
        • b90fc91 Change . to dot_ in symlink template example
        • 568fb50 Improve windows support by removing carriage return from prompts

        Full changelog: v1.7.17...v1.7.18

        "},{"location":"reference/release-history/#1717-2020-03-21","title":"1.7.17 (2020-03-21)","text":"
        • db03a2b Merge pull request #634 from twpayne/ignore-lookupgroupid-errors
        • d22a3cf Only set group value if user.LookupGroupId succeeds
        • d0ab459 Merge pull request #633 from twpayne/allow-kernel-fail
        • 74297e8 Make reading /proc/sys/kernel more tolerant of errors
        • d289303 Merge pull request #631 from twpayne/update-dependencies
        • f671329 Update dependencies
        • 208de3a Merge pull request #630 from twpayne/template-options
        • 4926a16 Add option to set template options
        • a75a1f7 Switch to functional options for TargetState
        • 21f46e0 Merge pull request #629 from twpayne/execute-template
        • b047430 Add execute-template command
        • 79d7ddf Export TargetState.ExecuteTemplateData
        • 771e4e7 Merge pull request #626 from twpayne/editor-with-args
        • d65ec45 Allow EDITOR and VISUAL to include arguments
        • 733b547 Merge pull request #624 from twpayne/add-thanks-faq
        • a4e76f3 Add thanks FAQ entry
        • 298c27f Merge pull request #623 from twpayne/mark-auto-commit-stable
        • 6d450c1 Mark autoCommit and autoPush as stable
        • cda7249 Merge pull request #622 from twpayne/document-ignore
        • e3caa96 Improve documentation of .chezmoiignore
        • efddb59 Only run CI on pushes
        • ae4bbc9 Merge pull request #620 from twpayne/refresh-readme
        • 07fb826 Refresh documentation
        • ec3b896 Merge pull request #618 from twpayne/go-1.14
        • ea3d8d2 Add freebsd/arm64 and openbsd/arm64 builds
        • 098c28c Build with Go 1.14
        • e05e396 Bump golangci-lint version to 1.23.8

        Full changelog: v1.7.16...v1.7.17

        "},{"location":"reference/release-history/#1716-2020-03-04","title":"1.7.16 (2020-03-04)","text":"
        • ce06ed9 Merge pull request #617 from twpayne/fix-commit-message-template-path
        • eb0129f Fix path to commit message template asset
        • b03639b Tidy up link fixes
        • 37c54ae Add missing punctuation
        • 509b93a Merge pull request #616 from twpayne/fix-chezmoi.io-links
        • 37d35c8 Fix links on chezmoi.io

        Full changelog: v1.7.15...v1.7.16

        "},{"location":"reference/release-history/#1715-2020-02-26","title":"1.7.15 (2020-02-26)","text":"
        • a7b5607 Merge pull request #612 from twpayne/revert-assets
        • 1403b64 Revert \"Move completions into assets directory\"

        Full changelog: v1.7.14...v1.7.15

        "},{"location":"reference/release-history/#1714-2020-02-25","title":"1.7.14 (2020-02-25)","text":"
        • 559da47 Tidy up release process
        • 9f8b2b6 Merge pull request #610 from twpayne/bump-dependencies
        • 0d429c8 Bump dependencies
        • 7192a91 Revert \"Move cmd into internal directory\"
        • 106aef2 Merge pull request #609 from twpayne/misc-fixes
        • 2d466db Move scripts into assets directory
        • 5317fe6 Move cmd into internal directory
        • b34673d Move completions into assets directory
        • 40d92cc Move templates into assets directory
        • c74392a Move images into assets directory
        • 4fc9f6b Tighten up return type
        • d3ff731 Merge pull request #608 from twpayne/lastpass-raw
        • c39b714 Add lastpassRaw template function
        • ff00fed Fix documentation for lastpass note parsing
        • 2c3f7e2 Merge pull request #606 from twpayne/improve-docs
        • 2fbaf35 Improve docs
        • 0cd7bdc Merge pull request #605 from twpayne/strip-symlink-template-whitespace
        • 49ba065 Improve template documentation
        • 251f698 Trim whitespace from evaluated symlink templates
        • 948f293 Merge pull request #603 from twpayne/renable-snap-bash-completion
        • 8840ecf Revert \"Temporarily disable bash completion in snaps\"
        • a9e7cb7 Switch from godoc.org to pkg.go.dev
        • 0b2decb Merge pull request #602 from twpayne/doc-cleanups
        • 27790db Use cobra.Command.Printf instead of Config.warn
        • da9d72a Add custom help command
        • d847c8f Make short helps more consistent
        • 3259503 Fix more typos and clean up docs
        • 3114a51 Fix typo
        • 08cabca Merge pull request #597 from twpayne/cd-command-config
        • 6114041 Add cd.command configuration variable
        • 34c402b Merge pull request #600 from MunifTanjim/docs/fix-reference-sourceDir-default-value
        • 62c9d45 Fix sourceDir default value in docs
        • b7b8e1e Tidy up issue templates

        Full changelog: v1.7.13...v1.7.14

        "},{"location":"reference/release-history/#1713-2020-02-13","title":"1.7.13 (2020-02-13)","text":"
        • ed3584c Temporarily disable bash completion in snaps
        • c11e4c9 Merge pull request #595 from twpayne/fix-594
        • 23bda0a Include relative path in template name
        • 37096b0 Merge pull request #592 from twpayne/update-toml
        • 5d20cbf Use github.com/pelletier/go-toml to handle TOML
        • 1624695 Merge pull request #591 from twpayne/functional-config-options
        • cd49a3f Use standard directories in all tests
        • dc82787 Make tests more verbose by default
        • 1b50624 Simplify I/O handling in Config
        • 4610fec Use newTestConfig function in tests
        • 8bea1b2 Add newTestConfig function
        • c475c5e Use functional options to construct Configs
        • 552151d Don't include destination directory in dump output
        • 5e8b893 Merge pull request #590 from twpayne/template-funcs-in-config-template
        • 8771b2d Make all template functions available in config file template
        • 0d8ddd6 Merge pull request #588 from twpayne/misc-fixes
        • c62befa Bump golangci-lint to v1.23.3
        • de3d05b Check more errors
        • b3dfbea Use more specific receiver
        • 64a30b2 Avoid unnecessary calls to Stat before MkdirAll
        • a65f193 Use Config.warn consistently
        • 3e2fd5b Merge pull request #587 from twpayne/format-assets
        • 02ae747 Compress assets as much as possible
        • 840d00e Wrap generated code at 80 columns
        • 7ac364b Tidy up contributing docs
        • 61a5942 Merge pull request #586 from twpayne/remove-empty-symlinks
        • a13cff2 If a symlink is empty, remove the target
        • c39c254 Merge pull request #584 from twpayne/no-large-diffs
        • bde4d3e Don't print diffs if file is larger than 1MB
        • ecfba0e Merge pull request #582 from twpayne/use-issue-templates
        • f03e442 Link to issue templates in documentation
        • 17ceb5f When looking for an entry, return an error if it does not exist (#581)
        • a5785d3 When looking for an entry, return an error if it does not exist
        • 5099fed Merge pull request #579 from twpayne/upgrade-checksum
        • 7b6fa02 Fix upgrade checksum filename

        Full changelog: v1.7.12...v1.7.13

        "},{"location":"reference/release-history/#1712-2020-01-24","title":"1.7.12 (2020-01-24)","text":"
        • bed22fc Rename internal command for consistency (#576)
        • ac77728 Simplify code generation
        • 395b450 Rename internal command for consistency
        • e938d4c Remove debug code
        • 52e49ad Improve packaging of assets (#575)
        • 7c6d8e7 Improve install-tools target
        • ca61c8d Improve packaging of assets
        • 92deba6 Update dependencies (#571)
        • c8f7305 Update dependencies
        • fe7728e Merge pull request #569 from twpayne/linux-install
        • c9df290 Add NixOS Linux install instructions
        • 1d1230d Update Alpine Linux install instructions
        • 888736a Add note about installation instructions to contributing guide
        • ae3666b Merge pull request #568 from twpayne/issue-templates
        • 0659f65 Tidy up issue template markdown
        • e536db5 Merge pull request #567 from twpayne/support-request
        • 0782706 Add support request issue template
        • 7b5f645 Merge pull request #565 from twpayne/fix-install.sh
        • 699d0b5 Remove no-longer-correct action to build install.sh
        • c882899 Restore default arm builds
        • ddde88b Merge pull request #563 from ndt/patch-1
        • 31d9a40 Update install.sh
        • 185e2c9 Merge pull request #562 from twpayne/commit-faq
        • b5cfe03 Add FAQ entry on committing changes
        • 65694b2 Update tables of contents
        • 48c0d31 Merge pull request #560 from twpayne/source-alias
        • 4ab59df Add hg command
        • c8010c2 Add git command
        • f30445b Document aliases
        • 372c392 Merge pull request #559 from twpayne/zsh-completions
        • 9795d04 Add zsh completions for positional arguments
        • 2d5a384 Fix missing Oxford comma
        • f9bd8bb Don't compute full target state in data command (#557)
        • 1b630ce Don't compute full target state in data command
        • f563a08 Merge pull request #556 from twpayne/windows-colors
        • 6cec157 Enable virtual terminal processing on Windows
        • 0b3aa77 Use golang.org/x/crypto/ssh/terminal instead of github.com/mattn/go-isatty

        Full changelog: v1.7.11...v1.7.12

        "},{"location":"reference/release-history/#1711-2020-01-09","title":"1.7.11 (2020-01-09)","text":"
        • acf3478 Merge pull request #553 from twpayne/keepassxc-show-protected
        • ff4f8d9 Pass --show-protected to keepassxc-cli version 2.5.2 or later
        • 3788d1b Merge pull request #549 from twpayne/improve-template-docs
        • 16e1fa9 Validate variable names in config data
        • 73d2aa7 Improve template how-to
        • cf6b4a7 Merge pull request #543 from twpayne/release-improvements
        • 87881f2 Consolidate GitHub Actions
        • 92ce3c4 Add arm7 builds
        • 1f01859 Tidy up goreleaser config
        • 4be8957 Bump golangci-lint to version 1.22.2
        • 3e733b1 Merge pull request #547 from twpayne/update-glamour
        • 128c291 Use Glamour's ASCII style for rendering docs
        • 3df4931 Fix use of autotemplate in how-to doc (#546)
        • ac494ee Fix use of autotemplate in how-to doc
        • acdd04d Use more reliable install-from-source method (#541)
        • f6fb2dc Use more reliable install-from-source method
        • 73d325e Render docs with github.com/charmbracelet/glamour (#537)
        • 0d2c73d Render long help and docs with github.com/charmbracelet/glamour
        • ea4b6c4 Fix autotemplate docs

        Full changelog: v1.7.10...v1.7.11

        "},{"location":"reference/release-history/#1710-2019-12-27","title":"1.7.10 (2019-12-27)","text":"
        • 74f6b5b Added kernel information to data
        • d318b14 Consolidate data source files
        • b603f77 Don't automatically assign bug label in bug report template
        • 4f65240 Only set osRelease on Linux
        • a402f9e Remove stale entry from .gitignore
        • e271597 Treat adding an empty file without --empty as remove
        • a698afe Treat adding an empty file without --empty as remove (#536)
        • db2e446 Trigger CI on pull requests
        • 6559538 Tweak markdown to avoid Hugo bug
        • b4f0cbc Update homepage in snaps and brews
        • b10aa9f Use standard source directory in tests
        • 14a9c3b typo

        Full changelog: v1.7.9...v1.7.10

        "},{"location":"reference/release-history/#179-2019-12-20","title":"1.7.9 (2019-12-20)","text":"
        • 8908b55 Do not print idempotent commands in verbose mode
        • a1caca6 Don't add files if template would be overwritten
        • 91e562a Don't quote shell args just because of equals signs
        • 2992fce Don't quote shell args just because of equals signs (#515)
        • 8cea741 Improve contributing docs
        • 5b488de Improve contributing docs (#516)
        • 2a164f9 Iterate on GitHub Actions
        • 90c506b Iterate on infrastructure (#524)
        • 5d16890 Preserve but don't enforce private on Windows
        • d58df90 Quote command args in debug mode
        • 035e416 Reformat tables of content with latest Markdown plugin
        • 61611b5 Simplify generated help template
        • ac4f8d0 Update Alpine Linux install instructions
        • 7d84ccf Update Alpine Linux install instructions (#514)
        • ddd0b62 Update all dependencies
        • e349fef Update all dependencies (#520)
        • 5f6943c Update install.sh
        • d6970d1 Update issue templates
        • 8825d44 Use go/format instead of gofmt
        • 7a41df2 Use go:generate more idiomatically
        • 6a9256a Use more specific command for generating help

        Full changelog: v1.7.8...v1.7.9

        "},{"location":"reference/release-history/#178-2019-12-13","title":"1.7.8 (2019-12-13)","text":"
        • d106ef6 Include generate step in release builds

        Full changelog: v1.7.7...v1.7.8

        "},{"location":"reference/release-history/#177-2019-12-10","title":"1.7.7 (2019-12-10)","text":"
        • de86467 Use GORELEASER_GITHUB_TOKEN for releases

        Full changelog: v1.7.6...v1.7.7

        "},{"location":"reference/release-history/#176-2019-12-10","title":"1.7.6 (2019-12-10)","text":"
        • e74485f Add Alpine Linux installation instructions
        • cd50d7b Add ShellQuoteArgs
        • 954b51a Add contributing guide for documentation changes
        • ce5d509 Add link to Windows binaries and GitHub releases page
        • f93c255 Add updating chezmoi.io to contributing docs
        • a0e061a Correct use of setup
        • 123fb2a Enable dupl linter
        • 1db6960 Export MaybeShellQuote
        • e20f00a Fix website automation for when gh-pages branch does not exist
        • f1b4221 Fixed a type in completion example
        • d3c75da Fixed a type in completion example (#508)
        • 5a687a2 Improve documentation (#509)
        • fa8e001 Improve install docs (#506)
        • a23c640 Improve template errors (#504)
        • 34b3fb2 Indent all YAML files consistently
        • ff7dd1b Miscellaneous fixes (#505)
        • c5d9ce0 Omit unknown components from --version output
        • a5321f6 Prepare docs for next release
        • addb0cb Prepare docs for next release (#511)
        • cf457c4 Quote command arguments if needed in template error messages
        • a4c459e Release future Windows binaries in zip archives
        • bcebd2f Set GITHUB_TOKEN for releases
        • 993f87d Switch to GitHub Actions
        • 91e32c3 Switch to GitHub Actions (#494)
        • de4e40b Tidy up package install table
        • eaf7294 Update argument name for consistency with docs
        • d4e1c1b Warn when skipping add of ignored files
        • 4403954 Warn when skipping add of ignored files (#510)

        Full changelog: v1.7.5...v1.7.6

        "},{"location":"reference/release-history/#175-2019-12-02","title":"1.7.5 (2019-12-02)","text":"
        • 243ccc1 Add onepasswordDocument template function
        • 55ecebe Add onepasswordDocument template function (#503)
        • ebe4695 Use more robust shell quoting algorithm

        Full changelog: v1.7.4...v1.7.5

        "},{"location":"reference/release-history/#174-2019-12-01","title":"1.7.4 (2019-12-01)","text":"
        • 13398a8 Add runtime.GOOS and runtime.GOARCH to doctor check
        • 97258b3 Add runtime.GOOS and runtime.GOARCH to doctor check (#498)
        • 770d34e Avoid duplicated first arg in verbose mode
        • 51ca763 Drop coveralls
        • daf6a0e Drop coveralls (#497)
        • 5f98352 Fix links on chezmoi.io
        • 5966624 Fix links on chezmoi.io (#499)
        • fce5ec0 Use go-shell with 32-bit support
        • 2246c5d Use go-shell with 32-bit support (#500)

        Full changelog: v1.7.3...v1.7.4

        "},{"location":"reference/release-history/#173-2019-11-23","title":"1.7.3 (2019-11-23)","text":"
        • 47bb3ce Add --debug flag
        • 4122f12 Add DebugMutator
        • 40fb730 Add FAQ entry on running a command when a file changes
        • 953879e Add FAQ entry on running a command when a file changes (#469)
        • 7d52ca8 Add IdempotentCmdOutput and RunCmd to Mutator
        • 413c8ec Add book theme
        • 948f479 Add content doc dependency on generator
        • 9ea31ce Add debug code (#478)
        • 387cffa Add how to handle externally modified config files
        • 1b655f9 Add how to handle externally modified config files (#487)
        • 1e020e2 Add how to import Oh My Zsh documentation
        • f40fb42 Add how to import Oh My Zsh documentation (#480)
        • 3468c22 Add initial www.chezmoi.io
        • 680cbae Add initial www.chezmoi.io content
        • 616c63a Add smoketest target as default
        • ee0e99b Add sourceDir to default template data
        • 7acba23 Add sourceDir to default template data (#485)
        • add120d Add www.chezmoi.io automation
        • 89e2713 Add www.chezmoi.io website (#471)
        • 7ceb1a9 Build improvements (#488)
        • 011b72c Bump golangci-lint to version 1.21.0
        • 574e74e Clarify Go modules requirement in docs
        • 97987b6 Clarify upgrade command
        • 5dedfdf Disable flaky tests on Windows
        • a362775 Disable flaky tests on Windows (#491)
        • 496c985 Document --debug flag
        • df35378 Don't include tables of contents on chezmoi.io
        • eccc569 Fix debug logging
        • e38d210 Fix debug logging (#482)
        • 9cfd78d Fix grammar and receiver name
        • 4d678ce Fix links on chezmoi.io (#493)
        • 8d0a21e Fix logging (#481)
        • c6af790 Fix logging with --debug and --verbose flags
        • ddac85f Fix typo i make every day, and therefore see everywhere.
        • 7a5c063 Fix typo i make every day, and therefore see everywhere. (#466)
        • 6329176 Improve install docs
        • 51946fa Improve onepassword documentation
        • fde5551 Improve onepassword documentation (#476)
        • 5db37d9 Move fs and mutator into config
        • c5cfcea Only create source parent directory if it does not exist
        • 0840ede Only create source parent directory if it does not exist (#484)
        • 84350bf Quote arguments in verbose mode if necessary
        • 4b04b24 Quote arguments in verbose mode if necessary (#486)
        • f111abd Refactor GitHub Actions
        • 8473c3f Refactor GitHub Actions (#465)
        • df05dff Rename LoggingMutator to VerboseMutator
        • 32359e3 Update modules
        • b286352 Update modules (#470)
        • 05bd6e2 Update reference manual table of contents
        • 07ecbef Use IdempotentCmdOutput in template functions
        • cc9ee40 Use consistent receiver name
        • 62fcb3a Use go vet in golangci-lint
        • 3167f57 Use https://chezmoi.io/ as base URL
        • 7469b97 Use https://chezmoi.io/ as base URL (#473)
        • 0e62d4d Use run instead of exec

        Full changelog: v1.7.2...v1.7.3

        "},{"location":"reference/release-history/#172-2019-10-17","title":"1.7.2 (2019-10-17)","text":"
        • 2445864 Add autocommit and autopush
        • 41c4fdc Add autocommit and autopush (#432)
        • a7bc3b7 Add git status parser
        • f1f9391 Add lines function
        • 963985f Add shell check to doctor command
        • 5033a31 Bump golangci-lint to version 1.20.0
        • 066c9a5 Update dependencies to latest versions

        Full changelog: v1.7.1...v1.7.2

        "},{"location":"reference/release-history/#171-2019-10-13","title":"1.7.1 (2019-10-13)","text":"
        • 88b48f4 Disable source state private check on Windows
        • 0f7bda1 Disable source state private check on Windows (#456)
        • f425bc6 Use Go 1.13's wrapped errors
        • 688bc14 Use Go 1.13's wrapped errors (#453)

        Full changelog: v1.7.0...v1.7.1

        "},{"location":"reference/release-history/#170-2019-10-10","title":"1.7.0 (2019-10-10)","text":"
        • f2cd6e9 Add FAQ entry on source/target filename bijection
        • 2d7d593 Add FAQ entry on source/target filename bijection (#442)
        • 9c67b56 Add GitHub Actions
        • 90d5323 Add gopass support
        • 5fda365 Add gopass.command reference
        • fd38084 Allow persistent state to be opened in read-only mode
        • 9e2ceb7 Don't export internal package
        • a90b01f Fix line-ending-dependent tests on Windows
        • 37ac582 Fix symlink test on Windows
        • 1929a0f Improve detection of the user's shell
        • fd991e7 Improve detection of the user's shell (#446)
        • b5b46db Only lock persistent state when writes are needed (#441)
        • ce09d0d Only open persistent state in read-write mode if needed
        • 3924950 Remove stray debug code
        • 7939fd6 Switch to github.com/pkg/diff
        • 8835998 Unify and improve GitHub workflows
        • c79de4c Unify and improve GitHub workflows (#450)
        • ec449db Update contributing docs
        • a1c7969 Update github.com/twpayne/go-acl to use latest version of golang.org/x/sys
        • 4255f83 Update install.sh from latest godownloader
        • f51a1ce Update install.sh from latest godownloader (#452)
        • f17d668 Update table of contents
        • 681116a Use gpg.recipient in docs, instead of deprecated gpgRecipient
        • eca92ce Use latest golangci-lint release
        • f6a0cd2 Use latest version of github.com/Masterminds/sprig

        Full changelog: v1.6.5...v1.7.0

        "},{"location":"reference/release-history/#165-2019-09-20","title":"1.6.5 (2019-09-20)","text":"
        • 3733485 Add nodocs and noembeddocs build tags (#431)
        • ad21e43 Add nodocs build tag
        • dbe4b67 Add noembeddocs build tag

        Full changelog: v1.6.4...v1.6.5

        "},{"location":"reference/release-history/#164-2019-09-19","title":"1.6.4 (2019-09-19)","text":"
        • e1410ab Make --follow a global option
        • 5212eb3 Make --follow a global option (#430)

        Full changelog: v1.6.3...v1.6.4

        "},{"location":"reference/release-history/#163-2019-09-17","title":"1.6.3 (2019-09-17)","text":"
        • 034ba74 Add Scoop support
        • 9fa8675 Add Scoop support (#429)
        • 850dd8c Execute templates after editing
        • c4190f5 Execute templates after editing (#428)
        • fd24e09 Pin golangci-lint to version 1.18.0
        • 1335bef Pin golangci-lint to version 1.18.0 (#426)

        Full changelog: v1.6.2...v1.6.3

        "},{"location":"reference/release-history/#162-2019-09-10","title":"1.6.2 (2019-09-10)","text":"
        • c29d46c Add Windows build test on Travis
        • 085c025 Add config file template test
        • 8144046 Add init test
        • 283d98e Add init test (#419)
        • 4203598 Add keepassxcAttribute template function
        • 6ccd08c Add keepassxcAttribute template function (#418)
        • d628770 Build with Go 1.13
        • 97dac6f Disable funlen linter
        • 5056d8a Disable funlen linter (#420)
        • e5d4962 Ignore chezmoi.exe
        • 9c02816 Ignore chezmoi.exe (#421)
        • 95759d7 Improve README.md
        • 1dea364 Improve README.md (#407)
        • a08bb5a Re-generate tables of contents
        • 2b5ec69 Remove stray double quote
        • 8ae43e6 Thread fs to exec
        • 1656bf6 Tidy up tables
        • ef1229e Tidy up tables and table of contents (#414)
        • 78dda03 Updated install script to be in line with shlib/uname_os.sh
        • 44e4a24 Use an interface to abstract VCSes

        Full changelog: v1.6.1...v1.6.2

        "},{"location":"reference/release-history/#161-2019-08-11","title":"1.6.1 (2019-08-11)","text":"
        • 140201c Add preview update doc (#391)
        • c157439 Add preview update to HOWTO.md
        • 4c3f2e9 Add \u2018Bug Report\u2019 Issue Template
        • d918f7e Disable autotemplate by default
        • 716bd09 Document PrivacyStater
        • 1792d38 Document PrivacyStater (#402)
        • 7d513f3 Don't run scripts in diff mode
        • 1e70622 Factor out common struct
        • aab0d2c Fix 397 (#405)
        • 76a691e Remove AppVeyor
        • a947359 Remove AppVeyor (#403)
        • 327a26d Update tables of contents with latest VSCode Markdown helper

        Full changelog: v1.6.0...v1.6.1

        "},{"location":"reference/release-history/#160-2019-07-08","title":"1.6.0 (2019-07-08)","text":"
        • b989fa6 Add AppVeyor CI for Windows
        • b32874c Add AppVeyor CI for Windows (#385)
        • 00c05f3 Add CI for OS X
        • 1c7c29e Add Windows release (#390)
        • 8539a1d Add bash completion in snap package (#362)
        • d64fbb1 Add bash completion to snap package
        • f88c88a Add some more template dir tests
        • f007172 Build releases for Windows
        • 835ab33 Disable upgrade command on Windows
        • 1be0691 Don't use github.com/google/renameio on Windows
        • 533b454 Fix IsPrivate
        • 77b8641 Fix IsPrivate (#386)
        • f276df1 Fix Windows IsPrivate to check explicit file permissions instead of effective permissions.
        • 4953b05 Fix execution with partial templates
        • 8e29647 Fix execution with partial templates (#388)
        • 612d56e Fix test filenames
        • 47313ac Fix whitespace in build tags
        • cbfea11 Improve Windows support (#381)
        • 6cbde10 No upgrade on windows (#378)
        • c46bed5 Re-enable the add --recursive tests on Windows
        • 131ed26 Skip add --recursive tests on Windows
        • 6cdf740 Tidy up comments
        • 4b38c75 Update dependencies
        • f6ed345 Update go.mod
        • 2800d6a Use fork of github.com/hectane/go-acl while waiting for upstream to merge
        • 8c81e98 Use latest github.com/twpayne/go-vfs
        • b42b08f Use latest github.com/twpayne/go-vfs
        • c6b5ebd Use latest github.com/twpayne/go-vfs (#380)
        • bff3e1e Use latest modules for Windows support (#377)

        Full changelog: v1.5.10...v1.6.0

        "},{"location":"reference/release-history/#1510-2019-06-29","title":"1.5.10 (2019-06-29)","text":"
        • 8f2f3e0 Add all logo images
        • ca11320 Add all logo images (#372)
        • bfa0198 Add docs command
        • f776ef5 Add docs command (#374)
        • 514bd77 Document where one line install script will install binary
        • 6323f53 Don't execute templates when editing source state
        • 355f650 Don't execute templates when editing source state (#370)
        • fa1d828 Fix issue 336 comments (#368)
        • 9301869 Fix template error messages (#371)
        • 0ea0cca Make remove command prompt by default
        • a2fc377 Make remove command prompt by default (#375)
        • abaabcb Open source directory with editor when edit is run with no arguments
        • 7f1d926 Remove go mod tidy test from CI
        • c711405 Use goreleaser's fine-grained control for releases
        • 542a132 Use goreleaser's fine-grained control for releases (#376)
        • 89ed284 Use text/template's error reporting mechanism

        Full changelog: v1.5.9...v1.5.10

        "},{"location":"reference/release-history/#159-2019-06-24","title":"1.5.9 (2019-06-24)","text":"
        • 79e568d Add Linuxbrew to install doc
        • 01eaf98 Add Linuxbrew to install doc (#365)
        • 0a74170 Document script shebangs and executable bits
        • f6a8d97 Initialize persistent state even when no config file exists
        • 909c6ac Initialize persistent state even when no config file exists (#367)

        Full changelog: v1.5.8...v1.5.9

        "},{"location":"reference/release-history/#158-2019-06-22","title":"1.5.8 (2019-06-22)","text":"
        • c829084 Fix unterminated string
        • 5baa07a Fix unterminated string
        • 1440388 Fix unterminated string (#364)

        Full changelog: v1.5.7...v1.5.8

        "},{"location":"reference/release-history/#157-2019-06-22","title":"1.5.7 (2019-06-22)","text":"
        • 008513f Add --follow option to add command
        • 4906a84 Add bash and fish completions to deb and rpm packages
        • 3805756 Add common templates
        • 822ed49 Add doctor binary check
        • 76f0952 Add issue 353 test
        • 78b908d Add logo to README.md
        • dc31e18 Add logo to README.md (#350)
        • 6fdcc6e Add missing -f
        • 15187ed Add note about completions
        • 5bdbde1 Add note about including version numbers
        • 4db775f Add remove functionality
        • fe8bfc1 Add shell completions
        • a199a64 Add square logo
        • 1817afd Add support for Arch Linux to upgrade command
        • 18ae3c4 Add support for gpg symmetric encryption
        • 25feb88 Add symmetric encryption (#333)
        • 9ed9fd0 Add test for issue #353
        • 2ff163b Clean up whitespace
        • cdfb0c6 Connect gpg to terminal for encryption and decryption
        • 9215412 Correct capitalization of GitHub
        • 4586dfb Correct capitalization of GitHub (#334)
        • 58a7446 Correct order of arguments
        • c91bc9d Document that fish completion exists in REFERENCE.md
        • 5603bef Document that fish completion exists in REFERENCE.md (#346)
        • ea294a3 Documentation cleanups (#358)
        • e90a576 Exec new version after upgrade
        • 36ff00e Exec new version after upgrade (#335)
        • 1e9ba2f Factor out GPG
        • dc52690 Factor out getVersionFromOutput
        • 7a50dd7 Factor out gpgBinaryCheck
        • 6c4353c Fix arch install command
        • be10fe9 Fix formatting
        • d7af42c Fix typos
        • 96f0847 Fix typos (#337)
        • 64d52b4 Ignore downloaded binaries
        • 938185b Improve quick start guide
        • 2983fc8 Improve quick start guide (#359)
        • eb861e7 Improve secret management explanation
        • df82247 Improve section title
        • 483fe60 Improve use of ReadOnlyFS
        • b815ed3 Improve use of goreleaser (#349)
        • 4174a0b Include completions in archives
        • 6c00d56 Install completions (#343)
        • 5a60e95 Install golangci-lint with goreleaser
        • 89ecc76 Install improvements (#351)
        • 119cae6 Install package binaries in /usr/bin, not /usr/local/bin
        • 39fc02f Install shell completions in homebrew
        • 794a1a1 Install zsh completions
        • f1372a4 Install zsh completions (#361)
        • e498d91 Logo
        • 9c9f5ef Make default data available in config file templates
        • 136d229 Pass through stderr output from secret commands
        • 884747e Pass through stderr output from secret commands (#338)
        • e7324df Re-enable update-install.sh target
        • 6a16044 Refactor apply tests
        • 5ac2f33 Refresh install guide
        • b9baa5e Relax gpg version check regexp
        • 8467697 Remove stale sentence
        • 47d2b78 Remove unused tool
        • 508d459 Rename completion files
        • e3814f2 Rename logo files
        • fc84b92 Run apply multiple times to check for idempotency
        • d45c23d Update brews in goreleaser config
        • 8759d79 Update go-github to v26
        • 297567d Update goreleaser configuration
        • a319f04 Update install.sh from goreleaser
        • 8c614a6 Update tables of contents
        • 8e92a90 Update tables of contents
        • 8b91858 Upload Logo (#348)
        • 6ecbff8 Use consistent email in tests
        • 957535f Use consistent path to state database in tests
        • a590114 Use consistent values in tests (#360)
        • d37888f Use tagged version of bolt
        • 6eb98eb chezmoi is now available in official Arch repository
        • 78f646b upload

        Full changelog: v1.5.6...v1.5.7

        "},{"location":"reference/release-history/#156-2019-06-06","title":"1.5.6 (2019-06-06)","text":"
        • 02b902d Add GitHub Release badge
        • 2566544 Add doctor version check
        • d17f54f Add doctor version check (#318)
        • e3b79bb Add fish completion support
        • a4aaed0 Add fish completion support (#320)
        • e40b797 Add fish to completion command description
        • f01f715 Add golangci-lint configuration
        • e34b215 Add install-tools target
        • f2cf3b8 Disable warning about computed URL
        • fa33f40 Don't use a singleton NullMutator instance
        • e2edc9e Don't use references to range-scoped variables
        • 1abbee1 Explain how to customise the merge tool
        • e7576f4 Improve documentation
        • ae968e3 Make script state bucket a parameter, not a global
        • 23c0169 Mark snap releases as stable
        • 36bbdcd Mark snap releases as stable (#317)
        • fd8a72e Remove Go Report Card badge
        • 802b3b1 Remove pre-release-checks target
        • f4c9963 Resolve all lint problems and enable more linters (#310)
        • f7ca727 Update badges (#311)
        • a324c18 Update contribution docs
        • de73d1b Update contribution docs (#309)
        • dac85d2 Update go.mod
        • 3073691 Update snap install instructions with beta channel
        • b006026 Update snap install instructions with beta channel (#307)
        • 1b047e6 Use latest go-difflib with improved colors
        • 377bed9 Use latest go-difflib with improved colors (#328)
        • 24cb155 Use latest go-vfs with Windows support
        • 6963cb9 Use latest go-vfs with Windows support (#319)
        • b0182fe Use relative package paths in documentation
        • 07244d3 Use simpler interfaces where possible
        • dadd7fa go mod tidy to make CI happy

        Full changelog: v1.5.5...v1.5.6

        "},{"location":"reference/release-history/#155-2019-05-18","title":"1.5.5 (2019-05-18)","text":"
        • 19f1d3d Work around snap not creating XDG_RUNTIME_DIR
        • 4fb74c9 Work around snap not creating XDG_RUNTIME_DIR (#306)

        Full changelog: v1.5.4...v1.5.5

        "},{"location":"reference/release-history/#154-2019-05-18","title":"1.5.4 (2019-05-18)","text":"
        • 013e289 Ensure that dist directory is empty before releasing
        • 7d37a3b Release fixes (#304)
        • 60ed2ec Update README.md

        Full changelog: v1.5.3...v1.5.4

        "},{"location":"reference/release-history/#153-2019-05-18","title":"1.5.3 (2019-05-18)","text":"
        • 2b5e1a0 Add KeePassXC support
        • a840bcc Add KeePassXC support (#293)
        • 46822f2 Add gpg doctor check
        • fa87510 Add install.sh
        • 1904a34 Add install.sh (#299)
        • 476b614 Add snap support to upgrade command
        • 121950c Allow file checks to be skipped
        • db75551 Build snap packages
        • a192eb6 Build snap packages (#298)
        • e5bc9db Disable update of install script from buggy godownloader
        • f921559 Fix godownloader-generated install script
        • 590d0ae Goreleaser tweaks (#301)
        • 8b823e8 Misc fixes (#296)
        • d31de11 Move goreleaser config to default location
        • 74befd1 Move goreleaser config to default location (#300)
        • 4db9935 Quote number used as string
        • 2b6cd27 Remove bzr support
        • 239d33a Remove bzr support (#294)
        • 54b09c2 Rework installation (#302)
        • c65f96f Rework installation documentation
        • 8194f9f Strip any leading v when parsing version
        • 9ca08a2 Update archives stanza
        • ffd20c6 Update reference table of contents
        • 8d068c1 Use short URL in installation docs

        Full changelog: v1.5.2...v1.5.3

        "},{"location":"reference/release-history/#152-2019-05-15","title":"1.5.2 (2019-05-15)","text":"
        • 8bd7bc9 Add BoltPersistentState
        • ffc67b4 Add PersistentState
        • a03f4f3 Add go mod tidy check to CI
        • c07dde5 Add go mod tidy check to CI (#290)
        • 5f9b01d Add initial script documentation
        • d75c32b Add script support
        • 8088850 Add script support (#287)
        • 2cd7d3c Documentation fixes (#286)
        • 3efc5c2 Factor out ApplyOptions
        • 0adef48 Fix typo in comment
        • fe1cee7 Fix typo in reference
        • 9d4dba1 Go mod workarounds (#291)
        • e7e0188 Remove CVS and Subversion support skeleton (#288)
        • 4810ef1 Remove CVS support skeleton
        • 309f340 Remove Subversion support skeleton
        • 9f1d435 Sort fields
        • 32e5d4e Update reference table of contents
        • 6630266 Use github.com/twpayne/go-difflib instead of github.com/pmezard/go-difflib
        • ef59741 Use latest go.etcd.io/bbolt at HEAD instead of fork

        Full changelog: v1.5.1...v1.5.2

        "},{"location":"reference/release-history/#151-2019-05-08","title":"1.5.1 (2019-05-08)","text":"
        • e224be0 Add missing newline
        • 770ca59 Add pre-release-checks target
        • 6917265 Add pre-release-checks target (#282)
        • 7b61b9f Document pre-release-checks target
        • 9f0d52c Fixed typo in 1Password instructions
        • b6f35e5 Fixed typo in 1Password instructions (#285)
        • 1e7327f Misc fixes (#281)
        • 4f8ae57 Pre-allocate array
        • 68eea80 Reduce interface requirements
        • fbde75f Remove unnecessary gofumpt
        • 54fd0a8 Remove unnecessary return value
        • a984e58 Update mercurial support
        • 8d7d5b6 Use smaller interface

        Full changelog: v1.5.0...v1.5.1

        "},{"location":"reference/release-history/#150-2019-05-03","title":"1.5.0 (2019-05-03)","text":"
        • 67e6861 Add FAQ entry on origin of chezmoi
        • 0f11911 Add another source-path example
        • 4ce6c61 Add colored diff support
        • f22c1e7 Add example extraction
        • 6ff9ad9 Add excluded ignores
        • 5293105 Add explicit test for #192
        • 1664463 Add generated long help infrastructure
        • e845ac9 Add golangci-lint check
        • f0bcb41 Add initial REFERENCE.md
        • a41c2d3 Add internal extract-long-help tool
        • c866b0c Add internal extract-markdown-ast tool
        • 40abd64 Add long help for all commands
        • 188b88d Add make targets for common tasks
        • 14410e0 Add merge command
        • 993f6a9 Add merge command check to doctor
        • 91071ec Add minimum version assertion to source state
        • 011ba83 Add minimum version check and document special files (#272)
        • 555f8ad Add missing backquote
        • 087d9cf Add missing closing double-quote
        • afdcb33 Add more documentation to README.md
        • 0f6f7eb Add more questions
        • 693ca87 Add note about golangci-lint and gofumpt
        • bc2f2a9 Add note about upgrade to installation doc
        • c0706ce Add note on packaging
        • 34c3f4d Add noupgrade build tag
        • cae1e1d Add noupgrade build tag (#276)
        • 1632584 Add reference manual and long help for all commands (#258)
        • 61f8309 Add table of contents
        • 0553dd9 Add tables of contents
        • 92d520c Add upgrade command
        • 7810b62 Add upgrade command (#265)
        • 738fcd8 Add warning if source VCS command is not supported
        • 4f57699 Change indent to two spaces to match Cobra
        • 1ebf43c Check config file for errors after edit-config
        • 2cb4272 Cosmetic fixes
        • cb554ed De-duplicate goreleaser build ids
        • 467a1d6 De-duplicate goreleaser build ids (#277)
        • a7bfe73 Doc improvements (#267)
        • 4d3e7de Document goinstaller installation
        • d1ef895 Document gpgRecipient
        • bbd1b81 Document merge commands
        • ad89352 Document special files
        • 1415432 Download modules first
        • f322a1c Factor out Encrypt
        • 72318e5 Factor out TargetState.Decrypt
        • ad7a836 Fix FAQ link
        • 8c27153 Fix FAQ link (#260)
        • cedee29 Fix caching of generic secret command output
        • 58bf7e9 Fix calculation of current source dir mode
        • df5c96a Fix destination flag name
        • 2d1ba6e Fix formatting of chattr reference
        • 7606f5e Fix grammar
        • d98b524 Fix grammar (#280)
        • 3273255 Fix grammar in comment
        • 19f9fa0 Fix remaining documentation FIXMEs
        • e4f023c Fix typo
        • 6b4e503 Fix typo
        • c836187 Fixed link to quick start guide
        • ef5d496 Fixed link to quick start guide (#270)
        • 2f94aa5 Generalize chattr implementation
        • 1fa49ba Improve detection of imperfectly-formatted code
        • 066884c Improve documentation (#259)
        • b9d6d87 Improve readability of helps.gen.go and fix examples of last command
        • d25e457 Improve reference manual documentation
        • 87cec4f Make code pass golangci-lint
        • 68b2c6a Make edit work on plaintext, not ciphertext
        • 87571b4 Misc fixes (#263)
        • 4901baf Misc fixes (#266)
        • bf7a42f Misc fixes (#273)
        • add797b More cosmetic fixes
        • 7923310 Move documentation into docs
        • 20c3538 Propagate Encrypted state
        • 259c5f9 Put flags after arguments for consistency with Cobra and add more examples
        • 038e7b5 Refactor documentation
        • 8bcff93 Reformat paragraph
        • fa72a55 Remove --umask flag
        • 6e95959 Remove link to godoc.org
        • 4ac4708 Remove list of template variables
        • e330084 Remove pets vs. cattle comment
        • ac75e01 Remove snap infrastructure
        • 99513e3 Remove snap infrastructure (#269)
        • c56f61d Remove some obvious comments
        • 81d16a0 Remove underscores from filenames
        • 9077575 Rename HOW-TO.md to HOWTO.md
        • f16c811 Rewrite single-case switch as if
        • b60b022 Simplify logic
        • 467ab16 Sort variables
        • b9fe1c9 Split installation and quick start guides
        • ca98784 Support encrypt attribute in chattr
        • 854cfd5 Tolerate config file errors for certain commands
        • b03d480 Update cmd/helps.gen.go
        • f21f9e2 Update long help
        • c86e2ba Upgrade by replacement if executable is in temp dir
        • 696c2f6 Upgrade improvements (#278)
        • da941b8 Use command variable name for commands consistently
        • 5a9f735 Use make targets in CI
        • b3e445f Use mvdan.cc/gofumpt
        • 9d08f18 Verify checksums when upgrading

        Full changelog: v1.4.2...v1.5.0

        "},{"location":"reference/release-history/#142-2019-04-14","title":"1.4.2 (2019-04-14)","text":"
        • 295da27 Abstract out stdin, stdout, and stderr for testing
        • 5fabcff Add apply test
        • a24348b Add archive test
        • da6ac24 Add bash & zsh completion
        • ba462c6 Add coverage badge
        • 7c8e4b6 Add destination directory is a symlink test
        • dbc942d Add dump test
        • 67bc2e0 Add golint test
        • adcd979 Add import test
        • c0f657a Add note about pets vs. cattle
        • 7bf62ae Add permValue test
        • 57d009a Add ppc64 architectures to README.md
        • 9f1232f Add snap generation and tidy up YAML files
        • be5e240 Attempt to build snap
        • 9092c62 Combine coverage profiles for more accurate coverage
        • 3273eee Disable Go modules when installing linters
        • 9619ed6 Disable snapcraft support and re-enable ppc64, ppc64le, and arm
        • 98ec39e Don't trust golang.org/x/lint/golint
        • 2eb4227 Export TemplateSuffix
        • 86859d9 Factor out coverage targets into Makefile
        • 7d0bf1d Fix cosmetics
        • bc2edae Fixes from PR review comments
        • 7e53826 Hint at #243
        • a12313c Implement config file creation from template during init command
        • b7e2346 Make default config file format TOML
        • 6e5813c Remove golint checks while golint is broken
        • eb1c302 Require Go 1.12
        • 93c585d Respect umask in dump command
        • 99068b9 Run gofumpt -s
        • 0109341 Switch to github.com/stretchr/testify for testing
        • 80e441b Tidy up .goreleaser.yaml
        • 31d5fea Tidy up .goreleaser.yaml
        • 4ae22b9 Tidy up config file creation in init
        • 43c26fc Use github.com/twpayne/go-xdg v3
        • 56c0b00 Use github.com/twpayne/go-xdg/v2
        • 9aa00ca Use vfs.Contains
        • f8b2094 add a space before ; fi
        • c53640c add missing ; fi to .travis.yml
        • 5e0b43b disable goveralls on pull requests
        • 7b72952 don't run on PRs instead of exclusively running on them
        • 6374b6c fixing go vet error

        Full changelog: v1.4.1...v1.4.2

        "},{"location":"reference/release-history/#141-2019-03-20","title":"1.4.1 (2019-03-20)","text":"
        • 30bfacf Add git as a dependency for rpm and deb packages
        • 8f40f2e Add ppc64 and ppc64le to goreleaser target
        • b8bbd12 Fix #198 - Use os.UserHomeDir() instead of custom function
        • d7e76e8 Fix new issue link in CONTRIBUTING

        Full changelog: v1.4.0...v1.4.1

        "},{"location":"reference/release-history/#140-2019-03-14","title":"1.4.0 (2019-03-14)","text":"
        • c827046 Add Mutator.Stat
        • 8d8fb55 Add TOML as an output format
        • e13bb89 Add gpg encryption
        • 6075a02 Add manage as an alias for add
        • 8406817 Add unmanage as an alias for forget
        • e47c444 Add unmanaged command, fixes #186
        • cd3d86b Add userHomeDir
        • 4cfdaac Change example configs to TOML and reformat
        • 93d03aa Check lastpass CLI version on first call
        • da8098b Create directory for config file before editing if needed
        • b324637 Fix all markdownlint warnings, except one
        • 72690a6 Fix double word in init help
        • 201e7a5 Fix that accomodates blank lines and comments
        • 4d32cde Make hostname only first part of hostname and add fullHostname
        • 249e2b9 Make it clearer that the rpm packages work on OpenSUSE
        • f2dfbb8 Only display text diffs
        • b477972 Reduce number of semver libraries
        • 02636ad Remove NullMutator
        • d63c406 Remove unused function arguments
        • 306df8b Return ErrNotExist from nullMutator.Stat
        • b41824c Return an error instead of panicking
        • 035988d Revert \"Remove NullMutator\"
        • 9fea286 Revert \"Use vfs.ReadOnlyFS's instead of NullMutators\"
        • 90d4274 Spell out lastpass --json arg
        • ab807b1 Test to demonstrate parsing error
        • ab1de29 Use latest github.com/twpayne/go-xdg
        • 19947c8 Use latest version of github.com/twpayne/go-vfs
        • 2a72a34 Use renameio correctly across multiple filesystems
        • b1cddc3 Use userHomeDir instead of github.com/mitchellh/go-homedir
        • 5bf7ead Use vfs.MkdirAll
        • 18366aa Use vfs.ReadOnlyFS's instead of NullMutators

        Full changelog: v1.3.0...v1.4.0

        "},{"location":"reference/release-history/#130-2019-01-30","title":"1.3.0 (2019-01-30)","text":"
        • 7f4bd2d Add Config.getVCSInfo
        • f385ec1 Add ID as a well-known abbreviation
        • 4daf21d Add check for generic secret command
        • 32146ce Add check for suspicious filenames
        • b3e8085 Add first run git init instructions to README
        • 9b7b268 Add hermetic text functions from sprig, fixes #184
        • 595dcf1 Add init command
        • 2ef2695 Add stow-to-chezmoi.sh migration script
        • 013e419 Add update command, fixes #159
        • 6a1a0ea Always print permissions with three digits
        • 1ef4f89 Consider files only containing whitespace as empty
        • abbc0c1 Don't make init command apply by default
        • 3cc895d Emphasize flexibility first
        • 4dee096 Ensure that source directory exists in cd command
        • f9290fc Factor out doctorCheck interface
        • ed27b49 Factor out doctorCheckResult
        • 1679704 Factor out ensureSourceDirectory
        • a3830ca Factor out runDoctorCheck
        • bd21ee6 Factor out vcs_infos.go
        • 4633ca1 Fix dump command with targets
        • cf18630 Fix handling of missing directories
        • 18911f1 Fix source directory errors in documentation, fixes #171
        • 85b7ece Fix template in example, fixes #161
        • f7edc93 Fix typos in README.md
        • 68a304c Include args in usage
        • d249d15 Init new repo when init is called with no args
        • 792c631 Make source VCS pull command configurable
        • 47b305a Mention init command in README.md
        • dfd18a1 Minor documentation change
        • 7abd4cc Parse permissions in octal
        • 2d3eff1 Refactor doctor command to include versions, fixes #160
        • b8aabb0 Refactor getting started documentation
        • 9abe99d Refactor init command
        • 204a5a7 Remove evident comment
        • fc71c55 Remove unnecessary os.FileInfo.Mode() calls
        • d7be60a Rename onepassword config var to match command
        • 13f5d47 Replace Command with Cmd in internal structure names
        • 61ffbf4 Respect umask when creating source directory
        • cf305f8 Store config file in config struct
        • e0410cd Tidy up doctor check reporting
        • b97f37d Update description
        • 96797da fix: several plausible failure modes for the script during routine running

        Full changelog: v1.2.0...v1.3.0

        "},{"location":"reference/release-history/#120-2019-01-18","title":"1.2.0 (2019-01-18)","text":"
        • 367c0d5 Add 1Password support, fixes #135
        • acbf852 Add advantages
        • 0494cb8 Add doctor command
        • 36cd576 Add generic secret manager support, fixes #51
        • 932a8e9 Add support for \"secret\" command namespace
        • 290d13e Add support for passwordstore
        • e4c8d41 Better position transparency benefit
        • bf45f84 Call pass show explicitly
        • 2ff85c2 Document pass support, fixes #139
        • 333066e Don't disable secret manager commands if binary is not present
        • abf762f Don't export internal config structures
        • 3a63e45 Include binary names in secret manager descriptions
        • 209c1e2 Move keyring command into secret command
        • f2ac9c3 Only add commands that have installed executables
        • 015609d Re-order features based on feedback
        • 24f7131 Remove --bitwarden-session flag
        • 95c14a3 Rename Funcs to TemplateFuncs
        • 718ae00 Rename field for consistency
        • fe18833 Rename source files to match command structure
        • 24c94fe Scan pass output up to the first newline, rather than splitting

        Full changelog: v1.1.0...v1.2.0

        "},{"location":"reference/release-history/#110-2019-01-16","title":"1.1.0 (2019-01-16)","text":"
        • a8aeb1b Add 'Why use chezmoi?' section
        • abfe150 Add --prompt flag to add command, refs #123
        • d676fc6 Add chezmoi in the news section
        • 55746d9 Add data command
        • bbb5b2a Add link to Hacker News discussion
        • 55bfe71 Add link to dotfiles.github.io
        • 8677883 Add link to lobste.rs discussion
        • fe39c57 Add link to reddit.com discussion
        • 39c2645 Add missing dollar
        • 8919b6c Add note about data command
        • bf690dd Add os-release parser
        • 341b99f Add osRelease to .chezmoi data, fixes #126
        • 4044b1e Add table of packages
        • 7a88b12 Add test for CGO
        • 1fe3fe0 Add vault support, fixes #120
        • e0b7bad Avoid potential out-of-range access if string is empty
        • d1ee299 Convert OS release map keys outside getOSRelease
        • c1525d8 Convert os-release keys to JSON-like keys
        • 61f7659 Correct source flag
        • 9921965 Document .chezmoi.osRelease
        • 8cc9fdd Don't add ignored files, fixes #124
        • 4fecad4 Don't delete ignored files in exact directories
        • 99e138e Don't duplicate licence text
        • 34eb20d Extract target dir names when computing ignore pattern
        • 6ac240c Factor out formatMap
        • 6ffb4f1 Fix typo
        • bf67981 Ignore errors from user.LookupGroupId if CGO is disabled, fixes #125
        • 877f0cb Make error messages more consistent
        • 53c20a0 Preserve existing directories in source state instead of renaming them
        • 15a1cd2 Use latest version of github.com/twpayne/go-vfs
        • 125f4ba Wrap comment
        • 9cec1f6 dirNames: use make for init slice of string

        Full changelog: v1.0.0...v1.1.0

        "},{"location":"reference/release-history/#100-2019-01-13","title":"1.0.0 (2019-01-13)","text":"
        • d855c1e Add printing of symlinks to cat command
        • 5529485 Don't check for config files in old locations, fixes #113
        • 05935b1 Remove note about versioning
        • af4b714 Use DestDir instead of TargetDir in code
        • 7484973 Use consistent terminology in help and doc

        Full changelog: v0.0.15...v1.0.0

        "},{"location":"reference/release-history/#0015-2019-01-13","title":"0.0.15 (2019-01-13)","text":"
        • fc3be3e Add CONTRIBUTING.md
        • 2f90eef Add initial chattr test
        • dd7e6c1 Add more tests for chattr on file
        • 744d2cf Add octalIntValue
        • dfc456e Add tests for chattr on symlink
        • f9fefac Allow no- prefix to remove attributes
        • 6ffae71 Fix chattr -private on directories
        • 619b2ed Fix chattr of files in directories, fixes #103
        • 60a26df Print umask in octal in help, fixes #107
        • c42eecf Remove FIXMEs that are now Github issues
        • 0d8551c Remove stale FIXME
        • 32ce15c Remove unused cobra.Command argument
        • 1c8d357 Reorganize functions
        • 1704912 Respect .chezmoiignore in Entry.ConcreteValue
        • 4612ada Respect .chezmoiignore in Entry.Evaluate
        • 84c41c7 Respect .chezmoiignore in Entry.archive
        • d8f8445 Sort functions alphabetically

        Full changelog: v0.0.14...v0.0.15

        "},{"location":"reference/release-history/#0014-2019-01-12","title":"0.0.14 (2019-01-12)","text":"
        • 20ed7e2 Set version in linux-amd64 release

        Full changelog: v0.0.13...v0.0.14

        "},{"location":"reference/release-history/#0013-2019-01-12","title":"0.0.13 (2019-01-12)","text":"
        • d66bf04 Add .chezmoiignore support, fixes #91
        • ac412b6 Add PatternSet
        • 9c6cedf Avoid duplicate filename in template errors
        • 17a590c Avoid infinite loop when template value is empty
        • 81eba36 Remove stale comment
        • 60cb5ff Sort entries in test
        • cab2f01 Use latest github.com/twpayne/go-vfs

        Full changelog: v0.0.12...v0.0.13

        "},{"location":"reference/release-history/#0012-2019-01-11","title":"0.0.12 (2019-01-11)","text":"
        • 4e07b0e Add alphabetical test
        • 721df9f Add edit-config command, fixes #90
        • bb05d54 Add inWord
        • e4f1ca1 Add link to github.com/twpayne/dotfiles
        • 9219d3f Compute valueRegexp when needed
        • 0ec171a Factor out execEditor and runEditor
        • 355aef8 Fix README.md formatting
        • 555ea41 Improve variable substitution, fixes #89
        • 6230dbf Use a tagged version of github.com/google/renameio
        • 313c04b Use subtests in autotemplate tests

        Full changelog: v0.0.11...v0.0.12

        "},{"location":"reference/release-history/#0011-2019-01-05","title":"0.0.11 (2019-01-05)","text":"
        • 02bcd30 Add exact support to chattr
        • 7bb40c2 Add support for exact directories, fixes #11
        • 447e244 Correct path to source directory
        • 532d788 Ensure directory exists before creating .keep file
        • 2abc9a9 Factor out AddOptions
        • e66da3c Factor out ImportTAROptions
        • ba1c8fa Reformat test
        • b28a722 Remove default values
        • a8c5ca1 Remove early reference to go-keyring
        • 5004108 Rename jenkins to user
        • 12d817d Shorten description
        • 7f621cb Use interface{} for root values consistently

        Full changelog: v0.0.10...v0.0.11

        "},{"location":"reference/release-history/#0010-2018-12-22","title":"0.0.10 (2018-12-22)","text":"
        • 5301881 Add --bitwarden-session flag
        • cbd9256 Add initial Bitwarden support
        • d068f60 Automatically parse Lastpass note values
        • 6147683 Compute name argument
        • fe723f8 Correct error text
        • bbaf694 Correct variable name
        • 4f2ddb2 Factor out addDir
        • d9d79dd Factor out addFile
        • 52c1768 Factor out addSymlink
        • 66cb18c Move DirAttributes in to dir.go
        • 703bfd6 Move FileAttributes into file.go
        • 5e7036a Move TargetState tests into target_state_test.go
        • c198aa1 Pass os.FileInfo to TargetState.addFile instead of perm and empty
        • 4b9114a Reformat tests
        • 9264001 Remove last trace of ParsedSourceDirName
        • 72c8d6f Remove unnecessary masks
        • 06559bc Remove unreachable code
        • 7f9cabc Rename DirName to Name
        • 2631a87 Rename FileName to Name
        • c59600e Rename LinkName to linkname
        • 04e1423 Rename ParsedSourceDirName to DirAttributes
        • c2da0c0 Rename ParsedSourceFileName to FileAttributes
        • 7f3b2a8 Rename TargetState.Import to ImportTAR
        • a2bbef6 Rename internal variable
        • 38cd4da Unify error messages across password managers
        • 3db61d1 Use os.FileMode.Perm() consistently

        Full changelog: v0.0.9...v0.0.10

        "},{"location":"reference/release-history/#009-2018-12-16","title":"0.0.9 (2018-12-16)","text":"
        • 39e003c Don't assume that config file exists, fixes #73
        • 3a4ea33 Don't use cgo on linux_i386
        • 0c6aca4 Enable CGO on Linux
        • 5aa794d Make description consistent
        • 4c8054f Make parameter documentation more consistent
        • 4021463 Make usage error output less verbose
        • f6ae4f3 Prefix errors with chezmoi:
        • 2e007a3 Refresh go modules with latest versions
        • 4c7aa0c Remove old version infrastructure
        • 1ddcc7e Revert \"Ignore group lookup errors, fixes #65\"
        • 28346cc Use cobra's --version flag

        Full changelog: v0.0.8...v0.0.9

        "},{"location":"reference/release-history/#008-2018-12-14","title":"0.0.8 (2018-12-14)","text":"
        • 3913e51 Add archive documentation
        • 13edec3 Document cd command
        • 8e9ec60 Ignore group lookup errors, fixes #65
        • 6449e9c Support XDG Base Directory Specification, fixes #19

        Full changelog: v0.0.7...v0.0.8

        "},{"location":"reference/release-history/#007-2018-12-14","title":"0.0.7 (2018-12-14)","text":"
        • baddf0f Generate unified diffs
        • 52feafc Remove remaining references to Windows while Windows is unsupported
        • 52566d9 Remove stray bracket
        • 144b125 Restore default source VCS command
        • 9629996 Update description to emphasize security

        Full changelog: v0.0.6...v0.0.7

        "},{"location":"reference/release-history/#006-2018-12-11","title":"0.0.6 (2018-12-11)","text":"
        • fd2f39b Add --recursive flag
        • 6a33cdc Add Actuator.Rename
        • f5fcdb1 Add Dir.Private
        • c1d38dd Add Entry.ConcreteValue
        • 842097f Add Entry.TargetName
        • 22c530a Add FIXMEs for flags to add
        • f1832ca Add File.Executable
        • 66c2461 Add File.Private
        • 20543f8 Add File.Template
        • 15a3826 Add Symlink.Template
        • ec77a95 Add TargetState.AddArchive
        • 31481f7 Add YAML output
        • 91be5c7 Add cd command
        • 0b84bf5 Add chattr command, fixes #2
        • e26f3ec Add import command, fixes #50
        • 42ecba3 Add package aliases
        • 240ac97 Add source-path command
        • 1f5eba6 Add test to exercise some commands
        • 5bef462 Add type field
        • 4556383 Apply umask last consistently
        • 08a5345 Avoid overwriting argument before first use
        • 8f570ef Bump version of github.com/twpayne/go-vfs
        • 9cbae2a Check format before computing concrete value
        • e8b97cb Clarify LastPass example
        • a78af0e Correct function documentation
        • 5d3ae7d Delete 'practical' section that is explained elsewhere
        • d9fb233 Depersonalize template example
        • bcf98b1 Disable Windows releases
        • 242e549 Document exported struct
        • 97818e0 Dump source and target paths, not names
        • d7e1697 Dump state in JSON format instead of spew
        • 6053e48 Evaluate entries before dumping them
        • d4f8beb Export Entry.Evaluate
        • a05d9c1 Export ParseSourceDirName
        • 8660cb7 Export ParseSourceFileName
        • 165397a Export ParsedSourceDirName
        • e9e4d77 Export ParsedSourceFileName
        • 9925c08 Factor out dir.go
        • efd6dde Factor out file.go
        • 2a6990d Factor out symlink.go
        • 34a1cba Factor out target_state.go
        • 7879a59 Fix capitalization
        • 9312f94 Fix removal of target in remove command
        • 4037322 Format github.com links consistently
        • 166688c Improve short descriptions of commands
        • b3625b2 Make it explicit that error is ignored
        • 9db2ce1 Make it explicit that errors are ignored
        • 5910f22 Make the NullActuator a singleton
        • ae51ba4 Print source dir if no targets are specified
        • c4bad5b Qualify .netrc example
        • a8fcaa9 Quote permissions
        • ad8add0 Refactor individual Entry application
        • 9dc8b10 Remove --source-vcs flag
        • ea5d380 Remove TargetState.AllEntries
        • a35fbb4 Remove docker image building code
        • 01086cc Remove fixed FIXME
        • b62ac56 Remove uneccessary 'note that's
        • 1750988 Remove unused field
        • 307f767 Rename Symlink.Target to Symlink.LinkName
        • bd27c36 Rename TargetState.AddArchive to TargetState.Import
        • 55a947a Rename actuator to mutator
        • ff58780 Rename variable for clarity
        • 9b0e724 Replace getSourceNames with getEntries
        • 2effdf7 Use absolute path to ignore dist directory
        • 4387aa1 Use angle brackets for all examples
        • 764263b Use dir, file, symlink order consistently
        • ca06a88 Use getEntries and Entry.TargetName is remove command
        • 615c3bd Use getEntries in cat command
        • 4e74b17 Use getEntries in chattr command
        • e375f25 Use getEntries in dump command
        • 1d97198 Use targetName in archive
        • 1804974 Use variable name ts for target state consistently
        • a341f75 Use vfs.ReadOnlyFS to ensure all changes are made via an Actuator

        Full changelog: v0.0.5...v0.0.6

        "},{"location":"reference/release-history/#005-2018-12-02","title":"0.0.5 (2018-12-02)","text":"
        • 083d25d Add --apply, --diff, and --prompt flags to edit command, fixes #28
        • 5527d94 Add TargetState.ApplyOne
        • a8670c4 Add prompt
        • f644bf2 Cache keyring lookups
        • 53a12d1 Cache lastpass lookups
        • 900a2e3 Extend apply command to take a list of targets, fixes #3
        • db96d06 Extend diff command to take a list of targets, fixes #4
        • a324b0b Extend verify command to take a list of targets, fixes #5
        • 7e98072 Factor out Config.applyArgs
        • 89440ce Make runRemoveCommand a method on Config
        • c37b9ad Remove trailing E from function names

        Full changelog: v0.0.4...v0.0.5

        "},{"location":"reference/release-history/#004-2018-11-30","title":"0.0.4 (2018-11-30)","text":"
        • a2e6e88 Add LastPass integration
        • 377d68e Add graceful template error handling mechanism
        • cbb5b2d Add installation docs referring to Goreleaser-generated artefacts and Homebrew formula
        • 377999a Add lastpass command as a wrapper for lpass
        • 496c2ba Documentation tweaks
        • 06f8e7a Ensure Go modules are enabled in before hook
        • 273e14f Factor out keyringFunc
        • e612476 Handle errors gracefully in keyring
        • 841d2e7 Handle errors gracefully in lastpass
        • d88b705 Make CI output less verbose
        • 7992f60 Make template execution more strict
        • 4c7aece Only read files and evaluate templates when required
        • a436144 Remove GO111MODULES
        • b45c5ad Set GO111MODULE in .travis.yml

        Full changelog: v0.0.3...v0.0.4

        "},{"location":"reference/release-history/#003-2018-11-30","title":"0.0.3 (2018-11-30)","text":"
        • cfab91b Add newline at end of file
        • 8e8d142 Use Go 1.11.x explicitly
        "},{"location":"reference/source-state-attributes/","title":"Source state attributes","text":"

        chezmoi stores the source state of files, symbolic links, and directories in regular files and directories in the source directory (~/.local/share/chezmoi by default). This location can be overridden with the -S flag or by giving a value for sourceDir in the configuration file. Directory targets are represented as directories in the source state. All other target types are represented as files in the source state. Some state is encoded in the source names.

        The following prefixes and suffixes are special, and are collectively referred to as \"attributes\":

        Prefix Effect after_ Run script after updating the destination before_ Run script before updating the destination create_ Ensure that the file exists, and create it with contents if it does not dot_ Rename to use a leading dot, e.g. dot_foo becomes .foo empty_ Ensure the file exists, even if is empty. By default, empty files are removed encrypted_ Encrypt the file in the source state external_ Ignore attributes in child entries exact_ Remove anything not managed by chezmoi executable_ Add executable permissions to the target file literal_ Stop parsing prefix attributes modify_ Treat the contents as a script that modifies an existing file once_ Only run the script if its contents have not been run before onchange_ Only run the script if its contents have not been run before with the same filename private_ Remove all group and world permissions from the target file or directory readonly_ Remove all write permissions from the target file or directory remove_ Remove the file or symlink if it exists or the directory if it is empty run_ Treat the contents as a script to run symlink_ Create a symlink instead of a regular file Suffix Effect .literal Stop parsing suffix attributes .tmpl Treat the contents of the source file as a template

        Different target types allow different prefixes and suffixes. The order of prefixes is important.

        Target type Source type Allowed prefixes in order Allowed suffixes Directory Directory remove_, external_, exact_, private_, readonly_, dot_ none Regular file File encrypted_, private_, readonly_, empty_, executable_, dot_ .tmpl Create file File create_, encrypted_, private_, readonly_, empty_, executable_, dot_ .tmpl Modify file File modify_, encrypted_, private_, readonly_, executable_, dot_ .tmpl Remove file File remove_, dot_ none Script File run_, once_ or onchange_, before_ or after_ .tmpl Symbolic link File symlink_, dot_ .tmpl

        The literal_ prefix and .literal suffix can appear anywhere and stop attribute parsing. This permits filenames that would otherwise conflict with chezmoi's attributes to be represented.

        In addition, if the source file is encrypted, the suffix .age (when age encryption is used) or .asc (when gpg encryption is used) is stripped. These suffixes can be overridden with the age.suffix and gpg.suffix configuration variables.

        chezmoi ignores all files and directories in the source directory that begin with a . with the exception of files and directories that begin with .chezmoi.

        "},{"location":"reference/target-types/","title":"Target types","text":"

        chezmoi will create, update, and delete files, directories, and symbolic links in the destination directory, and run scripts. chezmoi deterministically performs actions in ASCII order of their target name.

        Example

        Given a file dot_a, a script run_z, and a directory exact_dot_c, chezmoi will first create .a, create .c, and then execute run_z.

        "},{"location":"reference/target-types/#files","title":"Files","text":"

        Files are represented by regular files in the source state. The encrypted_ attribute determines whether the file in the source state is encrypted. The executable_ attribute will set the executable bits in the target state, and the private_ attribute will clear all group and world permissions. The readonly_ attribute will clear all write permission bits in the target state. Files with the .tmpl suffix will be interpreted as templates. If the target contents are empty then the file will be removed, unless it has an empty_ prefix.

        "},{"location":"reference/target-types/#create-file","title":"Create file","text":"

        Files with the create_ prefix will be created in the target state with the contents of the file in the source state if they do not already exist. If the file in the destination state already exists then its contents will be left unchanged.

        "},{"location":"reference/target-types/#modify-file","title":"Modify file","text":"

        Files with the modify_ prefix are treated as scripts that modify an existing file.

        If the file contains a line with the text chezmoi:modify-template then that line is removed and the rest of the script is executed template with the existing file's contents passed as a string in .chezmoi.stdin. The result of executing the template are the new contents of the file.

        Otherwise, the contents of the existing file (which maybe empty if the existing file does not exist or is empty) are passed to the script's standard input, and the new contents are read from the script's standard output.

        "},{"location":"reference/target-types/#remove-entry","title":"Remove entry","text":"

        Files with the remove_ prefix will cause the corresponding entry (file, directory, or symlink) to be removed in the target state.

        "},{"location":"reference/target-types/#directories","title":"Directories","text":"

        Directories are represented by regular directories in the source state. The exact_ attribute causes chezmoi to remove any entries in the target state that are not explicitly specified in the source state, and the private_ attribute causes chezmoi to clear all group and world permissions. The readonly_ attribute will clear all write permission bits.

        "},{"location":"reference/target-types/#symbolic-links","title":"Symbolic links","text":"

        Symbolic links are represented by regular files in the source state with the prefix symlink_. The contents of the file will have a trailing newline stripped, and the result be interpreted as the target of the symbolic link. Symbolic links with the .tmpl suffix in the source state are interpreted as templates. If the target of the symbolic link is empty or consists only of whitespace, then the target is removed.

        "},{"location":"reference/target-types/#scripts","title":"Scripts","text":"

        Scripts are represented as regular files in the source state with prefix run_. The file's contents (after being interpreted as a template if it has a .tmpl suffix) are executed.

        Scripts are executed on every chezmoi apply, unless they have the once_ or onchange_ attribute. run_once_ scripts are only executed if a script with the same contents has not been run before, i.e. if the script is new or if its contents have changed. run_onchange_ scripts are executed whenever their contents change, even if a script with the same contents has run before.

        Scripts with the before_ attribute are executed before any files, directories, or symlinks are updated. Scripts with the after_ attribute are executed after all files, directories, and symlinks have been updated. Scripts without an before_ or after_ attribute are executed in ASCII order of their target names with respect to files, directories, and symlinks.

        Scripts will normally run with their working directory set to their equivalent location in the destination directory. If the equivalent location in the destination directory either does not exist or is not a directory, then chezmoi will walk up the script's directory hierarchy and run the script in the first directory that exists and is a directory.

        Example

        A script in ~/.local/share/chezmoi/dir/run_script will be run with a working directory of ~/dir.

        chezmoi sets a number of CHEZMOI* environment variables when running scripts, corresponding to commonly-used template data variables. Extra environment variables can be set in the env or scriptEnv configuration variables.

        Scripts are executed using an interpreter, if configured. See the section on interpreters.

        "},{"location":"reference/target-types/#symlink-mode","title":"symlink mode","text":"

        By default, chezmoi will create regular files and directories. Setting mode = \"symlink\" will make chezmoi behave more like a dotfile manager that uses symlinks by default, i.e. chezmoi apply will make dotfiles symlinks to files in the source directory if the target is a regular file and is not encrypted, executable, private, or a template.

        "},{"location":"reference/command-line-flags/","title":"Command line flags","text":"

        Command line flags override any values set in the configuration file.

        "},{"location":"reference/command-line-flags/common/","title":"Common command line flags","text":"

        The following flags apply to multiple commands where they are relevant.

        "},{"location":"reference/command-line-flags/common/#flags","title":"Flags","text":""},{"location":"reference/command-line-flags/common/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/command-line-flags/common/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

        Set the output format, json by default.

        "},{"location":"reference/command-line-flags/common/#-h-help","title":"-h, --help","text":"

        Print help.

        "},{"location":"reference/command-line-flags/common/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/command-line-flags/common/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/command-line-flags/common/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/command-line-flags/common/#-p-path-style-style","title":"-p, --path-style style","text":"

        Print paths in the given style. The default is relative.

        Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory source-absolute Absolute paths in the source tree directory source-relative Relative paths to the source tree directory all All path styles, indexed by relative"},{"location":"reference/command-line-flags/common/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories.

        "},{"location":"reference/command-line-flags/common/#-tree","title":"--tree","text":"

        Print paths as a tree instead of a list.

        "},{"location":"reference/command-line-flags/common/#available-entry-types","title":"Available entry types","text":"

        You can provide a list of entry types, separated by commas. Types can be preceded with no to remove them, e.g. scripts,noalways.

        Type Description all All entries none No entries dirs Directories files Files remove Removes scripts Scripts symlinks Symbolic links always Scripts that are always run encrypted Encrypted entries externals External entries templates Templates"},{"location":"reference/command-line-flags/developer/","title":"Developer command line flags","text":"

        The following flags are global but only relevant for developers and debugging.

        "},{"location":"reference/command-line-flags/developer/#flags","title":"Flags","text":""},{"location":"reference/command-line-flags/developer/#-cpu-profile-filename","title":"--cpu-profile filename","text":"

        Write a Go CPU profile to filename.

        "},{"location":"reference/command-line-flags/developer/#-debug","title":"--debug","text":"

        Log information helpful for debugging.

        "},{"location":"reference/command-line-flags/global/","title":"Global command line flags","text":"

        The following flags are available for all chezmoi commands. Note that some flags may not have any effect on certain commands.

        "},{"location":"reference/command-line-flags/global/#flags","title":"Flags","text":""},{"location":"reference/command-line-flags/global/#-cache-directory","title":"--cache directory","text":"

        Configuration: cacheDir

        Use directory as the cache directory.

        "},{"location":"reference/command-line-flags/global/#-color-value","title":"--color value","text":"

        Configuration: color

        Colorize diffs, value can be on, off, auto, or any boolean-like value recognized by promptBool. The default is auto which will colorize diffs only if the environment variable $NO_COLOR is not set and stdout is a terminal.

        "},{"location":"reference/command-line-flags/global/#-c-config-filename","title":"-c, --config filename","text":"

        Read the configuration from filename.

        "},{"location":"reference/command-line-flags/global/#-config-format-format","title":"--config-format format","text":"

        Assume the configuration file is in the given format. This is only needed if the config filename does not have an extension, for example when it is /dev/stdin. Supported formats: json, jsonc, toml, yaml.

        "},{"location":"reference/command-line-flags/global/#-d-destination-directory","title":"-D, --destination directory","text":"

        Configuration: destDir

        Use directory as the destination directory.

        "},{"location":"reference/command-line-flags/global/#-n-dry-run","title":"-n, --dry-run","text":"

        Set dry run mode. In dry run mode, the destination directory is never modified. This is most useful in combination with the -v (verbose) flag to print changes that would be made without making them.

        "},{"location":"reference/command-line-flags/global/#-force","title":"--force","text":"

        Make changes without prompting.

        "},{"location":"reference/command-line-flags/global/#-interactive","title":"--interactive","text":"

        Prompt before applying each target.

        "},{"location":"reference/command-line-flags/global/#-k-keep-going","title":"-k, --keep-going","text":"

        Keep going as far as possible after a encountering an error.

        "},{"location":"reference/command-line-flags/global/#-mode-filesymlink","title":"--mode file|symlink","text":"

        Mode of operation. The default is file.

        "},{"location":"reference/command-line-flags/global/#-no-pager","title":"--no-pager","text":"

        Do not use the pager.

        "},{"location":"reference/command-line-flags/global/#-no-tty","title":"--no-tty","text":"

        Do not attempt to get a TTY for prompts. Instead, read them from stdin.

        "},{"location":"reference/command-line-flags/global/#-o-output-filename","title":"-o, --output filename","text":"

        Write the output to filename instead of stdout.

        "},{"location":"reference/command-line-flags/global/#-persistent-state-filename","title":"--persistent-state filename","text":"

        Configuration: persistentState

        Read and write the persistent state from filename. By default, chezmoi stores its persistent state in chezmoistate.boltdb in the same directory as its configuration file.

        "},{"location":"reference/command-line-flags/global/#-progress-value","title":"--progress value","text":"

        Show progress when downloading externals. value can be on, off, or auto. The default is auto which shows progress bars when stdout is a terminal.

        "},{"location":"reference/command-line-flags/global/#-r-refresh-externals-value","title":"-R, --refresh-externals [value]","text":"

        Control the refresh of the externals cache. value can be any of always, auto, or never and defaults to always if no value is specified. If no --refresh-externals flag is specified then chezmoi defaults to auto.

        always (or any truthy value as accepted by parseBool) causes chezmoi to re-download externals.

        auto means only re-download externals that have not been downloaded within their refresh periods.

        never (or any other falsey value accepted by parseBool) means only download if no cached external is available.

        "},{"location":"reference/command-line-flags/global/#-s-source-directory","title":"-S, --source directory","text":"

        Configuration: sourceDir

        Use directory as the source directory.

        "},{"location":"reference/command-line-flags/global/#-source-path","title":"--source-path","text":"

        Interpret targets passed to the command as paths in the source directory rather than the destination directory.

        "},{"location":"reference/command-line-flags/global/#-use-builtin-age-bool","title":"--use-builtin-age [bool]","text":"

        Configuration: useBuiltinAge

        Use chezmoi's builtin age encryption instead of an external age command. value can be on, off, auto, or any boolean-like value recognized by promptBool. The default is auto which will only use the builtin age if age.command cannot be found in $PATH.

        The builtin age command does not support passphrases, symmetric encryption, or the use of SSH keys.

        "},{"location":"reference/command-line-flags/global/#-use-builtin-diff-bool","title":"--use-builtin-diff [bool]","text":"

        Use chezmoi's builtin diff, even if the diff.command configuration variable is set.

        "},{"location":"reference/command-line-flags/global/#-use-builtin-git-bool","title":"--use-builtin-git [bool]","text":"

        Configuration: useBuiltinGit

        Use chezmoi's builtin git instead of git.command for the init and update commands. value can be on, off, auto, or any boolean-like value recognized by promptBool. The default is auto which will only use the builtin git if git.command cannot be found in $PATH.

        Info

        chezmoi's builtin git has only supports the HTTP and HTTPS transports and does not support git-repo externals.

        "},{"location":"reference/command-line-flags/global/#-v-verbose","title":"-v, --verbose","text":"

        Set verbose mode. In verbose mode, chezmoi prints the changes that it is making as approximate shell commands, and any differences in files between the target state and the destination set are printed as unified diffs.

        "},{"location":"reference/command-line-flags/global/#-version","title":"--version","text":"

        Print the version of chezmoi, the commit at which it was built, and the build timestamp.

        "},{"location":"reference/command-line-flags/global/#-w-working-tree-directory","title":"-w, --working-tree directory","text":"

        Use directory as the git working tree directory. By default, chezmoi searches the source directory and then its ancestors for the first directory that contains a .git directory.

        "},{"location":"reference/commands/","title":"Commands","text":"

        This section provides documentation for chezmoi commands and their arguments.

        All commands accept global flags, though some flags may have no effect on certain commands. Many commands also share common flags.

        "},{"location":"reference/commands/add/","title":"add target...","text":"

        Add targets to the source state. If any target is already in the source state, then its source state is replaced with its current state in the destination directory.

        "},{"location":"reference/commands/add/#flags","title":"Flags","text":""},{"location":"reference/commands/add/#-a-autotemplate","title":"-a, --autotemplate","text":"

        Automatically generate a template by replacing strings that match variable values from the data section of the config file with their respective config names as a template string. Longer substitutions occur before shorter ones. This implies the --template option.

        Warning

        --autotemplate uses a greedy algorithm which occasionally generates templates with unwanted variable substitutions. Carefully review any templates it generates.

        "},{"location":"reference/commands/add/#-create","title":"--create","text":"

        Add files that should exist, irrespective of their contents.

        "},{"location":"reference/commands/add/#-encrypt","title":"--encrypt","text":"

        Configuration: add.encrypt

        Encrypt files using the defined encryption method.

        "},{"location":"reference/commands/add/#-exact","title":"--exact","text":"

        Set the exact attribute on added directories.

        "},{"location":"reference/commands/add/#-follow","title":"--follow","text":"

        If the last part of a target is a symlink, add the target of the symlink instead of the symlink itself.

        "},{"location":"reference/commands/add/#-p-prompt","title":"-p, --prompt","text":"

        Interactively prompt before adding each file.

        "},{"location":"reference/commands/add/#-q-quiet","title":"-q, --quiet","text":"

        Suppress warnings about adding ignored entries.

        "},{"location":"reference/commands/add/#-secrets-ignorewarningerror","title":"--secrets ignore|warning|error","text":"

        Configuration: add.secrets

        Action to take when a secret is found when adding a file. The default is warning.

        "},{"location":"reference/commands/add/#-t-template","title":"-T, --template","text":"

        Set the template attribute on added files and symlinks.

        "},{"location":"reference/commands/add/#-template-symlinks","title":"--template-symlinks","text":"

        Configuration: add.templateSymlinks

        When adding symlink to an absolute path in the source directory or destination directory, create a symlink template with .chezmoi.sourceDir or .chezmoi.homeDir. This is useful for creating portable absolute symlinks.

        "},{"location":"reference/commands/add/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/add/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/add/#-f-force","title":"-f, --force","text":"

        Add targets, even if doing so would cause a source template to be overwritten.

        "},{"location":"reference/commands/add/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/add/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/add/#examples","title":"Examples","text":"
        chezmoi add ~/.bashrc\nchezmoi add ~/.gitconfig --template\nchezmoi add ~/.ssh/id_rsa --encrypt\nchezmoi add ~/.vim --recursive\nchezmoi add ~/.oh-my-zsh --exact --recursive\n
        "},{"location":"reference/commands/add/#notes","title":"Notes","text":"

        Bug

        chezmoi add will fail if the entry being added is in a directory implicitly created by an external. See this GitHub issue for details.

        "},{"location":"reference/commands/age/","title":"age","text":"

        Interact with age's passphrase-based encryption.

        "},{"location":"reference/commands/age/#subcommands","title":"Subcommands","text":""},{"location":"reference/commands/age/#age-encrypt-file","title":"age encrypt [file...]","text":"

        Encrypt file or standard input.

        "},{"location":"reference/commands/age/#-p-passphrase","title":"-p, --passphrase","text":"

        Decrypt with a passphrase.

        "},{"location":"reference/commands/age/#age-decrypt-file","title":"age decrypt [file...]","text":"

        Decrypt file or standard input.

        "},{"location":"reference/commands/age/#-p-passphrase_1","title":"-p, --passphrase","text":"

        Decrypt with a passphrase.

        "},{"location":"reference/commands/age/#examples","title":"Examples","text":"
        chezmoi age encrypt --passphrase plaintext.txt > ciphertext.txt\nchezmoi age decrypt --passphrase ciphertext.txt > decrypted-ciphertext.txt\n
        "},{"location":"reference/commands/apply/","title":"apply [target...]","text":"

        Ensure that target... are in the target state, updating them if necessary. If no targets are specified, the state of all targets are ensured. If a target has been modified since chezmoi last wrote it then the user will be prompted if they want to overwrite the file.

        "},{"location":"reference/commands/apply/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/apply/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/apply/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/apply/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/apply/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/commands/apply/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/apply/#-source-path","title":"--source-path","text":"

        Specify targets by source path, rather than target path. This is useful for applying changes after editing.

        "},{"location":"reference/commands/apply/#examples","title":"Examples","text":"
        chezmoi apply\nchezmoi apply --dry-run --verbose\nchezmoi apply ~/.bashrc\n
        "},{"location":"reference/commands/archive/","title":"archive [target....]","text":"

        Generate an archive of the target state, or only the targets specified. This can be piped into tar to inspect the target state.

        "},{"location":"reference/commands/archive/#flags","title":"Flags","text":""},{"location":"reference/commands/archive/#-f-format-format","title":"-f, --format format","text":"

        Write the archive in format. If --output is set the format is guessed from the extension, otherwise the default is tar.

        Supported formats tar tar.gz tgz zip"},{"location":"reference/commands/archive/#-z-gzip","title":"-z, --gzip","text":"

        Compress the archive with gzip. This is automatically set if the format is tar.gz or tgz and is ignored if the format is zip.

        "},{"location":"reference/commands/archive/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/archive/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/archive/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/archive/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/archive/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/commands/archive/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/archive/#examples","title":"Examples","text":"
        chezmoi archive | tar tvf -\nchezmoi archive --output=dotfiles.tar.gz\nchezmoi archive --output=dotfiles.zip\n
        "},{"location":"reference/commands/cat-config/","title":"cat-config","text":"

        Print the configuration file.

        "},{"location":"reference/commands/cat-config/#examples","title":"Examples","text":"
        chezmoi cat-config\n
        "},{"location":"reference/commands/cat/","title":"cat target...","text":"

        Write the target contents of targets to stdout. targets must be files, scripts, or symlinks. For files, the target file contents are written. For scripts, the script's contents are written. For symlinks, the target is written.

        "},{"location":"reference/commands/cat/#examples","title":"Examples","text":"
        chezmoi cat ~/.bashrc\n
        "},{"location":"reference/commands/cd/","title":"cd [path]","text":"

        Launch a shell in the working tree (typically the source directory). chezmoi will launch the command set by the cd.command configuration variable with any extra arguments specified by cd.args. If this is not set, chezmoi will attempt to detect your shell and finally fall back to an OS-specific default.

        If the optional argument path is present, the shell will be launched in the source directory corresponding to path.

        The shell will have various CHEZMOI* environment variables set, as for scripts.

        Hint

        This does not change the current directory of the current shell. To do that, instead use:

        $ cd $(chezmoi source-path)\n
        "},{"location":"reference/commands/cd/#examples","title":"Examples","text":"
        chezmoi cd\nchezmoi cd ~\nchezmoi cd ~/.config\n
        "},{"location":"reference/commands/chattr/","title":"chattr modifier target...","text":"

        Change the attributes and/or type of targets. modifier specifies what to modify.

        Add attributes by specifying them or their abbreviations directly, optionally prefixed with a plus sign (+). Remove attributes by prefixing them or their attributes with the string no or a minus sign (-). The available attribute modifiers and their abbreviations are:

        Attribute modifier Abbreviation after a before b empty e encrypted none exact none executable x external none once o private p readonly r remove none template t

        The type of a target can be changed using a type modifier:

        Type modifier create modify script symlink

        The negative form of type modifiers, e.g. nocreate, changes the target to be a regular file if it is of that type, otherwise the type is left unchanged.

        Multiple modifications may be specified by separating them with a comma (,). If you use the -modifier form then you must put modifier after a -- to prevent chezmoi from interpreting -modifier as an option.

        "},{"location":"reference/commands/chattr/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/chattr/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories.

        "},{"location":"reference/commands/chattr/#examples","title":"Examples","text":"
        chezmoi chattr template ~/.bashrc\nchezmoi chattr noempty ~/.profile\nchezmoi chattr private,template ~/.netrc\nchezmoi chattr -- -x ~/.zshrc\nchezmoi chattr +create,+private ~/.kube/config\n
        "},{"location":"reference/commands/completion/","title":"completion shell","text":"

        Generate shell completion code for the specified shell (bash, fish, powershell, or zsh).

        "},{"location":"reference/commands/completion/#examples","title":"Examples","text":"
        chezmoi completion bash\nchezmoi completion fish --output=~/.config/fish/completions/chezmoi.fish\n
        "},{"location":"reference/commands/data/","title":"data","text":"

        Write the computed template data to stdout.

        "},{"location":"reference/commands/data/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/data/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

        Set the output format, json by default.

        "},{"location":"reference/commands/data/#examples","title":"Examples","text":"
        chezmoi data\nchezmoi data --format=yaml\n
        "},{"location":"reference/commands/decrypt/","title":"decrypt [file...]","text":"

        Decrypt files using chezmoi's configured encryption. If no files are given, decrypt the standard input. The decrypted result is written to the standard output or a file if the --output flag is set.

        "},{"location":"reference/commands/destroy/","title":"destroy target...","text":"

        Danger

        The destroy command permanently removes files both from your home directory and chezmoi's source directory.

        Only run chezmoi destroy if you have a separate backup of your home directory and your source directory.

        If you want chezmoi to stop managing the file use forget instead.

        If you want to remove all traces of chezmoi from your system use purge instead.

        Remove target from the source state, the destination directory, and the state.

        "},{"location":"reference/commands/destroy/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/destroy/#-force","title":"--force","text":"

        Destroy without prompting.

        "},{"location":"reference/commands/destroy/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories.

        "},{"location":"reference/commands/diff/","title":"diff [target...]","text":"

        Print the difference between the target state and the destination state for targets. If no targets are specified, print the differences for all targets.

        If a diff.pager command is set in the configuration file then the output will be piped into it.

        If diff.command is set then it will be invoked to show individual file differences with diff.args passed as arguments. Each element of diff.args is interpreted as a template with the variables .Destination and .Target available corresponding to the path of the file in the source and target state respectively. The default value of diff.args is [\"{{ .Destination }}\", \"{{ .Target }}\"]. If diff.args does not contain any template arguments then {{ .Destination }} and {{ .Target }} will be appended automatically.

        "},{"location":"reference/commands/diff/#flags","title":"Flags","text":""},{"location":"reference/commands/diff/#-pager-pager","title":"--pager pager","text":"

        Configuration: diff.pager

        Pager to use for output.

        "},{"location":"reference/commands/diff/#-reverse","title":"--reverse","text":"

        Configuration: diff.reverse

        Reverse the direction of the diff, i.e. show the changes to the target required to match the destination.

        "},{"location":"reference/commands/diff/#-script-contents","title":"--script-contents","text":"

        Show script contents, defaults to true.

        "},{"location":"reference/commands/diff/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/diff/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/diff/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/diff/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/diff/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/commands/diff/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories.

        "},{"location":"reference/commands/diff/#examples","title":"Examples","text":"
        chezmoi diff\nchezmoi diff ~/.bashrc\n
        "},{"location":"reference/commands/doctor/","title":"doctor","text":"

        Check for potential problems.

        "},{"location":"reference/commands/doctor/#flags","title":"Flags","text":""},{"location":"reference/commands/doctor/#-no-network","title":"--no-network","text":"

        Do not use any network connections.

        "},{"location":"reference/commands/doctor/#examples","title":"Examples","text":"
        chezmoi doctor\n
        "},{"location":"reference/commands/dump-config/","title":"dump-config","text":"

        Dump the configuration.

        "},{"location":"reference/commands/dump-config/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/dump-config/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

        Set the output format, json by default.

        "},{"location":"reference/commands/dump-config/#examples","title":"Examples","text":"
        chezmoi dump-config\n
        "},{"location":"reference/commands/dump/","title":"dump [target...]","text":"

        Dump the target state of targets. If no targets are specified, then the entire target state.

        "},{"location":"reference/commands/dump/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/dump/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/dump/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

        Set the output format, json by default.

        "},{"location":"reference/commands/dump/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/dump/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/dump/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/commands/dump/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/dump/#examples","title":"Examples","text":"
        chezmoi dump ~/.bashrc\nchezmoi dump --format=yaml\n
        "},{"location":"reference/commands/edit-config-template/","title":"edit-config-template","text":"

        Edit the configuration file template. If no configuration file template exists, then a new one is created with the contents of the current config file.

        "},{"location":"reference/commands/edit-config-template/#examples","title":"Examples","text":"
        chezmoi edit-config-template\n
        "},{"location":"reference/commands/edit-config/","title":"edit-config","text":"

        Edit the configuration file.

        "},{"location":"reference/commands/edit-config/#examples","title":"Examples","text":"
        chezmoi edit-config\n
        "},{"location":"reference/commands/edit/","title":"edit [target...]","text":"

        Edit the source state of targets, which must be files or symlinks. If no targets are given then the working tree of the source directory is opened.

        Encrypted files are decrypted to a private temporary directory and the editor is invoked with the decrypted file. When the editor exits the edited decrypted file is re-encrypted and replaces the original file in the source state.

        If the operating system supports hard links, then the edit command invokes the editor with filenames which match the target filename, unless the edit.hardlink configuration variable is set to false or the --hardlink=false command line flag is set.

        "},{"location":"reference/commands/edit/#flags","title":"Flags","text":""},{"location":"reference/commands/edit/#-a-apply","title":"-a, --apply","text":"

        Configuration: edit.apply

        Apply target immediately after editing. Ignored if there are no targets.

        "},{"location":"reference/commands/edit/#-hardlink-bool","title":"--hardlink bool","text":"

        Configuration: edit.hardlink

        Invoke the editor with a hard link to the source file with a name matching the target filename. This can help the editor determine the type of the file correctly. This is the default.

        "},{"location":"reference/commands/edit/#-watch","title":"--watch","text":"

        Configuration: edit.watch

        Automatically apply changes when files are saved, with the following limitations:

        • Only available when chezmoi edit is invoked with arguments (i.e. argument-free chezmoi edit is not supported).
        • All edited files are applied when any file is saved.
        • Only the edited files are watched, not any dependent files (e.g. .chezmoitemplates and included files in templates are not watched).
        • Only works on operating systems supported by fsnotify.
        "},{"location":"reference/commands/edit/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/edit/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/edit/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/edit/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/edit/#examples","title":"Examples","text":"
        chezmoi edit ~/.bashrc\nchezmoi edit ~/.bashrc --apply\nchezmoi edit\n
        "},{"location":"reference/commands/encrypt/","title":"encrypt [file...]","text":"

        Encrypt files using chezmoi's configured encryption. If no files are given, encrypt the standard input. The encrypted result is written to the standard output or a file if the --output flag is set.

        "},{"location":"reference/commands/execute-template/","title":"execute-template [template...]","text":"

        Execute templates. This is useful for testing templates or for calling chezmoi from other scripts. templates are interpreted as literal templates, with no whitespace added to the output between arguments. If no templates are specified, the template is read from stdin.

        "},{"location":"reference/commands/execute-template/#flags","title":"Flags","text":""},{"location":"reference/commands/execute-template/#-i-init","title":"-i, --init","text":"

        Include simulated functions only available during chezmoi init.

        "},{"location":"reference/commands/execute-template/#-left-delimiter-delimiter","title":"--left-delimiter delimiter","text":"

        Set the left template delimiter.

        "},{"location":"reference/commands/execute-template/#-promptbool-pairs","title":"--promptBool pairs","text":"

        Simulate the promptBool template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptBool is called with a prompt that does not match any of pairs, then it returns false.

        "},{"location":"reference/commands/execute-template/#-promptchoice-pairs","title":"--promptChoice pairs","text":"

        Simulate the promptChoice template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptChoice is called with a prompt that does not match any of pairs, then it returns false.

        "},{"location":"reference/commands/execute-template/#-promptint-pairs","title":"--promptInt pairs","text":"

        Simulate the promptInt template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptInt is called with a prompt that does not match any of pairs, then it returns zero.

        "},{"location":"reference/commands/execute-template/#-p-promptstring-pairs","title":"-p, --promptString pairs","text":"

        Simulate the promptString template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptString is called with a prompt that does not match any of pairs, then it returns prompt unchanged.

        "},{"location":"reference/commands/execute-template/#-right-delimiter-delimiter","title":"--right-delimiter delimiter","text":"

        Set the right template delimiter.

        "},{"location":"reference/commands/execute-template/#-stdinisatty-bool","title":"--stdinisatty bool","text":"

        Simulate the stdinIsATTY function by returning bool.

        "},{"location":"reference/commands/execute-template/#-with-stdin","title":"--with-stdin","text":"

        If run with arguments, then set .chezmoi.stdin to the contents of the standard input.

        "},{"location":"reference/commands/execute-template/#examples","title":"Examples","text":"
        chezmoi execute-template '{{ .chezmoi.sourceDir }}'\nchezmoi execute-template '{{ .chezmoi.os }}' / '{{ .chezmoi.arch }}'\necho '{{ .chezmoi | toJson }}' | chezmoi execute-template\nchezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl\n
        "},{"location":"reference/commands/forget/","title":"forget target...","text":"

        Remove targets from the source state, i.e. stop managing them. targets must have entries in the source state. They cannot be externals.

        "},{"location":"reference/commands/forget/#examples","title":"Examples","text":"
        chezmoi forget ~/.bashrc\n
        "},{"location":"reference/commands/generate/","title":"generate output","text":"

        Generates output for use with chezmoi. The currently supported outputs are:

        Output Description git-commit-message A git commit message, describing the changes to the source directory. install.sh An install script, suitable for use with GitHub Codespaces"},{"location":"reference/commands/generate/#examples","title":"Examples","text":"
        chezmoi generate install.sh > install.sh\nchezmoi git commit -m \"$(chezmoi generate git-commit-message)\"\n
        "},{"location":"reference/commands/git/","title":"git [arg...]","text":"

        Run git args in the working tree (typically the source directory).

        Note

        Flags in args must occur after -- to prevent chezmoi from interpreting them.

        "},{"location":"reference/commands/git/#examples","title":"Examples","text":"
        chezmoi git add .\nchezmoi git add dot_gitconfig\nchezmoi git -- commit -m \"Add .gitconfig\"\n
        "},{"location":"reference/commands/help/","title":"help [command...]","text":"

        Print the help associated with command, or general help if no command is given.

        "},{"location":"reference/commands/ignored/","title":"ignored","text":"

        Print the list of entries ignored by chezmoi.

        "},{"location":"reference/commands/ignored/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/ignored/#-t-tree","title":"-t, --tree","text":"

        Print paths as a tree instead of a list.

        "},{"location":"reference/commands/ignored/#examples","title":"Examples","text":"
        chezmoi ignored\n
        "},{"location":"reference/commands/import/","title":"import filename","text":"

        Import the source state from an archive file in to a directory in the source state. This is primarily used to make subdirectories of your home directory exactly match the contents of a downloaded archive. You will generally always want to set the --destination, --exact, and --remove-destination flags.

        The supported archive formats are tar, tar.gz, tgz, tar.bz2, tbz2, txz, tar.zst, and zip.

        "},{"location":"reference/commands/import/#flags","title":"Flags","text":""},{"location":"reference/commands/import/#-d-destination-directory","title":"-d, --destination directory","text":"

        Set the destination (in the source state) where the archive will be imported.

        "},{"location":"reference/commands/import/#-exact","title":"--exact","text":"

        Set the exact attribute on all imported directories.

        "},{"location":"reference/commands/import/#-r-remove-destination","title":"-r, --remove-destination","text":"

        Remove destination (in the source state) before importing.

        "},{"location":"reference/commands/import/#-strip-components-n","title":"--strip-components n","text":"

        Strip n leading components from paths.

        "},{"location":"reference/commands/import/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/import/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/import/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/import/#examples","title":"Examples","text":"
        curl -s -L -o ${TMPDIR}/oh-my-zsh-master.tar.gz https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz\nmkdir -p $(chezmoi source-path)/dot_oh-my-zsh\nchezmoi import --strip-components 1 --destination ~/.oh-my-zsh ${TMPDIR}/oh-my-zsh-master.tar.gz\n
        "},{"location":"reference/commands/init/","title":"init [repo]","text":"

        Setup the source directory, generate the config file, and optionally update the destination directory to match the target state.

        By default, if repo is given, chezmoi will guess the full git repo URL, using HTTPS by default, or SSH if the --ssh option is specified, according to the following patterns:

        Pattern HTTPS Repo SSH repo user https://user@github.com/user/dotfiles.git git@github.com:user/dotfiles.git user/repo https://user@github.com/user/repo.git git@github.com:user/repo.git site/user/repo https://user@site/user/repo.git git@site:user/repo.git sr.ht/~user https://user@git.sr.ht/~user/dotfiles git@git.sr.ht:~user/dotfiles.git sr.ht/~user/repo https://user@git.sr.ht/~user/repo git@git.sr.ht:~user/repo.git

        To disable git repo URL guessing, pass the --guess-repo-url=false option.

        First, if the source directory does not already contain a repository, then if repo is given, it is checked out into the source directory; otherwise a new repository is initialized in the source directory.

        Second, if a file called .chezmoi.$FORMAT.tmpl exists, where $FORMAT is one of the supported file formats (e.g. json, jsonc, toml, or yaml) then a new configuration file is created using that file as a template.

        Then, if the --apply flag is passed, chezmoi apply is run.

        Then, if the --purge flag is passed, chezmoi will remove its source, config, and cache directories.

        Finally, if the --purge-binary is passed, chezmoi will attempt to remove its own binary.

        "},{"location":"reference/commands/init/#flags","title":"Flags","text":""},{"location":"reference/commands/init/#-a-apply","title":"-a, --apply","text":"

        Run chezmoi apply after checking out the repo and creating the config file.

        "},{"location":"reference/commands/init/#-branch-branch","title":"--branch branch","text":"

        Check out branch instead of the default branch.

        "},{"location":"reference/commands/init/#-c-config-path-path","title":"-C, --config-path path","text":"

        Write the generated config file to path instead of the default location.

        "},{"location":"reference/commands/init/#-data-bool","title":"--data bool","text":"

        Include existing template data when creating the config file. This defaults to true. Set this to false to simulate creating the config file with no existing template data.

        "},{"location":"reference/commands/init/#-d-depth-depth","title":"-d, --depth depth","text":"

        Clone the repo with depth depth.

        "},{"location":"reference/commands/init/#-git-lfs-bool","title":"--git-lfs bool","text":"

        Run git lfs pull after cloning the repo.

        "},{"location":"reference/commands/init/#-g-guess-repo-url-bool","title":"-g, --guess-repo-url bool","text":"

        Guess the repo URL from the repo argument. This defaults to true.

        "},{"location":"reference/commands/init/#-one-shot","title":"--one-shot","text":"

        --one-shot is the equivalent of --apply, --depth=1, --force, --purge, and --purge-binary. It attempts to install your dotfiles with chezmoi and then remove all traces of chezmoi from the system. This is useful for setting up temporary environments (e.g. Docker containers).

        "},{"location":"reference/commands/init/#-prompt","title":"--prompt","text":"

        Force the prompt*Once template functions to prompt.

        "},{"location":"reference/commands/init/#-promptbool-pairs","title":"--promptBool pairs","text":"

        Populate the promptBool template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptBool is called with a prompt that does not match any of pairs, then it prompts the user for a value.

        "},{"location":"reference/commands/init/#-promptchoice-pairs","title":"--promptChoice pairs","text":"

        Populate the promptChoice template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptChoice is called with a prompt that does not match any of pairs, then it prompts the user for a value.

        "},{"location":"reference/commands/init/#-promptdefaults","title":"--promptDefaults","text":"

        Make all prompt* template function calls with a default value return that default value instead of prompting.

        "},{"location":"reference/commands/init/#-promptint-pairs","title":"--promptInt pairs","text":"

        Populate the promptInt template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If prompInt is called with a prompt that does not match any of pairs, then it prompts the user for a value.

        "},{"location":"reference/commands/init/#-promptstring-pairs","title":"--promptString pairs","text":"

        Populate the promptString template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptString is called with a prompt that does not match any of pairs, then it prompts the user for a value.

        "},{"location":"reference/commands/init/#-p-purge","title":"-p, --purge","text":"

        Remove the source and config directories after applying.

        "},{"location":"reference/commands/init/#-p-purge-binary","title":"-P, --purge-binary","text":"

        Attempt to remove the chezmoi binary after applying.

        "},{"location":"reference/commands/init/#-recurse-submodules-bool","title":"--recurse-submodules bool","text":"

        Recursively clone submodules. This defaults to true.

        "},{"location":"reference/commands/init/#-ssh","title":"--ssh","text":"

        Guess an SSH repo URL instead of an HTTPS repo.

        "},{"location":"reference/commands/init/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/init/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/init/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/init/#examples","title":"Examples","text":"
        chezmoi init user\nchezmoi init user --apply\nchezmoi init user --apply --purge\nchezmoi init user/dots\nchezmoi init codeberg.org/user\nchezmoi init gitlab.com/user\n
        "},{"location":"reference/commands/license/","title":"license","text":"

        Print chezmoi's license.

        "},{"location":"reference/commands/license/#examples","title":"Examples","text":"
        chezmoi license\n
        "},{"location":"reference/commands/list/","title":"list","text":"

        list is an alias for managed.

        "},{"location":"reference/commands/manage/","title":"manage target...","text":"

        manage is an alias for add for symmetry with unmanage.

        "},{"location":"reference/commands/managed/","title":"managed [path...]","text":"

        List all managed entries in the destination directory under all paths in alphabetical order. When no paths are supplied, list all managed entries in the destination directory in alphabetical order.

        "},{"location":"reference/commands/managed/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/managed/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/managed/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

        Set the output format, json by default.

        "},{"location":"reference/commands/managed/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/managed/#-p-path-style-style","title":"-p, --path-style style","text":"

        Print paths in the given style. The default is relative.

        Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory source-absolute Absolute paths in the source tree directory source-relative Relative paths to the source tree directory all All path styles, indexed by relative"},{"location":"reference/commands/managed/#-t-tree","title":"-t, --tree","text":"

        Print paths as a tree instead of a list.

        "},{"location":"reference/commands/managed/#examples","title":"Examples","text":"
        chezmoi managed\nchezmoi managed --include=files\nchezmoi managed --include=files,symlinks\nchezmoi managed -i dirs\nchezmoi managed -i dirs,files\nchezmoi managed -i files ~/.config\nchezmoi managed --exclude=encrypted --path-style=source-relative\n
        "},{"location":"reference/commands/merge-all/","title":"merge-all","text":"

        Perform a three-way merge for file whose actual state does not match its target state. The merge is performed with chezmoi merge.

        "},{"location":"reference/commands/merge-all/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/merge-all/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/merge-all/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/merge-all/#examples","title":"Examples","text":"
        chezmoi merge-all\n
        "},{"location":"reference/commands/merge/","title":"merge target...","text":"

        Perform a three-way merge between the destination state, the target state, and the source state for each target. The merge tool is defined by the merge.command configuration variable, and defaults to vimdiff. If multiple targets are specified the merge tool is invoked separately and sequentially for each target. If the target state cannot be computed (for example if source is a template containing errors or an encrypted file that cannot be decrypted) a two-way merge is performed instead.

        The order of arguments to merge.command is set by merge.args. Each argument is interpreted as a template with the variables .Destination, .Source, and .Target available corresponding to the path of the file in the destination state, the source state, and the target state respectively. The default value of merge.args is [\"{{ .Destination }}\", \"{{ .Source }}\", \"{{ .Target }}\"]. If merge.args does not contain any template arguments then {{ .Destination }}, {{ .Source }}, and {{ .Target }} will be appended automatically.

        "},{"location":"reference/commands/merge/#examples","title":"Examples","text":"
        chezmoi merge ~/.bashrc\n
        "},{"location":"reference/commands/purge/","title":"purge","text":"

        Remove chezmoi's configuration, state, and source directory, but leave the target state intact.

        "},{"location":"reference/commands/purge/#flags","title":"Flags","text":""},{"location":"reference/commands/purge/#-p-binary","title":"-P, --binary","text":"

        Purge chezmoi binary.

        "},{"location":"reference/commands/purge/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/purge/#-force","title":"--force","text":"

        Remove without prompting.

        "},{"location":"reference/commands/purge/#examples","title":"Examples","text":"
        chezmoi purge\nchezmoi purge --force\n
        "},{"location":"reference/commands/re-add/","title":"re-add [target...]","text":"

        Re-add modified files in the target state, preserving any encrypted_ attributes. chezmoi will not overwrite templates, and all entries that are not files are ignored. Directories are recursed into by default.

        If no targets are specified then all modified files are re-added. If one or more targets are given then only those targets are re-added.

        "},{"location":"reference/commands/re-add/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/re-add/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/re-add/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/re-add/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/re-add/#examples","title":"Examples","text":"
        chezmoi re-add\nchezmoi re-add ~/.bashrc\nchezmoi re-add --recursive=false ~/.config/git\n
        "},{"location":"reference/commands/re-add/#notes","title":"Notes","text":"

        Hint

        If you want to re-add a single file unconditionally, use chezmoi add --force instead.

        "},{"location":"reference/commands/remove/","title":"remove","text":"

        The remove command has been removed. Use the forget command or the destroy command instead.

        "},{"location":"reference/commands/rm/","title":"rm","text":"

        The rm command has been removed. Use the forget command or the destroy command instead.

        "},{"location":"reference/commands/secret/","title":"secret","text":"

        Run a secret manager's CLI, passing any extra arguments to the secret manager's CLI. This is primarily for verifying chezmoi's integration with a custom secret manager. Normally you would use chezmoi's existing template functions to retrieve secrets.

        Note

        If you need to pass flags to the secret manager's CLI you must separate them with -- to prevent chezmoi from interpreting them.

        "},{"location":"reference/commands/secret/#subcommands","title":"Subcommands","text":""},{"location":"reference/commands/secret/#secret-keyring-delete","title":"secret keyring delete","text":""},{"location":"reference/commands/secret/#-service-string","title":"--service string","text":"

        Name of the service.

        "},{"location":"reference/commands/secret/#-user-string","title":"--user string","text":"

        Name of the user.

        "},{"location":"reference/commands/secret/#secret-keyring-get","title":"secret keyring get","text":""},{"location":"reference/commands/secret/#-service-string_1","title":"--service string","text":"

        Name of the service.

        "},{"location":"reference/commands/secret/#-user-string_1","title":"--user string","text":"

        Name of the user.

        "},{"location":"reference/commands/secret/#secret-keyring-set","title":"secret keyring set","text":""},{"location":"reference/commands/secret/#-service-string_2","title":"--service string","text":"

        Name of the service.

        "},{"location":"reference/commands/secret/#-user-string_2","title":"--user string","text":"

        Name of the user.

        "},{"location":"reference/commands/secret/#-value-string","title":"--value string","text":"

        New value.

        "},{"location":"reference/commands/secret/#examples","title":"Examples","text":"
        chezmoi secret keyring set --service=service --user=user --value=password\nchezmoi secret keyring get --service=service --user=user\nchezmoi secret keyring delete --service=service --user=user\n
        "},{"location":"reference/commands/secret/#notes","title":"Notes","text":"

        Warning

        On FreeBSD, the secret keyring command is only available if chezmoi was compiled with cgo enabled. The official release binaries of chezmoi are not compiled with cgo enabled, and secret keyring command is not available.

        "},{"location":"reference/commands/source-path/","title":"source-path [target...]","text":"

        Print the path to each target's source state. If no targets are specified then print the source directory.

        "},{"location":"reference/commands/source-path/#examples","title":"Examples","text":"
        chezmoi source-path\nchezmoi source-path ~/.bashrc\n
        "},{"location":"reference/commands/state/","title":"state","text":"

        Manipulate the persistent state.

        Hint

        To get a full list of subcommands run:

        $ chezmoi state help\n
        "},{"location":"reference/commands/state/#subcommands","title":"Subcommands","text":""},{"location":"reference/commands/state/#data","title":"data","text":"

        Print the raw data in the persistent state.

        "},{"location":"reference/commands/state/#delete","title":"delete","text":"

        Delete a value from the persistent state.

        "},{"location":"reference/commands/state/#delete-bucket","title":"delete-bucket","text":"

        Delete a bucket from the persistent state.

        "},{"location":"reference/commands/state/#dump","title":"dump","text":"

        Generate a dump of the persistent state.

        "},{"location":"reference/commands/state/#get","title":"get","text":"

        Get a value from the persistent state.

        "},{"location":"reference/commands/state/#get-bucket","title":"get-bucket","text":"

        Get a bucket from the persistent state.

        "},{"location":"reference/commands/state/#reset","title":"reset","text":"

        Reset the persistent state.

        "},{"location":"reference/commands/state/#set","title":"set","text":"

        Set a value from the persistent state

        "},{"location":"reference/commands/state/#examples","title":"Examples","text":"
        chezmoi state data\nchezmoi state delete --bucket=$BUCKET --key=$KEY\nchezmoi state delete-bucket --bucket=$BUCKET\nchezmoi state dump\nchezmoi state get --bucket=$BUCKET --key=$KEY\nchezmoi state get-bucket --bucket=$BUCKET\nchezmoi state set --bucket=$BUCKET --key=$KEY --value=$VALUE\nchezmoi state reset\n
        "},{"location":"reference/commands/status/","title":"status","text":"

        Print the status of the files and scripts managed by chezmoi in a format similar to git status.

        The first column of output indicates the difference between the last state written by chezmoi and the actual state. The second column indicates the difference between the actual state and the target state, and what effect running chezmoi apply will have.

        Character Meaning First column Second column Space No change No change No change A Added Entry was created Entry will be created D Deleted Entry was deleted Entry will be deleted M Modified Entry was modified Entry will be modified R Run Not applicable Script will be run"},{"location":"reference/commands/status/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/status/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/status/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/status/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/status/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/commands/status/#-p-path-style-style","title":"-p, --path-style style","text":"

        Print paths in the given style. The default is relative.

        Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory source-absolute Absolute paths in the source tree directory source-relative Relative paths to the source tree directory all All path styles, indexed by relative"},{"location":"reference/commands/status/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/status/#examples","title":"Examples","text":"
        chezmoi status\n
        "},{"location":"reference/commands/target-path/","title":"target-path [source-path...]","text":"

        Print the target path of each source path. If no source paths are specified then print the target directory.

        "},{"location":"reference/commands/target-path/#examples","title":"Examples","text":"
        chezmoi target-path\nchezmoi target-path ~/.local/share/chezmoi/dot_zshrc\n
        "},{"location":"reference/commands/unmanage/","title":"unmanage target...","text":"

        unmanage is an alias for forget for symmetry with manage.

        "},{"location":"reference/commands/unmanaged/","title":"unmanaged [path...]","text":"

        List all unmanaged files in paths. When no paths are supplied, list all unmanaged files in the destination directory.

        It is an error to supply paths that are not found on the filesystem.

        "},{"location":"reference/commands/unmanaged/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/unmanaged/#-p-path-style-style","title":"-p, --path-style style","text":"

        Print paths in the given style. The default is relative.

        Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory"},{"location":"reference/commands/unmanaged/#-t-tree","title":"-t, --tree","text":"

        Print paths as a tree instead of a list.

        "},{"location":"reference/commands/unmanaged/#examples","title":"Examples","text":"
        chezmoi unmanaged\nchezmoi unmanaged ~/.config/chezmoi ~/.ssh\n
        "},{"location":"reference/commands/update/","title":"update","text":"

        Pull changes from the source repo and apply any changes.

        If update.command is set then chezmoi will run update.command with update.args in the working tree. Otherwise, chezmoi will run git pull --autostash --rebase [--recurse-submodules] , using chezmoi's builtin git if useBuiltinGit is true or if git.command cannot be found in $PATH.

        "},{"location":"reference/commands/update/#flags","title":"Flags","text":""},{"location":"reference/commands/update/#-a-apply","title":"-a, --apply","text":"

        Apply changes after pulling, true by default. Can be disabled with --apply=false.

        "},{"location":"reference/commands/update/#-recurse-submodules","title":"--recurse-submodules","text":"

        Update submodules recursively. This defaults to true. Can be disabled with --recurse-submodules=false.

        "},{"location":"reference/commands/update/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/update/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/update/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/update/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/update/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/commands/update/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/update/#examples","title":"Examples","text":"
        chezmoi update\n
        "},{"location":"reference/commands/upgrade/","title":"upgrade","text":"

        Upgrade chezmoi by downloading and installing the latest released version. This will call the GitHub API to determine if there is a new version of chezmoi available, and if so, download and attempt to install it in the same way as chezmoi was previously installed.

        If the any of the $CHEZMOI_GITHUB_ACCESS_TOKEN, $CHEZMOI_GITHUB_TOKEN, $GITHUB_ACCESS_TOKEN, or $GITHUB_TOKEN environment variables are set, then the first value found will be used to authenticate requests to the GitHub API, otherwise unauthenticated requests are used which are subject to stricter rate limiting. Unauthenticated requests should be sufficient for most cases.

        Warning

        If you installed chezmoi using a package manager, the upgrade command might have been removed by the package maintainer.

        "},{"location":"reference/commands/upgrade/#flags","title":"Flags","text":""},{"location":"reference/commands/upgrade/#-executable-filename","title":"--executable filename","text":"

        Set name of executable to replace.

        "},{"location":"reference/commands/upgrade/#-method-method","title":"--method method","text":"

        Override the upgrade method that was automatically detected by chezmoi.

        Danger

        This flag should only be used when recommended by chezmoi developers.

        Methods Description brew-upgrade Run brew upgrade chezmoi. replace-executable Download the latest released executable from Github. snap-refresh Run snap refresh chezmoi. sudo-upgrade-package Same as upgrade-package but use sudo. upgrade-package Download and install .apk, .deb or .rpm package. Run pacman on Arch Linux."},{"location":"reference/commands/verify/","title":"verify [target...]","text":"

        Verify that all targets match their target state. chezmoi exits with code 0 (success) if all targets match their target state, or 1 (failure) otherwise. If no targets are specified then all targets are checked.

        "},{"location":"reference/commands/verify/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/verify/#-x-exclude-types","title":"-x, --exclude types","text":"

        Exclude target state entries of specific types. The default is none.

        Types can be explicitly included with the --include flag.

        Example

        --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

        "},{"location":"reference/commands/verify/#-i-include-types","title":"-i, --include types","text":"

        Include target state entries of specific types. The default is all.

        Types can be explicitly excluded with the --exclude flag.

        Example

        --include=files specifies all files.

        "},{"location":"reference/commands/verify/#-init","title":"--init","text":"

        Regenerate and reload the config file from its template before computing the target state.

        "},{"location":"reference/commands/verify/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

        Execute the command on target and all its parent directories.

        "},{"location":"reference/commands/verify/#-r-recursive","title":"-r, --recursive","text":"

        Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

        "},{"location":"reference/commands/verify/#examples","title":"Examples","text":"
        chezmoi verify\nchezmoi verify ~/.bashrc\n
        "},{"location":"reference/configuration-file/","title":"Configuration file","text":"

        chezmoi searches for its configuration file according to the XDG Base Directory Specification and supports JSON, JSONC, TOML, and YAML. The basename of the config file is chezmoi. If multiple configuration file formats are present, chezmoi will report an error.

        In most installations, the config file will be read from $HOME/.config/chezmoi/chezmoi.$FORMAT (%USERPROFILE%/.config/chezmoi/chezmoi.$FORMAT), where $FORMAT is one of json, jsonc, toml, or yaml. The config file can be set explicitly with the --config command line option. By default, the format is detected based on the extension of the config file name, but can be overridden with the --config-format command line option.

        "},{"location":"reference/configuration-file/#examples","title":"Examples","text":"JSONJSONCTOMLYAML ~/.config/chezmoi/chezmoi.json
        {\n    \"sourceDir\": \"/home/user/.dotfiles\",\n    \"git\": {\n        \"autoPush\": true\n    }\n}\n
        ~/.config/chezmoi/chezmoi.jsonc
        {\n    // The chezmoi source files are stored here\n    \"sourceDir\": \"/home/user/.dotfiles\",\n    \"git\": {\n        \"autoPush\": true\n    }\n}\n
        ~/.config/chezmoi/chezmoi.toml
        sourceDir = \"/home/user/.dotfiles\"\n[git]\n    autoPush = true\n
        ~/.config/chezmoi/chezmoi.yaml
        sourceDir: /home/user/.dotfiles\ngit:\n    autoPush: true\n
        "},{"location":"reference/configuration-file/editor/","title":"Editor","text":"

        The editor used is the first non-empty string of the edit.command configuration variable, the $VISUAL environment variable, the $EDITOR environment variable. If none are set then chezmoi falls back to notepad.exe on Windows systems and vi on non-Windows systems.

        When the edit.command configuration variable is used, extra arguments can be passed to the editor with the edit.args configuration variable.

        chezmoi will emit a warning if the editor returns in less than edit.minDuration (default 1s). To disable this warning, set edit.minDuration to 0.

        "},{"location":"reference/configuration-file/hooks/","title":"Hooks","text":"

        Hook commands are executed before and after events. Unlike scripts, hooks are always run, even if --dry-run is specified. Hooks should be fast and idempotent.

        The following events are defined:

        Event Trigger command, e.g. add Running chezmoi command, e.g. chezmoi add read-source-state Reading the source state

        Each event can have a .pre and/or a .post command. The event.pre command is executed before event occurs and the event.post command is executed after event has occurred.

        A command contains a command or script and an optional array of strings args. commands are executed directly. scripts are executed with configured interpreter for the script's extension, see the section on interpreters.

        Example

        ~/.config/chezmoi/chezmoi.toml
        [hooks.read-source-state.pre]\ncommand = \"echo\"\nargs = [\"pre-read-source-state-hook\"]\n\n[hooks.apply.post]\ncommand = \"echo\"\nargs = [\"post-apply-hook\"]\n\n[hooks.add.post]\nscript = \"post-add-hook.ps1'\n

        When running hooks, the CHEZMOI=1 and CHEZMOI_* environment variables will be set. CHEZMOI_COMMAND is set to the chezmoi command being run, CHEZMOI_COMMAND_DIR is set to the directory where chezmoi was run from, and CHEZMOI_ARGS contains the full arguments to chezmoi, starting with the path to chezmoi's executable.

        "},{"location":"reference/configuration-file/interpreters/","title":"Interpreters","text":"

        The execution of scripts and hooks on Windows depends on the file extension. Windows will natively execute scripts with a .bat, .cmd, .com, and .exe extensions. Other extensions require an interpreter, which must be in your %PATH%.

        The default script interpreters are:

        Extension Command Arguments .nu nu none .pl perl none .py python3 none .ps1 powershell -NoLogo .rb ruby none

        Script interpreters can be added or overridden by adding the corresponding extension (without the leading dot) as a key under the interpreters section of the configuration file.

        Note

        The leading . is dropped from extension, for example to specify the interpreter for .pl files you configure interpreters.pl (where . in this case just means \"a child of\" in the configuration file, however that is specified in your preferred format).

        Example

        To change the Python interpreter to C:\\Python39\\python3.exe and add a Tcl/Tk interpreter, include the following in your config file:

        ~/.config/chezmoi/chezmoi.toml
        [interpreters.py]\n    command = 'C:\\Python39\\python3.exe'\n[interpreters.tcl]\n    command = \"tclsh\"\n

        Or if using YAML:

        ~/.config/chezmoi/chezmoi.yaml
        interpreters:\n  py:\n    command: \"C:\\Python39\\python3.exe\"\n  tcl:\n    command: \"tclsh\"\n

        Note that the TOML version can also be written like this, which resembles the YAML version more and makes it clear that the key for each file extension should not have a leading .:

        ~/.config/chezmoi/chezmoi.toml
        [interpreters]\npy = { command = 'C:\\Python39\\python3.exe' }\ntcl = { command = \"tclsh\" }\n

        Note

        If you intend to use PowerShell Core (pwsh.exe) as the .ps1 interpreter, include the following in your config file:

        ~/.config/chezmoi/chezmoi.toml
        [interpreters.ps1]\n    command = \"pwsh\"\n    args = [\"-NoLogo\"]\n

        If the script in the source state is a template (with a .tmpl extension), then chezmoi will strip the .tmpl extension and use the next remaining extension to determine the interpreter to use.

        "},{"location":"reference/configuration-file/pinentry/","title":"pinentry","text":"

        By default, chezmoi will request passwords from the terminal.

        If the --no-tty option is passed, then chezmoi will instead read passwords from the standard input.

        Otherwise, if the configuration variable pinentry.command is set then chezmoi will instead used the given command to read passwords, assuming that it follows the Assuan protocol like GnuPG's pinentry. The configuration variable pinentry.args specifies extra arguments to be passed to pinentry.command and the configuration variable pinentry.options specifies extra options to be set. The default pinentry.options is [\"allow-external-password-cache\"].

        Example

        ~/.config/chezmoi/chezmoi.toml
        [pinentry]\n    command = \"pinentry\"\n
        "},{"location":"reference/configuration-file/textconv/","title":"textconv","text":"

        A section called textconv in the configuration file controls how file contents are modified before being passed to diff.

        The textconv must contain an array of objects where each object has the following properties:

        Name Type Description pattern string Target path pattern to match command string Command to transform contents args []string Extra arguments to command

        Files whose target path matches pattern are transformed by passing them to the standard input of command with args, and new contents are read from the command's standard output.

        If a target path does not match any patterns then the file contents are passed unchanged to diff. If a target path matches multiple patterns then element with the longest pattern is used.

        "},{"location":"reference/configuration-file/umask/","title":"umask","text":"

        By default, chezmoi uses your current umask as set by your operating system and shell. chezmoi only stores crude permissions in its source state, namely in the executable and private attributes, corresponding to the umasks of 0o111 and 0o077 respectively.

        For machine-specific control of umask, set the umask configuration variable in chezmoi's configuration file.

        Example

        ~/.config/chezmoi/chezmoi.toml
        umask = 0o22\n
        "},{"location":"reference/configuration-file/variables/","title":"Variables","text":"

        The following configuration variables are available:

        Section Variable Type Default value Description Top level cacheDir string $XDG_CACHE_HOME/chezmoi $HOME/.cache/chezmoi %USERPROFILE%/.cache/chezmoi Cache directory color string auto Colorize output data object none Template data destDir string $HOME %USERPROFILE% Destination directory encryption string none Encryption type, either age or gpg env object none Extra environment variables for scripts and commands format string json Format for data output, either json or yaml interactive string false Prompt for all changes mode string file Mode in target dir, either file or symlink pager string $PAGER Default pager CLI command persistentState string $XDG_CONFIG_HOME/chezmoi/chezmoi.boltdb $HOME/.config/chezmoi/chezmoi.boltdb %USERPROFILE%/.config/chezmoi/chezmoi.boltdb Location of the persistent state file progress bool false Display progress bars scriptEnv object none Extra environment variables for scripts and commands scriptTempDir string none Temporary directory for scripts sourceDir string $XDG_SHARE_HOME/chezmoi $HOME/.local/share/chezmoi %USERPROFILE%/.local/share/chezmoi Source directory tempDir string from system Temporary directory umask int from system Umask useBuiltinAge string auto Use builtin age if age command is not found in $PATH useBuiltinGit string auto Use builtin git if git command is not found in $PATH verbose bool false Make output more verbose workingTree string source directory git working tree directory add encrypt bool false Encrypt by default secrets string warning Action when secrets are found when adding files templateSymlinks bool false Template symlinks to source and home dirs age args []string none Extra args to age CLI command command string age age CLI command identities []string none age identity files identity string none age identity file passphrase bool false Use age passphrase instead of identity recipient string none age recipient recipients []string none age recipients recipientsFile string none age recipients file recipientsFiles []string none age recipients files suffix string .age Suffix appended to age-encrypted files symmetric bool false Use age symmetric encryption awsSecretsManager profile string none AWS shared profile name region string none AWS region azureKeyVault defaultVault string none Default Azure Key Vault name bitwarden command string bw Bitwarden CLI command bitwardenSecrets command string bws Bitwarden Secrets CLI command cd args []string none Extra args to shell in cd command command string none Shell to run in cd command completion custom bool false Enable custom shell completions dashlane args []string none Extra args to Dashlane CLI command command string dcli Dashlane CLI command diff args []string see diff Extra args to external diff command command string none External diff command exclude []string none Entry types to exclude from diffs pager string none Diff-specific pager reverse bool false Reverse order of arguments to diff scriptContents bool true Show script contents doppler args []string none Extra args to Doppler CLI command command string doppler Doppler CLI command config string none Default config (aka environment) if none is specified project string none Default project name if none is specified edit apply bool false Apply changes on exit args []string none Extra args to edit command command string $EDITOR / $VISUAL Edit command hardlink bool true Invoke editor with a hardlink to the source file minDuration duration 1s Minimum duration for edit command watch bool false Automatically apply changes when files are saved ejson key string none The private key to use for decryption, will supersede using the keyDir if set. keyDir string none Path to directory containing private keys. Defaults to /opt/ejson/keys. Setting the EJSON_KEYDIR environment will also set this value, with lower precedence. git autoAdd bool false Add changes to the source state after any change autoCommit bool false Commit changes to the source state after any change autoPush bool false Push changes to the source state after any change command string git git CLI command commitMessageTemplate string none Commit message template commitMessageTemplateFile string none Commit message template file (relative to source directory) lfs bool false Run git lfs pull after cloning gitHub refreshPeriod duration 1m Minimum duration between identical GitHub API requests gopass command string gopass gopass CLI command mode string none See gopass functions gpg args []string none Extra args to GPG CLI command command string gpg GPG CLI command recipient string none GPG recipient recipients []string none GPG recipients suffix string .asc Suffix appended to GPG-encrypted files symmetric bool false Use symmetric GPG encryption hcpVaultSecrets applicationName string none Default application name if none is specified args []string none Extra args to HCP Vault Secrets CLI command command string vlt HCP Vault Secrets CLI command organizationId string none Default organization ID if none is specified projectId string none Default project ID if none is specified hooks command.post.args []string none Extra arguments to command to run after command command.post.command []string none Command to run after command command.pre.args []string none Extra arguments to command to run before command command.pre.command []string none Command to run before command interpreters extension.args []string none See Interpreters extension.command string special See Interpreters keepassxc args []string none Extra args to KeePassXC CLI command command string keepassxc-cli KeePassXC CLI command database string none KeePassXC database mode string cache-password See KeePassXC functions prompt bool true Prompt for password keeper args []string none Extra args to Keeper CLI command command string keeper Keeper CLI command lastpass command string lpass LastPass CLI command merge args []string See merge Extra args to three-way merge CLI command command string none Three-way merge CLI command onepassword cache bool true Enable optional caching provided by op command string op 1Password CLI command mode string account See 1Password Secrets Automation prompt bool true Prompt for sign-in when no valid session is available onepasswordSDK token string none See 1Password SDK functions tokenEnvVar string none See 1Password SDK functions pass command string pass Pass CLI command passhole args []string none Extra args to Passhole CLI command command string ph Passhole CLI command prompt bool true Prompt for password pinentry args []string none Extra args to pinentry CLI command command string none pinentry CLI command options []string See pinentry Extra options for pinentry rbw command string rbw Unofficial Bitwarden CLI command secret args []string none Extra args to secret CLI command command string none Generic secret CLI command status exclude []string none Entry types to exclude from status pathStyle string relative How to present the path to files in status output template options []string [\"missingkey=error\"] Template options textconv []object none See textconv update apply bool true Apply after pulling args []string none Extra args to update command command string none Update command recurseSubmodules bool true Update submodules recursively vault command string vault Vault CLI command verify exclude []string none Entry types to exclude from verify warnings object none See Warnings"},{"location":"reference/configuration-file/warnings/","title":"Warnings","text":"

        By default, chezmoi will warn you when it encounters potential problems. Some of these warnings can be suppressed by setting values in configuration file.

        Variable Type Default Description configFileTemplateHasChanged bool true Warn when the config file template has changed

        Example

        ~/.config/chezmoi/chezmoi.toml
        [warnings]\n    configFileTemplateHasChanged = false\n
        "},{"location":"reference/special-directories/","title":"Special directories","text":"

        All directories in the source state whose name begins with . are ignored by default, unless they are one of the special directories listed here. .chezmoitemplates is read before all other files so that they can be used in templates.

        "},{"location":"reference/special-directories/chezmoidata/","title":".chezmoidata","text":"

        If a directory called .chezmoidata exists in the source state, then all files in it are interpreted as template data in the format given by their extension.

        "},{"location":"reference/special-directories/chezmoiexternals/","title":".chezmoiexternals","text":"

        If a directory called .chezmoiexternals exists, then all files in this directory are treated as .chezmoiexternal.<format> files.

        "},{"location":"reference/special-directories/chezmoiscripts/","title":".chezmoiscripts","text":"

        If a directory called .chezmoiscripts exists in the root of the source directory then any scripts in it are executed as normal scripts without creating a corresponding directory in the target state.

        "},{"location":"reference/special-directories/chezmoitemplates/","title":".chezmoitemplates","text":"

        If a directory called .chezmoitemplates exists, then all files in this directory are available as templates with a name equal to the relative path to the .chezmoitemplates directory.

        The template action can be used to include these templates in another template. The value of . must be set explicitly if needed, otherwise the template will be executed with nil data.

        Example

        Given:

        ~/.local/share/chezmoi/.chezmoitemplates/foo
        {{ if true }}bar{{ end }}\n
        ~/.local/share/chezmoi/dot_file.tmpl
        {{ template \"foo\" . }}\n

        The target state of .file will be bar.

        "},{"location":"reference/special-files/","title":"Special files","text":"

        All files in the source state whose name begins with . are ignored by default, unless they are one of the special files listed here. .chezmoidata.$FORMAT is read before all other files so that it can be used in templates.

        "},{"location":"reference/special-files/chezmoi-format-tmpl/","title":".chezmoi.$FORMAT.tmpl","text":"

        If a file called .chezmoi.$FORMAT.tmpl exists then chezmoi init will use it to create an initial config file. $FORMAT must be one of the supported config file formats, e.g. json, jsonc, toml, or yaml. Templates defined in .chezmoitemplates are not available because the template is executed before the source state is read.

        Example

        ~/.local/share/chezmoi/.chezmoi.yaml.tmpl
        {{ $email := promptString \"email\" -}}\n\ndata:\n    email: {{ $email | quote }}\n
        "},{"location":"reference/special-files/chezmoidata-format/","title":".chezmoidata.$FORMAT","text":"

        If a file called .chezmoidata.$FORMAT exists in the source state, it is interpreted as template data in the given format.

        Example

        If .chezmoidata.toml contains the following:

        ~/.local/share/chezmoi/.chezmoidata.toml
        fontSize = 12\n

        Then the .fontSize variable is available in templates, e.g.

        FONT_SIZE={{ .fontSize }}\n

        Will result in:

        FONT_SIZE=12\n
        "},{"location":"reference/special-files/chezmoiexternal-format/","title":".chezmoiexternal.$FORMAT{,.tmpl}","text":"

        If a file called .chezmoiexternal.$FORMAT (with an optional .tmpl extension) exists anywhere in the source state (either ~/.local/share/chezmoi or directory defined inside .chezmoiroot), it is interpreted as a list of external files and archives to be included as if they were in the source state.

        $FORMAT must be one of chezmoi's supported configuration file formats, e.g. json, jsonc, toml, or yaml.

        .chezmoiexternal.$FORMAT is interpreted as a template. This allows different externals to be included on different machines.

        If a .chezmoiexternal.$FORMAT file is located in an ignored directory (one listed in .chezmoiignore), all entries within the file are also ignored.

        Entries are indexed by target name relative to the directory of the .chezmoiexternal.$FORMAT file, and must have a type and a url and/or a urls field. type can be either file, archive, archive-file, or git-repo. If the entry's parent directories do not already exist in the source state then chezmoi will create them as regular directories.

        Entries may have the following fields:

        Variable Type Default value Description type string none External type (file, archive, archive-file, or git-repo) decompress string none Decompression for file encrypted bool false Whether the external is encrypted exact bool false Add exact_ attribute to directories in archive exclude []string none Patterns to exclude from archive executable bool false Add executable_ attribute to file private bool false Add private_ attribute to file readonly bool false Add readonly_ attribute to file format string autodetect Format of archive path string none Path to file in archive include []string none Patterns to include from archive refreshPeriod duration 0 Refresh period stripComponents int 0 Number of leading directory components to strip from archives url string none URL urls []string none Extra URLs to try, in order checksum.sha256 string none Expected SHA256 checksum of data checksum.sha384 string none Expected SHA384 checksum of data checksum.sha512 string none Expected SHA512 checksum of data checksum.size int none Expected size of data clone.args []string none Extra args to git clone filter.command string none Command to filter contents filter.args []string none Extra args to command to filter contents pull.args []string none Extra args to git pull archive.extractAppleDouble bool false If true, AppleDouble files are extracted

        url must be an https://, http://, or file:// URL. If urls is specified then they are tried in order and the first URL that succeeds is used.

        If any of the optional checksum.sha256, checksum.sha384, or checksum.sha512 fields are set, chezmoi will verify that the downloaded data has the given checksum.

        The optional boolean encrypted field specifies whether the file or archive is encrypted.

        The optional string decompress specifies how the file should be decompressed. Supported compression formats are bzip2, gzip, xz, and zstd. Note the .zip files are archives and you must use the archive-file type to extract a single file from a .zip archive.

        If optional string filter.command and array of strings filter.args are specified, the file or archive is filtered by piping it into the command's standard input and reading the command's standard output.

        If type is file then the target is a file with the contents of url. The optional boolean field executable may be set, in which case the target file will be executable.

        If type is archive then the target is a directory with the contents of the archive at url. The optional boolean field exact may be set, in which case the directory and all subdirectories will be treated as exact directories, i.e. chezmoi apply will remove entries not present in the archive. The optional integer field stripComponents will remove leading path components from the members of archive. The optional string field format sets the archive format. The supported archive formats are tar, tar.gz, tgz, tar.bz2, tbz2, xz, .tar.zst, and zip. If format is not specified then chezmoi will guess the format using firstly the path of the URL and secondly its contents.

        When type is archive or archive-file, the optional setting archive.extractAppleDouble controls whether AppleDouble files are extracted. It is false by default, so AppleDouble files will not be extracted.

        The optional include and exclude fields are lists of patterns specify which archive members to include or exclude respectively. Patterns match paths in the archive, not the target state. chezmoi uses the following algorithm to determine whether an archive member is included:

        1. If the archive member name matches any exclude pattern, then the archive member is excluded. In addition, if the archive member is a directory, then all contained files and sub-directories will be excluded, too (recursively).
        2. Otherwise, if the archive member name matches any include pattern, then the archive member is included.
        3. Otherwise, if only include patterns were specified then the archive member is excluded.
        4. Otherwise, if only exclude patterns were specified then the archive member is included.
        5. Otherwise, the archive member is included.

        Excluded archive members do not generate source state entries, and, if they are directories, all of their children are also excluded.

        If type is archive-file then the target is a file or symlink with the contents of the entry path in the archive at url. The optional integer field stripComponents will remove leading path components from the members of the archive before comparing them with path. The behavior of format is the same as for archive. If executable is true then chezmoi will set the executable bits on the target file, even if they are not set in the archive.

        If type is git-repo then chezmoi will run git clone $URL $TARGET_NAME with the optional clone.args if the target does not exist. If the target exists, then chezmoi will run git pull with the optional pull.args to update the target.

        For file and archive externals, chezmoi will cache downloaded URLs. The optional duration refreshPeriod field specifies how often chezmoi will re-download the URL. The default is zero meaning that chezmoi will never re-download unless forced. To force chezmoi to re-download URLs, pass the -R/--refresh-externals flag. Suitable refresh periods include one day (24h), one week (168h), or four weeks (672h).

        Example

        ~/.local/share/chezmoi/.chezmoiexternal.toml
        [\".vim/autoload/plug.vim\"]\n    type = \"file\"\n    url = \"https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim\"\n    refreshPeriod = \"168h\"\n[\".oh-my-zsh\"]\n    type = \"archive\"\n    url = \"https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz\"\n    exact = true\n    stripComponents = 1\n    refreshPeriod = \"168h\"\n[\".oh-my-zsh/custom/plugins/zsh-syntax-highlighting\"]\n    type = \"archive\"\n    url = \"https://github.com/zsh-users/zsh-syntax-highlighting/archive/master.tar.gz\"\n    exact = true\n    stripComponents = 1\n    refreshPeriod = \"168h\"\n[\".oh-my-zsh/custom/themes/powerlevel10k\"]\n    type = \"archive\"\n    url = \"https://github.com/romkatv/powerlevel10k/archive/v1.15.0.tar.gz\"\n    exact = true\n    stripComponents = 1\n[\".local/bin/age\"]\n    type = \"archive-file\"\n    url = \"https://github.com/FiloSottile/age/releases/download/v1.1.1/age-v1.1.1-{{ .chezmoi.os }}-{{ .chezmoi.arch }}.tar.gz\"\n    path = \"age/age\"\n[\"www/adminer/plugins\"]\n    type = \"archive\"\n    url = \"https://api.github.com/repos/vrana/adminer/tarball\"\n    refreshPeriod = \"744h\"\n    stripComponents = 2\n    include = [\"*/plugins/**\"]\n

        Some more examples can be found in the user guide.

        "},{"location":"reference/special-files/chezmoiignore/","title":".chezmoiignore{,.tmpl}","text":"

        If a file called .chezmoiignore (with an optional .tmpl extension) exists in the source state then it is interpreted as a set of patterns to ignore. Patterns are matched using doublestar.Match and match against the target path, not the source path.

        Patterns can be excluded by prefixing them with a ! character. All excludes take priority over all includes.

        Comments are introduced with the # character and run until the end of the line.

        .chezmoiignore is interpreted as a template, whether or not it has a .tmpl extension. This allows different files to be ignored on different machines.

        .chezmoiignore files in subdirectories apply only to that subdirectory.

        Example

        ~/.local/share/chezmoi/.chezmoiignore
        README.md\n\n*.txt   # ignore *.txt in the target directory\n*/*.txt # ignore *.txt in subdirectories of the target directory\n        # but not in subdirectories of subdirectories;\n        # so a/b/c.txt would *not* be ignored\n\nbackups/   # ignore the backups folder, but not its contents\nbackups/** # ignore the contents of backups folder but not the folder itself\n\n{{- if ne .email \"firstname.lastname@company.com\" }}\n# Ignore .company-directory unless configured with a company email\n.company-directory # note that the pattern is not dot_company-directory\n{{- end }}\n\n{{- if ne .email \"me@home.org\" }}\n.personal-file\n{{- end }}\n
        "},{"location":"reference/special-files/chezmoiremove/","title":".chezmoiremove{,.tmpl}","text":"

        If a file called .chezmoiremove (with an optional .tmpl extension) exists in the source state then it is interpreted as a list of targets to remove. .chezmoiremove is interpreted as a template, whether or not it has a .tmpl extension.

        "},{"location":"reference/special-files/chezmoiroot/","title":".chezmoiroot","text":"

        If a file called .chezmoiroot exists in the root of the source directory then the source state is read from the directory specified in .chezmoiroot interpreted as a relative path to the source directory. .chezmoiroot is read before all other files in the source directory.

        "},{"location":"reference/special-files/chezmoiversion/","title":".chezmoiversion","text":"

        If a file called .chezmoiversion exists, then its contents are interpreted as a semantic version defining the minimum version of chezmoi required to interpret the source state correctly. chezmoi will refuse to interpret the source state if the current version is too old.

        Example

        ~/.local/share/chezmoi/.chezmoiversion
        1.5.0\n
        "},{"location":"reference/templates/","title":"Templates","text":"

        chezmoi executes templates using text/template. The result is treated differently depending on whether the target is a file or a symlink.

        If target is a file, then:

        • If the result is an empty string, then the file is removed.

        • Otherwise, the target file contents are result.

        If the target is a symlink, then:

        • Leading and trailing whitespace are stripped from the result.

        • If the result is an empty string, then the symlink is removed.

        • Otherwise, the target symlink target is the result.

        chezmoi executes templates using text/template's missingkey=error option, which means that misspelled or missing keys will raise an error. This can be overridden by setting a list of options in the configuration file.

        Hint

        For a full list of template options, see Template.Option.

        Example

        ~/.config/chezmoi/chezmoi.toml
        [template]\n    options = [\"missingkey=zero\"]\n
        "},{"location":"reference/templates/directives/","title":"Directives","text":"

        File-specific template options can be set using template directives in the template of the form:

        chezmoi:template:$KEY=$VALUE\n

        which sets the template option $KEY to $VALUE. $VALUE must be quoted if it contains spaces or double quotes. Multiple key/value pairs may be specified on a single line.

        Lines containing template directives are removed to avoid parse errors from any delimiters. If multiple directives are present in a file, later directives override earlier ones.

        "},{"location":"reference/templates/directives/#delimiters","title":"Delimiters","text":"

        By default, chezmoi uses the standard text/template delimiters {{ and }}. If a template contains the string:

        chezmoi:template:left-delimiter=$LEFT right-delimiter=$RIGHT\n

        Then the delimiters $LEFT and $RIGHT are used instead. Either or both of left-delimiter=$LEFT and right-delimiter=$RIGHT may be omitted. If either $LEFT or $RIGHT is empty then the default delimiter ({{ and }} respectively) is set instead.

        The delimiters are specific to the file in which they appear and are not inherited by templates called from the file.

        Example

        #!/bin/sh\n# chezmoi:template:left-delimiter=\"# [[\" right-delimiter=]]\n\n# [[ \"true\" ]]\n
        "},{"location":"reference/templates/directives/#format-indent","title":"Format indent","text":"

        By default, chezmoi's toJson, toToml, and toYaml template functions use the default indent of two spaces. The indent can be overidden with:

        chezmoi:template:format-indent=$STRING\n

        to set the indent to be the literal $STRING, or

        chezmoi:template:format-indent-width=$WIDTH\n

        to set the indent to be $WIDTH spaces.

        Example

        {{/* chezmoi:template:format-indent=\"\\t\" */}}\n{{ dict \"key\" \"value\" | toJson }}\n

        Example

        {{/* chezmoi:template:format-indent-width=4 */}}\n{{ dict \"key\" \"value\" | toYaml }}\n
        "},{"location":"reference/templates/directives/#line-endings","title":"Line endings","text":"

        Many of the template functions available in chezmoi primarily use UNIX-style line endings (lf/\\n), which may result in unexpected output when running chezmoi diff on a modify_ template. These line endings can be overridden with a template directive:

        chezmoi:template:line-endings=$VALUE\n

        $VALUE can be an arbitrary string or one of:

        Value Effect crlf Use Windows line endings (\\r\\n) lf Use UNIX-style line endings (\\n) native Use platform-native line endings (crlf on Windows, lf elsewhere)"},{"location":"reference/templates/directives/#missing-keys","title":"Missing keys","text":"

        By default, chezmoi will return an error if a template indexes a map with a key that is not present in the map. This behavior can be changed globally with the template.options configuration variable or with a template directive:

        chezmoi:template:missing-key=$VALUE\n

        $VALUE can be one of:

        Value Effect error Return an error on any missing key (default) invalid Ignore missing keys. If printed, the result of the index operation is the string <no value> zero Ignore missing keys. If printed, the result of the index operation is the zero value"},{"location":"reference/templates/variables/","title":"Variables","text":"

        chezmoi provides the following automatically-populated variables:

        Variable Type Value .chezmoi.arch string Architecture, e.g. amd64, arm, etc. as returned by runtime.GOARCH .chezmoi.args []string The arguments passed to the chezmoi command, starting with the program command .chezmoi.cacheDir string The cache directory .chezmoi.config object The configuration, as read from the config file .chezmoi.configFile string The path to the configuration file used by chezmoi .chezmoi.destDir string The destination directory .chezmoi.executable string The path to the chezmoi executable, if available .chezmoi.fqdnHostname string The fully-qualified domain name hostname of the machine chezmoi is running on .chezmoi.gid string The primary group ID .chezmoi.group string The group of the user running chezmoi .chezmoi.homeDir string The home directory of the user running chezmoi .chezmoi.hostname string The hostname of the machine chezmoi is running on, up to the first . .chezmoi.kernel object Contains information from /proc/sys/kernel. Linux only, useful for detecting specific kernels (e.g. Microsoft's WSL kernel) .chezmoi.os string Operating system, e.g. darwin, linux, etc. as returned by runtime.GOOS .chezmoi.osRelease object The information from /etc/os-release, Linux only, run chezmoi data to see its output .chezmoi.pathListSeparator string The path list separator, typically ; on Windows and : on other systems. Used to separate paths in environment variables. ie /bin:/sbin:/usr/bin .chezmoi.pathSeparator string The path separator, typically \\ on windows and / on unix. Used to separate files and directories in a path. ie c:\\see\\dos\\run .chezmoi.sourceDir string The source directory .chezmoi.sourceFile string The path of the template relative to the source directory .chezmoi.targetFile string The absolute path of the target file for the template .chezmoi.uid string The user ID .chezmoi.username string The username of the user running chezmoi .chezmoi.version.builtBy string The program that built the chezmoi executable, if set .chezmoi.version.commit string The git commit at which the chezmoi executable was built, if set .chezmoi.version.date string The timestamp at which the chezmoi executable was built, if set .chezmoi.version.version string The version of chezmoi .chezmoi.windowsVersion object Windows version information, if running on Windows .chezmoi.workingTree string The working tree of the source directory

        .chezmoi.windowsVersion contains the following keys populated from the registry key Computer\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion.

        Key Type currentBuild string currentMajorVersionNumber integer currentMinorVersionNumber integer currentVersion string displayVersion string editionID string productName string

        Additional variables can be defined in the config file in the data section. Variable names must consist of a letter and be followed by zero or more letters and/or digits.

        "},{"location":"reference/templates/1password-functions/","title":"1Password functions","text":"

        The onepassword* template functions return structured data from 1Password using the 1Password CLI (op).

        Info

        When using the 1Password CLI with biometric authentication, chezmoi derives values from op account list that can resolves into the appropriate 1Password account-uuid.

        As an example, if op account list --format=json returns the following structure:

        [\n  {\n    \"url\": \"account1.1password.ca\",\n    \"email\": \"my@email.com\",\n    \"user_uuid\": \"some-user-uuid\",\n    \"account_uuid\": \"some-account-uuid\"\n  }\n]\n

        The following values can be used in the account parameter and the value some-account-uuid will be passed as the --account parameter to op.

        • some-account-uuid
        • some-user-uuid
        • account1.1password.ca
        • account1
        • my@email.com
        • my
        • my@account1.1password.ca
        • my@account1

        If there are multiple accounts and any value exists more than once, that value will be removed from the account mapping. That is, if you are signed into my@email.com and your@email.com for account1.1password.ca, then account1.1password.ca will not be a valid lookup value, but my@account1, my@account1.1password.ca, your@account1, and your@account1.1password.ca would all be valid lookups.

        Warning

        chezmoi has experimental support for 1Password secrets automation modes. These modes change how the 1Password CLI works and affect all functions. Most notably, account parameters are not allowed on all 1Password template functions.

        "},{"location":"reference/templates/1password-functions/onepassword/","title":"onepassword uuid [vault [account]]","text":"

        onepassword returns structured data from 1Password using the 1Password CLI (op). uuid is passed to op item get $UUID --format json and the output from op is parsed as JSON. The output from op is cached so calling onepassword multiple times with the same uuid will only invoke op once. If the optional vault is supplied, it will be passed along to the op item get call, which can significantly improve performance. If the optional account is supplied, it will be passed along to the op item get call, which will help it look in the right account, in case you have multiple accounts (e.g., personal and work accounts).

        If there is no valid session in the environment, by default you will be interactively prompted to sign in.

        The 1password CLI command can be set with the onePassword.command config variable, and extra arguments can be specified with the onePassword.args config variable.

        Example

        {{ (onepassword \"$UUID\").fields[1].value }}\n{{ (onepassword \"$UUID\" \"$VAULT_UUID\").fields[1].value }}\n{{ (onepassword \"$UUID\" \"$VAULT_UUID\" \"$ACCOUNT_NAME\").fields[1].value }}\n{{ (onepassword \"$UUID\" \"\" \"$ACCOUNT_NAME\").fields[1].value }}\n

        A more robust way to get a password field would be something like:

        {{ range (onepassword \"$UUID\").fields -}}\n{{   if and (eq .label \"password\") (eq .purpose \"PASSWORD\") -}}\n{{     .value -}}\n{{   end -}}\n{{ end }}\n

        Warning

        When using 1Password secrets automation, the account parameter is not allowed.

        "},{"location":"reference/templates/1password-functions/onepasswordDetailsFields/","title":"onepasswordDetailsFields uuid [vault [account]]","text":"

        onepasswordDetailsFields returns structured data from 1Password using the 1Password CLI (op). uuid is passed to op get item $UUID, the output from op is parsed as JSON, and elements of details.fields are returned as a map indexed by each field's id (if set) or label (if set and id is not present).

        If there is no valid session in the environment, by default you will be interactively prompted to sign in.

        The output from op is cached so calling onepasswordDetailsFields multiple times with the same uuid will only invoke op once. If the optional vault is supplied, it will be passed along to the op get call, which can significantly improve performance. If the optional account is supplied, it will be passed along to the op get call, which will help it look in the right account, in case you have multiple accounts (e.g. personal and work accounts).

        Example

        {{ (onepasswordDetailsFields \"$UUID\").password.value }}\n{{ (onepasswordDetailsFields \"$UUID\" \"$VAULT_UUID\").password.value }}\n{{ (onepasswordDetailsFields \"$UUID\" \"$VAULT_UUID\" \"$ACCOUNT_NAME\").password.value }}\n{{ (onepasswordDetailsFields \"$UUID\" \"\" \"$ACCOUNT_NAME\").password.value }}\n

        Example

        Given the output from op:

        {\n    \"uuid\": \"$UUID\",\n    \"details\": {\n        \"fields\": [\n            {\n                \"designation\": \"username\",\n                \"name\": \"username\",\n                \"type\": \"T\",\n                \"value\": \"exampleuser\"\n            },\n            {\n                \"designation\": \"password\",\n                \"name\": \"password\",\n                \"type\": \"P\",\n                \"value\": \"examplepassword\"\n            }\n        ]\n    }\n}\n

        the return value of onepasswordDetailsFields will be the map:

        {\n    \"username\": {\n        \"designation\": \"username\",\n        \"name\": \"username\",\n        \"type\": \"T\",\n        \"value\": \"exampleuser\"\n    },\n    \"password\": {\n        \"designation\": \"password\",\n        \"name\": \"password\",\n        \"type\": \"P\",\n        \"value\": \"examplepassword\"\n    }\n}\n

        Warning

        When using 1Password secrets automation, the account parameter is not allowed.

        "},{"location":"reference/templates/1password-functions/onepasswordDocument/","title":"onepasswordDocument uuid [vault [account]]","text":"

        onepasswordDocument returns a document from 1Password using the 1Password CLI (op). uuid is passed to op get document $UUID and the output from op is returned. The output from op is cached so calling onepasswordDocument multiple times with the same uuid will only invoke op once. If the optional vault is supplied, it will be passed along to the op get call, which can significantly improve performance. If the optional account is supplied, it will be passed along to the op get call, which will help it look in the right account, in case you have multiple accounts (e.g., personal and work accounts).

        If there is no valid session in the environment, by default you will be interactively prompted to sign in.

        Example

        {{- onepasswordDocument \"$UUID\" -}}\n{{- onepasswordDocument \"$UUID\" \"$VAULT_UUID\" -}}\n{{- onepasswordDocument \"$UUID\" \"$VAULT_UUID\" \"$ACCOUNT_NAME\" -}}\n{{- onepasswordDocument \"$UUID\" \"\" \"$ACCOUNT_NAME\" -}}\n

        Warning

        When using 1Password Connect, onepasswordDocument is not available.

        Warning

        When using 1Password Service Accounts, the account parameter is not allowed.

        "},{"location":"reference/templates/1password-functions/onepasswordItemFields/","title":"onepasswordItemFields uuid [vault [account]]","text":"

        onepasswordItemFields returns structured data from 1Password using the 1Password CLI (op). uuid is passed to op item get $UUID --format json, the output from op is parsed as JSON, and each element of details.sections are iterated over and any fields are returned as a map indexed by each field's n.

        If there is no valid session in the environment, by default you will be interactively prompted to sign in.

        Example

        The result of

        {{ (onepasswordItemFields \"abcdefghijklmnopqrstuvwxyz\").exampleLabel.value }}\n

        is equivalent to calling

        $ op item get abcdefghijklmnopqrstuvwxyz --fields label=exampleLabel\n# or\n$ op item get abcdefghijklmnopqrstuvwxyz --fields exampleLabel\n

        Example

        Given the output from op:

        {\n    \"id\": \"$UUID\",\n    \"title\": \"$TITLE\",\n    \"version\": 1,\n    \"vault\": {\n        \"id\": \"$vaultUUID\"\n    },\n    \"category\": \"LOGIN\",\n    \"last_edited_by\": \"userUUID\",\n    \"created_at\": \"2022-01-12T16:29:26Z\",\n    \"updated_at\": \"2022-01-12T16:29:26Z\",\n    \"sections\": [\n        {\n            \"id\": \"$sectionID\",\n            \"label\": \"Related Items\"\n        }\n    ],\n    \"fields\": [\n        {\n            \"id\": \"nerlnqbfzdm5q5g6ydsgdqgdw4\",\n            \"type\": \"STRING\",\n            \"label\": \"exampleLabel\",\n            \"value\": \"exampleValue\"\n        }\n    ],\n}\n

        the return value of onepasswordItemFields will be the map:

        {\n    \"exampleLabel\": {\n        \"id\": \"string\",\n        \"type\": \"D4328E0846D2461E8E455D7A07B93397\",\n        \"label\": \"exampleLabel\",\n        \"value\": \"exampleValue\"\n    }\n}\n

        Warning

        When using 1Password secrets automation, the account parameter is not allowed.

        "},{"location":"reference/templates/1password-functions/onepasswordRead/","title":"onepasswordRead url [account]","text":"

        onepasswordRead returns data from 1Password using the 1Password CLI (op). url is passed to the op read --no-newline command. If account is specified, the extra arguments --account $ACCOUNT are passed to op.

        If there is no valid session in the environment, by default you will be interactively prompted to sign in.

        Example

        The result of

        {{ onepasswordRead \"op://vault/item/field\" }}\n

        is equivalent to calling

        $ op read --no-newline op://vault/item/field\n

        Warning

        When using 1Password secrets automation, the account parameter is not allowed.

        "},{"location":"reference/templates/1password-sdk-functions/","title":"1Password SDK functions","text":"

        Warning

        1Password SDK template functions are experimental and may change.

        The onepasswordSDK* template functions return structured data from 1Password using the 1Password SDK.

        By default, the 1Password service account token is taken from the $OP_SERVICE_ACCOUNT_TOKEN environment variable. The name of the environment variable can be set with onepasswordSDK.tokenEnvVar configuration variable, or the token can be set explicitly by setting the onepasswordSDK.token configuration variable.

        "},{"location":"reference/templates/1password-sdk-functions/onepasswordSDKItemsGet/","title":"onepasswordSDKItemsGet vault-id item-id","text":"

        Warning

        onepasswordSDKItemsGet is an experimental function and may change.

        onepasswordSDKItemsGet returns an item from 1Password using the 1Password SDK.

        The output of onepasswordSDKItemsGet is cached so multiple calls to onepasswordSDKItemsGet with the same vault-id and item-id will return the same value.

        Example

        {{- onepasswordSDKItemsGet \"vault\" \"item\" | toJson -}}\n
        "},{"location":"reference/templates/1password-sdk-functions/onepasswordSDKSecretsResolve/","title":"onepasswordSDKSecretsResolve url","text":"

        Warning

        onepasswordSDKSecretsResolve is an experimental function and may change.

        onepasswordSDKSecretsResolve returns a secret from 1Password using the 1Password SDK.

        The output of onepasswordSDKSecretsResolve is cached so multiple calls to onepasswordSDKSecretsResolve with the same url will return the same value.

        Example

        {{- onepasswordSDKSecretsResolve \"op://vault/item/field\" -}}\n
        "},{"location":"reference/templates/aws-secrets-manager-functions/","title":"AWS Secrets Manager functions","text":"

        The awsSecretsManager* functions return data from AWS Secrets Manager using the GetSecretValue API.

        The profile and region are pulled from the standard environment variables and shared config files but can be overridden by setting awsSecretsManager.profile and awsSecretsManager.region configuration variables respectively.

        "},{"location":"reference/templates/aws-secrets-manager-functions/awsSecretsManager/","title":"awsSecretsManager arn","text":"

        awsSecretsManager returns structured data retrieved from AWS Secrets Manager. arn specifies the SecretId passed to GetSecretValue. This can either be the full ARN or the simpler name if applicable.

        "},{"location":"reference/templates/aws-secrets-manager-functions/awsSecretsManagerRaw/","title":"awsSecretsManagerRaw arn","text":"

        awsSecretsManager returns the raw string value retrieved from AWS Secrets Manager. arn specifies the SecretId passed to GetSecretValue. This can either be the full ARN or the simpler name if applicable.

        "},{"location":"reference/templates/azure-key-vault-functions/azureKeyVault/","title":"azureKeyVault secret name [vault-name]","text":"

        azureKeyVault returns a secret value retrieved from an Azure Key Vault.

        The mandatory secret name argument specifies the name of the secret to retrieve.

        The optional vault name argument specifies the name of the vault, if not set, the default vault name will be used.

        Warning

        The current implementation will always return the latest version of the secret. Retrieving a specific version of a secret is not supported.

        "},{"location":"reference/templates/bitwarden-functions/","title":"Bitwarden functions","text":"

        The bitwarden* and rbw* functions return data from Bitwarden using the Bitwarden CLI (bw), Bitwarden Secrets CLI (bws), and rbw commands.

        "},{"location":"reference/templates/bitwarden-functions/bitwarden/","title":"bitwarden [arg...]","text":"

        bitwarden returns structured data retrieved from Bitwarden using the Bitwarden CLI (bw). args are passed to bw get unchanged and the output from bw get is parsed as JSON.

        The output from bw get is cached so calling bitwarden multiple times with the same arguments will only invoke bw once.

        Example

        username = {{ (bitwarden \"item\" \"$ITEMID\").login.username }}\npassword = {{ (bitwarden \"item\" \"$ITEMID\").login.password }}\n
        "},{"location":"reference/templates/bitwarden-functions/bitwardenAttachment/","title":"bitwardenAttachment filename itemid","text":"

        bitwardenAttachment returns a document from Bitwarden using the Bitwarden CLI (bw). filename and itemid are passed to bw get attachment $FILENAME --itemid $ITEMID and the output is returned.

        The output from bw is cached so calling bitwardenAttachment multiple times with the same filename and itemid will only invoke bw once.

        Example

        {{- bitwardenAttachment \"$FILENAME\" \"$ITEMID\" -}}\n
        "},{"location":"reference/templates/bitwarden-functions/bitwardenAttachmentByRef/","title":"bitwardenAttachmentByRef filename args","text":"

        bitwardenAttachmentByRef returns a document from Bitwarden using the Bitwarden CLI (bw). This method requires two calls to bw to complete:

        1. First, args are passed to bw get in order to retrieve the item's itemid.
        2. Then, filename and itemid are passed to bw get attachment $FILENAME --itemid $ITEMID and the output from bw is returned.

        The output from bw is cached so calling bitwardenAttachmentByRef multiple times with the same filename and itemid will only invoke bw once.

        Example

        {{- bitwardenAttachmentByRef \"$FILENAME\" \"$ARGS\" -}}\n

        Example

        {{- bitwardenAttachmentByRef \"id_rsa\" \"item\" \"example.com\" -}}\n
        "},{"location":"reference/templates/bitwarden-functions/bitwardenFields/","title":"bitwardenFields [arg...]","text":"

        bitwardenFields returns structured data retrieved from Bitwarden using the Bitwarden CLI (bw). args are passed to bw get unchanged, the output from bw get is parsed as JSON, and the elements of fields are returned as a dict indexed by each field's name.

        The output from bw get is cached so calling bitwardenFields multiple times with the same arguments will only invoke bw get once.

        Example

        {{ (bitwardenFields \"item\" \"$ITEMID\").token.value }}\n

        Example

        Given the output from bw get:

        {\n    \"object\": \"item\",\n    \"id\": \"bf22e4b4-ae4a-4d1c-8c98-ac620004b628\",\n    \"organizationId\": null,\n    \"folderId\": null,\n    \"type\": 1,\n    \"name\": \"example.com\",\n    \"notes\": null,\n    \"favorite\": false,\n    \"fields\": [\n        {\n            \"name\": \"hidden\",\n            \"value\": \"hidden-value\",\n            \"type\": 1\n        },\n        {\n            \"name\": \"token\",\n            \"value\": \"token-value\",\n            \"type\": 0\n        }\n    ],\n    \"login\": {\n        \"username\": \"username-value\",\n        \"password\": \"password-value\",\n        \"totp\": null,\n        \"passwordRevisionDate\": null\n    },\n    \"collectionIds\": [],\n    \"revisionDate\": \"2020-10-28T00:21:02.690Z\"\n}\n

        the return value if bitwardenFields will be the map:

        {\n    \"hidden\": {\n        \"name\": \"hidden\",\n        \"type\": 1,\n        \"value\": \"hidden-value\"\n    },\n    \"token\": {\n        \"name\": \"token\",\n        \"type\": 0,\n        \"value\": \"token-value\"\n    }\n}\n
        "},{"location":"reference/templates/bitwarden-functions/bitwardenSecrets/","title":"bitwardenSecrets secret-id [access-token]","text":"

        bitwardenSecrets returns structured data from Bitwarden using the Bitwarden Secrets CLI (bws). secret-id is passed to bws secret get and the output from bws secret get is parsed as JSON and returned.

        If the additional access-token argument is given, it is passed to bws secret get with the --access-token flag.

        The output from bws secret get is cached so calling bitwardenSecrets multiple times with the same secret-id and access-token will only invoke bws secret get once.

        !!!

        ```\n{{ (bitwardenSecrets \"be8e0ad8-d545-4017-a55a-b02f014d4158\").value }}\n```\n
        "},{"location":"reference/templates/bitwarden-functions/rbw/","title":"rbw name [arg...]","text":"

        rbw returns structured data retrieved from Bitwarden using rbw. name is passed to rbw get --raw, along with any extra args, and the output is parsed as JSON.

        The output from rbw get --raw is cached so calling rbw multiple times with the same arguments will only invoke rbw once.

        Example

        username = {{ (rbw \"test-entry\").data.username }}\npassword = {{ (rbw \"test-entry\" \"--folder\" \"my-folder\").data.password }}\n
        "},{"location":"reference/templates/bitwarden-functions/rbwFields/","title":"rbwFields name [arg...]","text":"

        rbw returns structured data retrieved from Bitwarden using rbw. name is passed to rbw get --raw, along with any extra args, the output is parsed as JSON, and the elements of fields are returned as a dict indexed by each field's name.

        The output from rbw get --raw is cached so calling rbwFields multiple times with the same arguments will only invoke rbwFields once.

        Example

        {{ (rbwFields \"item\").name.value }}\n{{ (rbwFields \"item\" \"--folder\" \"my-folder\").name.value }}\n
        "},{"location":"reference/templates/dashlane-functions/","title":"Dashlane functions","text":"

        The dashlane* functions return data from Dashlane using the Dashlane CLI.

        "},{"location":"reference/templates/dashlane-functions/dashlaneNote/","title":"dashlaneNote filter","text":"

        dashlaneNote returns the content of a secure note from Dashlane using the Dashlane CLI (dcli). filter is passed to dcli note, and the output from dcli note is just read as a multiline string.

        The output from dcli note is cached so calling dashlaneNote multiple times with the same filter will only invoke dcli note once.

        Example

        {{ dashlaneNote \"filter\" }}\n
        "},{"location":"reference/templates/dashlane-functions/dashlanePassword/","title":"dashlanePassword filter","text":"

        dashlanePassword returns structured data from Dashlane using the Dashlane CLI (dcli). filter is passed to dcli password --output json, and the output from dcli password is parsed as JSON.

        The output from dcli password cached so calling dashlanePassword multiple times with the same filter will only invoke dcli password once.

        Example

        {{ (index (dashlanePassword \"filter\") 0).password }}\n
        "},{"location":"reference/templates/doppler-functions/","title":"Doppler","text":"

        chezmoi includes support for Doppler using the doppler CLI to expose data through the doppler and dopplerProjectJson template functions.

        "},{"location":"reference/templates/doppler-functions/doppler/","title":"doppler key [project [config]]","text":"

        doppler returns the secret for the specified project and configuration from Doppler using doppler secrets download --json --no-file.

        If either of project or config are empty or omitted, then chezmoi will use the value from the doppler.project and doppler.config config variables if they are set and not empty.

        Example

        {{ doppler \"SECRET_NAME\" \"project_name\" \"configuration_name\" }}\n
        "},{"location":"reference/templates/doppler-functions/dopplerProjectJson/","title":"dopplerProjectJson [project [config]]","text":"

        dopplerProjectJson returns the secret for the specified project and configuration from Doppler using doppler secrets download --json --no-file as json structured data.

        If either of project or config are empty or omitted, then chezmoi will use the value from the doppler.project and doppler.config config variables if they are set and not empty.

        Example

        {{ (dopplerProjectJson \"project_name\" \"configuration_name\").SECRET_NAME }}\n
        "},{"location":"reference/templates/ejson-functions/","title":"ejson functions","text":"

        The ejson* functions return data from ejson-encrypted files.

        "},{"location":"reference/templates/ejson-functions/ejsonDecrypt/","title":"ejsonDecrypt filePath","text":"

        ejsonDecrypt returns the decrypted content of an ejson-encrypted file.

        filePath indicates where the encrypted file is located.

        The decrypted file is cached so calling ejsonDecrypt multiple times with the same filePath will only run through the decryption process once. The cache is shared with ejsonDecryptWithKey.

        Example

        {{ (ejsonDecrypt \"my-secrets.ejson\").password }}\n
        "},{"location":"reference/templates/ejson-functions/ejsonDecryptWithKey/","title":"ejsonDecryptWithKey filePath key","text":"

        ejsonDecryptWithKey returns the decrypted content of an ejson-encrypted file.

        filePath indicates where the encrypted file is located, and key is used to decrypt the file.

        The decrypted file is cached so calling ejsonDecryptWithKey multiple times with the same filePath will only run through the decryption process once. The cache is shared with ejsonDecrypt.

        Example

        {{ (ejsonDecryptWithKey \"my-secrets.ejson\" \"top-secret-key\").password }}\n
        "},{"location":"reference/templates/functions/","title":"Functions","text":"

        All standard text/template and text template functions from sprig are included. chezmoi provides some additional functions.

        "},{"location":"reference/templates/functions/comment/","title":"comment prefix text","text":"

        comment returns text with each line prefixed with prefix.

        Example

        {{ \"Header\" | comment \"# \" }}\n
        "},{"location":"reference/templates/functions/completion/","title":"completion shell","text":"

        completion returns chezmoi's shell completion for shell. shell can be one of bash, fish, powershell, or zsh.

        Example

        {{ completion \"zsh\" }}\n
        "},{"location":"reference/templates/functions/decrypt/","title":"decrypt ciphertext","text":"

        decrypt decrypts ciphertext using chezmoi's configured encryption method.

        Example

        {{ joinPath .chezmoi.sourceDir \".ignored-encrypted-file.age\" | include | decrypt }}\n
        "},{"location":"reference/templates/functions/deleteValueAtPath/","title":"deleteValueAtPath path dict","text":"

        deleteValueAtPath modifies dict to delete the value at path and returns dict. path can be either a string containing a .-separated list of keys or a list of keys.

        If path does not exist in dict then deleteValueAtPath returns dict unchanged.

        Example

        {{ dict \"outer\" (dict \"inner\" \"value\") | deleteValueAtPath \"outer.inner\" | toJson }}\n{{ dict | setValueAtPath \"key1\" \"value1\" | setValueAtPath \"key2.nestedKey\" \"value2\" | toJson }}\n{{ dict | setValueAtPath (list \"key2\" \"nestedKey\") \"value2\" | toJson }}\n
        "},{"location":"reference/templates/functions/encrypt/","title":"encrypt plaintext","text":"

        encrypt encrypts plaintext using chezmoi's configured encryption method.

        "},{"location":"reference/templates/functions/eqFold/","title":"eqFold string1 string2 [extraString...]","text":"

        eqFold returns the boolean truth of comparing string1 with string2 and any number of extraStrings under Unicode case-folding.

        Example

        {{ $commandOutput := output \"path/to/output-FOO.sh\" }}\n{{ if eqFold \"foo\" $commandOutput }}\n# $commandOutput is \"foo\"/\"Foo\"/\"FOO\"...\n{{ else if eqFold \"bar\" $commandOutput }}\n# $commandOutput is \"bar\"/\"Bar\"/\"BAR\"...\n{{ end }}\n
        "},{"location":"reference/templates/functions/findExecutable/","title":"findExecutable file path-list","text":"

        findExecutable searches for an executable named file in directories identified by path-list. The result will be the executable file concatenated with the matching path. If an executable file cannot be found in path-list, findExecutable returns an empty string.

        findExecutable is provided as an alternative to lookPath so that you can interrogate the system PATH as it would be configured after chezmoi apply. Like lookPath, findExecutable is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

        The return value of the first successful call to findExecutable is cached, and future calls to findExecutable with the same parameters will return this path.

        Info

        On Windows, the resulting path will contain the first found executable extension as identified by the environment variable %PathExt%.

        Example

        {{ if findExecutable \"rtx\" (list \"bin\" \"go/bin\" \".cargo/bin\" \".local/bin\") }}\n# $HOME/.cargo/bin/rtx exists and will probably be in $PATH after apply\n{{ end }}\n
        "},{"location":"reference/templates/functions/findOneExecutable/","title":"findOneExecutable file-list path-list","text":"

        findOneExecutable searches for an executable from file-list in directories identified by path-list, finding the first matching executable in the first matching directory (each directory is searched for matching executables in turn). The result will be the executable file concatenated with the matching path. If an executable from file-list cannot be found in path-list, findOneExecutable returns an empty string.

        findOneExecutable is provided as an alternative to lookPath so that you can interrogate the system PATH as it would be configured after chezmoi apply. Like lookPath, findOneExecutable is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

        The return value of the first successful call to findOneExecutable is cached, and future calls to findOneExecutable with the same parameters will return this path.

        Info

        On Windows, the resulting path will contain the first found executable extension as identified by the environment variable %PathExt%.

        Example

        {{ if findOneExecutable (list \"eza\" \"exa\") (list \"bin\" \"go/bin\" \".cargo/bin\" \".local/bin\") }}\n# $HOME/.cargo/bin/exa exists and will probably be in $PATH after apply\n{{ end }}\n
        "},{"location":"reference/templates/functions/fromIni/","title":"fromIni initext","text":"

        fromIni returns the parsed value of initext.

        Example

        {{ (fromIni \"[section]\\nkey = value\").section.key }}\n
        "},{"location":"reference/templates/functions/fromJson/","title":"fromJson jsontext","text":"

        fromJson parses jsontext as JSON and returns the parsed value.

        JSON numbers that can be represented exactly as 64-bit signed integers are returned as such. Otherwise, if the number is in the range of 64-bit IEEE floating point values, it is returned as such. Otherwise, the number is returned as a string. See RFC7159 Section 6.

        "},{"location":"reference/templates/functions/fromJsonc/","title":"fromJsonc jsonctext","text":"

        fromJsonc parses jsonctext as JSONC using github.com/tailscale/hujson and returns the parsed value.

        "},{"location":"reference/templates/functions/fromToml/","title":"fromToml tomltext","text":"

        fromToml returns the parsed value of tomltext.

        Example

        {{ (fromToml \"[section]\\nkey = \\\"value\\\"\").section.key }}\n
        "},{"location":"reference/templates/functions/fromYaml/","title":"fromYaml yamltext","text":"

        fromYaml returns the parsed value of yamltext.

        Example

        {{ (fromYaml \"key1: value\\nkey2: value\").key2 }}\n
        "},{"location":"reference/templates/functions/glob/","title":"glob pattern","text":"

        glob returns the list of files matching pattern according to doublestar.Glob. Relative paths are interpreted relative to the destination directory.

        "},{"location":"reference/templates/functions/hexDecode/","title":"hexDecode hextext","text":"

        hexDecode returns hextext decoded from a hex-encoding string.

        Example

        {{ hexDecode \"68656c6c6f\" }}\n
        "},{"location":"reference/templates/functions/hexEncode/","title":"hexEncode string","text":"

        hexEncode returns string encoded as a hex string.

        Example

        {{ hexEncode \"example\" }}\n
        "},{"location":"reference/templates/functions/include/","title":"include filename","text":"

        include returns the literal contents of the file named *filename*. Relative paths are interpreted relative to the source directory.

        "},{"location":"reference/templates/functions/includeTemplate/","title":"includeTemplate filename [data]","text":"

        includeTemplate returns the result of executing the contents of filename with the optional data. Relative paths are first searched for in .chezmoitemplates and, if not found, are interpreted relative to the source directory.

        "},{"location":"reference/templates/functions/ioreg/","title":"ioreg","text":"

        On macOS, ioreg returns the structured output of the ioreg -a -l command, which includes detailed information about the I/O Kit registry.

        On non-macOS operating systems, ioreg returns nil.

        The output from ioreg is cached so multiple calls to the ioreg function will only execute the ioreg -a -l command once.

        Example

        {{ if eq .chezmoi.os \"darwin\" }}\n{{   $serialNumber := index ioreg \"IORegistryEntryChildren\" 0 \"IOPlatformSerialNumber\" }}\n{{ end }}\n

        Warning

        The ioreg function can be very slow and should not be used. It will be removed in a later version of chezmoi.

        "},{"location":"reference/templates/functions/isExecutable/","title":"isExecutable file","text":"

        isExecutable returns true if a file is executable.

        Example

        {{ if isExecutable \"/bin/echo\" }}\n# echo is executable\n{{ end }}\n
        "},{"location":"reference/templates/functions/joinPath/","title":"joinPath element...","text":"

        joinPath joins any number of path elements into a single path, separating them with the OS-specific path separator. Empty elements are ignored. The result is cleaned. If the argument list is empty or all its elements are empty, joinPath returns an empty string. On Windows, the result will only be a UNC path if the first non-empty element is a UNC path.

        Example

        {{ joinPath .chezmoi.homeDir \".zshrc\" }}\n
        "},{"location":"reference/templates/functions/jq/","title":"jq query input","text":"

        jq runs the jq query query against input and returns a list of results.

        Example

        {{ dict \"key\" \"value\" | jq \".key\" | first }}\n

        Warning

        jq uses github.com/itchyny/gojq, which behaves slightly differently to the jq command in some edge cases.

        "},{"location":"reference/templates/functions/lookPath/","title":"lookPath file","text":"

        lookPath searches for an executable named file in the directories named by the PATH environment variable. If file contains a slash, it is tried directly and the PATH is not consulted. The result may be an absolute path or a path relative to the current directory. If file is not found, lookPath returns an empty string.

        lookPath is not hermetic: its return value depends on the state of the environment and the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

        The return value of the first successful call to lookPath is cached, and future calls to lookPath for the same file will return this path.

        Example

        {{ if lookPath \"diff-so-fancy\" }}\n# diff-so-fancy is in $PATH\n{{ end }}\n
        "},{"location":"reference/templates/functions/lstat/","title":"lstat name","text":"

        lstat runs os.Lstat on name. If name exists it returns structured data. If name does not exist then it returns a false value. If os.Lstat returns any other error then it raises an error. The structured value returned if name exists contains the fields name, size, mode, perm, modTime, isDir, and type.

        lstat is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

        Example

        {{ if eq (joinPath .chezmoi.homeDir \".xinitrc\" | lstat).type \"symlink\" }}\n# ~/.xinitrc exists and is a symlink\n{{ end }}\n
        "},{"location":"reference/templates/functions/mozillaInstallHash/","title":"mozillaInstallHash path","text":"

        mozillaInstallHash returns the Mozilla install hash for path. This is a convenience function to assist the management of Firefox profiles.

        "},{"location":"reference/templates/functions/output/","title":"output name [arg...]","text":"

        output returns the output of executing the command name with args. If executing the command returns an error then template execution exits with an error. The execution occurs every time that the template is executed. It is the user's responsibility to ensure that executing the command is both idempotent and fast.

        Example

        current-context: {{ output \"kubectl\" \"config\" \"current-context\" | trim }}\n
        "},{"location":"reference/templates/functions/pruneEmptyDicts/","title":"pruneEmptyDicts dict","text":"

        pruneEmptyDicts modifies dict to remove nested empty dicts. Properties are pruned from the bottom up, so any nested dicts that themselves only contain empty dicts are pruned.

        Example

        {{ dict \"key\" \"value\" inner (dict) | pruneEmptyDicts | toJson }}\n
        "},{"location":"reference/templates/functions/quoteList/","title":"quoteList list","text":"

        quoteList returns a list where each element is the corresponding element in list quoted.

        Example

        {{ $args := list \"alpha\" \"beta\" \"gamma\" }}\ncommand {{ $args | quoteList }}\n
        [section]\n    array = [{{- $list | quoteList | join \", \" -}}]\n
        "},{"location":"reference/templates/functions/replaceAllRegex/","title":"replaceAllRegex expr repl text","text":"

        replaceAllRegex returns text with all substrings matching the regular expression expr replaced with repl. It is an alternative to sprig's regexpReplaceAll function with a different argument order that supports pipelining.

        Example

        {{ \"foo subject string\" | replaceAllRegex \"foo\" \"bar\" }}\n
        "},{"location":"reference/templates/functions/setValueAtPath/","title":"setValueAtPath path value dict","text":"

        setValueAtPath modifies dict to set the value at path to value and returns dict. path can be either a string containing a .-separated list of keys or a list of keys. The function will create new key/value pairs in dict if needed.

        This is an alternative to sprig's set function with a different argument order that supports pipelining.

        Example

        {{ dict | setValueAtPath \"key1\" \"value1\" | setValueAtPath \"key2.nestedKey\" \"value2\" | toJson }}\n{{ dict | setValueAtPath (list \"key2\" \"nestedKey\") \"value2\" | toJson }}\n
        "},{"location":"reference/templates/functions/stat/","title":"stat name","text":"

        stat runs os.Stat on name. If name exists it returns structured data. If name does not exist then it returns a false value. If os.Stat returns any other error then it raises an error. The structured value returned if name exists contains the fields name, size, mode, perm, modTime, isDir, and type.

        stat is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

        Example

        {{ if stat (joinPath .chezmoi.homeDir \".pyenv\") }}\n# ~/.pyenv exists\n{{ end }}\n
        "},{"location":"reference/templates/functions/toIni/","title":"toIni value","text":"

        toIni returns the ini representation of value, which must be a dict.

        Example

        {{ dict \"key\" \"value\" \"section\" (dict \"subkey\" \"subvalue\") | toIni }}\n

        Warning

        The ini format is not well defined, and the particular variant generated by toIni might not be suitable for you.

        "},{"location":"reference/templates/functions/toPrettyJson/","title":"toPrettyJson [indent] value","text":"

        toPrettyJson returns the JSON representation of value. The optional indent specifies how much nested elements are indented relative to their parent. indent defaults to two spaces.

        Examples

        {{ dict \"a\" (dict \"b\" \"c\") | toPrettyJson \"\\t\" }}\n
        "},{"location":"reference/templates/functions/toToml/","title":"toToml value","text":"

        toToml returns the TOML representation of value.

        Example

        {{ dict \"key\" \"value\" | toToml }}\n
        "},{"location":"reference/templates/functions/toYaml/","title":"toYaml value","text":"

        toYaml returns the YAML representation of value.

        Example

        {{ dict \"key\" \"value\" | toYaml }}\n
        "},{"location":"reference/templates/github-functions/","title":"GitHub functions","text":"

        The gitHub* template functions return data from the GitHub API.

        By default, chezmoi makes anonymous GitHub API requests, which are subject to GitHub's rate limits (currently 60 requests per hour per source IP address). chezmoi caches results from identical GitHub API requests for the period defined in gitHub.refreshPeriod (default one minute).

        If any of the environment variables $CHEZMOI_GITHUB_ACCESS_TOKEN, $GITHUB_ACCESS_TOKEN, or $GITHUB_TOKEN are found, then the first one found will be used to authenticate the GitHub API requests which have a higher rate limit (currently 5,000 requests per hour per user).

        In practice, GitHub API rate limits are high enough chezmoi's caching of results mean that you should rarely need to set a token, unless you are sharing a source IP address with many other GitHub users. If needed, the GitHub documentation describes how to create a personal access token.

        "},{"location":"reference/templates/github-functions/gitHubKeys/","title":"gitHubKeys user","text":"

        gitHubKeys returns user's public SSH keys from GitHub using the GitHub API. The returned value is a slice of structs with .ID and .Key fields.

        Warning

        If you use this function to populate your ~/.ssh/authorized_keys file then you potentially open SSH access to anyone who is able to modify or add to your GitHub public SSH keys, possibly including certain GitHub employees. You should not use this function on publicly-accessible machines and should always verify that no unwanted keys have been added, for example by using the -v / --verbose option when running chezmoi apply or chezmoi update.

        Additionally, GitHub automatically removes keys which haven't been used in the last year. This may cause your keys to be removed from ~/.ssh/authorized_keys suddenly, and without any warning or indication of the removal. You should provide one or more keys in plain text alongside this function to avoid unknowingly losing remote access to your machine.

        Example

        {{ range gitHubKeys \"user\" }}\n{{- .Key }}\n{{ end }}\n
        "},{"location":"reference/templates/github-functions/gitHubLatestRelease/","title":"gitHubLatestRelease owner-repo","text":"

        gitHubLatestRelease calls the GitHub API to retrieve the latest release about the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

        Calls to gitHubLatestRelease are cached so calling gitHubLatestRelease with the same owner-repo will only result in one call to the GitHub API.

        Example

        {{ (gitHubLatestRelease \"docker/compose\").TagName }}\n
        "},{"location":"reference/templates/github-functions/gitHubLatestReleaseAssetURL/","title":"gitHubLatestReleaseAssetURL owner-repo pattern","text":"

        gitHubLatestReleaseAssetURL calls the GitHub API to retrieve the latest release about the given owner-repo, returning structured data as defined by the GitHub Go API bindings. It then iterates through all the release's assets, returning the first one that matches pattern. pattern is a shell pattern as described in path.Match.

        Calls to gitHubLatestReleaseAssetURL are cached so calling gitHubLatestReleaseAssetURL with the same owner-repo will only result in one call to the GitHub API.

        Example

        {{ gitHubLatestReleaseAssetURL \"FiloSottile/age\" (printf \"age-*-%s-%s.tar.gz\" .chezmoi.os .chezmoi.arch) }}\n{{ gitHubLatestReleaseAssetURL \"twpayne/chezmoi\" (printf \"chezmoi-%s-%s\" .chezmoi.os .chezmoi.arch) }}\n
        "},{"location":"reference/templates/github-functions/gitHubLatestTag/","title":"gitHubLatestTag owner-repo","text":"

        gitHubLatestTag calls the GitHub API to retrieve the latest tag for the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

        Calls to gitHubLatestTag are cached the same as githubTags, so calling gitHubLatestTag with the same owner-repo will only result in one call to the GitHub API.

        Example

        {{ (gitHubLatestTag \"docker/compose\").Name }}\n

        Warning

        The gitHubLatestTag returns the first tag returned by the list repository tags GitHub API endpoint. Although this seems to be the most recent tag, the GitHub API documentation does not specify the order of the returned tags.

        "},{"location":"reference/templates/github-functions/gitHubRelease/","title":"gitHubRelease owner-repo version","text":"

        gitHubRelease calls the GitHub API to retrieve the latest releases about the given owner-repo, It iterates through all the versions of the release, fetching the first entry equal to version.

        It then returns structured data as defined by the GitHub Go API bindings.

        Calls to gitHubRelease are cached so calling gitHubRelease with the same owner-repo version will only result in one call to the GitHub API.

        Example

        {{ (gitHubRelease \"docker/compose\" \"v2.29.1\").TagName }}\n
        "},{"location":"reference/templates/github-functions/gitHubReleaseAssetURL/","title":"gitHubReleaseAssetURL owner-repo version pattern","text":"

        gitHubReleaseAssetURL calls the GitHub API to retrieve the latest releases about the given owner-repo, returning structured data as defined by the GitHub Go API bindings. It iterates through all the versions of the release, returning the first entry equal to version. It then iterates through all the release's assets, returning the first one that matches pattern. pattern is a shell pattern as described in path.Match.

        Calls to gitHubReleaseAssetURL are cached so calling gitHubReleaseAssetURL with the same owner-repo will only result in one call to the GitHub API.

        Example

        {{ gitHubReleaseAssetURL \"FiloSottile/age\" \"age v1.2.0\" (printf \"age-*-%s-%s.tar.gz\" .chezmoi.os .chezmoi.arch) }}\n{{ gitHubReleaseAssetURL \"twpayne/chezmoi\" \"v2.50.0\" (printf \"chezmoi-%s-%s\" .chezmoi.os .chezmoi.arch) }}\n
        "},{"location":"reference/templates/github-functions/gitHubReleases/","title":"gitHubReleases owner-repo","text":"

        gitHubReleases calls the GitHub API to retrieve the first page of releases for the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

        Calls to gitHubReleases are cached so calling gitHubReleases with the same owner-repo will only result in one call to the GitHub API.

        Example

        {{ (index (gitHubReleases \"docker/compose\") 0).TagName }}\n

        Note

        The maximum number of items returned by gitHubReleases is determined by default page size for the GitHub API.

        Warning

        The values returned by gitHubReleases are not directly queryable via the jq function and must instead be converted through JSON:

        {{ gitHubReleases \"docker/compose\" | toJson | fromJson | jq \".[0].tag_name\" }}\n
        "},{"location":"reference/templates/github-functions/gitHubTags/","title":"gitHubTags owner-repo","text":"

        gitHubTags calls the GitHub API to retrieve the first page of tags for the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

        Calls to gitHubTags are cached so calling gitHubTags with the same owner-repo will only result in one call to the GitHub API.

        Example

        {{ (index (gitHubTags \"docker/compose\") 0).Name }}\n

        Note

        The maximum number of items returned by gitHubReleases is determined by default page size for the GitHub API.

        Warning

        The values returned by gitHubTags are not directly queryable via the jq function and must instead be converted through JSON:

        {{ gitHubTags \"docker/compose\" | toJson | fromJson | jq \".[0].name\" }}\n
        "},{"location":"reference/templates/gopass-functions/","title":"gopass functions","text":"

        The gopass* template functions return data stored in gopass using the gopass CLI (gopass) or builtin code.

        By default, chezmoi will use the gopass CLI (gopass). Depending on your gopass configuration, you may have to enter your passphrase once for each secret.

        When setting gopass.mode to builtin, chezmoi use builtin code to access the goapass database and caches your passphrase in plaintext in memory until chezmoi terminates.

        Warning

        Using the builtin code is experimental and may be removed.

        "},{"location":"reference/templates/gopass-functions/gopass/","title":"gopass gopass-name","text":"

        gopass returns passwords stored in gopass using the gopass CLI (gopass). gopass-name is passed to gopass show --password $GOPASS_NAME and the first line of the output of gopass is returned with the trailing newline stripped. The output from gopass is cached so calling gopass multiple times with the same gopass-name will only invoke gopass once.

        Example

        {{ gopass \"$PASS_NAME\" }}\n
        "},{"location":"reference/templates/gopass-functions/gopassRaw/","title":"gopassRaw gopass-name","text":"

        gopass returns raw passwords stored in gopass using the gopass CLI (gopass). gopass-name is passed to gopass show --noparsing $GOPASS_NAME and the output is returned. The output from gopassRaw is cached so calling gopassRaw multiple times with the same gopass-name will only invoke gopass once.

        "},{"location":"reference/templates/hcp-vault-secrets-functions/","title":"HCP Vault Secrets","text":"

        chezmoi includes support for HCP Vault Secrets using the vlt CLI to expose data through the hcpVaultSecret and hcpVaultSecretJson template functions.

        "},{"location":"reference/templates/hcp-vault-secrets-functions/hcpVaultSecret/","title":"hcpVaultSecret key [application-name [project-id [organization-id]]]","text":"

        hcpVaultSecret returns the plaintext secret from HCP Vault Secrets using vlt secrets get --plaintext.

        If any of application-name, project-id, or organization-id are empty or omitted, then chezmoi will use the value from the hcpVaultSecret.applicationName, hcpVaultSecret.projectId, and hcpVaultSecret.organizationId config variables if they are set and not empty.

        Example

        {{ hcpVaultSecret \"username\" }}\n
        "},{"location":"reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson/","title":"hcpVaultSecretJson key [application-name [project-id [organization-id]]]","text":"

        hcpVaultSecretJson returns structured data from HCP Vault Secrets using vlt secrets get --format=json.

        If any of application-name, project-id, or organization-id are empty or omitted, then chezmoi will use the value from the hcpVaultSecret.applicationName, hcpVaultSecret.projectId, and hcpVaultSecret.organizationId config variables if they are set and not empty.

        Example

        {{ (hcpVaultSecretJson \"secret_name\" \"application_name\").created_by.email }}\n
        "},{"location":"reference/templates/init-functions/","title":"Init functions","text":"

        These template functions are only available when generating a config file with chezmoi init. For testing with chezmoi execute-template, pass the --init flag to enable them.

        "},{"location":"reference/templates/init-functions/exit/","title":"exit code","text":"

        exit stops template execution and causes chezmoi to exit with code.

        "},{"location":"reference/templates/init-functions/promptBool/","title":"promptBool prompt [default]","text":"

        promptBool prompts the user with prompt and returns the user's response interpreted as a boolean. If default is passed and the user's response is empty then it returns default. The user's response is interpreted as follows (case insensitive):

        Response Result 1, on, t, true, y, yes true 0, off, f, false, n, no false"},{"location":"reference/templates/init-functions/promptBoolOnce/","title":"promptBoolOnce map path prompt [default]","text":"

        promptBoolOnce returns the value of map at path if it exists and is a boolean value, otherwise it prompts the user for a boolean value with prompt and an optional default using promptBool.

        Example

        {{ $hasGUI := promptBoolOnce . \"hasGUI\" \"Does this machine have a GUI\" }}\n
        "},{"location":"reference/templates/init-functions/promptChoice/","title":"promptChoice prompt choices [default]","text":"

        promptChoice prompts the user with prompt and choices and returns the user's response. choices must be a list of strings. If default is passed and the user's response is empty then it returns default.

        Example

        {{- $choices := list \"desktop\" \"server\" -}}\n{{- $hosttype := promptChoice \"What type of host are you on\" $choices -}}\n[data]\n    hosttype = {{- $hosttype | quote -}}\n
        "},{"location":"reference/templates/init-functions/promptChoiceOnce/","title":"promptChoiceOnce map path prompt choices [default]","text":"

        promptChoiceOnce returns the value of map at path if it exists and is a string, otherwise it prompts the user for one of choices with prompt and an optional default using promptChoice.

        Example

        {{- $choices := list \"desktop\" \"laptop\" \"server\" \"termux\" -}}\n{{- $hosttype := promptChoiceOnce . \"hosttype\" \"What type of host are you on\" $choices -}}\n[data]\n    hosttype = {{- $hosttype | quote -}}\n
        "},{"location":"reference/templates/init-functions/promptInt/","title":"promptInt prompt [default]","text":"

        promptInt prompts the user with prompt and returns the user's response interpreted as an integer. If default is passed and the user's response is empty then it returns default.

        "},{"location":"reference/templates/init-functions/promptIntOnce/","title":"promptIntOnce map path prompt [default]","text":"

        promptIntOnce returns the value of map at path if it exists and is an integer value, otherwise it prompts the user for a integer value with prompt and an optional default using promptInt.

        Example

        {{ $monitors := promptIntOnce . \"monitors\" \"How many monitors does this machine have\" }}\n
        "},{"location":"reference/templates/init-functions/promptString/","title":"promptString prompt [default]","text":"

        promptString prompts the user with prompt and returns the user's response with all leading and trailing spaces stripped. If default is passed and the user's response is empty then it returns default.

        Example

        {{ $email := promptString \"email\" -}}\n[data]\n    email = {{ $email | quote }}\n
        "},{"location":"reference/templates/init-functions/promptStringOnce/","title":"promptStringOnce map path prompt [default]","text":"

        promptStringOnce returns the value of map at path if it exists and is a string value, otherwise it prompts the user for a string value with prompt and an optional default using promptString.

        Example

        {{ $email := promptStringOnce . \"email\" \"What is your email address\" }}\n
        "},{"location":"reference/templates/init-functions/stdinIsATTY/","title":"stdinIsATTY","text":"

        stdinIsATTY returns true if chezmoi's standard input is a TTY. It is primarily useful for determining whether prompt* functions should be called or default values be used.

        Example

        {{ $email := \"\" }}\n{{ if stdinIsATTY }}\n{{   $email = promptString \"email\" }}\n{{ else }}\n{{   $email = \"user@example.com\" }}\n{{ end }}\n
        "},{"location":"reference/templates/init-functions/writeToStdout/","title":"writeToStdout string...","text":"

        writeToStdout writes each string to stdout.

        Example

        {{- writeToStdout \"Hello, world\\n\" -}}\n
        "},{"location":"reference/templates/keepassxc-functions/","title":"KeePassXC functions","text":"

        The keepassxc* template functions return structured data retrieved from a KeePassXC database using the KeePassXC CLI (keepassxc-cli)

        The database is configured by setting keepassxc.database in the configuration file. You will be prompted for the database password the first time keepassxc-cli is run, and the password is cached, in plain text, in memory until chezmoi terminates.

        The command used can be changed by setting the keepassxc.command configuration variable, and extra arguments can be added by setting keepassxc.args. The password prompt can be disabled by setting keepassxc.prompt to false.

        By default, chezmoi will prompt for the KeePassXC password when required and cache it for the duration of chezmoi's execution. Setting keepassxc.mode to open will tell chezmoi to instead open KeePassXC's console with keepassxc-cli open followed by keepassxc.args. chezmoi will use this console to request values from KeePassXC.

        When setting keepassxc.mode to builtin, chezmoi uses a builtin library to access a keepassxc database, which can be handy if keepassxc-cli is not available. Some KeePassXC features (such as Yubikey-enhanced encryption) may not be available with builtin support.

        "},{"location":"reference/templates/keepassxc-functions/keepassxc/","title":"keepassxc entry","text":"

        keepassxc returns structured data for entry using keepassxc-cli.

        The output from keepassxc-cli is parsed into key-value pairs and cached so calling keepassxc multiple times with the same entry will only invoke keepassxc-cli once.

        Example

        username = {{ (keepassxc \"example.com\").UserName }}\npassword = {{ (keepassxc \"example.com\").Password }}\n
        "},{"location":"reference/templates/keepassxc-functions/keepassxcAttachment/","title":"keepassxcAttachment entry name","text":"

        keepassxcAttachment returns the attachment with name of entry using keepassxc-cli.

        Info

        keepassxcAttachment requires keepassxc-cli version 2.7.0 or later.

        Example

        {{- keepassxcAttachment \"SSH Config\" \"config\" -}}\n
        "},{"location":"reference/templates/keepassxc-functions/keepassxcAttribute/","title":"keepassxcAttribute entry attribute","text":"

        keepassxcAttribute returns the attribute attribute of entry using keepassxc-cli, with any leading or trailing whitespace removed.

        Example

        {{ keepassxcAttribute \"SSH Key\" \"private-key\" }}\n
        "},{"location":"reference/templates/keeper-functions/","title":"Keeper functions","text":"

        The keeper* functions return data from Keeper Commander CLI (keeper).

        The command used can by changed by setting the keeper.command configuration variable, and extra arguments can be added by setting keeper.args.

        "},{"location":"reference/templates/keeper-functions/keeper/","title":"keeper uid","text":"

        keeper returns structured data retrieved from Keeper using the Commander CLI. uid is passed to keeper get --format=json and the output is parsed as JSON.

        "},{"location":"reference/templates/keeper-functions/keeperDataFields/","title":"keeperDataFields uid","text":"

        keeperDataFields returns the .data.fields elements of keeper get --format=json *uid* indexed by type.

        "},{"location":"reference/templates/keeper-functions/keeperDataFields/#examples","title":"Examples","text":"
        url = {{ (keeperDataFields \"$UID\").url }}\nlogin = {{ index (keeperDataFields \"$UID\").login 0 }}\npassword = {{ index (keeperDataFields \"$UID\").password 0 }}\n
        "},{"location":"reference/templates/keeper-functions/keeperFindPassword/","title":"keeperFindPassword query","text":"

        keeperFindPassword returns the output of keeper find-password query. query can be a UID or a path.

        "},{"location":"reference/templates/keyring-functions/keyring/","title":"keyring service user","text":"

        keyring retrieves the value associated with service and user from the user's keyring.

        OS Keyring macOS Keychain Linux GNOME Keyring Windows Windows Credentials Manager FreeBSD GNOME Keyring

        Example

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

        Warning

        On FreeBSD, the keyring template function is only available if chezmoi was compiled with cgo enabled. The official release binaries of chezmoi are not compiled with cgo enabled, and keyring will always return an empty string.

        "},{"location":"reference/templates/lastpass-functions/","title":"LastPass functions","text":"

        The lastpass* template functions return structured data from LastPass using the LastPass CLI (lpass).

        "},{"location":"reference/templates/lastpass-functions/lastpass/","title":"lastpass id","text":"

        lastpass returns structured data from LastPass using the LastPass CLI (lpass). id is passed to lpass show --json $ID and the output from lpass is parsed as JSON. In addition, the note field, if present, is further parsed as colon-separated key-value pairs. The structured data is an array so typically the index function is used to extract the first item. The output from lastpass is cached so calling lastpass multiple times with the same id will only invoke lpass once.

        Example

        githubPassword = {{ (index (lastpass \"GitHub\") 0).password | quote }}\n{{ (index (lastpass \"SSH\") 0).note.privateKey }}\n
        "},{"location":"reference/templates/lastpass-functions/lastpassRaw/","title":"lastpassRaw id","text":"

        lastpassRaw returns structured data from LastPass using the LastPass CLI (lpass). It behaves identically to the lastpass function, except that no further parsing is done on the note field.

        Example

        {{ (index (lastpassRaw \"SSH Private Key\") 0).note }}\n
        "},{"location":"reference/templates/pass-functions/","title":"pass functions","text":"

        The pass template functions return passwords stored in pass using the pass CLI (pass).

        Hint

        To use a pass-compatible password manager like passage, set pass.command to the name of the binary and use chezmoi's pass* template functions as if you were using pass.

        ~/.config/chezmoi/chezmoi.toml
        [pass]\n    command = \"passage\"\n
        "},{"location":"reference/templates/pass-functions/pass/","title":"pass pass-name","text":"

        pass returns passwords stored in pass using the pass CLI (pass). pass-name is passed to pass show $PASS_NAME and the first line of the output of pass is returned with the trailing newline stripped. The output from pass is cached so calling pass multiple times with the same pass-name will only invoke pass once.

        Example

        {{ pass \"$PASS_NAME\" }}\n
        "},{"location":"reference/templates/pass-functions/passFields/","title":"passFields pass-name","text":"

        passFields returns structured data stored in pass using the pass CLI (pass). pass-name is passed to pass show $PASS_NAME and the output is parsed as colon-separated key-value pairs, one per line. The return value is a map of keys to values.

        Example

        Given the output from pass:

        GitHub\nlogin: username\npassword: secret\n

        the return value will be the map:

        {\n    \"login\": \"username\",\n    \"password\": \"secret\"\n}\n

        Example

        {{ (passFields \"GitHub\").password }}\n
        "},{"location":"reference/templates/pass-functions/passRaw/","title":"passRaw pass-name","text":"

        passRaw returns passwords stored in pass using the pass CLI (pass). pass-name is passed to pass show $PASS_NAME and the output is returned. The output from pass is cached so calling passRaw multiple times with the same pass-name will only invoke pass once.

        "},{"location":"reference/templates/passhole-functions/","title":"Passhole","text":"

        chezmoi includes support for KeePass using the Passhole CLI (ph).

        "},{"location":"reference/templates/passhole-functions/passhole/","title":"passhole path field","text":"

        passhole returns the field of path from a KeePass database using passhole's ph command.

        Example

        {{ passhole \"example.com\" \"password\" }}\n
        "},{"location":"reference/templates/secret-functions/","title":"Generic secret functions","text":"

        The secret* template functions return the output of the generic secret command defined by the secret.command configuration variable.

        "},{"location":"reference/templates/secret-functions/secret/","title":"secret [arg...]","text":"

        secret returns the output of the generic secret command defined by the secret.command configuration variable with secret.args and args with leading and trailing whitespace removed. The output is cached so multiple calls to secret with the same args will only invoke the generic secret command once.

        "},{"location":"reference/templates/secret-functions/secretJSON/","title":"secretJSON [arg...]","text":"

        secretJSON returns structured data from the generic secret command defined by the secret.command configuration variable with secret.args and args. The output is parsed as JSON. The output is cached so multiple calls to secret with the same args will only invoke the generic secret command once.

        "},{"location":"reference/templates/vault-functions/vault/","title":"vault key","text":"

        vault returns structured data from Vault using the Vault CLI (vault). key is passed to vault kv get -format=json $KEY and the output from vault is parsed as JSON. The output from vault is cached so calling vault multiple times with the same key will only invoke vault once.

        Example

        {{ (vault \"$KEY\").data.data.password }}\n
        "},{"location":"user-guide/command-overview/","title":"Command overview","text":""},{"location":"user-guide/command-overview/#getting-started","title":"Getting started","text":"
        • chezmoi doctor checks for common problems. If you encounter something unexpected, run this first.

        • chezmoi init creates chezmoi's source directory and a git repo on a new machine.

        "},{"location":"user-guide/command-overview/#daily-commands","title":"Daily commands","text":"
        • chezmoi add $FILE adds $FILEfrom your home directory to the source directory.

        • chezmoi edit $FILE opens your editor with the file in the source directory that corresponds to $FILE.

        • chezmoi status gives a quick summary of what files would change if you ran chezmoi apply.

        • chezmoi diff shows the changes that chezmoi apply would make to your home directory.

        • chezmoi apply updates your dotfiles from the source directory.

        • chezmoi edit --apply $FILE is like chezmoi edit $FILE but also runs chezmoi apply $FILE afterwards.

        • chezmoi cd opens a subshell in the source directory.

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo H->>W: chezmoi add <file> W->>W: chezmoi edit <file> W-->>H: chezmoi status W-->>H: chezmoi diff W->>H: chezmoi apply W->>H: chezmoi edit --apply <file> H-->>W: chezmoi cd"},{"location":"user-guide/command-overview/#using-chezmoi-across-multiple-machines","title":"Using chezmoi across multiple machines","text":"
        • chezmoi init $GITHUB_USERNAME clones your dotfiles from GitHub into the source directory.

        • chezmoi init --apply $GITHUB_USERNAME clones your dotfiles from GitHub into the source directory and runs chezmoi apply.

        • chezmoi update pulls the latest changes from your remote repo and runs chezmoi apply.

        • Use normal git commands to add, commit, and push changes to your remote repo.

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init <github-username> R->>H: chezmoi init --apply <github-username> R->>H: chezmoi update <github-username> W->>L: git commit L->>R: git push"},{"location":"user-guide/command-overview/#working-with-templates","title":"Working with templates","text":"
        • chezmoi data prints the available template data.

        • chezmoi add --template $FILE adds $FILE as a template.

        • chezmoi chattr +template $FILE makes an existing file a template.

        • chezmoi cat $FILE prints the target contents of $FILE, without changing $FILE.

        • chezmoi execute-template is useful for testing and debugging templates.

        "},{"location":"user-guide/daily-operations/","title":"Daily operations","text":""},{"location":"user-guide/daily-operations/#edit-your-dotfiles","title":"Edit your dotfiles","text":"

        Edit a dotfile with:

        chezmoi edit $FILENAME\n

        This will edit $FILENAME's source file in your source directory. chezmoi will not make any changes to the actual dotfile until you run chezmoi apply.

        To automatically run chezmoi apply when you quit your editor, run:

        chezmoi edit --apply $FILENAME\n

        To automatically run chezmoi apply whenever you save the file in your editor, run:

        chezmoi edit --watch $FILENAME\n

        You don't have to use chezmoi edit to edit your dotfiles. For more information, see Do I have to use chezmoi edit to edit my dotfiles?

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo W->>W: chezmoi edit W->>H: chezmoi apply W->>H: chezmoi edit --apply W->>H: chezmoi edit --watch"},{"location":"user-guide/daily-operations/#pull-the-latest-changes-from-your-repo-and-apply-them","title":"Pull the latest changes from your repo and apply them","text":"

        You can pull the changes from your repo and apply them in a single command:

        chezmoi update\n

        This runs git pull --autostash --rebase in your source directory and then chezmoi apply.

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>H: chezmoi update"},{"location":"user-guide/daily-operations/#pull-the-latest-changes-from-your-repo-and-see-what-would-change-without-actually-applying-the-changes","title":"Pull the latest changes from your repo and see what would change, without actually applying the changes","text":"

        Run:

        chezmoi git pull -- --autostash --rebase && chezmoi diff\n

        This runs git pull --autostash --rebase in your source directory and chezmoi diff then shows the difference between the target state computed from your source directory and the actual state.

        If you're happy with the changes, then you can run

        chezmoi apply\n

        to apply them.

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi git pull W-->>H: chezmoi diff W->>H: chezmoi apply"},{"location":"user-guide/daily-operations/#automatically-commit-and-push-changes-to-your-repo","title":"Automatically commit and push changes to your repo","text":"

        chezmoi can automatically commit and push changes to your source directory to your repo. This feature is disabled by default. To enable it, add the following to your config file:

        ~/.config/chezmoi/chezmoi.toml
        [git]\n    autoCommit = true\n    autoPush = true\n

        Whenever a change is made to your source directory, chezmoi will commit the changes with an automatically-generated commit message (if autoCommit is true) and push them to your repo (if autoPush is true). autoPush implies autoCommit, i.e. if autoPush is true then chezmoi will auto-commit your changes. If you only set autoCommit to true then changes will be committed but not pushed.

        By default, autoCommit will generate a commit message based on the files changed. You can override this by setting the git.commitMessageTemplate configuration variable. For example, to have chezmoi prompt you for a commit message each time, use:

        ~/.config/chezmoi/chezmoi.toml
        [git]\n    autoCommit = true\n    commitMessageTemplate = \"{{ promptString \\\"Commit message\\\" }}\"\n

        If your commit message is longer than fits in a string then you can set git.commitMessageTemplateFile to specify a path to the commit message template relative to the source directory, for example:

        ~/.config/chezmoi/chezmoi.toml
        [git]\n    autoCommit = true\n    commitMessageTemplateFile = \".commit_message.tmpl\"\n

        Be careful when using autoPush. If your dotfiles repo is public and you accidentally add a secret in plain text, that secret will be pushed to your public repo.

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo W->>L: autoCommit W->>R: autoPush"},{"location":"user-guide/daily-operations/#install-chezmoi-and-your-dotfiles-on-a-new-machine-with-a-single-command","title":"Install chezmoi and your dotfiles on a new machine with a single command","text":"

        chezmoi's install script can run chezmoi init for you by passing extra arguments to the newly installed chezmoi binary. If your dotfiles repo is github.com/$GITHUB_USERNAME/dotfiles then installing chezmoi, running chezmoi init, and running chezmoi apply can be done in a single line of shell:

        sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply $GITHUB_USERNAME\n

        If your dotfiles repo has a different name to dotfiles, or if you host your dotfiles on a different service, then see the reference manual for chezmoi init.

        For setting up transitory environments (e.g. short-lived Linux containers) you can install chezmoi, install your dotfiles, and then remove all traces of chezmoi, including the source directory and chezmoi's configuration directory, with a single command:

        sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --one-shot $GITHUB_USERNAME\n
        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init $GITHUB_USERNAME R->>H: chezmoi init --apply $GITHUB_USERNAME R->>H: chezmoi init --one-shot $GITHUB_USERNAME"},{"location":"user-guide/include-files-from-elsewhere/","title":"Include dotfiles from elsewhere","text":"

        The sections below contain examples of how to use .chezmoiexternal.toml to include files from external sources. For more details, check the reference manual .

        "},{"location":"user-guide/include-files-from-elsewhere/#include-a-subdirectory-from-a-url","title":"Include a subdirectory from a URL","text":"

        To include a subdirectory from another repository, e.g. Oh My Zsh, you cannot use git submodules because chezmoi uses its own format for the source state and Oh My Zsh is not distributed in this format. Instead, you can use the .chezmoiexternal.$FORMAT to tell chezmoi to import dotfiles from an external source.

        For example, to import Oh My Zsh, the zsh-syntax-highlighting plugin, and powerlevel10k, put the following in ~/.local/share/chezmoi/.chezmoiexternal.toml:

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

        To apply the changes, run:

        chezmoi apply\n

        chezmoi will download the archives and unpack them as if they were part of the source state. chezmoi caches downloaded archives locally to avoid re-downloading them every time you run a chezmoi command, and will only re-download them at most every refreshPeriod (default never).

        In the above example refreshPeriod is set to 168h (one week) for .oh-my-zsh and .oh-my-zsh/custom/plugins/zsh-syntax-highlighting because the URL point to tarballs of the master branch, which changes over time. No refresh period is set for .oh-my-zsh/custom/themes/powerlevel10k because the URL points to the a tarball of a tagged version, which does not change over time. To bump the version of powerlevel10k, change the version in the URL.

        To force a refresh the downloaded archives, use the --refresh-externals flag to chezmoi apply:

        chezmoi --refresh-externals apply\n

        --refresh-externals can be shortened to -R:

        chezmoi -R apply\n

        When using Oh My Zsh, make sure you disable auto-updates by setting DISABLE_AUTO_UPDATE=\"true\" in ~/.zshrc. Auto updates will cause the ~/.oh-my-zsh directory to drift out of sync with chezmoi's source state. To update Oh My Zsh and its plugins, refresh the downloaded archives.

        Note

        If your external dependency target directory can contain cache files that are added during normal use, chezmoi will report that files have changed on chezmoi apply. To avoid this, add the cache directory to your .chezmoiignore file.

        For example, Oh My Zsh may cache completions in .oh-my-zsh/cache/completions/, which should be added to your .chezmoiignore file.

        Warning

        Do not use externals for large files or archives. chezmoi validates the exact contents of externals every time you run chezmoi diff, chezmoi apply, or chezmoi verify. For large externals, use a run_once_ or run_onchange_ script to unpack the archive or file once instead.

        "},{"location":"user-guide/include-files-from-elsewhere/#include-a-subdirectory-with-selected-files-from-a-url","title":"Include a subdirectory with selected files from a URL","text":"

        Use include pattern filters to include only selected files from an archive URL.

        For example, to import just the required source files of the zsh-syntax-highlighting plugin in the example above, add in include filter to the zsh-syntax-highlighting section as shown below:

        ~/.local/share/chezmoi/.chezmoiexternal.toml
        [\".oh-my-zsh/custom/plugins/zsh-syntax-highlighting\"]\n    type = \"archive\"\n    url = \"https://github.com/zsh-users/zsh-syntax-highlighting/archive/master.tar.gz\"\n    exact = true\n    stripComponents = 1\n    refreshPeriod = \"168h\"\n    include = [\"*/*.zsh\", \"*/.version\", \"*/.revision-hash\", \"*/highlighters/**\"]\n
        "},{"location":"user-guide/include-files-from-elsewhere/#include-a-single-file-from-a-url","title":"Include a single file from a URL","text":"

        Including single files uses the same mechanism as including a subdirectory above, except with the external type file instead of archive. For example, to include plug.vim from github.com/junegunn/vim-plug in ~/.vim/autoload/plug.vim put the following in ~/.local/share/chezmoi/.chezmoiexternal.toml:

        ~/.local/share/chezmoi/.chezmoiexternal.toml
        [\".vim/autoload/plug.vim\"]\n    type = \"file\"\n    url = \"https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim\"\n    refreshPeriod = \"168h\"\n
        "},{"location":"user-guide/include-files-from-elsewhere/#extract-a-single-file-from-an-archive","title":"Extract a single file from an archive","text":"

        You can extract a single file from an archive using the archive-file type in .chezmoiexternal.$FORMAT, for example:

        ~/.local/share/chezmoi/.chezmoiexternal.toml
        {{ $ageVersion := \"1.1.1\" -}}\n[\".local/bin/age\"]\n    type = \"archive-file\"\n    url = \"https://github.com/FiloSottile/age/releases/download/v{{ $ageVersion }}/age-v{{ $ageVersion }}-{{ .chezmoi.os }}-{{ .chezmoi.arch }}.tar.gz\"\n    path = \"age/age\"\n

        This will extract the single archive member age/age from the given URL (which is computed for the current OS and architecture) to the target ./local/bin/age.

        "},{"location":"user-guide/include-files-from-elsewhere/#import-archives","title":"Import archives","text":"

        It is occasionally useful to import entire archives of configuration into your source state. The import command does this. For example, to import the latest version github.com/ohmyzsh/ohmyzsh to ~/.oh-my-zsh run:

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

        Note

        This only updates the source state. You will need to run:

        chezmoi apply\n

        to update your destination directory.

        "},{"location":"user-guide/include-files-from-elsewhere/#handle-tar-archives-in-an-unsupported-compression-format","title":"Handle tar archives in an unsupported compression format","text":"

        chezmoi natively understands tar archives. tar archives can be uncompressed or compressed in the bzip2, gzip, xz, or zstd formats.

        If you have a tar archive in an unsupported compression format then you can use a filter to decompress it. For example, before chezmoi natively supported the zstd compression format, you could handle .tar.zst external archives with, for example:

        ~/.local/share/chezmoi/.chezmoiexternal.toml
        [\".Software/anki/2.1.54-qt6\"]\n    type = \"archive\"\n    url = \"https://github.com/ankitects/anki/releases/download/2.1.54/anki-2.1.54-linux-qt6.tar.zst\"\n    filter.command = \"zstd\"\n    filter.args = [\"-d\"]\n    format = \"tar\"\n

        Here filter.command and filter.args together tell chezmoi to filter the downloaded data through zstd -d. The format = \"tar\" line tells chezmoi that output of the filter is an uncompressed tar archive.

        "},{"location":"user-guide/include-files-from-elsewhere/#include-a-subdirectory-from-a-git-repository","title":"Include a subdirectory from a git repository","text":"

        You can configure chezmoi to keep a git repository up to date in a subdirectory by using the external type git-repo, for example:

        ~/.local/share/chezmoi/.chezmoiexternal.toml
        [\".vim/pack/alker0/chezmoi.vim\"]\n    type = \"git-repo\"\n    url = \"https://github.com/alker0/chezmoi.vim.git\"\n    refreshPeriod = \"168h\"\n

        If the directory does not exist then chezmoi will run git clone to clone it. If the directory does exist then chezmoi will run git pull to pull the latest changes, but not more often than every refreshPeriod. In the above example the refreshPeriod is 168h which is one week. The default refreshPeriod is zero, which disables refreshes. You can force a refresh (i.e. force a git pull) by passing the --refresh-externals/-R flag to chezmoi apply.

        Warning

        chezmoi's support for git-repo externals is limited to running git clone and/or git pull in a directory. You must have a git binary in your $PATH.

        Using a git-repo external delegates management of the directory to git. chezmoi cannot manage any other files in that directory.

        The contents of git-repo externals will not be manifested in commands like chezmoi diff or chezmoi dump, and will be listed by chezmoi unmanaged.

        Hint

        If you need to manage extra files in a git-repo external, use an archive external instead with the URL pointing to an archive of the git repo's master or main branch.

        You can customize the arguments to git clone and git pull by setting the $DIR.clone.args and $DIR.pull.args variables in .chezmoiexternal.$FORMAT, for example:

        ~/.local/share/chezmoi/.chezmoiexternal.toml
        [\".vim/pack/alker0/chezmoi.vim\"]\n    type = \"git-repo\"\n    url = \"https://github.com/alker0/chezmoi.vim.git\"\n    refreshPeriod = \"168h\"\n    [\".vim/pack/alker0/chezmoi.vim\".pull]\n        args = [\"--ff-only\"]\n
        "},{"location":"user-guide/include-files-from-elsewhere/#use-git-submodules-in-your-source-directory","title":"Use git submodules in your source directory","text":"

        Important

        If you use git submodules, then you should set the external_ attribute on the subdirectory containing the submodule.

        You can include git repos from elsewhere as git submodules in your source directory. chezmoi init and chezmoi update are aware of git submodules and will run git with the --recurse-submodules flag by default.

        chezmoi assumes that all files and directories in its source state are in chezmoi's format, i.e. their filenames include attributes like private_ and run_. Most git submodules are not in chezmoi's format and so files like run_test.sh will be interpreted by chezmoi as a run_ script. To avoid this problem, set the external_ attribute on all subdirectories that contain submodules.

        You can stop chezmoi from handling git submodules by passing the --recurse-submodules=false flag or setting the update.recurseSubmodules configuration variable to false.

        "},{"location":"user-guide/manage-different-types-of-file/","title":"Manage different types of file","text":""},{"location":"user-guide/manage-different-types-of-file/#have-chezmoi-create-a-directory-but-ignore-its-contents","title":"Have chezmoi create a directory, but ignore its contents","text":"

        If you want chezmoi to create a directory, but ignore its contents, say ~/src, first run:

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

        This creates the directory in the source state, which means that chezmoi will create it (if it does not already exist) when you run chezmoi apply.

        However, as this is an empty directory it will be ignored by git. So, create a file in the directory in the source state that will be seen by git (so git does not ignore the directory) but ignored by chezmoi (so chezmoi does not include it in the target state):

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

        chezmoi automatically creates .keep files when you add an empty directory with chezmoi add.

        "},{"location":"user-guide/manage-different-types-of-file/#ensure-that-a-target-is-removed","title":"Ensure that a target is removed","text":"

        Create a file called .chezmoiremove in the source directory containing a list of patterns of files to remove. chezmoi will remove anything in the target directory that matches the pattern. As this command is potentially dangerous, you should run chezmoi in verbose, dry-run mode beforehand to see what would be removed:

        chezmoi apply --dry-run --verbose\n

        .chezmoiremove is interpreted as a template, so you can remove different files on different machines. Negative matches (patterns prefixed with a !) or targets listed in .chezmoiignore will never be removed.

        "},{"location":"user-guide/manage-different-types-of-file/#manage-part-but-not-all-of-a-file","title":"Manage part, but not all, of a file","text":"

        chezmoi, by default, manages whole files, but there are two ways to manage just parts of a file.

        Firstly, a modify_ script receives the current contents of the file on the standard input and chezmoi reads the target contents of the file from the script's standard output. This can be used to change parts of a file, for example using sed.

        Hint

        If you need random access to the file to modify it, then you can write standard input to a temporary file, modify the temporary file, and then write the temporary file to the standard output, for example:

        #!/bin/sh\ntempfile=\"$(mktemp)\"\ntrap 'rm -rf \"${tempfile}\"' EXIT\ncat > \"${tempfile}\"\n# modify ${tempfile}\ncat \"${tempfile}\"\n

        Note

        If the file does not exist then the standard input to the modify_ script will be empty and it is the script's responsibility to write a complete file to the standard output.

        modify_ scripts that contain the string chezmoi:modify-template are executed as templates with the current contents of the file passed as .chezmoi.stdin and the result of the template execution used as the new contents of the file.

        Example

        To replace the string old with new in a file while leaving the rest of the file unchanged, use the modify script:

        {{- /* chezmoi:modify-template */ -}}\n{{- .chezmoi.stdin | replaceAllRegex \"old\" \"new\" }}\n

        To set individual values in JSON, JSONC, TOML, and YAML files you can use the setValueAtPath template function, for example:

        {{- /* chezmoi:modify-template */ -}}\n{{ fromJson .chezmoi.stdin | setValueAtPath \"key.nestedKey\" \"value\" | toPrettyJson }}\n

        Warning

        Modify templates must not have a .tmpl extension.

        Secondly, if only a small part of the file changes then consider using a template to re-generate the full contents of the file from the current state. For example, Kubernetes configurations include a current context that can be substituted with:

        ~/.local/share/chezmoi/dot_kube/config.tmpl
        current-context: {{ output \"kubectl\" \"config\" \"current-context\" | trim }}\n

        Hint

        For managing ini files with a mix of settings and state (such as recently used files or window positions), there is a third party tool called chezmoi_modify_manager that builds upon modify_ scripts. See related software for more information.

        "},{"location":"user-guide/manage-different-types-of-file/#manage-a-files-permissions-but-not-its-contents","title":"Manage a file's permissions, but not its contents","text":"

        chezmoi's create_ attributes allows you to tell chezmoi to create a file if it does not already exist. chezmoi, however, will apply any permission changes from the executable_, private_, and readonly_ attributes. This can be used to control a file's permissions without altering its contents.

        For example, if you want to ensure that ~/.kube/config always has permissions 600 then if you create an empty file called dot_kube/private_config in your source state, chezmoi will ensure ~/.kube/config's permissions are 0600 when you run chezmoi apply without changing its contents.

        This approach does have the downside that chezmoi will create the file if it does not already exist. If you only want chezmoi apply to set a file's permissions if it already exists and not create the file otherwise, you can use a run_ script. For example, create a file in your source state called run_set_kube_config_permissions.sh containing:

        #!/bin/sh\n\nFILE=\"$HOME/.kube/config\"\nif [ -f \"$FILE\" ]; then\n    if [ \"$(stat -c %a \"$FILE\")\" != \"600\" ] ; then\n        chmod 600 \"$FILE\"\n    fi\nfi\n
        "},{"location":"user-guide/manage-different-types-of-file/#handle-configuration-files-which-are-externally-modified","title":"Handle configuration files which are externally modified","text":"

        Some programs modify their configuration files. When you next run chezmoi apply, any modifications made by the program will be lost.

        You can track changes to these files by replacing with a symlink back to a file in your source directory, which is under version control. Here is a worked example for VSCode's settings.json on Linux:

        Copy the configuration file to your source directory:

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

        Tell chezmoi to ignore this file:

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

        Tell chezmoi that ~/.config/Code/User/settings.json should be a symlink to the file in your source directory:

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

        The prefix private_ is used because the ~/.config and ~/.config/Code directories are private by default.

        Apply the changes:

        chezmoi apply -v\n

        Now, when the program modifies its configuration file it will modify the file in the source state instead.

        "},{"location":"user-guide/manage-different-types-of-file/#populate-sshauthorized_keys-with-your-public-ssh-keys-from-github","title":"Populate ~/.ssh/authorized_keys with your public SSH keys from GitHub","text":"

        chezmoi can retrieve your public SSH keys from GitHub, which can be useful for populating your ~/.ssh/authorized_keys. Put the following in your ~/.local/share/chezmoi/dot_ssh/authorized_keys.tmpl:

        {{ range gitHubKeys \"$GITHUB_USERNAME\" -}}\n{{   .Key }}\n{{ end -}}\n
        "},{"location":"user-guide/manage-machine-to-machine-differences/","title":"Manage machine-to-machine differences","text":""},{"location":"user-guide/manage-machine-to-machine-differences/#use-templates","title":"Use templates","text":"

        The primary goal of chezmoi is to manage configuration files across multiple machines, for example your personal macOS laptop, your work Ubuntu desktop, and your work Linux laptop. You will want to keep much configuration the same across these, but also need machine-specific configurations for email addresses, credentials, etc. chezmoi achieves this functionality by using text/template for the source state where needed.

        For example, your home ~/.gitconfig on your personal machine might look like:

        ~/.gitconfig
        [user]\n    email = \"me@home.org\"\n

        Whereas at work it might be:

        ~/.gitconfig
        [user]\n    email = \"firstname.lastname@company.com\"\n

        To handle this, on each machine create a configuration file called ~/.config/chezmoi/chezmoi.toml defining variables that might vary from machine to machine. For example, for your home machine:

        ~/.config/chezmoi/chezmoi.toml
        [data]\n    email = \"me@home.org\"\n

        If you intend to store private data (e.g. access tokens) in ~/.config/chezmoi/chezmoi.toml, make sure it has permissions 0600.

        If you prefer, you can use JSON, JSONC, or YAML for your configuration file. Variable names must start with a letter and be followed by zero or more letters or digits.

        Then, add ~/.gitconfig to chezmoi using the --template flag to turn it into a template:

        chezmoi add --template ~/.gitconfig\n

        You can then open the template (which will be saved in the file ~/.local/share/chezmoi/dot_gitconfig.tmpl):

        chezmoi edit ~/.gitconfig\n

        Edit the file so it looks something like:

        ~/.local/share/chezmoi/dot_gitconfig.tmpl
        [user]\n    email = {{ .email | quote }}\n

        Templates are often used to capture machine-specific differences. For example, in your ~/.local/share/chezmoi/dot_bashrc.tmpl you might have:

        ~/.local/share/chezmoi/dot_bashrc.tmpl
        # common config\nexport EDITOR=vi\n\n# machine-specific configuration\n{{- if eq .chezmoi.hostname \"work-laptop\" }}\n# this will only be included in ~/.bashrc on work-laptop\n{{- end }}\n

        For a full list of variables, run:

        chezmoi data\n

        For more advanced usage, you can use the full power of the text/template language. chezmoi includes all of the text functions from sprig and its own functions for interacting with password managers.

        Templates can be executed directly from the command line, without the need to create a file on disk, with the execute-template command, for example:

        chezmoi execute-template \"{{ .chezmoi.os }}/{{ .chezmoi.arch }}\"\n

        This is useful when developing or debugging templates.

        Some password managers allow you to store complete files. The files can be retrieved with chezmoi's template functions. For example, if you have a file stored in 1Password with the UUID uuid then you can retrieve it with the template:

        {{- onepasswordDocument \"uuid\" -}}\n

        The -s inside the brackets remove any whitespace before or after the template expression, which is useful if your editor has added any newlines.

        If, after executing the template, the file contents are empty, the target file will be removed. This can be used to ensure that files are only present on certain machines. If you want an empty file to be created anyway, you will need to give it an empty_ prefix.

        "},{"location":"user-guide/manage-machine-to-machine-differences/#ignore-files-or-a-directory-on-different-machines","title":"Ignore files or a directory on different machines","text":"

        For coarser-grained control of files and entire directories managed on different machines, or to exclude certain files completely, you can create .chezmoiignore files in the source directory. These specify a list of patterns that chezmoi should ignore, and are interpreted as templates. An example .chezmoiignore file might look like:

        ~/.local/share/chezmoi/.chezmoiignore
        README.md\n{{- if ne .chezmoi.hostname \"work-laptop\" }}\n.work # only manage .work on work-laptop\n{{- end }}\n

        The use of ne (not equal) is deliberate. What we want to achieve is \"only install .work if hostname is work-laptop\" but chezmoi installs everything by default, so we have to turn the logic around and instead write \"ignore .work unless the hostname is work-laptop\".

        Patterns can be excluded by starting the line with a !, for example:

        ~/.local/share/chezmoi/.chezmoiignore
        dir/f*\n!dir/foo\n

        will ignore all files beginning with an f in dir except for dir/foo.

        You can see what files chezmoi ignores with the command

        chezmoi ignored\n
        "},{"location":"user-guide/manage-machine-to-machine-differences/#handle-different-file-locations-on-different-systems-with-the-same-contents","title":"Handle different file locations on different systems with the same contents","text":"

        If you want to have the same file contents in different locations on different systems, but maintain only a single file in your source state, you can use a shared template.

        Create the common file in the .chezmoitemplates directory in the source state. For example, create .chezmoitemplates/file.conf. The contents of this file are available in templates with the template $NAME . function where $NAME is the name of the file (. passes the current data to the template code in file.conf; see template action for details).

        Then create files for each system, for example Library/Application Support/App/file.conf.tmpl for macOS and dot_config/app/file.conf.tmpl for Linux. Both template files should contain {{- template \"file.conf\" . -}}.

        Finally, tell chezmoi to ignore files where they are not needed by adding lines to your .chezmoiignore file, for example:

        ~/.local/share/chezmoi/.chezmoiignore
        {{ if ne .chezmoi.os \"darwin\" }}\nLibrary/Application Support/App/file.conf\n{{ end }}\n{{ if ne .chezmoi.os \"linux\" }}\n.config/app/file.conf\n{{ end }}\n
        "},{"location":"user-guide/manage-machine-to-machine-differences/#use-completely-different-dotfiles-on-different-machines","title":"Use completely different dotfiles on different machines","text":"

        chezmoi's template functionality allows you to change a file's contents based on any variable. For example, if you want ~/.bashrc to be different on Linux and macOS you would create a file in the source state called dot_bashrc.tmpl containing:

        ~/.local/share/chezmoi/dot_bashrc.tmpl
        {{ if eq .chezmoi.os \"darwin\" -}}\n# macOS .bashrc contents\n{{ else if eq .chezmoi.os \"linux\" -}}\n# Linux .bashrc contents\n{{ end -}}\n

        However, if the differences between the two versions are so large that you'd prefer to use completely separate files in the source state, you can achieve this with the include template function.

        Create the following files:

        ~/.local/share/chezmoi/.bashrc_darwin
        # macOS .bashrc contents\n
        ~/.local/share/chezmoi/.bashrc_linux
        # Linux .bashrc contents\n
        ~/.local/share/chezmoi/dot_bashrc.tmpl
        {{- if eq .chezmoi.os \"darwin\" -}}\n{{-   include \".bashrc_darwin\" -}}\n{{- else if eq .chezmoi.os \"linux\" -}}\n{{-   include \".bashrc_linux\" -}}\n{{- end -}}\n

        This will cause ~/.bashrc to contain ~/.local/share/chezmoi/.bashrc_darwin on macOS and ~/.local/share/chezmoi/.bashrc_linux on Linux.

        If you want to use templates within your templates, then, instead, create:

        ~/.local/share/chezmoi/.chezmoitemplates/bashrc_darwin.tmpl
        # macOS .bashrc template contents\n
        ~/.local/share/chezmoi/.chezmoitemplates/bashrc_linux.tmpl
        # Linux .bashrc template contents\n
        ~/.local/share/chezmoi/dot_bashrc.tmpl
        {{- if eq .chezmoi.os \"darwin\" -}}\n{{-   template \"bashrc_darwin.tmpl\" . -}}\n{{- else if eq .chezmoi.os \"linux\" -}}\n{{-   template \"bashrc_linux.tmpl\" . -}}\n{{- end -}}\n
        "},{"location":"user-guide/setup/","title":"Setup","text":""},{"location":"user-guide/setup/#understand-chezmois-files-and-directories","title":"Understand chezmoi's files and directories","text":"

        chezmoi generates your dotfiles for your local machine. It combines two main sources of data:

        The source directory, ~/.local/share/chezmoi, is common to all your machines, and is a clone of your dotfiles repo. Each file that chezmoi manages has a corresponding file in the source directory.

        The config file, typically ~/.config/chezmoi/chezmoi.toml (although you can use JSON or YAML if you prefer), is specific to the local machine.

        Files whose contents are the same on all of your machines are copied verbatim from the source directory. Files which vary from machine to machine are executed as templates, typically using data from the local machine's config file to tune the final contents specific to the local machine.

        "},{"location":"user-guide/setup/#use-a-hosted-repo-to-manage-your-dotfiles-across-multiple-machines","title":"Use a hosted repo to manage your dotfiles across multiple machines","text":"

        chezmoi relies on your version control system and hosted repo to share changes across multiple machines. You should create a repo on the source code repository of your choice (e.g. Bitbucket, GitHub, or GitLab, many people call their repo dotfiles) and push the repo in the source directory here. For example:

        chezmoi cd\ngit remote add origin https://github.com/$GITHUB_USERNAME/dotfiles.git\ngit push -u origin main\nexit\n

        On another machine you can checkout this repo:

        chezmoi init https://github.com/$GITHUB_USERNAME/dotfiles.git\n

        You can then see what would be changed:

        chezmoi diff\n

        If you're happy with the changes then apply them:

        chezmoi apply\n

        The above commands can be combined into a single init, checkout, and apply:

        chezmoi init --apply --verbose https://github.com/$GITHUB_USERNAME/dotfiles.git\n

        These commands are summarized this sequence diagram:

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init <repo> W-->>H: chezmoi diff W->>H: chezmoi apply R->>H: chezmoi init --apply <repo>"},{"location":"user-guide/setup/#use-a-private-repo-to-store-your-dotfiles","title":"Use a private repo to store your dotfiles","text":"

        chezmoi supports storing your dotfiles in both public and private repos.

        chezmoi is designed so that your dotfiles repo can be public by making it easy for you to store your secrets either in your password manager, in encrypted files, or in private configuration files. Your dotfiles repo can still be private, if you choose.

        If you use a private repo for your dotfiles then you will typically need to enter your credentials (e.g. your username and password) each time you interact with the repo, for example when pulling or pushing changes. chezmoi itself does not store any credentials, but instead relies on your local git configuration for these operations.

        When using a private repo on GitHub without --ssh, when prompted for a password you will need to enter a GitHub personal access token. For more information on these changes, read the GitHub blog post on Token authentication requirements for Git operations

        "},{"location":"user-guide/setup/#create-a-config-file-on-a-new-machine-automatically","title":"Create a config file on a new machine automatically","text":"

        chezmoi init can also create a config file automatically, if one does not already exist. If your repo contains a file called .chezmoi.$FORMAT.tmpl where $FORMAT is one of the supported config file formats (e.g. json, jsonc, toml, or yaml) then chezmoi init will execute that template to generate your initial config file.

        Specifically, if you have .chezmoi.toml.tmpl that looks like this:

        ~/.local/share/chezmoi/.chezmoi.toml.tmpl
        {{- $email := promptStringOnce . \"email\" \"Email address\" -}}\n\n[data]\n    email = {{ $email | quote }}\n

        Then chezmoi init will create an initial chezmoi.toml using this template. promptStringOnce is a special function that prompts the user (you) for a value if it is not already set in your data.

        To test this template, use chezmoi execute-template with the --init and --promptString flags, for example:

        chezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl\n
        "},{"location":"user-guide/setup/#re-create-your-config-file","title":"Re-create your config file","text":"

        If you change your config file template, chezmoi will warn you if your current config file was not generated from that template. You can re-generate your config file by running:

        chezmoi init\n

        If you are using any prompt* template functions in your config file template you will be prompted again. However, you can avoid this with the following example template logic:

        {{- $email := promptStringOnce . \"email\" \"Email address\" -}}\n\n[data]\n    email = {{ $email | quote }}\n

        This will cause chezmoi use the email variable from your data and fallback to promptString only if it is not set.

        "},{"location":"user-guide/templating/","title":"Templating","text":""},{"location":"user-guide/templating/#introduction","title":"Introduction","text":"

        Templates are used to change the contents of a file depending on the environment. For example, you can use the hostname of the machine to create different configurations on different machines.

        chezmoi uses the text/template syntax from Go extended with text template functions from sprig.

        When reading files from the source state, chezmoi interprets them as a template if either of the following is true:

        • The file name has a .tmpl suffix.

        • The file is in the .chezmoitemplates directory, or a subdirectory of .chezmoitemplates.

        "},{"location":"user-guide/templating/#template-data","title":"Template data","text":"

        chezmoi provides a variety of template variables. For a full list, run

        chezmoi data\n

        These come from a variety of sources (later data overwrite earlier ones):

        • Variables populated by chezmoi are in .chezmoi, for example .chezmoi.os.

        • Variables created by you in the .chezmoidata.$FORMAT configuration file. The various supported formats (json, jsonc, toml and yaml) are read in alphabetical order.

        • Variables created by you in the data section of the configuration file.

        Furthermore, chezmoi provides a variety of functions to retrieve data at runtime from password managers, environment variables, and the filesystem.

        "},{"location":"user-guide/templating/#creating-a-template-file","title":"Creating a template file","text":"

        There are several ways to create a template:

        • When adding a file for the first time, pass the --template argument, for example:

          chezmoi add --template ~/.zshrc\n
        • If a file is already managed by chezmoi, but is not a template, you can make it a template by running, for example:

          chezmoi chattr +template ~/.zshrc\n
        • You can create a template manually in the source directory by giving it a .tmpl extension, for example:

          chezmoi cd\n$EDITOR dot_zshrc.tmpl\n
        • Templates in .chezmoitemplates must be created manually, for example:

          chezmoi cd\nmkdir -p .chezmoitemplates\ncd .chezmoitemplates\n$EDITOR mytemplate\n
        "},{"location":"user-guide/templating/#editing-a-template-file","title":"Editing a template file","text":"

        The easiest way to edit a template is to use chezmoi edit, for example:

        chezmoi edit ~/.zshrc\n

        This will open the source file for ~/.zshrc in $EDITOR. When you quit the editor, chezmoi will check the template syntax.

        If you want the changes you make to be immediately applied after you quit the editor, use the --apply option, for example:

        chezmoi edit --apply ~/.zshrc\n
        "},{"location":"user-guide/templating/#testing-templates","title":"Testing templates","text":"

        Templates can be tested and debugged with chezmoi execute-template, which treats each of its arguments as a template and executes it. The templates are interpreted and the results are output to standard output, making it useful for testing small template fragments:

        chezmoi execute-template '{{ .chezmoi.hostname }}'\n

        Without arguments, chezmoi execute-template will read the template from standard input, which is useful for testing whole files:

        chezmoi cd\nchezmoi execute-template < dot_zshrc.tmpl\n

        If file redirection does not work (as when using PowerShell), the contents of a file can be piped into chezmoi execute-template:

        cat foo.txt | chezmoi execute-template\n
        "},{"location":"user-guide/templating/#template-syntax","title":"Template syntax","text":"

        Template actions are written inside double curly brackets, {{ and }}. Actions can be variables, pipelines, or control statements. Text outside actions is copied literally.

        Variables are written literally, for example:

        {{ .chezmoi.hostname }}\n

        Conditional expressions can be written using if, else if, else, and end, for example:

        {{ if eq .chezmoi.os \"darwin\" }}\n# darwin\n{{ else if eq .chezmoi.os \"linux\" }}\n# linux\n{{ else }}\n# other operating system\n{{ end }}\n

        For a full description of the template syntax, see the text/template documentation.

        "},{"location":"user-guide/templating/#removing-whitespace","title":"Removing whitespace","text":"

        For formatting reasons you might want to leave some whitespace after or before the template code. This whitespace will remain in the final file, which you might not want.

        A solution for this is to place a minus sign and a space next to the brackets. So {{- for the left brackets and -}} for the right brackets. Here's an example:

        HOSTNAME={{- .chezmoi.hostname }}\n

        This will result in

        HOSTNAME=myhostname\n

        Notice that this will remove any number of tabs, spaces and even newlines and carriage returns.

        "},{"location":"user-guide/templating/#simple-logic","title":"Simple logic","text":"

        A very useful feature of chezmoi templates is the ability to perform logical operations.

        # common config\nexport EDITOR=vi\n\n# machine-specific configuration\n{{- if eq .chezmoi.hostname \"work-laptop\" }}\n# this will only be included in ~/.bashrc on work-laptop\n{{- end }}\n

        In this example chezmoi will look at the hostname of the machine and if that is equal to \"work-laptop\", the text between the if and the end will be included in the result.

        "},{"location":"user-guide/templating/#boolean-functions","title":"Boolean functions","text":"Function Return value eq Returns true if the first argument is equal to any of the other arguments not Returns the boolean negation of its single argument and Returns the boolean AND of its arguments by returning the first empty argument or the last argument, that is, and x y behaves as if x then y else x. All the arguments are evaluated or Returns the boolean OR of its arguments by returning the first non-empty argument or the last argument, that is, or x y behaves as if x then x else y All the arguments are evaluated"},{"location":"user-guide/templating/#integer-functions","title":"Integer functions","text":"Function Return value len Returns the integer length of its argument eq Returns the boolean truth of arg1 == arg2 ne Returns the boolean truth of arg1 != arg2 lt Returns the boolean truth of arg1 < arg2 le Returns the boolean truth of arg1 <= arg2 gt Returns the boolean truth of arg1 > arg2 ge Returns the boolean truth of arg1 >= arg2"},{"location":"user-guide/templating/#more-complicated-logic","title":"More complicated logic","text":"

        Up until now, we have only seen if statements that can handle at most two variables. In this part we will see how to create more complicated expressions.

        You can also create more complicated expressions. The eq command can accept multiple arguments. It will check if the first argument is equal to any of the other arguments.

        {{ if eq \"foo\" \"foo\" \"bar\" }}hello{{end}}\n{{ if eq \"foo\" \"bar\" \"foo\" }}hello{{end}}\n{{ if eq \"foo\" \"bar\" \"bar\" }}hello{{end}}\n

        The first two examples will output hello and the last example will output nothing.

        The operators or and and can also accept multiple arguments.

        "},{"location":"user-guide/templating/#chaining-operators","title":"Chaining operators","text":"

        You can perform multiple checks in one if statement.

        {{ if (and (eq .chezmoi.os \"linux\") (ne .email \"me@home.org\")) }}\n...\n{{ end }}\n

        This will check if the operating system is Linux and the configured email is not the home email. The brackets are needed here, because otherwise all the arguments will be give to the and command.

        This way you can chain as many operators together as you like.

        "},{"location":"user-guide/templating/#helper-functions","title":"Helper functions","text":"

        chezmoi has added multiple helper functions to the text/template syntax.

        chezmoi includes sprig, an extension to the text/template format that contains many helper functions. Take a look at their documentation for a list.

        chezmoi adds a few functions of its own as well. Take a look at the reference for complete list.

        "},{"location":"user-guide/templating/#template-variables","title":"Template variables","text":"

        chezmoi defines a few useful templates variables that depend on the system you are currently on. A list of the variables defined by chezmoi can be found here.

        There are, however more variables than that. To view the variables available on your system, execute:

        chezmoi data\n

        This outputs the variables in JSON format by default. To access the variable chezmoi.kernel.osrelease in a template, use

        {{ .chezmoi.kernel.osrelease }}\n

        This way you can also access the variables you defined yourself.

        "},{"location":"user-guide/templating/#using-chezmoitemplates","title":"Using .chezmoitemplates","text":"

        Files in the .chezmoitemplates subdirectory are parsed as templates and are available to be included in other templates using the template action with a name equal to their relative path to the .chezmoitemplates directory.

        By default, such templates will be executed with nil data. If you want to access template variables (e.g. .chezmoi.os) in the template you must pass the data explicitly.

        For example:

        .chezmoitemplates/part.tmpl:\n{{ if eq .chezmoi.os \"linux\" }}\n# linux config\n{{ else }}\n# non-linux config\n{{ end }}\n\ndot_file.tmpl:\n{{ template \"part.tmpl\" . }}\n
        "},{"location":"user-guide/templating/#using-chezmoitemplates-for-creating-similar-files","title":"Using .chezmoitemplates for creating similar files","text":"

        When you have multiple similar files, but they aren't quite the same, you can create a template file in the directory .chezmoitemplates. This template can be inserted in other template files, for example:

        Create .local/share/chezmoi/.chezmoitemplates/alacritty:

        some: config\nfontsize: {{ . }}\nmore: config\n

        Notice the file name doesn't have to end in .tmpl, as all files in the directory .chezmoitemplates are interpreted as templates.

        Create other files using the template ~/.local/share/chezmoi/small-font.yml.tmpl

        {{- template \"alacritty\" 12 -}}\n

        ~/.local/share/chezmoi/big-font.yml.tmpl

        {{- template \"alacritty\" 18 -}}\n

        Here we're calling the shared alacritty template with the font size as the . value passed in. You can test this with chezmoi cat:

        $ chezmoi cat ~/small-font.yml\nsome: config\nfontsize: 12\nmore: config\n$ chezmoi cat ~/big-font.yml\nsome: config\nfontsize: 18\nmore: config\n
        "},{"location":"user-guide/templating/#passing-multiple-arguments","title":"Passing multiple arguments","text":"

        In the example above only one arguments is passed to the template. To pass more arguments to the template, you can do it in two ways.

        "},{"location":"user-guide/templating/#via-the-config-file","title":"Via the config file","text":"

        This method is useful if you want to use the same template arguments multiple times, because you don't specify the arguments every time. Instead you specify them in the file ~/.config/chezmoi/chezmoi.toml:

        ~/.config/chezmoi/chezmoi.toml
        [data.alacritty.big]\n    fontsize = 18\n    font = \"DejaVu Serif\"\n[data.alacritty.small]\n    fontsize = 12\n    font = \"DejaVu Sans Mono\"\n

        Use the variables in ~/.local/share/chezmoi/.chezmoitemplates/alacritty:

        ~/.local/share/chezmoi/.chezmoitemplates/alacritty
        some: config\nfontsize: {{ .fontsize }}\nfont: {{ .font }}\nmore: config\n

        And connect them with ~/.local/share/chezmoi/small-font.yml.tmpl:

        ~/.local/share/chezmoi/small-font.yml.tmpl
        {{- template \"alacritty\" .alacritty.small -}}\n

        At the moment, this means that you'll have to duplicate the alacritty data in the config file on every machine, but a feature will be added to avoid this.

        "},{"location":"user-guide/templating/#by-passing-a-dictionary","title":"By passing a dictionary","text":"

        Using the same alacritty configuration as above, you can pass the arguments to it with a dictionary, for example ~/.local/share/chezmoi/small-font.yml.tmpl:

        ~/.local/share/chezmoi/small-font.yml.tmpl
        {{- template \"alacritty\" dict \"fontsize\" 12 \"font\" \"DejaVu Sans Mono\" -}}\n
        "},{"location":"user-guide/use-scripts-to-perform-actions/","title":"Use scripts to perform actions","text":""},{"location":"user-guide/use-scripts-to-perform-actions/#understand-how-scripts-work","title":"Understand how scripts work","text":"

        chezmoi supports scripts that are executed when you run chezmoi apply. These scripts can be configured to run every time, only when their contents have changed, or only if they haven't been run before.

        Scripts are any file in the source directory with the prefix run_, and they are executed in alphabetical order.

        • run_ scripts: These scripts are executed every time you run chezmoi apply.
        • run_onchange_ scripts: These scripts are only executed if their content has changed since the last time they were run.
        • run_once_ scripts: These scripts are executed once for each unique version of the content. If the script is a template, the content is hashed after template execution. chezmoi tracks the content's SHA256 hash and stores it in a database. If the content has been run before (even under a different filename), the script will not run again unless the content itself changes.

        Scripts break chezmoi's declarative approach and should be used sparingly. All scripts should be idempotent, including run_onchange_ and run_once_ scripts.

        Scripts are normally run while chezmoi updates your dotfiles. For example, run_b.sh will be run after updating a.txt and before updating c.txt. To run scripts before or after the updates, use the before_ or after_ attributes, respectively, e.g., run_once_before_install-password-manager.sh.

        Scripts must be created manually in the source directory, typically by running chezmoi cd and then creating a file with a run_ prefix. There is no need to set the executable bit on the script.

        Scripts with the .tmpl suffix are treated as templates, with the usual template variables available. If the template resolves to only whitespace or an empty string, the script will not be executed, which is useful for disabling scripts dynamically.

        When executing a script, chezmoi generates the script contents in a file in a temporary directory with the executable bit set and then executes it using exec(3). As a result, the script must either include a #! line or be an executable binary. Script working directory is set to the first existing parent directory in the destination tree.

        If a .chezmoiscripts directory exists at the root of the source directory, scripts in this directory are executed as normal scripts, without creating a corresponding directory in the target state.

        In verbose mode, the scripts' contents are printed before execution. In dry-run mode, scripts are not executed.

        "},{"location":"user-guide/use-scripts-to-perform-actions/#set-environment-variables","title":"Set environment variables","text":"

        You can set extra environment variables for your scripts in the scriptEnv section of your config file. For example, to set the MY_VAR environment variable to my_value, specify:

        ~/.config/chezmoi/chezmoi.toml
        [scriptEnv]\n    MY_VAR = \"my_value\"\n

        chezmoi sets a number of environment variables when running scripts, including CHEZMOI=1 and common template data like CHEZMOI_OS and CHEZMOI_ARCH.

        Note

        By default, chezmoi diff will print the contents of scripts that would be run by chezmoi apply. To exclude scripts from the output of chezmoi diff, set diff.exclude in your configuration file, for example:

        ~/.config/chezmoi/chezmoi.toml
        [diff]\n    exclude = [\"scripts\"]\n

        Similarly, chezmoi status will print the names of the scripts that it will execute with the status R. This can similarly disabled by setting status.exclude to [\"scripts\"] in your configuration file.

        "},{"location":"user-guide/use-scripts-to-perform-actions/#install-packages-with-scripts","title":"Install packages with scripts","text":"

        Change to the source directory and create a file called run_onchange_install-packages.sh. In this file create your package installation script, e.g.

        #!/bin/sh\nsudo apt install ripgrep\n

        The next time you run chezmoi apply or chezmoi update this script will be run. As it has the run_onchange_ prefix, it will not be run again unless its contents change, for example if you add more packages to be installed.

        This script can also be a template. For example, if you create run_onchange_install-packages.sh.tmpl with the contents:

        ~/.local/share/chezmoi/run_onchange_install-packages.sh.tmpl
        {{ if eq .chezmoi.os \"linux\" -}}\n#!/bin/sh\nsudo apt install ripgrep\n{{ else if eq .chezmoi.os \"darwin\" -}}\n#!/bin/sh\nbrew install ripgrep\n{{ end -}}\n

        This will install ripgrep on both Debian/Ubuntu Linux systems and macOS.

        "},{"location":"user-guide/use-scripts-to-perform-actions/#run-a-script-when-the-contents-of-another-file-changes","title":"Run a script when the contents of another file changes","text":"

        chezmoi's run_ scripts are run every time you run chezmoi apply, whereas run_onchange_ scripts are run only when their contents have changed, after executing them as templates. You can use this to cause a run_onchange_ script to run when the contents of another file has changed by including a checksum of the other file's contents in the script.

        For example, if your dconf settings are stored in dconf.ini in your source directory then you can make chezmoi apply only load them when the contents of dconf.ini has changed by adding the following script as run_onchange_dconf-load.sh.tmpl:

        ~/.local/share/chezmoi/run_onchange_dconf-load.sh.tmpl
        #!/bin/bash\n\n# dconf.ini hash: {{ include \"dconf.ini\" | sha256sum }}\ndconf load / < {{ joinPath .chezmoi.sourceDir \"dconf.ini\" | quote }}\n

        As the SHA256 sum of dconf.ini is included in a comment in the script, the contents of the script will change whenever the contents of dconf.ini are changed, so chezmoi will re-run the script whenever the contents of dconf.ini change.

        In this example you should also add dconf.ini to .chezmoiignore so chezmoi does not create dconf.ini in your home directory.

        "},{"location":"user-guide/use-scripts-to-perform-actions/#clear-the-state-of-all-run_onchange_-and-run_once_-scripts","title":"Clear the state of all run_onchange_ and run_once_ scripts","text":"

        chezmoi stores whether and when run_onchange_ and run_once_ scripts have been run in its persistent state.

        To clear the state of run_onchange_ scripts, run:

        chezmoi state delete-bucket --bucket=entryState\n

        To clear the state of run_once_ scripts, run:

        chezmoi state delete-bucket --bucket=scriptState\n
        "},{"location":"user-guide/advanced/customize-your-source-directory/","title":"Customize your source directory","text":""},{"location":"user-guide/advanced/customize-your-source-directory/#use-a-subdirectory-of-your-dotfiles-repo-as-the-root-of-the-source-state","title":"Use a subdirectory of your dotfiles repo as the root of the source state","text":"

        By default, chezmoi uses the root of your dotfiles repo as the root of the source state. If your source state contains many entries in its root, then your target directory (usually your home directory) will in turn be filled with many entries in its root as well. You can reduce the number of entries by keeping .chezmoiignore up to date, but this can become tiresome.

        Instead, you can specify that chezmoi should read the source state from a subdirectory of the source directory instead by creating a file called .chezmoiroot containing the relative path to this subdirectory.

        For example, given:

        ~/.local/share/chezmoi/.chezmoiroot
        home\n

        Then chezmoi will read the source state from the home subdirectory of your source directory, for example the desired state of ~/.gitconfig will be read from ~/.local/share/chezmoi/home/dot_gitconfig (instead of ~/.local/share/chezmoi/dot_gitconfig).

        When migrating an existing chezmoi dotfiles repo to use .chezmoiroot you will need to move the relevant files in to the new root subdirectory manually. You do not need to move files that are ignored by chezmoi in all cases (i.e. are listed in .chezmoiignore when executed as a template on all machines), and you can afterwards remove their entries from home/.chezmoiignore.

        "},{"location":"user-guide/advanced/customize-your-source-directory/#use-a-different-version-control-system-to-git","title":"Use a different version control system to git","text":"

        Although chezmoi is primarily designed to use a git repo for the source state, it does not require git and can be used with other version control systems, such as fossil or pijul.

        The version control system is used in only three places:

        • chezmoi init will use git clone to clone the source repo if it does not already exist.
        • chezmoi update will use git pull by default to pull the latest changes.
        • chezmoi's auto add, commit, and push functionality use git status, git add, git commit and git push.

        Using a different version control system (VCS) to git can be achieved in two ways.

        Firstly, if your VCS is compatible with git's CLI, then you can set the git.command configuration variable to your VCS command and set useBuiltinGit to false.

        Otherwise, you can use your VCS to create the source directory before running chezmoi init, for example:

        fossil clone https://dotfiles.example.com/ dotfiles.fossil\nmkdir -p .local/share/chezmoi/.git\ncd .local/share/chezmoi\nfossil open ~/dotfiles.fossil\nchezmoi init --apply\n

        Note

        The creation of an empty .git directory in the source directory is required for chezmoi to be able to identify the work tree.

        For updates, you can set the update.command and update.args configuration variables and chezmoi update will use these instead of git pull, for example:

        ~/.config/chezmoi/chezmoi.toml
        [update]\n    command = \"fossil\"\n    args = [\"update\"]\n

        Currently, it is not possible to override the auto add, commit, and push behavior for non-git VCSs, so you will have to commit changes manually, for example:

        chezmoi cd\nfossil add .\nfossil commit\n
        "},{"location":"user-guide/advanced/install-packages-declaratively/","title":"Install packages declaratively","text":"

        chezmoi uses a declarative approach for the contents of dotfiles, but package installation requires running imperative commands. However, you can simulate declarative package installation with a combination of a .chezmoidata file and a run_onchange_ script.

        The following example uses homebrew on macOS, but should be adaptable to other operating systems and package managers.

        First, create .chezmoidata/packages.yaml declaring the packages that you want installed, for example:

        ~/.local/share/chezmoi/.chezmoidata/packages.yaml
        packages:\n  darwin:\n    brews:\n    - 'git'\n    casks:\n    - 'google-chrome'\n

        Second, create a run_onchange_darwin-install-packages.sh.tmpl script that uses the package manager to install those packages, for example:

        ~/.local/share/chezmoi/run_onchange_darwin-install-packages.sh.tmpl
        {{ if eq .chezmoi.os \"darwin\" -}}\n#!/bin/bash\n\nbrew bundle --no-lock --file=/dev/stdin <<EOF\n{{ range .packages.darwin.brews -}}\nbrew {{ . | quote }}\n{{ end -}}\n{{ range .packages.darwin.casks -}}\ncask {{ . | quote }}\n{{ end -}}\nEOF\n{{ end -}}\n

        Now, when you run chezmoi apply, chezmoi will execute the install-packages.sh script with when the list of packages defined in .chezmoidata/packages.yaml changes.

        "},{"location":"user-guide/advanced/install-your-password-manager-on-init/","title":"Install your password manager on init","text":"

        If you use a password manager to store your secrets then you may need to install your password manager after you have run chezmoi init on a new machine but before chezmoi init --apply or chezmoi apply executes your run_before_ scripts.

        chezmoi provides a hooks.read-source-state.pre hook that allows you to modify your system after chezmoi init has cloned your dotfile repo but before chezmoi has read the source state. This is the perfect time to install your password manager as you can assume that ~/.local/share/chezmoi is populated but has not yet been read.

        First, write your password manager install hook. chezmoi executes this hook every time any command reads the source state so the hook should terminate as quickly as possible if there is no work to do.

        This hook is not a template so you cannot use template variables and must instead detect the system you are running on yourself.

        For example:

        ~/.local/share/chezmoi/.install-password-manager.sh
        #!/bin/sh\n\n# exit immediately if password-manager-binary is already in $PATH\ntype password-manager-binary >/dev/null 2>&1 && exit\n\ncase \"$(uname -s)\" in\nDarwin)\n    # commands to install password-manager-binary on Darwin\n    ;;\nLinux)\n    # commands to install password-manager-binary on Linux\n    ;;\n*)\n    echo \"unsupported OS\"\n    exit 1\n    ;;\nesac\n

        Note

        The leading . in .install-password-manager.sh is important because it tells chezmoi to ignore .install-password-manager.sh when declaring the state of files in your home directory.

        Finally, tell chezmoi to run your password manager install hook before reading the source state:

        .config/chezmoi/chezmoi.toml
        [hooks.read-source-state.pre]\n    command = \".local/share/chezmoi/.install-password-manager.sh\"\n
        "},{"location":"user-guide/advanced/migrate-away-from-chezmoi/","title":"Migrate away from chezmoi","text":"

        chezmoi provides several mechanisms to help you move to an alternative dotfile manager (or even no dotfile manager at all) in the future:

        chezmoi creates your dotfiles just as if you were not using a dotfile manager at all. Your dotfiles are regular files, directories, and symlinks. You can run chezmoi purge to delete all traces of chezmoi and then, if you're migrating to a new dotfile manager, then you can use whatever mechanism it provides to add your dotfiles to your new system.

        chezmoi has a chezmoi archive command that generates a tarball of your dotfiles. You can replace the contents of your dotfiles repo with the contents of the archive and you've effectively immediately migrated away from chezmoi.

        chezmoi has a chezmoi dump command that dumps the interpreted (target) state in a machine-readable form, so you can write scripts around chezmoi.

        "},{"location":"user-guide/advanced/use-chezmoi-with-watchman/","title":"Use chezmoi with Watchman","text":"

        chezmoi can be used with Watchman to automatically run chezmoi apply whenever your source state changes, but there are some limitations because Watchman runs actions in the background without a terminal.

        Firstly, Watchman spawns a server which runs actions when filesystems change. This server reads its environment variables when it is started, typically on the first invocation of the watchman command. If you use a password manager that uses environment variables to persist login sessions, then you must login to your password manager before you run the first watchman command, and your session might eventually time out.

        Secondly, Watchman runs processes without a terminal, and so cannot run interactive processes. For chezmoi apply, you can use the --force flag to suppress prompts to overwrite files that have been modified since chezmoi last wrote them. However, if any other part of chezmoi apply is interactive, for example if your password manager prompts for a password, then it will not work with Watchman.

        1. Tell watchman to watch your source directory:

          CHEZMOI_SOURCE_PATH=\"$(chezmoi source-path)\"\nwatchman watch \"${CHEZMOI_SOURCE_PATH}\"\n
        2. Tell watchman to run chezmoi apply --force whenever your source directory changes:

          watchman -j <<EOT\n[\"trigger\", \"${CHEZMOI_SOURCE_PATH}\", {\n  \"name\": \"chezmoi-apply\",\n  \"command\": [\"chezmoi\", \"apply\", \"--force\"]\n}]\nEOT\n

        You can now make changes to your source directory and Watchman will run chezmoi apply --force on each change.

        To shutdown the Watchman server, run:

        ```sh\nwatchman shutdown-server\n```\n
        "},{"location":"user-guide/encryption/","title":"Encryption","text":"

        chezmoi supports encrypting files with age and gpg.

        Encrypted files are stored in ASCII-armored format in the source directory with the encrypted_ attribute and are automatically decrypted when needed.

        Add files to be encrypted with the --encrypt flag, for example:

        chezmoi add --encrypt ~/.ssh/id_rsa\n

        chezmoi edit will transparently decrypt the file before editing and re-encrypt it afterwards.

        "},{"location":"user-guide/encryption/age/","title":"age","text":"

        chezmoi supports encrypting files with age.

        Generate a key using age-keygen:

        $ age-keygen -o $HOME/key.txt\nPublic key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p\n

        Specify age encryption in your configuration file, being sure to specify at least the identity and one recipient:

        ~/.config/chezmoi/chezmoi.toml
        encryption = \"age\"\n[age]\n    identity = \"/home/user/key.txt\"\n    recipient = \"age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p\"\n

        chezmoi supports multiple recipients and recipient files, and multiple identities.

        Note

        Make sure encryption is added to the top level section at the beginning of the config, before any other sections.

        "},{"location":"user-guide/encryption/age/#symmetric-encryption","title":"Symmetric encryption","text":"

        To use age's symmetric encryption, specify a single identity and enable symmetric encryption in your config file, for example:

        ~/.config/chezmoi/chezmoi.toml
        encryption = \"age\"\n[age]\n    identity = \"~/.ssh/id_rsa\"\n    symmetric = true\n
        "},{"location":"user-guide/encryption/age/#symmetric-encryption-with-a-passphrase","title":"Symmetric encryption with a passphrase","text":"

        To use age's symmetric encryption with a passphrase, set age.passphrase to true in your config file, for example:

        ~/.config/chezmoi/chezmoi.toml
        encryption = \"age\"\n[age]\n    passphrase = true\n

        You will be prompted for the passphrase whenever you run chezmoi add --encrypt and whenever chezmoi needs to decrypt the file, for example when you run chezmoi apply, chezmoi diff, or chezmoi status.

        "},{"location":"user-guide/encryption/age/#builtin-age-encryption","title":"Builtin age encryption","text":"

        chezmoi has builtin support for age encryption which is automatically used if the age command is not found in $PATH.

        Info

        The builtin age encryption does not support passphrases, symmetric encryption, or SSH keys.

        Passphrases are not supported because chezmoi needs to decrypt files regularly, e.g. when running a chezmoi diff or a chezmoi status command, not just when running chezmoi apply. Prompting for a passphrase each time would quickly become tiresome.

        Symmetric encryption may be supported in the future. Please open an issue if you want this.

        SSH keys are not supported as the age documentation explicitly recommends not using them:

        When integrating age into a new system, it's recommended that you only support X25519 keys, and not SSH keys. The latter are supported for manual encryption operations.

        "},{"location":"user-guide/encryption/gpg/","title":"gpg","text":"

        chezmoi supports encrypting files with gpg. Encrypted files are stored in the source state and automatically be decrypted when generating the target state or editing a file contents with chezmoi edit.

        "},{"location":"user-guide/encryption/gpg/#asymmetric-privatepublic-key-encryption","title":"Asymmetric (private/public-key) encryption","text":"

        Specify the encryption key to use in your configuration file (chezmoi.toml) with the gpg.recipient key:

        ~/.config/chezmoi/chezmoi.toml
        encryption = \"gpg\"\n[gpg]\n    recipient = \"...\"\n

        chezmoi will encrypt files:

        gpg --armor --recipient $RECIPIENT --encrypt\n

        and store the encrypted file in the source state. The file will automatically be decrypted when generating the target state.

        Note

        Make sure encryption is added to the top level section at the beginning of the config, before any other sections.

        "},{"location":"user-guide/encryption/gpg/#symmetric-encryption","title":"Symmetric encryption","text":"

        Specify symmetric encryption in your configuration file:

        ~/.config/chezmoi/chezmoi.toml
        encryption = \"gpg\"\n[gpg]\n    symmetric = true\n

        chezmoi will encrypt files:

        gpg --armor --symmetric\n
        "},{"location":"user-guide/encryption/gpg/#encrypting-files-with-a-passphrase","title":"Encrypting files with a passphrase","text":"

        If you want to encrypt your files with a passphrase, but don't mind the passphrase being stored in plaintext on your machines, then you can use the following configuration:

        ~/.local/share/chezmoi/.chezmoi.toml.tmpl
        {{ $passphrase := promptStringOnce . \"passphrase\" \"passphrase\" -}}\n\nencryption = \"gpg\"\n[data]\n    passphrase = {{ $passphrase | quote }}\n[gpg]\n    symmetric = true\n    args = [\"--batch\", \"--passphrase\", {{ $passphrase | quote }}, \"--no-symkey-cache\"]\n

        This will prompt you for the passphrase the first time you run chezmoi init on a new machine, and then remember the passphrase in your configuration file.

        "},{"location":"user-guide/encryption/gpg/#muting-gpg-output","title":"Muting gpg output","text":"

        Since gpg sends some info messages to stderr instead of stdout, you will see some output even if you redirect stdout to /dev/null.

        You can mute this by adding --quiet to the gpg.args key in your configuration:

        ~/.local/share/chezmoi/.chezmoi.toml.tmpl
        [gpg]\n    args = [\"--quiet\"]\n
        "},{"location":"user-guide/encryption/rage/","title":"rage","text":"

        chezmoi supports encrypting files with rage.

        To use rage, set age.command to rage in your configuration file, for example:

        ~/.config/chezmoi/chezmoi.toml
        encryption = \"age\"\n[age]\n    command = \"rage\"\n

        Note

        Make sure encryption is added to the top level section at the beginning of the config, before any other sections.

        Then, configure chezmoi as you would for age.

        "},{"location":"user-guide/frequently-asked-questions/design/","title":"Design","text":""},{"location":"user-guide/frequently-asked-questions/design/#do-i-have-to-use-chezmoi-edit-to-edit-my-dotfiles","title":"Do I have to use chezmoi edit to edit my dotfiles?","text":"

        No. chezmoi edit is a convenience command that has a couple of useful features, but you don't have to use it.

        You can also run chezmoi cd and then just edit the files in the source state directly. After saving an edited file you can run chezmoi diff to check what effect the changes would have, and run chezmoi apply if you're happy with them. If there are inconsistencies that you want to keep, then chezmoi merge-all will help you resolve any differences.

        chezmoi edit provides the following useful features:

        • The arguments to chezmoi edit are the files in their target location, so you don't have to think about source state attributes and your editor's syntax highlighting will work.

        • If the dotfile is encrypted in the source state, then chezmoi edit will decrypt it to a private directory, open that file in your $EDITOR, and then re-encrypt the file when you quit your editor. This makes encryption transparent.

        • With the --diff and --apply options you can see what would change and apply those changes without having to run chezmoi diff or chezmoi apply.

        • If you have configured git auto commits or git auto pushes then chezmoi edit will create commits and push them for you.

        If you chose to edit files in the source state and you're using VIM then github.com/alker0/chezmoi.vim gives you syntax highlighting, however you edit your files. Besides using the plugin, you can use modeline to tell VIM the correct filetype. For example, put # vim: filetype=zsh at the top of dot_zshrc, and VIM will treat dot_zshrc as zsh file.

        "},{"location":"user-guide/frequently-asked-questions/design/#why-doesnt-chezmoi-use-symlinks-like-gnu-stow","title":"Why doesn't chezmoi use symlinks like GNU Stow?","text":"

        Symlinks are first class citizens in chezmoi: chezmoi supports creating them, updating them, removing them, and even more advanced features not found in other dotfile managers like having the same symlink point to different targets on different machines by using a template.

        With chezmoi, you only use a symlink where you really need a symlink, in contrast to some other dotfile managers (e.g. GNU Stow) which require the use of symlinks as a layer of indirection between a dotfile's location (which can be anywhere in your home directory) and a dotfile's content (which needs to be in a centralized directory that you manage with version control). chezmoi solves this problem in a different way.

        Instead of using a symlink to redirect from the dotfile's location to the centralized directory, chezmoi generates the dotfile as a regular file in its final location from the contents of the centralized directory. This approach allows chezmoi to provide features that are not possible when using symlinks, for example having files that are encrypted, executable, private, or templates.

        There is nothing special about dotfiles managed by chezmoi whereas dotfiles managed with GNU Stow are special because they're actually symlinks to somewhere else.

        The only advantage to using GNU Stow-style symlinks is that changes that you make to the dotfile's contents in the centralized directory are immediately visible whenever you save them, whereas chezmoi currently requires you to pass the --watch flag to chezmoi edit or set edit.watch to true in your configuration file.

        If you really want to use symlinks, then chezmoi provides a symlink mode which uses symlinks where possible. This configures chezmoi to work like GNU Stow and have it create a set of symlinks back to a central directory, but this currently requires a bit of manual work (as described in #167). chezmoi might get some automation to help (see #886 for example) but it does need some convincing use cases that demonstrate that a symlink from a dotfile's location to its contents in a central directory is better than just having the correct dotfile contents.

        "},{"location":"user-guide/frequently-asked-questions/design/#what-are-the-limitations-of-chezmois-symlink-mode","title":"What are the limitations of chezmoi's symlink mode?","text":"

        In symlink mode chezmoi replaces targets with symlinks to the source directory if the target is a regular file and is not encrypted, executable, private, or a template.

        Symlinks cannot be used for encrypted files because the source state contains the ciphertext, not the plaintext.

        Symlinks cannot be used for executable files as the executable bit would need to be set on the file in the source directory and chezmoi uses only regular files and directories in its source state for portability across operating systems. This may change in the future.

        Symlinks cannot be used for private files because git does not persist group and world permission bits.

        Symlinks cannot be used for templated files because the source state contains the template, not the result of executing the template.

        Symlinks cannot be used for entire directories because of chezmoi's use of attributes in the filename mangles entries in the directory, directories might have the exact_ attribute and contain empty files, and the directory's entries might not be usable with symlinks.

        In symlink mode, running chezmoi add does not immediately replace the targets with a symlink. You must run chezmoi apply to create the symlinks.

        "},{"location":"user-guide/frequently-asked-questions/design/#why-does-chezmoi-use-weird-filenames","title":"Why does chezmoi use weird filenames?","text":"

        There are a number of criticisms of how chezmoi uses filenames:

        1. The long source file names are weird and verbose.
        2. Not all possible file permissions can be represented.
        3. Everything is in a single directory, which can end up containing many entries.

        chezmoi's decision to store metadata in filenames is a deliberate, practical, compromise.

        Firstly, almost all programs store metadata in filenames: the filename's extension. chezmoi extends the filename to storing metadata in attributes in the filename's prefix as well.

        The dot_ attribute makes it transparent which dotfiles are managed by chezmoi and which files are ignored by chezmoi. chezmoi ignores all files and directories that start with . so no special whitelists are needed for version control systems and their control files (e.g. .git and .gitignore).

        chezmoi needs per-file metadata to know how to interpret the source file's contents, for example to know when the source file is a template or if the file's contents are encrypted. By storing this metadata in the filename, the metadata is unambiguously associated with a single file and adding, updating, or removing a single file touches only a single file in the source state. Changes to the metadata (e.g. chezmoi chattr +template $TARGET) are simple file renames and isolated to the affected file.

        If chezmoi were to, say, use a common configuration file listing which files were templates and/or encrypted, then changes to any file would require updates to the common configuration file. Automating updates to configuration files requires a round trip (read config file, update config, write config) and it is not always possible preserve comments and formatting.

        chezmoi's attributes of executable_, private_, and readonly_ allow the file permissions 0o644, 0o755, 0o600, 0o700, 0o444, 0o555, 0o400, and 0o500 to be represented. Directories can only have permissions 0o755, 0o700, or 0o500. In practice, these cover all permissions typically used for dotfiles. If this does cause a genuine problem for you, please open an issue on GitHub.

        File permissions and modes like executable_, private_, readonly_, and symlink_ could also be stored in the filesystem, rather than in the filename. However, this requires the permissions to be preserved and handled by the underlying version control system and filesystem. chezmoi provides first-class support for Windows, where the executable_ and private_ attributes have no direct equivalents and symbolic links are not always permitted. By using regular files and directories, chezmoi avoids variations in the operating system, version control system, and filesystem making it both more robust and more portable.

        chezmoi uses a 1:1 mapping between entries in the source state and entries in the target state. This mapping is bi-directional and unambiguous.

        However, this also means that dotfiles that in the same directory in the target state must be in the same directory in the source state. In particular, every entry managed by chezmoi in the root of your home directory has a corresponding entry in the root of your source directory, which can mean that you end up with a lot of entries in the root of your source directory. This can be mitigated by using .chezmoiroot file.

        If chezmoi were to permit, say, multiple separate source directories (so you could, say, put dot_bashrc in a bash/ subdirectory, and dot_vimrc in a vim/ subdirectory, but have chezmoi apply map these to ~/.bashrc and ~/.vimrc in the root of your home directory) then the mapping between source and target states is no longer bidirectional nor unambiguous, which significantly increases complexity and requires more user interaction. For example, if both bash/dot_bashrc and vim/dot_bashrc exist, what should be the contents of ~/.bashrc? If you run chezmoi add ~/.zshrc, should dot_zshrc be stored in the source bash/ directory, the source vim/ directory, or somewhere else? How does the user communicate their preferences?

        chezmoi has many users and any changes to the source state representation must be backwards-compatible.

        In summary, chezmoi's source state representation is a compromise with both advantages and disadvantages. Changes to the representation will be considered, but must meet the following criteria, in order of importance:

        1. Be fully backwards-compatible for existing users.
        2. Fix a genuine problem encountered in practice.
        3. Be independent of the underlying operating system, version control system, and filesystem.
        4. Not add significant extra complexity to the user interface or underlying implementation.
        "},{"location":"user-guide/frequently-asked-questions/design/#can-chezmoi-support-multiple-sources-or-multiple-source-states","title":"Can chezmoi support multiple sources or multiple source states?","text":"

        With some dotfile managers, dotfiles can be distributed across multiple directories or even multiple repos. For example, the user might have one directory per application, or separate repos for home and work configurations, or even separate git submodules for different applications. These can be considered multiple sources of truth for the target state. This, however, comes with complications:

        1. Multiple sources of truth complicate the user interface. When running chezmoi add $FILE, which source should $FILE be added to?

        2. Multiple sources of truth do not compose easily if target files overlap. For example, if you have two sources, both of which need to set an environment variable in .bashrc, how do you handle this when both, only one, or neither source might be activated? What if the sources are mutually exclusive, e.g. if the VIM source and the Emacs source both want to set the $EDITOR environment variable?

        3. Multiple sources of truth are not always independent. Related to the previous point, consider a source that adds an applications's configuration files and shell completions. Should the shell completions be part of the applications's source or of the shell's source?

        chezmoi instead makes the opinionated choice to use a single source of truth, i.e. a single branch in a single git repo. Using a single source of truth avoids the inherent complexity and ambiguity of multiple sources.

        chezmoi provides mechanisms like templates (for minor differences), .chezmoiignore (for controlling the presence or otherwise of complete files and directories), and password manager integration (so secrets never need to be stored in a repo) handle machine-to-machine differences. Externals make it easy to pull in dotfiles from third-party sources.

        That said, if you are keen to use multiple sources of truth with chezmoi, you have a number of options with some scripting around chezmoi.

        Firstly, you can run chezmoi apply with different arguments to the --config and --source flags which will apply to the same destination. So that you only have to type one command you can wrap this in a shell function, for example:

        chezmoi-apply() {\n    chezmoi apply --config ~/.config/chezmoi-home/chezmoi.toml \\\n                  --source ~/.local/share/chezmoi-home && \\\n    chezmoi apply --config ~/.config/chezmoi-work/chezmoi.toml \\\n                  --source ~/.local/share/chezmoi-work\n}\n

        If you want to generate multiple configuration files with chezmoi init then you will need the --config-path flag. For more advanced use, use the --destination, --cache, and --persistent-state flags.

        Secondly, you can assemble a single source state from multiple sources and then use chezmoi apply. For example, if you have multiple source states in subdirectories of ~/.dotfiles:

        #!/bin/bash\n\n# create a combined source state in a temporary directory\ncombined_source=\"$(mktemp -d)\"\n\n# remove the temporary source state on exit\ntrap 'rm -rf -- \"${combined_source}\"' INT TERM\n\n# copy files from multiple sources into the temporary source state\nfor source in $HOME/.dotfiles/*; do\n    cp -r \"${source}\"/* \"${combined_source}\"\ndone\n\n# apply the temporary source state\nchezmoi apply --source \"${combined_source}\"\n

        Thirdly, you can use a run_ script to invoke a second instance of chezmoi, as used by @felipecrs.

        "},{"location":"user-guide/frequently-asked-questions/design/#why-does-chezmoi-cd-spawn-a-shell-instead-of-just-changing-directory","title":"Why does chezmoi cd spawn a shell instead of just changing directory?","text":"

        chezmoi cd spawns a shell because it is not possible for a program to change the working directory of its parent process. You can add a shell function instead:

        chezmoi-cd() {\n    cd $(chezmoi source-path)\n}\n

        Typing chezmoi-cd will then change the directory of your current shell to chezmoi's source directory.

        "},{"location":"user-guide/frequently-asked-questions/design/#why-are-the-prompt-functions-only-available-in-config-file-templates","title":"Why are the prompt* functions only available in config file templates?","text":"

        chezmoi regularly needs to execute templates to determine the target contents of files. For example, templates are executed for the apply, diff, and status commands, amongst many others. Having to interactively respond each time would quickly become tiresome. Therefore, chezmoi only provides these functions when generating a config file from a config file template (e.g. when you run chezmoi init or chezmoi --init apply).

        "},{"location":"user-guide/frequently-asked-questions/design/#why-not-use-ansiblechefpuppetsalt-or-similar-to-manage-my-dotfiles-instead","title":"Why not use Ansible/Chef/Puppet/Salt, or similar to manage my dotfiles instead?","text":"

        Whole system management tools are more than capable of managing your dotfiles, but they are large systems that entail several disadvantages. Compared to whole system management tools, chezmoi offers:

        • Small, focused feature set designed for dotfiles. There's simply less to learn with chezmoi compared to whole system management tools.

        • Easy installation and execution on every platform, without root access. Installing chezmoi requires only copying a single binary file with no external dependencies. Executing chezmoi just involves running the binary. In contrast, installing and running a whole system management tool typically requires installing a scripting language runtime, several packages, and running a system service, all typically requiring root access.

        chezmoi's focus and simple installation means that it runs almost everywhere: from tiny ARM-based Linux systems to Windows desktops, from inside lightweight containers to FreeBSD-based virtual machines in the cloud.

        "},{"location":"user-guide/frequently-asked-questions/design/#can-i-use-chezmoi-to-manage-files-outside-my-home-directory","title":"Can I use chezmoi to manage files outside my home directory?","text":"

        In practice, yes, you can, but this usage is strongly discouraged beyond using your system's package manager to install the packages you need.

        chezmoi is designed to operate on your home directory, and is explicitly not a full system configuration management tool. That said, there are some ways to have chezmoi manage a few files outside your home directory.

        chezmoi's scripts can execute arbitrary commands, so you can use a run_ script that is run every time you run chezmoi apply, to, for example:

        • Make the target file outside your home directory a symlink to a file managed by chezmoi in your home directory.

        • Copy a file managed by chezmoi inside your home directory to the target file.

        • Execute a template with chezmoi execute-template --output=$FILENAME template where $FILENAME is outside the target directory.

        chezmoi executes all scripts as the user executing chezmoi, so you may need to add extra privilege elevation commands like sudo or PowerShell start -verb runas -wait to your script.

        chezmoi, by default, operates on your home directory but this can be overridden with the --destination command line flag or by specifying destDir in your config file, and could even be the root directory (/ or C:\\). This allows you, in theory, to use chezmoi to manage any file in your filesystem, but this usage is extremely strongly discouraged.

        If your needs extend beyond modifying a handful of files outside your target system, then existing configuration management tools like Puppet, Chef, Ansible, and Salt are much better suited - and of course can be called from a chezmoi run_ script. Put your Puppet Manifests, Chef Recipes, Ansible Modules, and Salt Modules in a directory ignored by .chezmoiignore so they do not pollute your home directory.

        "},{"location":"user-guide/frequently-asked-questions/design/#what-inspired-chezmoi","title":"What inspired chezmoi?","text":"

        chezmoi was inspired by Puppet, but was created because Puppet is an overkill for managing your personal configuration files. The focus of chezmoi will always be personal home directory management. If your needs grow beyond that, switch to a whole system configuration management tool.

        "},{"location":"user-guide/frequently-asked-questions/design/#where-does-the-name-chezmoi-come-from","title":"Where does the name \"chezmoi\" come from?","text":"

        \"chezmoi\" splits to \"chez moi\" and pronounced /\u0283e\u026a mwa/ (shay-mwa) meaning \"at my house\" in French. It's seven letters long, which is an appropriate length for a command that is only run occasionally. If you prefer a shorter command, add an alias to your shell configuration, for example:

        alias cz=chezmoi\n
        "},{"location":"user-guide/frequently-asked-questions/encryption/","title":"Encryption","text":""},{"location":"user-guide/frequently-asked-questions/encryption/#how-do-i-configure-chezmoi-to-encrypt-files-but-only-request-a-passphrase-the-first-time-chezmoi-init-is-run","title":"How do I configure chezmoi to encrypt files but only request a passphrase the first time chezmoi init is run?","text":"

        The following steps use age for encryption.

        This can be achieved with the following process:

        1. Generate an age private key.
        2. Encrypt the private key with a passphrase.
        3. Configure chezmoi to decrypt the private key if needed.
        4. Configure chezmoi to use the private key.
        5. Add encrypted files.

        First, change to chezmoi's root directory:

        chezmoi cd ~\n

        Generate an age private key encrypted with a passphrase in the file key.txt.age with the command:

        $ age-keygen | age --armor --passphrase > key.txt.age\nPublic key: age193wd0hfuhtjfsunlq3c83s8m93pde442dkcn7lmj3lspeekm9g7stwutrl\nEnter passphrase (leave empty to autogenerate a secure one):\nConfirm passphrase:\n

        Use a strong passphrase and make a note of the public key (age193wd0hfuhtjfsunlq3c83s8m93pde442dkcn7lmj3lspeekm9g7stwutrl in this case).

        Add key.txt.age to .chezmoiignore so that chezmoi does not try to create it:

        echo key.txt.age >> .chezmoiignore\n

        Configure chezmoi to decrypt the passphrase-encrypted private key if needed:

        $ cat > run_once_before_decrypt-private-key.sh.tmpl <<EOF\n#!/bin/sh\n\nif [ ! -f \"${HOME}/.config/chezmoi/key.txt\" ]; then\n    mkdir -p \"${HOME}/.config/chezmoi\"\n    chezmoi age decrypt --output \"${HOME}/.config/chezmoi/key.txt\" --passphrase \"{{ .chezmoi.sourceDir }}/key.txt.age\"\n    chmod 600 \"${HOME}/.config/chezmoi/key.txt\"\nfi\nEOF\n

        Specify the public and private keys for encryption. age.recipient must be your public key from above. Make sure encryption is added at the beginning, before any other sections.

        ~/.config/chezmoi/chezmoi.toml
        encryption = \"age\"\n[age]\n    identity = \"~/.config/chezmoi/key.txt\"\n    recipient = \"age193wd0hfuhtjfsunlq3c83s8m93pde442dkcn7lmj3lspeekm9g7stwutrl\"\n

        Run chezmoi init --apply to generate the chezmoi's config file and decrypt the private key:

        $ chezmoi init --apply\nEnter passphrase:\n

        At this stage everything is configured and git status should report:

        $ git status\nOn branch main\nUntracked files:\n        (use \"git add <file>...\" to include in what will be committed)\n        .chezmoi.toml.tmpl\n        .chezmoiignore\n        key.txt.age\n        run_once_before_decrypt-private-key.sh.tmpl\n\nnothing added to commit but untracked files present (use \"git add\" to track)\n

        If you're happy with the changes you can commit them. All four files should be committed.

        Add files that you want to encrypt using the --encrypt argument to chezmoi add, for example:

        chezmoi add --encrypt ~/.ssh/id_rsa\n

        When you run chezmoi init on a new machine you will be prompted to enter your passphrase once to decrypt key.txt.age. Your decrypted private key will be stored in ~/.config/chezmoi/key.txt.

        "},{"location":"user-guide/frequently-asked-questions/encryption/#how-to-re-encrypt-encrypted-files","title":"How to re-encrypt encrypted files","text":"

        To rotate from an expired GPG key to its replacement, or change from GPG to age encryption, the following steps can be used:

        1. Make sure you have applied all encrypted files (e.g. chezmoi apply decrypts files and places them in their destinations).
        2. Update chezmoi configuration to use the new encryption method (examples: gpg, age, age with one-time passphrase).
        3. Remove all encrypted files from the state via chezmoi forget or chezmoi unmanage.
        4. Add them back with chezmoi add --encrypt.
        "},{"location":"user-guide/frequently-asked-questions/encryption/#example-migrate-from-gpg-to-age","title":"Example: Migrate from GPG to age","text":"

        Update chezmoi configuration to use age encryption (with chezmoi edit-config or manually editing the corresponding template):

        - encryption = \"gpg\"\n- [gpg]\n-     recipient = \"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"\n+ encryption = \"age\"\n+ [age]\n+     recipient = \"age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n+     identity = \"/home/user/key.txt\"\n

        Re-encrypt the files with a script like this:

        for encrypted_file in $(chezmoi managed --include encrypted --path-style absolute)\ndo\n  # optionally, add --force to avoid prompts\n  chezmoi forget \"$encrypted_file\"\n\n  # strip the .asc extension\n  decrypted_file=\"${encrypted_file%.asc}\"\n\n  chezmoi add --encrypt \"$decrypted_file\"\ndone\n
        "},{"location":"user-guide/frequently-asked-questions/general/","title":"General","text":""},{"location":"user-guide/frequently-asked-questions/general/#what-other-questions-have-been-asked-about-chezmoi","title":"What other questions have been asked about chezmoi?","text":"

        See the issues and discussions.

        "},{"location":"user-guide/frequently-asked-questions/general/#where-do-i-ask-a-question-that-isnt-answered-here","title":"Where do I ask a question that isn't answered here?","text":"

        Please open an issue on GitHub or start a discussion.

        "},{"location":"user-guide/frequently-asked-questions/general/#i-like-chezmoi-how-do-i-say-thanks","title":"I like chezmoi. How do I say thanks?","text":"

        Thank you! chezmoi was written to scratch a personal itch, and I'm very happy that it's useful to you. Please give chezmoi a star on GitHub, and if you're happy to share your public dotfile repo then tag it with chezmoi.

        If you write an article or give a talk on chezmoi please inform the author (e.g. by opening an issue) so it can be added to chezmoi's articles, podcasts, and videos pages.

        Contributions are very welcome and every bug report, support request, and feature request helps make chezmoi better. Thank you :)

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/","title":"Troubleshooting","text":""},{"location":"user-guide/frequently-asked-questions/troubleshooting/#how-can-i-quickly-check-for-problems-with-chezmoi-on-my-machine","title":"How can I quickly check for problems with chezmoi on my machine?","text":"

        Run:

        chezmoi doctor\n

        Anything ok is fine, anything warning is only a problem if you want to use the related feature, and anything error indicates a definite problem.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#a-specific-command-is-not-behaving-as-i-expect-how-can-i-debug-it","title":"A specific command is not behaving as I expect. How can I debug it?","text":"

        The --verbose flag makes chezmoi to print extra information about what it is doing.

        The --debug flag makes chezmoi print very detailed step by step information.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#the-output-of-chezmoi-diff-is-broken-and-does-not-contain-color-what-could-be-wrong","title":"The output of chezmoi diff is broken and does not contain color. What could be wrong?","text":"

        By default, chezmoi's diff output includes ANSI color escape sequences (e.g. ESC[37m) and is piped into your pager (by default less). chezmoi assumes that your pager passes through the ANSI color escape sequences, as configured on many systems, but not all. If your pager does not pass through ANSI color escape sequences then you will see monochrome diff output with uninterpreted ANSI color escape sequences.

        This can typically by fixed by setting the environment variable

        export LESS=-R\n

        which instructs less to display \"raw\" control characters via the -R / --RAW-CONTROL-CHARS option.

        You can also set the pager configuration variable in your config file, for example:

        ~/.config/chezmoi/chezmoi.toml
        pager = \"less -R\"\n

        If you have set a different pager (via the pager configuration variable or PAGER environment variable) then you must ensure that it passes through raw control characters. Alternatively, you can use the --color=false option to chezmoi to disable colors or the --no-pager option to chezmoi to disable the pager.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#why-do-i-get-a-blank-buffer-or-empty-file-when-running-chezmoi-edit","title":"Why do I get a blank buffer or empty file when running chezmoi edit?","text":"

        In this case, chezmoi edit typically prints a warning like:

        chezmoi: warning: $EDITOR $TMPDIR/$FILENAME: returned in less than 1s\n

        chezmoi edit performs a bit of magic to improve the experience of editing files in the source state by invoking your editor with filenames in a temporary directory that look like filenames in your home directory. What's happening here is that your editor command is exiting immediately, so chezmoi thinks you've finished editing and so removes the temporary directory, but actually your editor command has forked a edit process in the background, and that edit process opens a now non-existent file.

        To fix this you have to configure your editor command to remain in the foreground until you have finished editing the file, so chezmoi knows when to remove the temporary directory.

        VIMVSCode

        Pass the -f flag, e.g. by setting the edit.flags configuration variable to [\"-f\"], or by setting the EDITOR environment variable to include the -f flag, e.g. export EDITOR=\"vim -f\".

        Pass the --wait flag, e.g. by setting the edit.flags configuration variable to [\"--wait\"] or by setting the EDITOR environment variable to include the --wait flag, e.g. export EDITOR=\"code --wait\".

        The \"bit of magic\" that chezmoi edit performs includes:

        • chezmoi edit makes the filename opened by your editor more closely match the target filename, which can help your editor choose the correct syntax highlighting. For example, if you run chezmoi edit ~/.zshrc, your editor is be opened with $TMPDIR/.zshrc but you'll actually be editing ~/.local/share/chezmoi/dot_zshrc. Under the hood, chezmoi creates a hardlink in a temporary directory to the file in your source directory, so even though your editor thinks it's editing .zshrc, it is really editing dot_zshrc in your source directory.

        • If the source file is encrypted then chezmoi edit transparently decrypts and re-encrypts the file for you. Specifically, chezmoi decrypts the file into a private temporary directory and open your editor with the decrypted file, and re-encrypts the file when you exit your editor.

        • If the source file is a template, then chezmoi edit preserves the .tmpl extension.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-makes-sshconfig-group-writeable-how-do-i-stop-this","title":"chezmoi makes ~/.ssh/config group writeable. How do I stop this?","text":"

        By default, chezmoi uses your system's umask when creating files. On most systems the default umask is 022 but some systems use 002, which means that files and directories are group writeable by default.

        You can override this for chezmoi by setting the umask configuration variable in your configuration file, for example:

        ~/.config/chezmoi/chezmoi.toml
        umask = 0o022\n

        Note

        This will apply to all files and directories that chezmoi manages and will ensure that none of them are group writeable. It is not currently possible to control group write permissions for individual files or directories. Please open an issue on GitHub if you need this.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-user-lookup-userid-nnnnn-inputoutput-error","title":"chezmoi reports chezmoi: user: lookup userid NNNNN: input/output error","text":"

        This is likely because the chezmoi binary you are using was statically compiled with musl and the machine you are running on uses LDAP or NIS.

        The immediate fix is to use a package built for your distribution (e.g a .deb or .rpm) which is linked against glibc and includes LDAP/NIS support instead of the statically-compiled binary.

        If the problem still persists, then please open an issue on GitHub.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-timeout-or-chezmoi-timeout-obtaining-persistent-state-lock","title":"chezmoi reports chezmoi: timeout or chezmoi: timeout obtaining persistent state lock","text":"

        chezmoi will report this when it is unable to lock its persistent state (~/.config/chezmoi/chezmoistate.boltdb), typically because another instance of chezmoi is currently running and holding the lock.

        This can happen, for example, if you have a run_ script that invokes chezmoi, or are running chezmoi in another window.

        Under the hood, chezmoi uses bbolt which permits multiple simultaneous readers, but only one writer (with no readers).

        Commands that take a write lock include add, apply, edit, forget, import, init, state, unmanage, and update. Commands that take a read lock include diff, status, and verify.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-forkexec-tmpxxxxxxxxxxxx-exec-format-error-when-executing-a-template-script","title":"chezmoi reports chezmoi: fork/exec /tmp/XXXXXXXXXX.XX: exec format error when executing a template script","text":"

        This error occurs when you have a newline before the #! in your script. Suppress the newline by including a - before the closing }} on the first line.

        For example, if your template script begins with

        {{ if eq .chezmoi.os \"linux\" }}\n#!/bin/sh\n

        change this to

        {{ if eq .chezmoi.os \"linux\" -}}\n#!/bin/sh\n
        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-forkexec-tmpxxxxxxxxxxxx-permission-denied-when-executing-a-script","title":"chezmoi reports chezmoi: fork/exec /tmp/XXXXXXXXXX.XX: permission denied when executing a script","text":"

        This error occurs when your temporary directory is mounted with the noexec option.

        As chezmoi scripts can be templates, encrypted, or both, chezmoi needs to write the final script's contents to a file so that it can be executed by the operating system. By default, chezmoi will use $TMPDIR for this.

        You can change the temporary directory into which chezmoi writes and executes scripts with the scriptTempDir configuration variable. For example, to use a subdirectory of your home directory you can use:

        ~/.config/chezmoi/chezmoi.toml
        scriptTempDir = \"~/tmp\"\n
        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-mkdir-xxxxx-no-such-file-or-directory-when-trying-to-manage-file-or-directory","title":"chezmoi reports chezmoi: mkdir xxxxx: no such file or directory when trying to manage file or directory","text":"

        This error occurs when you try to add directory/file to be managed via chezmoi but the same directory is only listed in .chezmoiexternal.$FORMAT.

        A workaround can be applied in a such case via manually creating import directory in chezmoi source directory (typically ~/.local/share/chezmoi) and create .keep file.

        For example, if .chezmoiexternal.toml has the configuration:

        [\".config/nvim\"]\n    type = \"git-repo\"\n    url = \"https://github.com/NvChad/NvChad.git\"\n    refreshPeriod = \"168h\"\n    [\".config/nvim\".pull]\n        args = [\"--ff-only\"]\n

        Now chezmoi add ~/.config/direnv/direnvrc will raise the error:

        chezmoi: mkdir /home/<user>/.local/share/chezmoi/dot_config/direnv: no such file or directory\n

        But the workaround can be applied:

        chezmoi cd\nmkdir -p dot_config/\ntouch dot_config/.keep\n

        Now once that done chezmoi add ~/.config/direnv/direnvrc should work. For reference see this issue

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-read-devstdin-permission-denied-or-write-devstdout-permission-denied-when-i-redirect-standard-input-or-standard-output","title":"chezmoi reports read /dev/stdin: permission denied or write /dev/stdout: permission denied when I redirect standard input or standard output","text":"

        This error occurs when you installed chezmoi with snap and is caused by a long-standing bug in snap.

        This is not a bug in chezmoi and there is nothing that chezmoi can do about this. However, there are two workarounds:

        Firstly, you can use alternatives to shell redirection. For standard input:

        chezmoi $COMMAND <$FILENAME       # fails\ncat $FILENAME | chezmoi $COMMAND  # succeeds\n

        For standard output:

        chezmoi $COMMAND >$FILENAME                  # fails\nchezmoi $COMMAND -o $FILENAME                # succeeds\nchezmoi $COMMAND --output=$FILENAME          # succeeds\nchezmoi $COMMAND | tee $FILENAME >/dev/null  # succeeds\n

        Secondly, you can install chezmoi with any of the many supported install methods instead of snap.

        "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-forkexec-no-such-file-or-directory-when-running-scripts-on-nix-or-termux","title":"chezmoi reports fork/exec ...: no such file or directory when running scripts on Nix or Termux","text":"

        You are likely using a hardcoded script interpreter in the shebang line of your scripts, e.g.

        #!/bin/bash\n

        /bin/bash does not exist on Nix or Termux. You must update the shebang line to point to the actual bash interpreter. The easiest way to do this is make the script a template and use the lookPath template function, for example:

        #!{{ lookPath \"bash\" }}\n

        Alternatively, you can use the actual path to bash on your system, for example:

        NixTermux
        #!/usr/bin/env bash\n
        #!/data/data/com.termux/files/usr/bin/bash\n
        "},{"location":"user-guide/frequently-asked-questions/usage/","title":"Usage","text":""},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-edit-my-dotfiles-with-chezmoi","title":"How do I edit my dotfiles with chezmoi?","text":"

        There are five popular approaches:

        1. Use chezmoi edit $FILE. This will open the source file for $FILE in your editor, including opening the template if the file is templated and transparently decrypting and re-encrypting it if it is encrypted. For extra ease, use chezmoi edit --apply $FILE to apply the changes when you quit your editor, and chezmoi edit --watch $FILE to apply the changes whenever you save the file.

        2. Use chezmoi cd and edit the files in the source directory directly. Run chezmoi diff to see what changes would be made, and chezmoi apply to make the changes.

        3. If your editor supports opening directories, run chezmoi edit with no arguments to open the source directory.

        4. Edit the file in your home directory, and then either re-add it by running chezmoi add $FILE or chezmoi re-add.

        5. Edit the file in your home directory, and then merge your changes with source state by running chezmoi merge $FILE.

          Note

          re-add doesn't work with templates.

        "},{"location":"user-guide/frequently-asked-questions/usage/#what-are-the-consequences-of-bare-modifications-to-the-target-files-if-my-zshrc-is-managed-by-chezmoi-and-i-edit-zshrc-without-using-chezmoi-edit-what-happens","title":"What are the consequences of \"bare\" modifications to the target files? If my .zshrc is managed by chezmoi and I edit ~/.zshrc without using chezmoi edit, what happens?","text":"

        Until you run chezmoi apply your modified ~/.zshrc will remain in place. When you run chezmoi apply chezmoi will detect that ~/.zshrc has changed since chezmoi last wrote it and prompt you what to do. You can resolve differences with a merge tool by running chezmoi merge ~/.zshrc.

        "},{"location":"user-guide/frequently-asked-questions/usage/#how-can-i-tell-what-dotfiles-in-my-home-directory-arent-managed-by-chezmoi-is-there-an-easy-way-to-have-chezmoi-manage-a-subset-of-them","title":"How can I tell what dotfiles in my home directory aren't managed by chezmoi? Is there an easy way to have chezmoi manage a subset of them?","text":"

        chezmoi unmanaged will list everything not managed by chezmoi. You can add entire directories with chezmoi add.

        "},{"location":"user-guide/frequently-asked-questions/usage/#how-can-i-tell-what-dotfiles-in-my-home-directory-are-currently-managed-by-chezmoi","title":"How can I tell what dotfiles in my home directory are currently managed by chezmoi?","text":"

        chezmoi managed will list everything managed by chezmoi.

        "},{"location":"user-guide/frequently-asked-questions/usage/#if-theres-a-mechanism-in-place-for-the-above-is-there-also-a-way-to-tell-chezmoi-to-ignore-specific-files-or-groups-of-files-eg-by-directory-name-or-by-glob","title":"If there's a mechanism in place for the above, is there also a way to tell chezmoi to ignore specific files or groups of files (e.g. by directory name or by glob)?","text":"

        By default, chezmoi ignores everything that you haven't explicitly added. If you have files in your source directory that you don't want added to your destination directory when you run chezmoi apply add their names to a file called .chezmoiignore in the source state.

        Patterns are supported, and you can change what's ignored from machine to machine. The full usage and syntax is described in the reference manual.

        "},{"location":"user-guide/frequently-asked-questions/usage/#if-the-target-already-exists-but-is-behind-the-source-can-chezmoi-be-configured-to-preserve-the-target-version-before-replacing-it-with-one-derived-from-the-source","title":"If the target already exists, but is \"behind\" the source, can chezmoi be configured to preserve the target version before replacing it with one derived from the source?","text":"

        Yes. Running chezmoi add will update the source state with the target. To see diffs of what would change, without actually changing anything, use chezmoi diff.

        "},{"location":"user-guide/frequently-asked-questions/usage/#once-ive-made-a-change-to-the-source-directory-how-do-i-commit-it","title":"Once I've made a change to the source directory, how do I commit it?","text":"

        You have several options:

        • chezmoi cd opens a shell in the source directory, where you can run your usual version control commands, like git add and git commit.

        • chezmoi git runs git in the source directory and pass extra arguments to the command. If you're passing any flags, you'll need to use -- to prevent chezmoi from consuming them, for example chezmoi git -- commit -m \"Update dotfiles\".

        • You can configure chezmoi to automatically commit and push changes to your source state, as described in the how-to guide.

        "},{"location":"user-guide/frequently-asked-questions/usage/#ive-made-changes-to-both-the-destination-state-and-the-source-state-that-i-want-to-keep-how-can-i-keep-them-both","title":"I've made changes to both the destination state and the source state that I want to keep. How can I keep them both?","text":"

        chezmoi merge will open a merge tool to resolve differences between the source state, target state, and destination state. Copy the changes you want to keep in to the source state.

        "},{"location":"user-guide/frequently-asked-questions/usage/#can-i-use-chezmoi-to-manage-my-shell-history-across-multiple-machines","title":"Can I use chezmoi to manage my shell history across multiple machines?","text":"

        No. Every change in a file managed by chezmoi requires an explicit command to record it (e.g. chezmoi add) or apply it somewhere else (e.g. chezmoi update), and is recorded as a commit in your dotfiles repository. Creating a commit every time a command is entered would quickly become cumbersome. This makes chezmoi unsuitable for sharing changes to rapidly-changing files like shell histories.

        Instead, consider using a dedicated tool for sharing shell history across multiple machines, like atuin. You can use chezmoi to install and configure atuin.

        "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-install-pre-requisites-for-templates","title":"How do I install pre-requisites for templates?","text":"

        If you have a template that depends on some other tool, like curl, you may need to install it before chezmoi renders the template.

        To do so, use a run_before script that is not a template. Something like:

        run_before_00-install-pre-requisites.sh
        #!/bin/bash\n\nset -eu\n\n# Install curl if it's not already installed\nif ! command -v curl >/dev/null; then\n  sudo apt update\n  sudo apt install -y curl\nfi\n

        chezmoi will make sure to execute it before templating other files.

        Tip

        You can use scriptEnv to inject data into your scripts through environment variables.

        "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-write-a-literal-or-in-a-template","title":"How do I write a literal {{ or }} in a template?","text":"

        {{ and }} are chezmoi's default template delimiters, and so need escaping, for example:

        {{ \"{{\" }}\n{{ \"}}\" }}\n

        results in

        {{\n}}\n

        For longer tokens containing a {{ and a }} you can use a longer literal, for example:

        {{ \"{{ .Target }}\" }}\n

        results in

        {{ .Target }}\n
        "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-run-a-script-when-a-git-repo-external-changes","title":"How do I run a script when a git-repo external changes?","text":"

        Use a run_onchange_after_*.tmpl script that includes the HEAD commit. For example, if ~/.emacs.d is a git-repo external, then create:

        ~/.local/share/chezmoi/run_onchange_after_emacs.d.tmpl
        #!/bin/sh\n\n# {{ output \"git\" \"-C\" (joinPath .chezmoi.homeDir \".emacs.d\") \"rev-parse\" \"HEAD\" }}\necho \"~/emacs.d updated\"\n
        "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-run-a-script-periodically","title":"How do I run a script periodically?","text":"

        Use a run_once_*.tmpl script that includes the current time truncated to a suitable unit. For example, to run a script daily:

        ~/.local/share/chezmoi/run_once_daily.tmpl
        #!/bin/sh\n\n# {{ now | date \"2006-01-02\" }}\necho \"new day\"\n

        For weekly, use the week number from the output of date, for example:

        ~/.local/share/chezmoi/run_once_weekly.tmpl
        #!/bin/sh\n\n# {{ output \"date\" \"+%V\" | trim }}\necho \"new week\"\n

        Or, approximate the week number with template functions:

        ~/.local/share/chezmoi/run_once_weekly.tmpl
        #!/bin/sh\n\n# {{ div now.YearDay 7 }}\necho \"new week\"\n
        "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-enable-shell-completions","title":"How do I enable shell completions?","text":"

        chezmoi includes shell completions for bash, fish, powershell, and zsh. If you have installed chezmoi via your package manager then the shell completion should already be installed. For PowerShell, you need to manually add the completion script to your profile. Please open an issue if this is not working correctly.

        chezmoi provides a completion command and a completion template function which return the shell completions for the given shell. These can be used either as a one-off or as part of your dotfiles repo. The details of how to use these depend on your shell.

        "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-use-tools-that-i-installed-with-flatpak","title":"How do I use tools that I installed with Flatpak?","text":"

        Command line programs installed with Flatpak cannot be run directly. Instead, they must be run with flatpak run. This can either be added by using a wrapper script or by configuring chezmoi to invoke flatpak run with the correct arguments directly. Wrapper scripts are recommended, as they work with the doctor command.

        "},{"location":"user-guide/frequently-asked-questions/usage/#use-a-wrapper-script","title":"Use a wrapper script","text":"

        Create a wrapper script with the exact same name as the command that invokes flatpak run and passes all arguments to the wrapped command.

        For example, to wrap KeePassXC installed with Flatpak, create the script:

        keepassxc-cli
        #!/bin/bash\n\nflatpak run --command=keepassxc-cli org.keepassxc.KeePassXC -- \"$@\"\n

        Note that the script is called keepassxc-cli without any .sh extension, so it has the exact same name as the keepassxc-cli command that chezmoi invokes by default. Ensure that this script is in your path and is executable.

        "},{"location":"user-guide/frequently-asked-questions/usage/#configure-chezmoi-to-invoke-flatpak-run","title":"Configure chezmoi to invoke flatpak run","text":"

        For tools that chezmoi invokes with .command and .args configuration variables, you can configure chezmoi to invoke flatpak directly with the correct arguments.

        For example, to use VSCodium installed with Flatpak as your diff command, add the following to your config file:

        ~/.config/chezmoi/chezmoi.toml
        [diff]\n    command = \"flatpak\"\n    args = [\"run\", \"com.vscodium.codium\", \"--wait\", \"--diff\"]\n

        Note that the command is flatpak, the first two arguments are run and the name of app, and any further arguments are passed to the app.

        "},{"location":"user-guide/machines/containers-and-vms/","title":"Containers and VMs","text":"

        You can use chezmoi to manage your dotfiles in GitHub Codespaces, Visual Studio Codespaces, and Visual Studio Code Remote - Containers.

        For a quick start, you can clone the chezmoi/dotfiles repository which supports Codespaces out of the box.

        The workflow is different to using chezmoi on a new machine, notably:

        • These systems will automatically clone your dotfiles repo to ~/dotfiles, so there is no need to clone your repo yourself.

        • The installation script must be non-interactive.

        • When running in a Codespace, the environment variable CODESPACES will be set to true. You can read its value with the env template function.

        First, if you are using a chezmoi configuration file template, ensure that it is non-interactive when running in Codespaces, for example, .chezmoi.toml.tmpl might contain:

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

        Info

        Setting the sourceDir configuration variable to .chezmoi.sourceDir is required because Codespaces clones your dotfiles repo to a different one to chezmoi's default.

        This sets the codespaces template variable, so you don't have to repeat (env \"CODESPACES\") in your templates. It also sets the sourceDir configuration to the --source argument passed in chezmoi init.

        Second, create an install.sh script that installs chezmoi and your dotfiles and add it to .chezmoiignore and your dotfiles repo:

        chezmoi generate install.sh > install.sh\nchmod a+x install.sh\necho install.sh >> .chezmoiignore\ngit add install.sh .chezmoiignore\ngit commit -m \"Add install.sh\"\n

        The generated script installs the latest version of chezmoi in ~/.local/bin if needed, and then chezmoi init ... invokes chezmoi to create its configuration file and initialize your dotfiles. --apply tells chezmoi to apply the changes immediately, and --source=... tells chezmoi where to find the cloned dotfiles repo, which in this case is the same folder in which the script is running from.

        Finally, modify any of your templates to use the codespaces variable if needed. For example, to install vim-gtk on Linux but not in Codespaces, your run_once_install-packages.sh.tmpl might contain:

        {{- if (and (eq .chezmoi.os \"linux\") (not .codespaces)) -}}\n#!/bin/sh\nsudo apt install -y vim-gtk\n{{- end -}}\n
        "},{"location":"user-guide/machines/general/","title":"General","text":""},{"location":"user-guide/machines/general/#determine-whether-the-current-machine-is-a-laptop-or-desktop","title":"Determine whether the current machine is a laptop or desktop","text":"

        The following template sets the $chassisType variable to \"desktop\" or \"laptop\" on macOS, Linux, and Windows.

        {{- $chassisType := \"desktop\" }}\n{{- if eq .chezmoi.os \"darwin\" }}\n{{-   if contains \"MacBook\" (output \"sysctl\" \"-n\" \"hw.model\") }}\n{{-     $chassisType = \"laptop\" }}\n{{-   else }}\n{{-     $chassisType = \"desktop\" }}\n{{-   end }}\n{{- else if eq .chezmoi.os \"linux\" }}\n{{-   $chassisType = (output \"hostnamectl\" \"--json=short\" | mustFromJson).Chassis }}\n{{- else if eq .chezmoi.os \"windows\" }}\n{{-   $chassisType = (output \"powershell.exe\" \"-NoProfile\" \"-NonInteractive\" \"-Command\" \"if ((Get-CimInstance -Class Win32_Battery | Measure-Object).Count -gt 0) { Write-Output 'laptop' } else { Write-Output 'desktop' }\") | trim }}\n{{- end }}\n
        "},{"location":"user-guide/machines/general/#determine-how-many-cpu-cores-and-threads-the-current-machine-has","title":"Determine how many CPU cores and threads the current machine has","text":"

        The following template sets the $cpuCores and $cpuThreads variables to the number of CPU cores and threads on the current machine respectively on macOS, Linux and Windows.

        {{- $cpuCores := 1 }}\n{{- $cpuThreads := 1 }}\n{{- if eq .chezmoi.os \"darwin\" }}\n{{-   $cpuCores = (output \"sysctl\" \"-n\" \"hw.physicalcpu_max\") | trim | atoi }}\n{{-   $cpuThreads = (output \"sysctl\" \"-n\" \"hw.logicalcpu_max\") | trim | atoi }}\n{{- else if eq .chezmoi.os \"linux\" }}\n{{-   $cpuCores = (output \"sh\" \"-c\" \"lscpu --online --parse | grep --invert-match '^#' | sort --field-separator=',' --key='2,4' --unique | wc --lines\") | trim | atoi }}\n{{-   $cpuThreads = (output \"sh\" \"-c\" \"lscpu --online --parse | grep --invert-match '^#' | wc --lines\") | trim | atoi }}\n{{- else if eq .chezmoi.os \"windows\" }}\n{{-   $cpuCores = (output \"powershell.exe\" \"-NoProfile\" \"-NonInteractive\" \"-Command\" \"(Get-CimInstance -ClassName 'Win32_Processor').NumberOfCores\") | trim | atoi }}\n{{-   $cpuThreads = (output \"powershell.exe\" \"-NoProfile\" \"-NonInteractive\" \"-Command\" \"(Get-CimInstance -ClassName 'Win32_Processor').NumberOfLogicalProcessors\") | trim | atoi }}\n{{- end }}\n

        Example

        ~/.local/share/chezmoi/.chezmoi.toml.tmpl
        [data.cpu]\ncores = {{ $cpuCores }}\nthreads = {{ $cpuThreads }}\n
        ~/.local/share/chezmoi/is_hyperthreaded.txt.tmpl
        {{- if gt .cpu.threads .cpu.cores -}}\nHyperthreaded!\n{{- else -}}\nNot hyperthreaded!\n{{- end -}}\n
        "},{"location":"user-guide/machines/linux/","title":"Linux","text":""},{"location":"user-guide/machines/linux/#combine-operating-system-and-linux-distribution-conditionals","title":"Combine operating system and Linux distribution conditionals","text":"

        There can be as much variation between Linux distributions as there is between operating systems. Due to text/template's eager evaluation of conditionals, this means you often have to write templates with nested conditionals:

        {{ if eq .chezmoi.os \"darwin\" }}\n# macOS-specific code\n{{ else if eq .chezmoi.os \"linux\" }}\n{{   if eq .chezmoi.osRelease.id \"debian\" }}\n# Debian-specific code\n{{   else if eq .chezmoi.osRelease.id \"fedora\" }}\n# Fedora-specific code\n{{   end }}\n{{ end }}\n

        This can be simplified by combining the operating system and distribution into a single custom template variable. Put the following in your configuration file template:

        {{- $osid := .chezmoi.os -}}\n{{- if hasKey .chezmoi.osRelease \"id\" -}}\n{{-   $osid = printf \"%s-%s\" .chezmoi.os .chezmoi.osRelease.id -}}\n{{- end -}}\n\n[data]\n    osid = {{ $osid | quote }}\n

        This defines the .osid template variable to be {{ .chezmoi.os }} on machines without an os-release file, or to be {{ .chezmoi.os }}-{{ .chezmoi.osRelease.id }} on machines with an os-release file.

        You can then simplify your conditionals to be:

        {{ if eq .osid \"darwin\" }}\n# macOS-specific code\n{{ else if eq .osid \"linux-debian\" }}\n# Debian-specific code\n{{ else if eq .osid \"linux-fedora\" }}\n# Fedora-specific code\n{{ end }}\n
        "},{"location":"user-guide/machines/macos/","title":"macOS","text":""},{"location":"user-guide/machines/macos/#use-brew-bundle-to-manage-your-brews-and-casks","title":"Use brew bundle to manage your brews and casks","text":"

        Homebrew's brew bundle subcommand allows you to specify a list of brews and casks to be installed. You can integrate this with chezmoi by creating a run_once_ script. For example, create a file in your source directory called run_once_before_install-packages-darwin.sh.tmpl containing:

        {{- if eq .chezmoi.os \"darwin\" -}}\n#!/bin/bash\n\nbrew bundle --no-lock --file=/dev/stdin <<EOF\nbrew \"git\"\ncask \"google-chrome\"\nEOF\n{{ end -}}\n

        Note

        The Brewfile is embedded directly in the script with a bash here document. chezmoi will run this script whenever its contents change, i.e. when you add or remove brews or casks.

        "},{"location":"user-guide/machines/macos/#determine-the-hostname","title":"Determine the hostname","text":"

        The result of the hostname command on macOS depends on the network that the machine is connected to. For a stable result, use the scutil command:

        {{ $computerName := output \"scutil\" \"--get\" \"ComputerName\" | trim }}\n
        "},{"location":"user-guide/machines/macos/#run-script-after-every-macos-update","title":"Run script after every macOS update","text":"

        You can automate a script to run after each macOS update by creating a run_onchange_ script and using the output template function to run sw_vers:

        # MacOS build version: {{ output \"sw_vers\" \"--buildVersion\" }}\n
        "},{"location":"user-guide/machines/windows/","title":"Windows","text":""},{"location":"user-guide/machines/windows/#detect-windows-subsystem-for-linux-wsl","title":"Detect Windows Subsystem for Linux (WSL)","text":"

        WSL can be detected by looking for the string Microsoft or microsoft in /proc/sys/kernel/osrelease, which is available in the template variable .chezmoi.kernel.osrelease, for example:

        {{ if eq .chezmoi.os \"linux\" }}\n{{   if (.chezmoi.kernel.osrelease | lower | contains \"microsoft\") }}\n# WSL-specific code\n{{   end }}\n{{ end }}\n
        "},{"location":"user-guide/machines/windows/#run-a-powershell-script-as-admin-on-windows","title":"Run a PowerShell script as admin on Windows","text":"

        Put the following at the top of your script:

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

        If you use gsudo, it has tips on writing self-elevating scripts.

        "},{"location":"user-guide/machines/windows/#notes-on-running-elevated-scripts","title":"Notes on running elevated scripts","text":"

        However you decide to run a script in an elevated prompt, as soon as the non-elevated script returns, chezmoi will move to the next step in its processing (running more scripts, creating files, etc.). Ensure that the elevated script completes before the non-elevated script exits, or subsequent steps may not run as expected. In the example above, this is accomplished by passing -Wait to PowerShell's Start-Process cmdlet.

        Note that by including -NoExit in $CommandLine, the new (elevated) PowerShell process/window will not exit automatically on completion. This means you'll need to close the new window by hand for chezmoi to continue its steps. If this manual intervention is desired, it would be convenient to print a message as the script's last command to indicate completion for you to safely close the elevated window. If you want no manual intervention, you can remove -NoExit from $CommandLine, but then you likely won\u2019t see the output of the elevated script, which will make it more difficult to determine if something went wrong during its execution.

        "},{"location":"user-guide/password-managers/","title":"Password manager integration","text":"

        Template functions allow you to retrieve secrets from many popular password managers. Using a password manager allows you to keep all your secrets in one place, make your dotfiles repo public, and synchronize changes to secrets across multiple machines.

        "},{"location":"user-guide/password-managers/1password/","title":"1Password","text":"

        chezmoi includes support for 1Password using the 1Password CLI to expose data as a template function.

        Log in and get a session using:

        op account add --address $SUBDOMAIN.1password.com --email $EMAIL\neval $(op signin --account $SUBDOMAIN)\n

        This is not necessary if you are using biometric authentication.

        The output of op read $URL is available as the onepasswordRead template function, for example:

        {{ onepasswordRead \"op://app-prod/db/password\" }}\n

        returns the output of

        op read op://app-prod/db/password\n

        Documents can be retrieved with:

        {{- onepasswordDocument \"$UUID\" -}}\n

        The output of op item get $UUID --format json is available as the onepassword template function. chezmoi parses the JSON output and returns it as structured data. For example, if the output is:

        {\n  \"id\": \"$UUID\",\n  \"title\": \"$TITLE\",\n  \"version\": 2,\n  \"vault\": {\n    \"id\": \"$vaultUUID\"\n  },\n  \"category\": \"LOGIN\",\n  \"last_edited_by\": \"$userUUID\",\n  \"created_at\": \"2010-08-23T13:18:43Z\",\n  \"updated_at\": \"2014-07-20T04:40:11Z\",\n  \"fields\": [\n    {\n      \"id\": \"username\",\n      \"type\": \"STRING\",\n      \"purpose\": \"USERNAME\",\n      \"label\": \"username\",\n      \"value\": \"$USERNAME\"\n    },\n    {\n      \"id\": \"password\",\n      \"type\": \"CONCEALED\",\n      \"purpose\": \"PASSWORD\",\n      \"label\": \"password\",\n      \"value\": \"$PASSWORD\",\n      \"password_details\": {\n        \"strength\": \"FANTASTIC\",\n        \"history\": []\n      }\n    }\n  ],\n  \"urls\": [\n    {\n      \"primary\": true,\n      \"href\": \"$URL\"\n    }\n  ]\n}\n

        Then you can access the password field with the syntax

        {{ (index (onepassword \"$UUID\").fields 1).value }}\n

        or:

        {{ range (onepassword \"$UUID\").fields -}}\n{{   if and (eq .label \"password\") (eq .purpose \"PASSWORD\") -}}\n{{     .value -}}\n{{   end -}}\n{{ end }}\n

        onepasswordDetailsFields returns a reworked version of the structure that allows the fields to be queried by key:

        {\n  \"password\": {\n    \"id\": \"password\",\n    \"label\": \"password\",\n    \"password_details\": {\n      \"history\": [],\n      \"strength\": \"FANTASTIC\"\n    },\n    \"purpose\": \"PASSWORD\",\n    \"type\": \"CONCEALED\",\n    \"value\": \"$PASSWORD\"\n  },\n  \"username\": {\n    \"id\": \"username\",\n    \"label\": \"username\",\n    \"purpose\": \"USERNAME\",\n    \"type\": \"STRING\",\n    \"value\": \"$USERNAME\"\n  }\n}\n
        {{- (onepasswordDetailsFields \"$UUID\").password.value }}\n

        Additional fields may be obtained with onepasswordItemFields; not all objects in 1Password have item fields. This can be tested with:

        chezmoi execute-template \"{{ onepasswordItemFields \\\"$UUID\\\" | toJson }}\" | jq .\n
        "},{"location":"user-guide/password-managers/1password/#sign-in-prompt","title":"Sign-in prompt","text":"

        chezmoi will verify the availability and validity of a session token in the current environment. If it is missing or expired, you will be interactively prompted to sign-in again.

        In the past chezmoi used to exit with an error when no valid session was available. If you'd like to restore this behavior, set the onepassword.prompt configuration variable to false, for example:

        ~/.config/chezmoi/chezmoi.toml
        [onepassword]\n    prompt = false\n

        Danger

        Do not use prompt on shared machines. A session token verified or acquired interactively will be passed to the 1Password CLI through a command line parameter, which is visible to other users of the same system.

        "},{"location":"user-guide/password-managers/1password/#secrets-automation","title":"Secrets Automation","text":"

        chezmoi has experimental support for secrets automation with 1Password Connect and 1Password Service Accounts. These might be used on restricted machines where you cannot or do not wish to install a full 1Password desktop application.

        When these features are used, the behavior of the 1Password CLI changes, so chezmoi requires explicit configuration for either connect or service account modes using the onepassword.mode configuration option. The default, if not specified, is account:

        ~/.config/chezmoi/chezmoi.toml
        [onepassword]\n    mode = \"account\"\n

        In account mode, chezmoi will stop with an error if the environment variable OP_SERVICE_ACCOUNT_TOKEN is set, or if both environment variables OP_CONNECT_HOST and OP_CONNECT_TOKEN are set.

        Info

        Both 1Password Connect and Service Accounts prevent the CLI from working with multiple accounts. If you need access to secrets from more than one 1Password account, do not use these features with chezmoi.

        "},{"location":"user-guide/password-managers/1password/#1password-connect","title":"1Password Connect","text":"

        Once 1Password Connect is configured, and OP_CONNECT_HOST and OP_CONNECT_TOKEN are properly set, set onepassword.mode to connect.

        ~/.config/chezmoi/chezmoi.toml
        [onepassword]\n    mode = \"connect\"\n

        In connect mode:

        • the onepasswordDocument template function is not available,
        • account parameters are not allowed in 1Password template functions,
        • chezmoi will stop with an error if one or both of OP_CONNECT_HOST and OP_CONNECT_TOKEN are unset, or if OP_SERVICE_ACCOUNT_TOKEN is set.
        "},{"location":"user-guide/password-managers/1password/#1password-service-accounts","title":"1Password Service Accounts","text":"

        Once a 1Password service account has been created and OP_SERVICE_ACCOUNT_TOKEN is properly set, set onepassword.mode to service.

        ~/.config/chezmoi/chezmoi.toml
        [onepassword]\n    mode = \"service\"\n

        In service mode:

        • account parameters are not allowed in 1Password template functions,
        • chezmoi will stop with an error if OP_SERVICE_ACCOUNT_TOKEN is unset, or if both of OP_CONNECT_HOST and OP_CONNECT_TOKEN are set.
        "},{"location":"user-guide/password-managers/aws-secrets-manager/","title":"AWS Secrets Manager","text":"

        chezmoi includes support for AWS Secrets Manager.

        Structured data can be retrieved with the awsSecretsManager template function, for example:

        exampleUsername = {{ (awsSecretsManager \"my-secret-name\").username }}\nexamplePassword = {{ (awsSecretsManager \"my-secret-name\").password }}\n

        For retrieving unstructured data, the awsSecretsManagerRaw template function can be used. For example:

        exampleSecretString = {{ awsSecretsManagerRaw \"my-secret-string\" }}\n

        The AWS shared profile name and region can be specified in chezmoi's config file with awsSecretsManager.profile and awsSecretsManager.region respectively. By default, these values will be picked up from the standard environment variables and config files used by the standard AWS tooling.

        ~/.config/chezmoi/chezmoi.toml
        [awsSecretsManager]\n    profile = myWorkProfile\n    region = us-east-2\n
        "},{"location":"user-guide/password-managers/azure-key-vault/","title":"Azure Key Vault","text":"

        chezmoi includes support for Azure Key Vault secrets.

        A default Azure Key Vault name can be set in ~/.config/chezmoi/chezmoi.toml with azureKeyVault.defaultVault.

        Ensure Azure CLI is installed and log in. The logged in user must have the Key Vault Secrets User RBAC role on the Azure Key Vault resource.

        Alternatively, use alternate authentication options.

        ~/.config/chezmoi/chezmoi.toml
        [azureKeyVault]\n  defaultVault = \"contoso-vault2\"\n

        A secret value can be retrieved with the azureKeyVault template function.

        Retrieve the secret my-secret-name from the default configured vault.

        exampleSecret = {{ azureKeyVault \"my-secret-name\" }}\n

        Retrieve the secret my-secret-name from the vault named contoso-vault2.

        exampleSecret = {{ azureKeyVault \"my-secret-name\" \"contoso-vault2\" }}\n

        It is also possible to define an alias in the configuration file for an additional vault.

        ~/.config/chezmoi/chezmoi.toml
        [data]\n  vault42 = \"contoso-vault42\"\n\n[azureKeyVault]\n  defaultVault = \"contoso-vault2\"\n

        Retrieve the secret my-secret-name from the vault named contoso-vault42 through the alias.

        exampleSecret = {{ azureKeyVault \"my-secret-name\" .vault42 }}\n
        "},{"location":"user-guide/password-managers/bitwarden/","title":"Bitwarden","text":"

        chezmoi includes support for Bitwarden using the Bitwarden CLI (bw), Bitwarden Secrets CLI (bws), and rbw commands to expose data as a template function.

        "},{"location":"user-guide/password-managers/bitwarden/#bitwarden-cli","title":"Bitwarden CLI","text":"

        Log in to Bitwarden using a normal method

        bw login $BITWARDEN_EMAIL # or\nbw login --apikey # or\nbw login --sso\n

        If required, unlock your Bitwarden vault (API key and SSO logins always require an explicit unlock step):

        bw unlock\n

        Set the BW_SESSION environment variable, as instructed.

        Bitwarden Session One-liner

        The BW_SESSION value can be set directly. The exact combination differs based on whether you are currently logged into Bitwarden and how you log into Bitwarden.

        export BW_SESSION=$(bw unlock --raw)                    # You are already logged in with any method\nexport BW_SESSION=$(bw login $BITWARDEN_EMAIL --raw)    # You are not logged in and log in with an email\nexport BW_SESSION=$(bw login --sso && bw unlock --raw)  # You are not logged in and login with SSO or API key\n

        The structured data from bw get is available as the bitwarden template function in your config files, for example:

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

        Custom fields can be accessed with the bitwardenFields template function. For example, if you have a custom field named token you can retrieve its value with:

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

        Attachments can be accessed with the bitwardenAttachment and bitwardenAttachmentByRef template function. For example, if you have an attachment named id_rsa, you can retrieve its value with:

        {{ bitwardenAttachment \"id_rsa\" \"bf22e4b4-ae4a-4d1c-8c98-ac620004b628\" }}\n

        or

        {{ bitwardenAttachmentByRef \"id_rsa\" \"item\" \"example.com\" }}\n
        "},{"location":"user-guide/password-managers/bitwarden/#bitwarden-secrets-cli","title":"Bitwarden Secrets CLI","text":"

        Generate an access token for a specific service account.

        Either set the BWS_ACCESS_TOKEN environment variable or store the access token in a template variable, e.g.

        ~/.config/chezmoi/chezmoi.toml
        [data]\n    accessToken = \"0.48c78342-1635-48a6-accd-afbe01336365.C0tMmQqHnAp1h0gL8bngprlPOYutt0:B3h5D+YgLvFiQhWkIq6Bow==\"\n

        You can then retrieve secrets using the bitwardenSecrets template function, for example:

        {{ (bitwardenSecrets \"be8e0ad8-d545-4017-a55a-b02f014d4158\" .accessToken).value }}\n
        "},{"location":"user-guide/password-managers/custom/","title":"Custom","text":"

        You can use any command line tool that outputs secrets either as a string or in JSON format. Choose the binary by setting secret.command in your configuration file. You can then invoke this command with the secret and secretJSON template functions which return the raw output and JSON-decoded output respectively. All of the above secret managers can be supported in this way:

        Secret Manager secret.command Template skeleton 1Password op {{ secretJSON \"get\" \"item\" \"$ID\" }} Bitwarden bw {{ secretJSON \"get\" \"$ID\" }} Doppler doppler {{ secretJSON \"secrets\" \"download\" \"--json\" \"--no-file\" }} HashiCorp Vault vault {{ secretJSON \"kv\" \"get\" \"-format=json\" \"$ID\" }} HCP Vault Secrets vlt {{ secret \"secrets\" \"get\" \"--plaintext\" \"$ID\" }} LastPass lpass {{ secretJSON \"show\" \"--json\" \"$ID\" }} KeePassXC keepassxc-cli Not possible (interactive command only) Keeper keeper {{ secretJSON \"get\" \"--format=json\" \"$ID\" }} pass pass {{ secret \"show\" \"$ID\" }} passhole ph {{ secret \"$ID\" \"password\" }}"},{"location":"user-guide/password-managers/dashlane/","title":"Dashlane","text":"

        chezmoi includes support for Dashlane.

        Structured data can be retrieved with the dashlanePassword template function, for example:

        examplePassword = {{ (index (dashlanePassword \"filter\") 0).password }}\n

        Secure notes can be retrieved with the dashlaneNote template function, for example:

        exampleNote = {{ dashlaneNote \"filter\" }}\n
        "},{"location":"user-guide/password-managers/doppler/","title":"Doppler","text":"

        chezmoi includes support for Doppler using the doppler CLI to expose data through the doppler and dopplerProjectJson template functions.

        Log in using:

        doppler login\n

        It is now possible to interact with the doppler CLI in two different, but similar, ways. Both make use of the command doppler secrets download --json --no-file behind the scenes but present a different experience.

        The doppler function is used in the following way:

        {{ doppler \"SECRET_NAME\" \"project name\" \"config\" }}\n

        All secrets from the specified project/config combination are cached for subsequent access and will not requery the doppler CLI for another secret in the same project/config. This caching mechanism enhances performance and reduces unnecessary CLI calls.

        The dopplerProjectJson presents the secrets as json structured data and is used in the following way:

        {{ (dopplerProjectJson \"project\" \"config\").PASSWORD }}\n

        Additionally one can set the default values for the project and config (aka environment) in your config file, for example:

        ~/.config/chezmoi/chezmoi.toml
        [doppler]\n    project = \"my-project\"\n    config = \"dev\"\n

        With these default values, you can omit them in the call to both doppler and dopplerProjectJson, for example:

        {{ doppler \"SECRET_NAME\" }}\n{{ dopplerProjectJson.SECRET_NAME }}\n

        It is important to note that neither of the above parse any individual secret as json. This can be achieved by using the fromJson function, for example:

        {{ (doppler \"SECRET_NAME\" | fromJson).created_by.email_address }}\n{{ (dopplerProjectJson.SECRET_NAME | fromJson).created_by.email_address }}\n

        Obviously the secret would have to be saved in json format for this to work as expected.

        "},{"location":"user-guide/password-managers/ejson/","title":"ejson","text":"

        chezmoi includes support for ejson.

        Structured data can be retrieved with the ejsonDecrypt template function, for example:

        examplePassword = {{ (ejsonDecrypt \"my-secrets.ejson\").password }}\n

        If you want to specify the private key to use for the decryption, structured data can be retrieved with the ejsonDecryptWithKey template function, for example:

        examplePassword = {{ (ejsonDecryptWithKey \"my-secrets.ejson\" \"top-secret-key\").password }}\n
        "},{"location":"user-guide/password-managers/gopass/","title":"gopass","text":"

        chezmoi includes support for gopass using the gopass CLI.

        The first line of the output of gopass show $PASS_NAME is available as the gopass template function, for example:

        {{ gopass \"$PASS_NAME\" }}\n
        "},{"location":"user-guide/password-managers/hcp-vault-secrets/","title":"HCP Vault Secrets","text":"

        chezmoi includes support for HCP Vault Secrets using the vlt CLI to expose data through the hcpVaultSecret and hcpVaultSecretJson template functions.

        Log in using:

        vlt login\n

        The output of the vlt secrets get --plaintext $SECRET_NAME is available as the hcpVaultSecret function, for example:

        {{ hcpVaultSecret \"secret_name\" \"application_name\" \"project_id\" \"organization_id\" }}\n

        You can set the default values for the application name, project ID, and organization ID in your config file, for example:

        ~/.config/chezmoi/chezmoi.toml
        [hcpVaultSecrets]\n    organizationId = \"bf479eab-a292-4b46-92df-e22f5c47eadc\"\n    projectId = \"5907a2fa-d26a-462a-8705-74dfe967e87d\"\n    applicationName = \"my-application\"\n

        With these default values, you can omit them in the call to hcpVaultSecret, for example:

        {{ hcpVaultSecret \"secret_name\" }}\n{{ hcpVaultSecret \"other_secret_name\" \"other_application_name\" }}\n

        Structured data from vlt secrets get --format=json $SECRET_NAME is available as the hcpVaultSecretJson template function, for example:

        {{ (hcpVaultSecretJson \"secret_name\").created_by.email }}\n
        "},{"location":"user-guide/password-managers/keepassxc/","title":"KeePassXC","text":"

        chezmoi includes support for KeePassXC using the KeePassXC CLI (keepassxc-cli) to expose data as a template function.

        Provide the path to your KeePassXC database in your configuration file:

        ~/.config/chezmoi/chezmoi.toml
        [keepassxc]\n    database = \"/home/user/Passwords.kdbx\"\n

        The structured data from keepassxc-cli show $database is available as the keepassxc template function in your config files, for example:

        username = {{ (keepassxc \"example.com\").UserName }}\npassword = {{ (keepassxc \"example.com\").Password }}\n

        Additional attributes are available through the keepassxcAttribute function. For example, if you have an entry called SSH Key with an additional attribute called private-key, its value is available as:

        {{ keepassxcAttribute \"SSH Key\" \"private-key\" }}\n
        "},{"location":"user-guide/password-managers/keepassxc/#non-password-protected-databases","title":"Non-password-protected databases","text":"

        If your database is not password protected, add --no-password to keepassxc.args and keepassxc.prompt = false:

        ~/.config/chezmoi/chezmoi.toml
        [keepassxc]\n    database = \"/home/user/Passwords.kdbx\"\n    args = [\"--no-password\"]\n    prompt = false\n
        "},{"location":"user-guide/password-managers/keepassxc/#yubikey-support","title":"YubiKey support","text":"

        chezmoi includes an experimental mode to support using KeePassXC with YubiKeys. Set keepassxc.mode to open and keepassxc.args to the arguments required to set your YubiKey, for example:

        ~/.config/chezmoi/chezmoi.toml
        [keepassxc]\n    database = \"/home/user/Passwords.kdbx\"\n    args = [\"--no-password\", \"--yubikey\", \"2:7370001\"]\n    mode = \"open\"\n
        "},{"location":"user-guide/password-managers/keeper/","title":"Keeper","text":"

        chezmoi includes support for Keeper using the Commander CLI to expose data as a template function.

        Create a persistent login session as described in the Command CLI documentation.

        Passwords can be retrieved with the keeperFindPassword template function, for example:

        examplePasswordFromPath = {{ keeperFindPassword \"$PATH\" }}\nexamplePasswordFromUid = {{ keeperFindPassword \"$UID\" }}\n

        For retrieving more complex data, use the keeper template function with a UID to retrieve structured data from keeper get or the keeperDataFields template function which restructures the output of keeper get in to a more convenient form, for example:

        keeperDataTitle = {{ (keeper \"$UID\").data.title }}\nexamplePassword = {{ index (keeperDataFields \"$UID\").password 0 }}\n

        Extra arguments can be passed to the Keeper CLI command by setting the keeper.args variable in chezmoi's config file, for example:

        ~/.config/chezmoi/chezmoi.toml
        [keeper]\n    args = [\"--config\", \"/path/to/config.json\"]\n
        "},{"location":"user-guide/password-managers/keychain-and-windows-credentials-manager/","title":"Keychain and Windows Credentials Manager","text":"

        chezmoi includes support for Keychain (on macOS), GNOME Keyring (on Linux and FreeBSD), and Windows Credentials Manager (on Windows) via the zalando/go-keyring library.

        Set values with:

        $ chezmoi secret keyring set --service=$SERVICE --user=$USER\nValue: xxxxxxxx\n

        The value can then be used in templates using the keyring function which takes the service and user as arguments.

        For example, save a GitHub access token in keyring with:

        $ chezmoi secret keyring set --service=github --user=$GITHUB_USERNAME\nValue: xxxxxxxx\n

        and then include it in your ~/.gitconfig file with:

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

        You can query the keyring from the command line:

        chezmoi secret keyring get --service=github --user=$GITHUB_USERNAME\n
        "},{"location":"user-guide/password-managers/lastpass/","title":"LastPass","text":"

        chezmoi includes support for LastPass using the LastPass CLI to expose data as a template function.

        Log in to LastPass using:

        lpass login $LASTPASS_USERNAME\n

        Check that lpass is working correctly by showing password data:

        lpass show --json $LASTPASS_ENTRY_ID\n

        where $LASTPASS_ENTRY_ID is a LastPass Entry Specification.

        The structured data from lpass show --json id is available as the lastpass template function. The value will be an array of objects. You can use the index function and .Field syntax of the text/template language to extract the field you want. For example, to extract the password field from first the \"GitHub\" entry, use:

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

        chezmoi automatically parses the note value of the LastPass entry as colon-separated key-value pairs, so, for example, you can extract a private SSH key like this:

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

        Keys in the note section written as CamelCase Words are converted to camelCaseWords.

        If the note value does not contain colon-separated key-value pairs, then you can use lastpassRaw to get its raw value, for example:

        {{ (index (lastpassRaw \"SSH Private Key\") 0).note }}\n
        "},{"location":"user-guide/password-managers/pass/","title":"pass","text":"

        chezmoi includes support for pass using the pass CLI.

        The first line of the output of pass show $PASS_NAME is available as the pass template function, for example:

        {{ pass \"$PASS_NAME\" }}\n
        "},{"location":"user-guide/password-managers/passhole/","title":"Passhole","text":"

        chezmoi includes support for KeePass using the passhole CLI (ph) to expose data as a template function.

        "},{"location":"user-guide/password-managers/vault/","title":"Vault","text":"

        chezmoi includes support for Vault using the Vault CLI to expose data as a template function.

        The vault CLI needs to be correctly configured on your machine, e.g. the VAULT_ADDR and VAULT_TOKEN environment variables must be set correctly. Verify that this is the case by running:

        vault kv get -format=json $KEY\n

        The structured data from vault kv get -format=json is available as the vault template function. You can use the .Field syntax of the text/template language to extract the data you want. For example:

        {{ (vault \"$KEY\").data.data.password }}\n
        "},{"location":"user-guide/tools/diff/","title":"Diff","text":""},{"location":"user-guide/tools/diff/#use-a-custom-diff-tool","title":"Use a custom diff tool","text":"

        By default, chezmoi uses a built-in diff. You can use a custom tool by setting the diff.command and diff.args configuration variables. The elements of diff.args are interpreted as templates with the variables .Destination and .Target containing filenames of the file in the destination state and the target state respectively. For example, to use meld, specify:

        ~/.config/chezmoi/chezmoi.toml
        [diff]\n    command = \"meld\"\n    args = [\"--diff\", \"{{ .Destination }}\", \"{{ .Target }}\"]\n

        Hint

        If you generate your config file from a config file template, then you'll need to escape the {{ and }} as {{ \"{{\" }} and {{ \"}}\" }}. That way your generated config file contains the {{ and }} you expect.

        "},{"location":"user-guide/tools/diff/#use-vscode-as-the-diff-tool","title":"Use VSCode as the diff tool","text":"

        To use VSCode as the diff tool, add the following to your config:

        TOMLYAML ~/.config/chezmoi/chezmoi.toml
        [diff]\ncommand = \"code\"\nargs = [\"--wait\", \"--diff\"]\n
        ~/.config/chezmoi/chezmoi.yaml
        diff:\n  command: \"code\"\n  args:\n  - \"--wait\"\n  - \"--diff\"\n
        "},{"location":"user-guide/tools/diff/#use-delta-as-the-diff-tool","title":"Use delta as the diff tool","text":"

        To use delta as the diff tool you must set both diff.command and diff.pager to delta, for example:

        TOMLYAML ~/.config/chezmoi/chezmoi.toml
        [diff]\ncommand = \"delta\"\npager = \"delta\"\n
        ~/.config/chezmoi/chezmoi.yaml
        diff:\n  command: \"delta\"\n  pager: \"delta\"\n
        "},{"location":"user-guide/tools/diff/#dont-show-scripts-in-the-diff-output","title":"Don't show scripts in the diff output","text":"

        By default, chezmoi diff will show all changes, including the contents of scripts that will be run. You can exclude scripts from the diff output by setting the diff.exclude configuration variable in your configuration file, for example:

        ~/.config/chezmoi/chezmoi.toml
        [diff]\n    exclude = [\"scripts\"]\n
        "},{"location":"user-guide/tools/diff/#dont-show-externals-in-the-diff-output","title":"Don't show externals in the diff output","text":"

        To exclude diffs from externals, either pass the --exclude=externals flag or set diff.exclude to [\"externals\"] in your config file.

        "},{"location":"user-guide/tools/diff/#customize-the-diff-pager","title":"Customize the diff pager","text":"

        You can change the diff format, and/or pipe the output into a pager of your choice by setting diff.pager configuration variable. For example, to use diff-so-fancy specify:

        ~/.config/chezmoi/chezmoi.toml
        [diff]\n    pager = \"diff-so-fancy\"\n

        The pager can be disabled using the --no-pager flag or by setting diff.pager to an empty string.

        "},{"location":"user-guide/tools/diff/#show-human-friendly-diffs-for-binary-files","title":"Show human-friendly diffs for binary files","text":"

        Similar to git, chezmoi includes a \"textconv\" feature that can transform file contents before passing them to the diff program. This is primarily useful for generating human-readable diffs of binary files.

        For example, to show diffs of macOS .plist files, add the following to your configuration file:

        JSONTOMLYAML ~/.config/chezmoi/chezmoi.json
        {\n    \"textconv\": [\n        \"pattern\": \"**/*.plist\",\n        \"command\": \"plutil\",\n        \"args\": [\n            \"-convert\",\n            \"xml1\",\n            \"-o\",\n            \"-\",\n            \"-\"\n        ]\n    ]\n}\n
        ~/.config/chezmoi/chezmoi.toml
        [[textconv]]\npattern = \"**/*.plist\"\ncommand = \"plutil\"\nargs = [\"-convert\", \"xml1\", \"-o\", \"-\", \"-\"]\n
        ~/.config/chezmoi/chezmoi.yaml
        textconv:\n- pattern: \"**/*.plist\"\n  command: \"plutil\"\n  args:\n  - \"-convert\"\n  - \"xml1\"\n  - \"-o\"\n  - \"-\",\n  - \"-\"\n

        This will pipe all .plist files through plutil -convert xml1 -o - - before showing differences.

        "},{"location":"user-guide/tools/editor/","title":"Editor","text":""},{"location":"user-guide/tools/editor/#use-your-preferred-editor-with-chezmoi-edit-and-chezmoi-edit-config","title":"Use your preferred editor with chezmoi edit and chezmoi edit-config","text":"

        By default, chezmoi will use your preferred editor as defined by the $VISUAL or $EDITOR environment variables, falling back to a default editor depending on your operating system (vi on UNIX-like operating systems, notepad.exe on Windows).

        You can configure chezmoi to use your preferred editor by either setting the $EDITOR environment variable or setting the edit.command variable in your configuration file.

        The editor command must only return when you have finished editing the files. chezmoi will emit a warning if your editor command returns too quickly.

        In the specific case of using VSCode or Codium as your editor, you must pass the --wait flag, for example, in your shell config:

        export EDITOR=\"code --wait\"\n

        Or in chezmoi's configuration file:

        ~/.config/chezmoi/chezmoi.toml
        [edit]\n    command = \"code\"\n    args = [\"--wait\"]\n
        "},{"location":"user-guide/tools/editor/#use-chezmoi-with-vim","title":"Use chezmoi with VIM","text":"

        github.com/alker0/chezmoi.vim provides syntax highlighting for files managed by chezmoi, including for templates.

        github.com/Lilja/vim-chezmoi works with chezmoi edit to apply the edited dotfile on save.

        github.com/xvzc/chezmoi.nvim allows you to edit your chezmoi-managed files and automatically apply.

        Alternatively, you can use an autocmd to run chezmoi apply whenever you save a dotfile, but you must disable chezmoi edit's hardlinking:

        ~/.config/chezmoi/chezmoi.toml
        [edit]\n    hardlink = false\n
        ~/.vimrc
        autocmd BufWritePost ~/.local/share/chezmoi/* ! chezmoi apply --source-path \"%\"\n
        "},{"location":"user-guide/tools/editor/#use-chezmoi-with-emacs","title":"Use chezmoi with emacs","text":"

        github.com/tuh8888/chezmoi.el provides convenience functions for interacting with chezmoi from emacs, and is available in MELPA.

        "},{"location":"user-guide/tools/http-or-socks5-proxy/","title":"HTTP or SOCKS5 proxy","text":"

        chezmoi supports HTTP, HTTPS, and SOCKS5 proxies. Set the HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, or their lowercase equivalents, for example:

        HTTP_PROXY=socks5://127.0.0.1:1080 chezmoi apply --refresh-externals\n
        "},{"location":"user-guide/tools/merge/","title":"Merge","text":""},{"location":"user-guide/tools/merge/#use-a-custom-merge-command","title":"Use a custom merge command","text":"

        By default, chezmoi uses vimdiff. You can use a custom command by setting the merge.command and merge.args configuration variables. The elements of merge.args are interpreted as templates with the variables .Destination, .Source, and .Target containing filenames of the file in the destination state, source state, and target state respectively. For example, to use neovim's diff mode, specify:

        ~/.config/chezmoi/chezmoi.toml
        [merge]\n    command = \"nvim\"\n    args = [\"-d\", \"{{ .Destination }}\", \"{{ .Source }}\", \"{{ .Target }}\"]\n

        Hint

        If you generate your config file from a config file template, then you'll need to escape the {{ and }} as {{ \"{{\" }} and {{ \"}}\" }}. That way your generated config file contains the {{ and }} you expect.

        "},{"location":"user-guide/tools/merge/#use-vscode-as-the-merge-tool","title":"Use VSCode as the merge tool","text":"

        To use VSCode as the merge tool, add the following to your config:

        TOMLYAML ~/.config/chezmoi/chezmoi.toml
        [merge]\ncommand = \"bash\"\nargs = [\n    \"-c\",\n    \"cp {{ .Target }} {{ .Target }}.base && code --new-window --wait --merge {{ .Destination }} {{ .Target }} {{ .Target }}.base {{ .Source }}\",\n]\n
        ~/.config/chezmoi/chezmoi.yaml
        merge:\n  command: \"bash\"\n  args:\n  - \"-c\"\n  - \"cp {{ .Target }} {{ .Target }}.base && code --new-window --wait --merge {{ .Destination }} {{ .Target }} {{ .Target }}.base {{ .Source }}\"\n
        "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"chezmoi","text":"

        Manage your dotfiles across multiple diverse machines, securely.

        The latest version of chezmoi is 2.59.0 (release notes, release history).

        "},{"location":"#what-does-chezmoi-do","title":"What does chezmoi do?","text":"

        chezmoi helps you manage your personal configuration files (dotfiles, like ~/.gitconfig) across multiple machines.

        chezmoi provides many features beyond symlinking or using a bare git repo including:

        • templates (to handle small differences between machines)
        • password manager support (to store your secrets securely)
        • importing files from archives (great for shell and editor plugins)
        • full file encryption (using gpg or age)
        • running scripts (to handle everything else)

        With chezmoi, pronounced /\u0283e\u026a mwa/ (shay-mwa), you can install chezmoi and your dotfiles from your GitHub dotfiles repo on a new, empty machine with a single command:

        sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply $GITHUB_USERNAME\n

        As well as the curl | sh installation, you can install chezmoi with your favorite package manager.

        Updating your dotfiles on any machine is a single command:

        chezmoi update\n

        chezmoi runs on all popular operating systems, is distributed as a single statically-linked binary with no dependencies, and does not require root access.

        "},{"location":"#how-do-i-start-with-chezmoi","title":"How do I start with chezmoi?","text":"

        Install chezmoi then read the quick start guide. The user guide covers most common tasks. For a full description, consult the reference.

        "},{"location":"#should-i-use-chezmoi","title":"Should I use chezmoi?","text":"

        See what other people think about chezmoi by reading articles, listening to podcasts, and watching videos about chezmoi. Read how chezmoi compares to other dotfile managers. Explore other people's dotfile repos that use chezmoi.

        "},{"location":"#how-do-i-get-help-using-chezmoi","title":"How do I get help using chezmoi?","text":"

        chezmoi has extensive documentation. First, use the search bar at the top of this page using a few, short, and specific keywords related to your problem.

        chezmoi is an open source project with tens of thousands of users, so it is very likely that someone else has already encountered and solved your problem. Search chezmoi's GitHub repo for issues and discussions with keywords related to your problem.

        If your question is still unanswered, please open a GitHub issue for support.

        "},{"location":"#i-like-chezmoi-how-do-i-say-thanks","title":"I like chezmoi. How do I say thanks?","text":"

        Please give chezmoi a star on GitHub.

        Share chezmoi and, if you're happy to share your public dotfiles repo, then tag your repo with chezmoi.

        Contributions are very welcome and every bug report, support request, and feature request helps make chezmoi better. Thank you :)

        chezmoi does not accept financial contributions. Instead, please make a donation to a charity or cause of your choice.

        "},{"location":"comparison-table/","title":"Comparison table","text":"chezmoi dotbot rcm vcsh yadm bare git Distribution Single binary Python package Multiple files Single script or package Single script - Install method Many git submodule Many Many Many Manual Non-root install on bare system \u2705 \u2049\ufe0f \u2705 \u2705 \u2705 \u2705 Windows support \u2705 \u2705 \u274c \u274c \u2705 \u2705 Bootstrap requirements None Python, git Perl sh, git git git Source repos Single Single Multiple Multiple Single Single dotfiles are... Files Symlinks Files Files Files Files Config file Optional Required Optional None Optional Optional Private files \u2705 \u274c \u274c \u274c \u2705 \u274c Show differences without applying \u2705 \u274c \u274c \u2705 \u2705 \u2705 Whole file encryption \u2705 \u274c \u274c \u274c \u2705 \u274c Password manager integration \u2705 \u274c \u274c \u274c \u274c \u274c Machine-to-machine file differences Templates Alternative files Alternative files Branches Alternative files, templates \u2049\ufe0f Custom variables in templates \u2705 \u274c \u274c \u274c \u274c \u274c Executable files \u2705 \u2705 \u2705 \u2705 \u2705 \u2705 File creation with initial contents \u2705 \u274c \u274c \u2705 \u274c \u274c Externals \u2705 \u274c \u274c \u274c \u274c \u274c Manage partial files \u2705 \u274c \u274c \u2049\ufe0f \u2705 \u2049\ufe0f File removal \u2705 \u274c \u274c \u2705 \u2705 \u274c Directory creation \u2705 \u2705 \u2705 \u2705 \u2705 \u2705 Run scripts \u2705 \u2705 \u2705 \u2705 \u2705 \u274c Run once scripts \u2705 \u274c \u274c \u2705 \u2705 \u274c Machine-to-machine symlink differences \u2705 \u274c \u274c \u2049\ufe0f \u2705 \u2049\ufe0f Shell completion \u2705 \u274c \u274c \u2705 \u2705 \u2705 Archive import \u2705 \u274c \u274c \u2705 \u274c \u2705 Archive export \u2705 \u274c \u274c \u2705 \u274c \u2705 Implementation language Go Python Perl POSIX Shell Bash C

        \u2705 Supported, \u2049\ufe0f Possible with significant manual effort, \u274c Not supported

        For more comparisons, visit dotfiles.github.io/utilities.

        "},{"location":"install/","title":"Install","text":"

        The latest version of chezmoi is 2.59.0 (release notes, release history).

        "},{"location":"install/#one-line-package-install","title":"One-line package install","text":"

        Install chezmoi with your package manager with a single command:

        LinuxmacOSWindowsFreeBSDOpenIndiana AlpineArchNixOSopenSUSE TumbleweedTermuxVoid
        apk add chezmoi\n
        pacman -S chezmoi\n
        nix-env -i chezmoi\n
        zypper install chezmoi\n
        pkg install chezmoi\n
        xbps-install -S chezmoi\n
        HomebrewMacPortsNix
        brew install chezmoi\n
        port install chezmoi\n
        nix-env -i chezmoi\n
        ChocolateyScoopWinget
        choco install chezmoi\n
        scoop install chezmoi\n
        winget install twpayne.chezmoi\n
        pkg install chezmoi\n
        pkg install application/chezmoi\n

        chezmoi is available in many cross-platform package managers:

        asdfHomebrewNixsnap
        asdf plugin add chezmoi && asdf install chezmoi 2.59.0\n
        brew install chezmoi\n
        nix-env -i chezmoi\n
        snap install chezmoi --classic\n

        For more packages, see chezmoi on repology.org.

        "},{"location":"install/#one-line-binary-install","title":"One-line binary install","text":"

        Install the correct binary for your operating system and architecture in ./bin with a single command:

        curlwgetPowerShell
        sh -c \"$(curl -fsLS get.chezmoi.io)\"\n
        sh -c \"$(wget -qO- get.chezmoi.io)\"\n
        iex \"&{$(irm 'https://get.chezmoi.io/ps1')}\"\n

        To provide the script with arguments, place them at the end of the quote:

        iex \"&{$(irm 'https://get.chezmoi.io/ps1')} -b '~/bin'\"\n

        Hint

        If you already have a dotfiles repo using chezmoi on GitHub at https://github.com/$GITHUB_USERNAME/dotfiles then you can install chezmoi and your dotfiles with the single command:

        sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply $GITHUB_USERNAME\n

        Private GitHub repos require other authentication methods:

        sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply git@github.com:$GITHUB_USERNAME/dotfiles.git\n

        Hint

        If you want to install chezmoi in ./.local/bin instead of ./bin you can use get.chezmoi.io/lb or chezmoi.io/getlb instead.

        Hint

        To install the chezmoi binary in a different directory, use the -b option, for example:

        sh -c \"$(curl -fsLS get.chezmoi.io)\" -- -b $HOME/.local/bin\n
        "},{"location":"install/#download-a-pre-built-linux-package","title":"Download a pre-built Linux package","text":"

        Download a package for your distribution and architecture.

        debrpmapkArch Linux

        amd64 arm64 armel i386 loong64 mips64 mips64le ppc64 ppc64le riscv64 s390x

        aarch64 armhfp i686 loong64 mips64 mips64le ppc64 ppc64le s390x riscv64 x86_64

        386 amd64 arm arm64 loong64 mips64_hardfloat mips64le_hardfloat ppc64 ppc64le riscv64 s390x

        386 amd64 arm arm64 loong64 mips64_hardfloat mips64le_hardfloat ppc64 ppc64le riscv64 s390x

        "},{"location":"install/#download-a-pre-built-binary","title":"Download a pre-built binary","text":"

        Download an archive for your operating system and architecture containing a pre-built binary and shell completions.

        LinuxmacOSWindowsFreeBSDOpenBSD

        amd64 arm arm64 i386 loong64 mips64 mips64le ppc64 ppc64le riscv64 s390x amd64 (glibc) amd64 (musl) arm64 (Termux)

        amd64 arm64

        amd64 arm arm64 i386

        amd64 arm arm64 i386 riscv64

        amd64 arm arm64 i386 ppc64 riscv64

        "},{"location":"install/#install-from-source","title":"Install from source","text":"

        Download, build, and install chezmoi for your system with Go 1.23 or later:

        git clone https://github.com/twpayne/chezmoi.git\ncd chezmoi\nmake install-from-git-working-copy\n
        "},{"location":"install/#verify-your-download","title":"Verify your download","text":"

        chezmoi's release process signs the SHA256 checksums of all released assets with cosign.

        To verify an asset that you have downloaded:

        Download the checksum file, checksum file signature, and public signing key.

        curl --location --remote-name-all \\\n       https://github.com/twpayne/chezmoi/releases/download/v2.59.0/chezmoi_2.59.0_checksums.txt \\\n       https://github.com/twpayne/chezmoi/releases/download/v2.59.0/chezmoi_2.59.0_checksums.txt.sig \\\n       https://github.com/twpayne/chezmoi/releases/download/v2.59.0/chezmoi_cosign.pub\n

        Verify the signature of the checksum file with cosign.

        cosign verify-blob --key=chezmoi_cosign.pub \\\n                     --signature=chezmoi_2.59.0_checksums.txt.sig \\\n                     chezmoi_2.59.0_checksums.txt\n

        Important

        cosign should print Verified OK

        Verify the that the SHA256 sum of your downloads matches the SHA256 sum in the verified checksum file. All the downloaded files must be in the current directory.

        LinuxmacOS
        sha256sum --check chezmoi_2.59.0_checksums.txt --ignore-missing\n
        shasum --algorithm 256 --check chezmoi_2.59.0_checksums.txt --ignore-missing\n

        For more information on chezmoi's release signing process, see the developer documentation on chezmoi's releases.

        "},{"location":"license/","title":"License","text":"

        The MIT License (MIT)

        Copyright (c) 2018-2025 Tom Payne

        Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

        The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

        THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

        "},{"location":"migrating-from-another-dotfile-manager/","title":"Migrating from another dotfile manager","text":""},{"location":"migrating-from-another-dotfile-manager/#migrate-from-a-dotfile-manager-that-uses-symlinks","title":"Migrate from a dotfile manager that uses symlinks","text":"

        Many dotfile managers replace dotfiles with symbolic links to files in a common directory. If you chezmoi add such a symlink, chezmoi will add the symlink, not the file. To assist with migrating from symlink-based systems, use the --follow option to chezmoi add, for example:

        chezmoi add --follow ~/.bashrc\n

        This will tell chezmoi add that the target state of ~/.bashrc is the target of the ~/.bashrc symlink, rather than the symlink itself. When you run chezmoi apply, chezmoi will replace the ~/.bashrc symlink with the file contents.

        "},{"location":"quick-start/","title":"Quick start","text":""},{"location":"quick-start/#concepts","title":"Concepts","text":"

        Roughly speaking, chezmoi stores the desired state of your dotfiles in the directory ~/.local/share/chezmoi. When you run chezmoi apply, chezmoi calculates the desired contents for each of your dotfiles and then makes the minimum changes required to make your dotfiles match your desired state. chezmoi's concepts are described more accurately in the reference manual.

        "},{"location":"quick-start/#start-using-chezmoi-on-your-current-machine","title":"Start using chezmoi on your current machine","text":"

        Assuming that you have already installed chezmoi, initialize chezmoi with:

        chezmoi init\n

        This will create a new git local repository in ~/.local/share/chezmoi where chezmoi will store its source state. By default, chezmoi only modifies files in the working copy.

        Manage your first file with chezmoi:

        chezmoi add ~/.bashrc\n

        This will copy ~/.bashrc to ~/.local/share/chezmoi/dot_bashrc.

        Edit the source state:

        chezmoi edit ~/.bashrc\n

        This will open ~/.local/share/chezmoi/dot_bashrc in your $EDITOR. Make some changes and save the file.

        Hint

        You don't have to use chezmoi edit to edit your dotfiles. See this FAQ entry for more details.

        See what changes chezmoi would make:

        chezmoi diff\n

        Apply the changes:

        chezmoi -v apply\n

        All chezmoi commands accept the -v (verbose) flag to print out exactly what changes they will make to the file system, and the -n (dry run) flag to not make any actual changes. The combination -n -v is very useful if you want to see exactly what changes would be made.

        Next, open a shell in the source directory, to commit your changes:

        chezmoi cd\ngit add .\ngit commit -m \"Initial commit\"\n

        Create a new repository on GitHub called dotfiles and then push your repo:

        git remote add origin git@github.com:$GITHUB_USERNAME/dotfiles.git\ngit branch -M main\ngit push -u origin main\n

        Hint

        chezmoi can be configured to automatically add, commit, and push changes to your repo.

        chezmoi can also be used with GitLab, or BitBucket, Source Hut, or any other git hosting service.

        Finally, exit the shell in the source directory to return to where you were:

        exit\n

        These commands are summarized in this sequence diagram:

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo H->>L: chezmoi init H->>W: chezmoi add <file> W->>W: chezmoi edit <file> W-->>H: chezmoi diff W->>H: chezmoi apply H-->>W: chezmoi cd W->>L: git add W->>L: git commit L->>R: git push W-->>H: exit"},{"location":"quick-start/#using-chezmoi-across-multiple-machines","title":"Using chezmoi across multiple machines","text":"

        On a second machine, initialize chezmoi with your dotfiles repo:

        chezmoi init https://github.com/$GITHUB_USERNAME/dotfiles.git\n

        Hint

        Private GitHub repos require other authentication methods:

        chezmoi init git@github.com:$GITHUB_USERNAME/dotfiles.git\n

        This will check out the repo and any submodules and optionally create a chezmoi config file for you.

        Check what changes that chezmoi will make to your home directory by running:

        chezmoi diff\n

        If you are happy with the changes that chezmoi will make then run:

        chezmoi apply -v\n

        If you are not happy with the changes to a file then either edit it with:

        chezmoi edit $FILE\n

        Or, invoke a merge tool (by default vimdiff) to merge changes between the current contents of the file, the file in your working copy, and the computed contents of the file:

        chezmoi merge $FILE\n

        On any machine, you can pull and apply the latest changes from your repo with:

        chezmoi update -v\n

        These commands are summarized in this sequence diagram:

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init <repo> W-->>H: chezmoi diff W->>H: chezmoi apply W->>W: chezmoi edit <file> W->>W: chezmoi merge <file> R->>H: chezmoi update"},{"location":"quick-start/#set-up-a-new-machine-with-a-single-command","title":"Set up a new machine with a single command","text":"

        You can install your dotfiles on new machine with a single command:

        chezmoi init --apply https://github.com/$GITHUB_USERNAME/dotfiles.git\n

        If you use GitHub and your dotfiles repo is called dotfiles then this can be shortened to:

        chezmoi init --apply $GITHUB_USERNAME\n

        Hint

        Private GitHub repos require other authentication methods:

        chezmoi init --apply git@github.com:$GITHUB_USERNAME/dotfiles.git\n

        This command is summarized in this sequence diagram:

        sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>H: chezmoi init --apply <repo>"},{"location":"quick-start/#next-steps","title":"Next steps","text":"

        For a full list of commands run:

        chezmoi help\n

        chezmoi has much more functionality. Good starting points are reading what other people say about chezmoi, adding more dotfiles, and using templates to manage files that vary from machine to machine and retrieve secrets from your password manager. Read the user guide to explore and see how people use chezmoi for inspiration.

        "},{"location":"what-does-chezmoi-do/","title":"What does chezmoi do?","text":"

        chezmoi helps you manage your personal configuration files (dotfiles, like ~/.gitconfig) across multiple machines.

        chezmoi is helpful if you have spent time customizing the tools you use (e.g. shells, editors, and version control systems) and want to keep machines running different accounts (e.g. home and work) and/or different operating systems (e.g. Linux, macOS, and Windows) in sync, while still being able to easily cope with differences from machine to machine.

        chezmoi scales from the trivial (e.g. copying a few dotfiles onto a Raspberry Pi, development container, or virtual machine) to complex long-lived multi-machine development environments (e.g. keeping any number of home and work, Linux, macOS, and Windows machines in sync). In all cases you only need to maintain a single source of truth (a single branch in git) and getting started only requires adding a single binary to your machine (which you can do with curl, wget, or scp).

        chezmoi has strong support for security, allowing you to manage secrets (e.g. passwords, access tokens, and private keys) securely and seamlessly using a password manager and/or encrypt whole files with your favorite encryption tool.

        If you do not personalize your configuration or only ever use a single operating system with a single account and none of your dotfiles contain secrets then you don't need chezmoi. Otherwise, read on...

        "},{"location":"what-does-chezmoi-do/#what-are-chezmois-key-features","title":"What are chezmoi's key features?","text":""},{"location":"what-does-chezmoi-do/#flexible","title":"Flexible","text":"

        You can share as much configuration across machines as you want, while still being able to control machine-specific details.Your dotfiles can be templates (using text/template syntax). Predefined variables allow you to change behavior depending on operating system, architecture, and hostname. chezmoi runs on all commonly-used platforms, like Linux, macOS, and Windows. It also runs on less commonly-used platforms, like FreeBSD, OpenBSD, and Termux.

        "},{"location":"what-does-chezmoi-do/#personal-and-secure","title":"Personal and secure","text":"

        Nothing leaves your machine, unless you want it to. Your configuration remains in a git repo under your control. You can write the configuration file in the format of your choice. chezmoi can retrieve secrets from 1Password, AWS Secrets Manager, Azure Key Vault, Bitwarden, Dashlane, Doppler, gopass, HCP Vault Secrets, KeePassXC, Keeper, LastPass, pass, passage, passhole, Vault, Keychain, Keyring, or any command-line utility of your choice. You can encrypt individual files with GnuPG or age. You can checkout your dotfiles repo on as many machines as you want without revealing any secrets to anyone.

        "},{"location":"what-does-chezmoi-do/#transparent","title":"Transparent","text":"

        chezmoi includes verbose and dry run modes so you can review exactly what changes it will make to your home directory before making them. chezmoi's source format uses only regular files and directories that map one-to-one with the files, directories, and symlinks in your home directory that you choose to manage. If you decide not to use chezmoi in the future, it is easy to move your data elsewhere.

        "},{"location":"what-does-chezmoi-do/#declarative-and-robust","title":"Declarative and robust","text":"

        You declare the desired state of files, directories, and symbolic links in your source of truth and chezmoi updates your home directory to match that state. What you want is what you get. chezmoi updates all files and symbolic links atomically. You will never be left with incomplete files that could lock you out, even if the update process is interrupted.

        "},{"location":"what-does-chezmoi-do/#fast-and-easy-to-use","title":"Fast and easy to use","text":"

        Using chezmoi feels like using git: the commands are similar and chezmoi runs in fractions of a second. chezmoi makes most day-to-day operations one line commands, including installation, initialization, and keeping your machines up-to-date. chezmoi can pull and apply changes from your dotfiles repo in a single command, and automatically commit and push changes.

        "},{"location":"why-use-chezmoi/","title":"Why use chezmoi?","text":""},{"location":"why-use-chezmoi/#why-should-i-use-a-dotfile-manager","title":"Why should I use a dotfile manager?","text":"

        Dotfile managers give you the combined benefit of a consistent environment everywhere with an undo command and a restore from backup.

        As the core of our development environments become increasingly standardized (e.g. using git at both home and work), and we further customize them, at the same time we increasingly work in ephemeral environments like Docker containers, virtual machines, and GitHub Codespaces.

        In the same way that nobody would use an editor without an undo command, or develop software without a version control system, chezmoi brings the investment that you have made in mastering your tools to every environment that you work in.

        "},{"location":"why-use-chezmoi/#i-already-have-a-system-to-manage-my-dotfiles-why-should-i-use-chezmoi","title":"I already have a system to manage my dotfiles, why should I use chezmoi?","text":"

        Quote

        I\u2019ve been using Chezmoi for more than a year now, across at least 3 computers simultaneously, and I really love it. Most of all, I love how fast I can configure a new machine when I use it. In just a couple minutes of work, I can kick off a process on a brand-new computer that will set up my dotfiles and install all my usual software so it feels like a computer I\u2019ve been using for years. I also appreciate features like secrets management, which allow me to share my dotfiles while keeping my secrets safe. Overall, I love the way Chezmoi fits so perfectly into the niche of managing dotfiles.

        \u2014 @mike_kasberg

        Quote

        I had initially been turned off when I first encountered [chezmoi], because [chezmoi] seemed overkill for (what appeared to me) a simple task.

        But the problem of managing a relatively small number of dotfiles across a relatively small number of machines with small differences between them and keeping them up to date proved to be MUCH more complex than I imagined. Copy things around by hand, and then later distributing them via source control got hairy very quickly.

        I finally realized all those features were absolutely necessary to manage things sanely, and once I took some time to learn how to do things with chezmoi, I have never looked back.

        \u2014 njt

        Quote

        Regular reminder that chezmoi is the best dotfile manager utility I've used and you can too

        \u2014 @mbbroberg

        If you're using any of the following methods:

        • A custom shell script.

        • An existing dotfile manager like dotbot, rcm, homesick, vcsh, yadm, or GNU Stow.

        • A bare git repo.

        Then you've probably run into at least one of the following problems.

        "},{"location":"why-use-chezmoi/#if-coping-with-differences-between-machines-requires-extra-effort","title":"...if coping with differences between machines requires extra effort","text":"

        If you want to synchronize your dotfiles across multiple operating systems or distributions, then you may need to manually perform extra steps to cope with differences from machine to machine. You might need to run different commands on different machines, maintain separate per-machine files or branches (with the associated hassle of merging, rebasing, or copying each change), or hope that your custom logic handles the differences correctly.

        chezmoi uses a single source of truth (a single branch) and a single command that works on every machine. Individual files can be templates to handle machine to machine differences, if needed.

        "},{"location":"why-use-chezmoi/#if-you-have-to-keep-your-dotfiles-repo-private","title":"...if you have to keep your dotfiles repo private","text":"

        Quote

        And regarding dotfiles, I saw that. It's only public dotfiles repos so I have to evaluate my dotfiles history to be sure. I have secrets scanning and more, but it was easier to keep it private for security, I'm ok mostly though. I'm using chezmoi and it's easier now

        \u2014 @sheldon_hull

        If your system stores secrets in plain text, then you must be very careful about where you clone your dotfiles. If you clone them on your work machine then anyone with access to your work machine (e.g. your IT department) will have access to your home secrets. If you clone it on your home machine then you risk leaking work secrets.

        With chezmoi you can store secrets in your password manager or encrypt them, and even store passwords in different ways on different machines. You can clone your dotfiles repository anywhere, and even make your dotfiles repo public, without leaving personal secrets on your work machine or work secrets on your personal machine.

        "},{"location":"why-use-chezmoi/#if-you-have-to-maintain-your-own-tool","title":"...if you have to maintain your own tool","text":"

        Quote

        I've offloaded my dotfiles deployment from a homespun shell script to chezmoi. I'm quite happy with this decision.

        \u2014 @gotgenes

        Quote

        I discovered chezmoi and it's pretty cool, just migrated my old custom multi-machine sync dotfile setup and it's so much simpler now

        in case you're wondering I have written 0 code

        \u2014 @buritica

        Quote

        Chezmoi is like what you might get if you re-wrote my bash script in Go, came up with better solutions than diff for managing config on multiple machines, added in secrets management and other useful dotfile tools, and tweaked and perfected it over years.

        • @mike_kasberg

        If your system was written by you for your personal use, then it probably has the functionality that you needed when you wrote it. If you need more functionality then you have to implement it yourself.

        chezmoi includes a huge range of battle-tested functionality out-of-the-box, including dry-run and diff modes, script execution, conflict resolution, Windows support, and much, much more. chezmoi is used by thousands of people and has a rich suite of both unit and integration tests. When you hit the limits of your existing dotfile management system, chezmoi already has a tried-and-tested solution ready for you to use.

        "},{"location":"why-use-chezmoi/#if-setting-up-your-dotfiles-requires-more-than-one-short-command","title":"...if setting up your dotfiles requires more than one short command","text":"

        If your system is written in a scripting language like Python, Perl, or Ruby, then you also need to install a compatible version of that language's runtime before you can use your system.

        chezmoi is distributed as a single stand-alone statically-linked binary with no dependencies that you can simply copy onto your machine and run. You don't even need git installed. chezmoi provides one-line installs, pre-built binaries, packages for Linux and BSD distributions, Homebrew formulae, Scoop and Chocolatey support on Windows, and a initial config file generation mechanism to make installing your dotfiles on a new machine as painless as possible.

        "},{"location":"developer-guide/","title":"Developer guide","text":"

        Warning

        If you use an LLM (Large Language Model, like ChatGPT, Claude, Gemini, GitHub Copilot, or Llama) to make a contribution then you must say so in your contribution and you must carefully review your contribution for correctness before sharing it. If you share un-reviewed LLM-generated content then you will be immediately banned. See CODE_OF_CONDUCT.md for more information.

        chezmoi is written in Go and development happens on GitHub. chezmoi is a standard Go project, using standard Go tooling. chezmoi requires Go 1.23 or later.

        Checkout chezmoi:

        git clone https://github.com/twpayne/chezmoi.git\ncd chezmoi\n

        Build chezmoi:

        go build\n

        Run all tests:

        go test ./...\n

        chezmoi's tests include integration tests with other software. If the other software is not found in $PATH the tests will be skipped. Running the full set of tests requires age, base64, bash, bzip2, git, gpg, gzip, perl, python3, rage, ruby, sed, sha256sum, tr, true, unzip, xz, zip, and zstd.

        Run chezmoi:

        go run .\n

        Run a set of smoke tests, including cross-compilation, tests, and linting:

        make smoke-test\n

        Test building chezmoi for all architectures:

        make test-release\n

        Hint

        If you use fish as your primary shell, you may get warnings from Fish during tests:

        error: can not save history\nwarning-path: Unable to locate data directory derived from $HOME: '/home/user/.local/share/fish'.\nwarning-path: The error was 'Operation not supported'.\nwarning-path: Please set $HOME to a directory where you have write access.\n

        These can be avoided with by running tests with SHELL=bash or SHELL=zsh:

        SHELL=bash make test\nSHELL=zsh make smoke-test\nSHELL=bash go test ./...\n
        "},{"location":"developer-guide/architecture/","title":"Architecture","text":"

        This document gives a high-level overview of chezmoi's source code for anyone interested in contributing to chezmoi.

        You can generate Go documentation for chezmoi's source code with go doc, for example:

        go doc -all -u github.com/twpayne/chezmoi/v2/internal/chezmoi\n

        You can also browse chezmoi's generated documentation online.

        "},{"location":"developer-guide/architecture/#directory-structure","title":"Directory structure","text":"

        The important directories in chezmoi are:

        Directory Contents assets/chezmoi.io/docs/ The documentation single source of truth. Help text, examples, and the chezmoi.io website are generated from the files in this directory internal/chezmoi/ chezmoi's core functionality internal/cmd/ Code for the chezmoi command internal/cmd/testdata/scripts/ High-level tests of chezmoi's commands using testscript"},{"location":"developer-guide/architecture/#key-concepts","title":"Key concepts","text":"

        As described in the reference manual, chezmoi evaluates the source state to compute a target state for the destination directory (typically your home directory). It then compares the target state to the actual state of the destination directory and performs any changes necessary to update the destination directory to match the target state. These concepts are represented directly in chezmoi's code.

        chezmoi uses the generic term entry to describe something that it manages. Entries can be files, directories, symlinks, scripts, amongst other things.

        "},{"location":"developer-guide/architecture/#internalchezmoi-directory","title":"internal/chezmoi/ directory","text":"

        All of chezmoi's interaction with the operating system is abstracted through the System interface. A System includes functionality to read and write files and directories and execute commands. chezmoi makes a distinction between idempotent commands that can be run multiple times without modifying the underlying system and arbitrary commands that may modify the underlying system.

        The real underlying system is implemented via a RealSystem struct. Other Systems are composed on top of this to provide further functionality. For example, the --debug flag is implemented by wrapping the RealSystem with a DebugSystem that logs all calls to the underlying RealSystem. --dry-run is implemented by wrapping the RealSystem with a DryRunSystem that allows reads to pass through but silently discards all writes.

        The SourceState struct represents a source state, including reading a source state from the source directory, executing templates, applying the source state (i.e. updating a System to match the desired source state), and adding more entries to the source state.

        Entries in the source state are abstracted by the SourceStateEntry interface implemented by the SourceStateFile and SourceStateDir structs, as the source state only consists of regular files and directories.

        A SourceStateFile includes a FileAttr struct describing the attributes parsed from its file name. Similarly, a SourceStateDir includes a DirAttr struct describing the directory attributes parsed from a directory name.

        SourceStateEntrys can compute their target state entries, i.e. what the equivalent entry should be in the target state, abstracted by the TargetStateEntry interface.

        Actual target state entries include TargetStateFile structs, representing a file with contents and permissions, TargetStateDir structs, representing a directory, TargetStateSymlink for symlinks, TargetStateRemove for entries that should be removed, and TargetStateScript for scripts that should be run.

        The actual state of an entry in the target state is abstracted via the ActualStateEntry interface, with ActualStateAbsent, ActualStateDir, ActualStateFile, ActualStateSymlink structs implementing this interface.

        Finally, an EntryState struct represents a serialization of an ActualEntryState for storage in and retrieval from chezmoi's persistent state. It stores a SHA256 of the entry's contents, rather than the full contents, to avoid storing secrets in the persistent state.

        With these concepts, chezmoi's apply command is effectively:

        1. Read the source state from the source directory.

        2. For each entry in the source state (SourceStateEntry), compute its TargetStateEntry and read its actual state in the destination state (ActualStateEntry).

        3. If the ActualStateEntry is not equivalent to the TargetStateEntry then apply the minimal set of changes to the ActualStateEntry so that they are equivalent.

        Furthermore, chezmoi stores the EntryState of each entry that it writes in its persistent state. chezmoi can then detect if a third party has updated a target since chezmoi last wrote it by comparing the actual state entry in the target state with the entry state in the persistent state.

        "},{"location":"developer-guide/architecture/#internalcmd-directory","title":"internal/cmd/ directory","text":"

        internal/cmd/*cmd.go files contain the code for each individual command. internal/cmd/*templatefuncs.go files contain the template functions.

        Commands are defined as methods on the Config struct. The Config struct is large, containing all configuration values read from the config file, command line arguments, and computed and cached values.

        The Config.persistentPreRunRootE and Config.persistentPostRunRootE methods set up and tear down state for individual commands based on the command's Annotations field, which defines how the command interacts with the file system and persistent state.

        "},{"location":"developer-guide/architecture/#path-handling","title":"Path handling","text":"

        chezmoi uses separate types for absolute paths (AbsPath) and relative paths (RelPath) to avoid errors where paths are combined (e.g. joining two absolute paths is an error). The type SourceRelPath is a relative path within the source directory and handles file and directory attributes.

        Internally, chezmoi normalizes all paths to use forward slashes with an optional upper-cased Windows volume so they can be compared with string comparisons. Paths read from the user may include tilde (~) to represent the user's home directory, use forward or backward slashes, and are treated as external paths (ExtPath). These are normalized to absolute paths. chezmoi is case-sensitive internally and makes no attempt to handle case-insensitive or case-preserving filesystems.

        "},{"location":"developer-guide/architecture/#persistent-state","title":"Persistent state","text":"

        Persistent state is treated as a two-level key-value store with the pseudo-structure map[Bucket]map[Key]Value, where Bucket, Key, and Value are all []bytes. The PersistentState interface defines interaction with them. Sometimes temporary persistent states are used. For example, in dry run mode (--dry-run) the actual persistent state is copied into a temporary persistent state in memory which remembers writes but does not persist them to disk.

        "},{"location":"developer-guide/architecture/#encryption","title":"Encryption","text":"

        Encryption tools are abstracted by the Encryption interface that contains methods of encrypting and decrypting files and []bytes. Implementations are the AGEEncryption and GPGEncryption structs. A DebugEncryption struct wraps an Encryption interface and logs the methods called.

        "},{"location":"developer-guide/architecture/#run_once_-and-run_onchange_-scripts","title":"run_once_ and run_onchange_ scripts","text":"

        The execution of a run_once_ script is recorded by storing the SHA256 of its contents in the scriptState bucket in the persistent state. On future invocations the script is only run if no matching contents SHA256 is found in the persistent state.

        The execution of a run_onchange_ script is recorded by storing its target name in the entryState bucket along with its contents SHA256 sum. On future invocations the script is only run if its contents SHA256 sum has changed, and its contents SHA256 sum is then updated in the persistent state.

        "},{"location":"developer-guide/architecture/#testing","title":"Testing","text":"

        chezmoi has a mix of, unit, integration, and end-to-end tests. Unit and integration tests use the github.com/alecthomas/assert/v2 framework. End-to-end tests use github.com/rogpeppe/go-internal/testscript with the test scripts themselves in internal/cmd/testdata/scripts/$TEST_NAME.txtar.

        You can run individual end-to-end tests with

        go test ./internal/cmd -run=TestScript/$TEST_NAME\n

        Tests should, if at all possible, run unmodified on all operating systems tested in CI (Linux, macOS, Windows, and FreeBSD). Windows will sometimes need special handling due to its path separator and lack of POSIX-style file permissions.

        "},{"location":"developer-guide/building-on-top-of-chezmoi/","title":"Building on top of chezmoi","text":"

        chezmoi is designed with UNIX-style composability in mind, and the command line tool is semantically versioned. Building on top of chezmoi should primarily be done by executing the chezmoi binary with arguments and the standard input and output configured appropriately. The chezmoi dump and chezmoi state commands allows the inspection of chezmoi's internal state.

        "},{"location":"developer-guide/contributing-changes/","title":"Contributing changes","text":"

        Bug reports, bug fixes, and documentation improvements are always welcome. Please open an issue or create a pull request with your report, fix, or improvement.

        If you want to make a more significant change, please first open an issue to discuss the change that you want to make. Dave Cheney gives a good rationale as to why this is important.

        All changes are made via pull requests. In your pull request, please make sure that:

        • All existing tests pass. You can ensure this by running make test.

        • There are appropriate additional tests that demonstrate that your PR works as intended.

        • The documentation is updated, if necessary. For new features you should add an entry in assets/chezmoi.io/docs/user-guide/ and a complete description in assets/chezmoi.io/docs/reference/. See website for instructions on how to build and view a local version of the documentation.

        • All generated files are up to date. You can ensure this by running make generate and including any modified files in your commit.

        • The code is correctly formatted, according to gofumpt. You can ensure this by running make format.

        • The code passes golangci-lint. You can ensure this by running make lint.

        • The commit messages follow the conventional commits specification. chezmoi's release notes are generated directly from the commit messages. For trivial or user-invisible changes, please use the prefix chore:.

        • Commits are logically separate, with no merge or \"fixup\" commits.

        • The branch applies cleanly to master.

        "},{"location":"developer-guide/install-script/","title":"Install script","text":"

        chezmoi generates the install script from a single source of truth. You must run

        go generate\n

        if your change includes any of the following:

        • Modifications to the install script template.

        • Additions or modifications to the list of supported OSs and architectures.

        chezmoi's continuous integration verifies that all generated files are up to date. Changes to generated files should be included in the commit that modifies the source of truth.

        "},{"location":"developer-guide/packaging/","title":"Packaging","text":"

        If you're packaging chezmoi for an operating system or distribution:

        chezmoi has no build dependencies other than the standard Go toolchain.

        chezmoi has no runtime dependencies, but is usually used with git, so many packagers choose to make git an install dependency or recommended package.

        Please set the version number, git commit, and build time in the binary. This greatly assists debugging when end users report problems or ask for help. You can do this by passing the following flags to go build:

        -ldflags \"-X main.version=$VERSION\n          -X main.commit=$COMMIT\n          -X main.date=$DATE\n          -X main.builtBy=$BUILT_BY\"\n

        $VERSION should be the chezmoi version, e.g. 1.7.3. Any v prefix is optional and will be stripped, so you can pass the git tag in directly.

        Hint

        The command git describe --abbrev=0 --tags will return a suitable value for $VERSION.

        $COMMIT should be the full git commit hash at which chezmoi is built, e.g. 4d678ce6850c9d81c7ab2fe0d8f20c1547688b91.

        Hint

        The assets/scripts/generate-commit.go script will return a suitable value for $COMMIT. You can run it with go run assets/scripts/generate-commit.go.

        Hint

        The source archive contains a file called COMMIT containing the commit hash.

        $DATE should be the date of the build as a UNIX timestamp or in RFC3339 format.

        Hint

        The command git show -s --format=%ct HEAD returns the UNIX timestamp of the last commit, e.g. 1636668628.

        The command date -u +%Y-%m-%dT%H:%M:%SZ returns the current time in RFC3339 format, e.g. 2019-11-23T18:29:25Z.

        $BUILT_BY should be a string indicating what system was used to build the binary. Typically it should be the name of your packaging system, e.g. homebrew.

        Please enable cgo, if possible. chezmoi can be built and run without cgo, but the .chezmoi.username and .chezmoi.group template variables may not be set correctly on some systems.

        chezmoi includes an upgrade command which attempts to self-upgrade. You can remove this command completely by building chezmoi with the noupgrade build tag.

        chezmoi includes shell completions in the completions directory. Please include these in the package and install them in the shell-appropriate directory, if possible.

        If the instructions for installing chezmoi in chezmoi's install guide are absent or incorrect, please open an issue or submit a PR to correct them.

        "},{"location":"developer-guide/releases/","title":"Releases","text":"

        Releases are managed with goreleaser.

        "},{"location":"developer-guide/releases/#testing","title":"Testing","text":"

        To build a test release, without publishing, (Ubuntu Linux only) first ensure that the musl-tools and snapcraft packages are installed:

        sudo apt-get install musl-tools snapcraft\n

        Then run:

        make test-release\n
        "},{"location":"developer-guide/releases/#publishing","title":"Publishing","text":"

        Publish a new release by creating and pushing a tag, for example:

        git tag v1.2.3\ngit push --tags\n

        This triggers a GitHub Action that builds and publishes archives, packages, and snaps, creates a new GitHub Release, and deploys the website.

        Note

        Publishing Snaps requires a SNAPCRAFT_STORE_CREDENTIALS repository secret.

        Snapcraft store credentials periodically expire. Create new snapcraft store credentials by running:

        snapcraft export-login --snaps=chezmoi --channels=stable,candidate,beta,edge --acls=package_upload -\n

        Note

        brew automation will automatically detect new releases of chezmoi within a few hours and open a pull request in github.com/Homebrew/homebrew-core to bump the version.

        If needed, the pull request can be created with:

        brew bump-formula-pr --tag=v1.2.3 chezmoi\n

        Note

        chezmoi is in Scoop's Main bucket. Scoop's automation will automatically detect new releases within a few hours.

        "},{"location":"developer-guide/releases/#signing","title":"Signing","text":"

        chezmoi uses GoReleaser's support for signing to sign the checksums of its release assets with cosign.

        Details:

        • The cosign private key was generated with cosign v1.12.1 on a private recently-installed Ubuntu 22.04.1 system with a single user and all available updates applied.

        • The private key uses a long (more than 32 character) password generated locally by a password manager.

        • The password-protected private key is stored in chezmoi's public GitHub repo.

        • The private key's password is stored as a GitHub Actions secret and only available to the release step of release job of the main workflow.

        • The cosign public key is included in the release assets and also uploaded to https://chezmoi.io/cosign.pub. Since https://chezmoi.io is served by GitHub pages, it probably has equivalent security to chezmoi's GitHub Releases page, which is also managed by GitHub.

        "},{"location":"developer-guide/security/","title":"Security","text":""},{"location":"developer-guide/security/#supported-versions","title":"Supported versions","text":"

        Only the most recent version of chezmoi is supported with security updates.

        "},{"location":"developer-guide/security/#virus-scanner-false-positives","title":"Virus scanner false positives","text":"

        Virus scanning software, especially on Windows machines, occasionally report viruses or trojans in the chezmoi binary. This is almost certainly a false positive.

        For more information see Why does my virus-scanning software think my Go distribution or compiled binary is infected? in the Go FAQ.

        "},{"location":"developer-guide/security/#reporting-a-vulnerability","title":"Reporting a vulnerability","text":"

        Please report vulnerabilities by opening a GitHub issue or sending an email to twpayne+chezmoi-security@gmail.com.

        "},{"location":"developer-guide/testing/","title":"Testing","text":"

        chezmoi uses multiple levels of testing:

        1. Unit testing, using testing, and github.com/alecthomas/assert/v2, tests that functions and small components behave as expected for a wide range of inputs, especially edge cases. These are generally found in internal/chezmoi/*_test.go.

        2. Filesystem integration tests, using testing and github.com/twpayne/go-vfs/v5, test chezmoi's effects on the filesystem. This include some tests in internal/chezmoi/*_test.go, and higher level command tests in internal/cmd/*cmd_test.go.

        3. High-level integration tests using github.com/rogpeppe/go-internal/testscript are in internal/cmd/testdata/scripts/*.txtar and are run by internal/cmd/main_test.go.

        4. Linux distribution and OS tests run the full test suite using Docker for different Linux distributions (in assets/docker) and Vagrant for different OSes (in assets/vagrant). Windows tests are run in GitHub Actions.

        "},{"location":"developer-guide/using-make/","title":"Building and installing with make","text":"

        chezmoi can be built with GNU make, assuming you have the Go toolchain installed.

        Running make will build a chezmoi binary in the current directory for the host OS and architecture. To embed version information in the binary and control installation the following variables are available:

        Variable Example Purpose $VERSION v2.0.0 Set version $COMMIT 3895680a... Set the git commit at which the code was built $DATE 2019-11-23T18:29:25Z The time of the build $BUILT_BY homebrew The packaging system performing the build $PREFIX /usr Installation prefix $DESTDIR install-root Fake installation root

        Running make install will install the chezmoi binary in ${DESTDIR}${PREFIX}/bin.

        "},{"location":"developer-guide/website/","title":"Website","text":"

        The website is generated with Material for MkDocs from the contents of the assets/chezmoi.io/docs/ directory. It is hosted by GitHub pages from the gh-pages branch.

        To build the website locally, Go 1.23 (or later) and uv 0.4.15 (or later) must be installed. Python 3.10 (or later) is required, but may be installed with uv:

        If Python 3.10 (or later) is not currently installed, install it with uv:

        uv python install 3.10\n

        Install the dependencies (the --frozen is optional but recommended):

        uv sync --frozen\n

        Test the website locally by running:

        uv run task serve-docs\n

        and visiting http://127.0.0.1:8000/.

        "},{"location":"developer-guide/website/#maintainers","title":"Maintainers","text":"

        The website is automatically deployed when new releases are created, but manual deployments can be triggered by maintainers with appropriate access using:

        uv run task mkdocs gh-deploy\n
        "},{"location":"links/articles/","title":"Articles","text":"

        Tip

        Recommended article: Fedora Magazine: Take back your dotfiles with Chezmoi

        Date Version Language Title 2025-01-26 2.58.0 JP chezmoi \u3067 macOS \u306e user defaults \u3082\u7ba1\u7406\u3059\u308b 2025-01-19 2.58.0 EN Managing dotfiles with chezmoi 2025-01-03 2.57.0 EN Frictionless Dotfile Management With Chezmoi 2024-12-19 2.56.0 JP chezmoi\u3067dotfiles\u3092\u7ba1\u7406\u3059\u308b 2024-12-18 2.56.0 EN Exploring Tools For Managing Your Dotfiles 2024-12-02 2.55.0 JP chezmoi\u3092\u4f7f\u3063\u305f\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\u7206\u901f\u69cb\u7bc9 2024-11-19 2.54.0 AR \u0634\u064a\u0645\u0648\u0627 (chezmoi) \u0628\u0628\u0633\u0627\u0637\u0629 2024-11-16 2.54.0 EN Swapping to Chezmoi 2024-11-07 2.53.1 EN dotfiles management: chezmoi 2024-01-07 2.52.3 EN How I manage Neovim configuration with Chezmoi 2024-09-15 2.52.2 EN Cross-Platform Dotfiles with Chezmoi, Nix, Brew, and Devpod 2024-09-09 2.52.2 EN Keeping your Dotfiles in Sync and your Secrets in Gopass 2024-09-08 2.52.1 EN Managing dotfiles with chezmoi 2024-08-30 2.52.1 JP dotfiles\u7ba1\u7406\u3092chezmoi\u306b\u79fb\u884c\u3059\u308b 2024-07-31 2.51.0 EN Managing dotfiles with chezmoi 2024-07-28 2.51.0 EN Development Environment Setup with Chezmoi 2024-06-26 2.49.1 EN Automate Your Dotfiles with Chezmoi 2024-05-27 2.48.1 EN Managing Dotfiles with Chezmoi 2024-05-01 2.48.0 TH \u0e08\u0e31\u0e14\u0e01\u0e32\u0e23 dotfiles \u0e14\u0e49\u0e27\u0e22 chezmoi 2024-04-27 2.48.0 CN \u4f7f\u7528 chezmoi & vscode, \u7ba1\u7406\u4f60\u7684 dotfiles 2024-04-24 2.47.4 EN Chezmoi: Manage Your Dotfiles Across Multiple Linux Systems 2024-03-25 2.47.2 EN Whatever happened to dotfiles? 2024-03-23 2.47.2 EN A tour around chezmoi 2024-03-23 2.47.2 CN \u4f7f\u7528 chezmoi & vscode, \u7ba1\u7406\u4f60\u7684 dotfiles 2024-03-11 2.47.1 CN Chezmoi\uff1a\u512a\u96c5\u7ba1\u7406Linux\u7684dotfile\uff0c\u4f7f\u7528Git\u5132\u5b58\u5eab\u5099\u4efd\uff0c\u985e\u4f3cGNU Stow 2024-03-02 2.47.0 EN The Ultimate Dotfiles Management Tool 2024-02-25 2.47.0 EN Atuin and chezmoi are the dog's bollocks 2024-01-07 2.43.0 EN Chezmore Chezmoi 2023-12-23 2.42.3 DE Lokale Kofigurationsdateien sicher mit chezmoi und Git synchronisieren 2023-12-18 2.42.3 JP chezmoi \u7ba1\u7406\u306edotfiles \u3067\u30de\u30b7\u30f3\u6bce\u306b\u8a2d\u5b9a\u3092\u5909\u3048\u305f\u3044 2023-12-17 2.42.3 JP chezmoi \u3092 \u30b5\u30d6\u30de\u30b7\u30f3\u306b\u3082\u5c0e\u5165\u3059\u308b 2023-12-16 2.42.3 JP chezmoi \u3092\u4f7f\u3063\u305f dotfiles \u306e\u7ba1\u7406\u65b9\u6cd5 2023-12-10 2.42.2 JP chezmoi \u3067 dotfiles \u3092\u7ba1\u7406\u3059\u308b\u3068\u304d\u306b\u4fbf\u5229\u306a\u6a5f\u80fd\u306b\u3064\u3044\u3066\u307e\u3068\u3081\u308b 2023-10-29 2.40.4 CN \u7528 chezmoi \u7ba1\u7406 dotfiles 2023-09-13 2.39.1 JP \u8907\u6570OS\u306b\u5bfe\u5fdc\u3057\u3066\u3044\u308bchezmoi\u3092\u4f7f\u3063\u3066dotfiles\u3092\u52b9\u7387\u7684\u306b\u7ba1\u7406\u3059\u308b 2023-09-07 2.39.1 JP \u3010chezmoi\u3011dotfile\u306e\u30bb\u30ad\u30e5\u30a2\u306a\u5024\u3092dashlane\u304b\u3089\u53c2\u7167\u3067\u304d\u308b\u3088\u3046\u306b\u3059\u308b 2023-08-05 2.36.1 EN Dotfiles with chezmoi 2023-06-14 2.34.1 RU chezmoi 2023-05-16 2.33.6 JP chezmoi 2023-04-29 2.33.1 JP chezmoi \u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u6a5f\u80fd\u3092\u4f7f\u3063\u3066\u30b7\u30a7\u30eb\u306e\u8d77\u52d5\u3092\u9ad8\u901f\u5316\u3059\u308b 2023-04-26 2.33.1 EN Managing my /home directory 2023-04-15 2.33.1 JP dotfiles \u306e\u7ba1\u7406\u306b chezmoi \u3092\u5c0e\u5165\u3057\u3066 fswatch \u3067\u81ea\u52d5 apply \u3067\u304d\u308b\u3088\u3046\u306b\u3057\u305fg 2023-04-08 2.33.1 KR chezmoi, \ubcf8\uaca9\uc801\uc73c\ub85c \ud65c\uc6a9\ud558\uae30 2023-03-25 2.33.0 KR chezmoi, \uc138\uc0c1 \ud3b8\ub9ac\ud558\uac8c dotfile \uad00\ub9ac\ud558\uae30 2023-03-17 2.32.0 EN Automating the Setup of a New Mac With All Your Apps, Preferences, and Development Tools 2023-03-21 2.32.0 JP AWS CLI \u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092 chezmoi \u3068Bitwarden \u3067\u7ba1\u7406\u3059\u308b 2023-02-26 2.31.0 EN Managing dotfiles with chezmoi 2023-01-22 2.29.3 EN Managing dotfiles 2023-01-22 2.29.3 JP dotfile manager \u306e chezmoi \u306b\u79fb\u884c\u3057\u3066\u307f\u308b 2023-01-13 2.29.1 EN Making the most out of distrobox and toolbx 2023-01-12 2.29.1 JP Chezmoi\u3067\u304b\u3093\u305f\u3093\u30af\u30ed\u30b9\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0dotfiles\u7ba1\u7406\u306e\u30b9\u30b9\u30e1 2023-01-05 2.29.1 JP \u65e2\u5b58\u306e dotfiles \u3092 chezmoi \u3067\u7ba1\u7406\u3059\u308b 2022-09-28 2.24.0 EN Shit Hot Dotfiles 2022-09-13 2.22.1 IT Come installare Chezmoi: gestisci in modo sicuro i dotfile su pi\u00f9 macchine 2022-08-11 2.20.0 EN Chezmoi - a very cool tool to manage your dotfiles 2022-08-05 2.20.0 CN \u4f7f\u7528chezmoi\u7ba1\u7406dotfiles 2022-06-11 2.17.1 JP chezmoi \u3067 Linux \u3068 macOS \u4e21\u65b9\u3067\u4f7f\u3048\u308b dotfiles \u3092\u4f5c\u308b 2022-06-02 2.17.1 EN Local Env as Code: Is it possible yet 2022-05-16 2.16.0 EN Chezmoi for DotFiles 2022-04-25 2.15.1 EN Easily moving Linux installs 2022-03-13 2.14.0 EN Tools I love: Chezmoi 2022-03-03 2.13.0 EN Local Environment-as-Code: Is It Possible Yet? 2022-02-22 2.12.1 JP chezmoi \u3092\u4f7f\u3063\u3066 VSCode devcontainer \u5bfe\u5fdc dotfiles \u3092\u4f5c\u308b 2022-02-17 2.12.0 ES Qu\u00e9 son y c\u00f3mo gestionar archivos dotfiles con chezmoi 2022-02-12 2.11.2 EN How To Manage Dotfiles With Chezmoi 2022-02-02 2.11.0 FR Controler ses dotfiles en environnement \u00e9ph\u00e9m\u00e8re 2022-02-01 2.10.1 JP chezmoi \u3067 dotfiles \u3092\u624b\u8efd\u306b\u67d4\u8edf\u306b\u30bb\u30ad\u30e5\u30a2\u306b\u7ba1\u7406\u3059\u308b 2022-01-26 2.10.1 JP chezmoi \u3067 dotfiles \u3092\u7ba1\u7406\u3059\u308b 2022-01-12 2.9.5 IT Come funzionano i miei Mac 2021-12-23 2.9.3 EN Use Chezmoi to guarantee idempotency of terminal 2021-12-20 2.9.3 EN How chezmoi Implements Cross-Platform CI 2021-12-13 2.9.3 EN Managing Dotfiles With Chezmoi 2021-12-04 2.9.2 EN Advanced features of Chezmoi 2021-12-01 2.9.1 EN Chezmoi 2 2021-11-26 2.8.0 EN Weekly Journal 47 - chezmoi, neovim 2021-10-26 2.7.3 RU \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a 2021-10-25 2.7.3 EN Share credentials across machines using chezmoi and bitwarden 2021-09-18 2.1.2 EN PBS 125 of X \u2014 Chezmoi on Multiple Computers 2021-09-14 2.2.0 EN Managing preference plists under Chezmoi 2021-09-06 2.2.0 EN chezmoi dotfile management 2021-09-04 2.2.0 EN Configuration Management 2021-09-04 2.1.2 EN PBS 124 of X \u2014 Chezmoi Templates 2021-08-22 2.1.2 EN PBS 123 of X \u2014 Backing up and Syncing Dot Files with Chezmoi 2021-08-08 2.1.2 EN PBS 122 of X \u2014 Managing Dot Files with Chezmoi 2021-08-04 2.1.2 PT Como instalar o Chezmoi, um gerenciador de dotfiles, no Ubuntu, Linux Mint, Fedora, Debian 2021-07-23 2.1.2 EN PBS 121 of X \u2014 Managing Dot Files and an Introduction to Chezmoi 2021-07-15 2.1.2 CN \u4f7f\u7528Chezmoi\u7ba1\u7406\u914d\u7f6e\u6587\u4ef6 2021-05-14 2.0.12 EN A brief history of my dotfile management 2021-05-12 2.0.12 EN My Dotfiles Story: A Journey to Chezmoi 2021-05-10 2.0.11 EN Development Environment (2021) 2021-04-08 2.0.9 FR Bienvenue chez moi 2021-04-01 2.0.7 EN ChezMoi 2021-02-17 1.8.11 JP chezmoi \u3067 dotfiles \u3092\u624b\u8efd\u306b\u67d4\u8edf\u306b\u30bb\u30ad\u30e5\u30a2\u306b\u7ba1\u7406\u3059\u308b 2021-02-07 1.8.10 JP chezmoi\u59cb\u3081\u305f 2021-01-29 1.8.10 CN \u7528 Chezmoi \u7ba1\u7406\u914d\u7f6e\u6587\u4ef6 2021-01-12 1.8.10 EN Automating the Setup of a New Mac With All Your Apps, Preferences, and Development Tools 2020-11-06 1.8.8 EN Chezmoi \u2013 Securely Manage dotfiles across multiple machines 2020-11-05 1.8.8 EN Using chezmoi to manage dotfiles 2020-10-05 1.8.6 EN Dotfiles with Chezmoi 2020-10-03 1.8.6 EN Chezmoi Merging 2020-08-13 1.8.3 EN Using BitWarden and Chezmoi to manage SSH keys 2020-08-09 1.8.3 EN Automating and testing dotfiles 2020-08-03 1.8.3 EN Automating a Linux in Windows Dev Setup 2020-07-03 1.8.3 EN Feeling at home in a LXD container 2020-06-15 1.8.2 EN Dotfiles management using chezmoi - How I Use Linux Desktop at Work Part5 2020-04-27 1.8.0 EN Managing my dotfiles with chezmoi 2020-04-20 1.8.0 FR Gestion des dotfiles et des secrets avec chezmoi 2020-04-19 1.7.19 FR Git & dotfiles : versionner ses fichiers de configuration 2020-04-16 1.7.19 FR Chezmoi, visite guid\u00e9e 2020-04-17 1.7.17 CN \u7528 Chezmoi \u53d6\u56de\u4f60\u7684\u70b9\u6587\u4ef6 2020-04-03 1.7.17 EN Fedora Magazine: Take back your dotfiles with Chezmoi 2020-04-01 1.7.17 EN Managing dotfiles and secret with chezmoi 2019-01-10 0.0.11 EN Linux Fu: The kitchen sync"},{"location":"links/dotfile-repos/","title":"Dotfile repos","text":"
        • GitHub

        • GitLab

        • Codeberg

        "},{"location":"links/podcasts/","title":"Podcasts","text":"

        Tip

        Recommended podcast: Managing Dot Files and an Introduction to Chezmoi

        Date Version Language Title 2024-10-17 2.52.4 EN Releasing more BSDs 2023-05-22 2.33.6 ES 491 - Tres herramientas que han revolucionado mi terminal Linux 2023-01-30 2.29.3 ES 459 - Soy un zoquete, otra vez hice un rm -rf 2022-05-27 2.17.0 EN F\u00e9d\u00e9rer une communaut\u00e9 technique autour d'un projet Open Source 2022-03-11 2.14.0 EN The Real Python Podcast: Episode 101: Tools for Setting Up Python on a New Machine 2021-09-18 2.1.2 EN CCATP #699 \u2013 Bart Busschots on PBS 125 of X \u2013 Chezmoi on Multiple Computers 2021-09-04 2.1.2 EN CCATP #698 \u2013 Bart Busschots on PBS 124 of X \u2013 Chezmoi Templates 2021-08-22 2.1.2 EN CCATP #696 \u2013 Bart Busschots on PBS 123 of X \u2014 Backing up and Syncing Dot Files with Chezmoi 2021-08-08 2.1.2 EN CCATP #695 \u2013 Bart Busschots on PBS 122 \u2013 Managing Dot Files with Chezmoi 2021-07-23 2.1.2 EN CCATP #693 \u2013 Bart Busschots on PBS 121 of X \u2014 Managing Dot Files and an Introduction to Chezmoi 2019-11-20 1.7.2 EN FLOSS weekly episode 556: chezmoi"},{"location":"links/related-software/","title":"Related software","text":""},{"location":"links/related-software/#editor-integration","title":"Editor integration","text":""},{"location":"links/related-software/#githubcomandre-kotakenvim-chezmoi","title":"github.com/andre-kotake/nvim-chezmoi","text":"

        A NeoVim plugin that integrates with chezmoi.

        "},{"location":"links/related-software/#githubcomalker0chezmoivim","title":"github.com/alker0/chezmoi.vim","text":"

        Intelligent VIM syntax highlighting when editing files in your source directory. Works with both chezmoi edit and editing files directly.

        "},{"location":"links/related-software/#githubcomtuh8888chezmoiel","title":"github.com/tuh8888/chezmoi.el","text":"

        Convenience functions for interacting with chezmoi in Emacs.

        "},{"location":"links/related-software/#githubcomliljavim-chezmoi","title":"github.com/Lilja/vim-chezmoi","text":"

        A plugin for VIM to apply the dotfile you are editing on :w.

        "},{"location":"links/related-software/#githubcomxvzcchezmoinvim","title":"github.com/xvzc/chezmoi.nvim","text":"

        Edit your chezmoi-managed files and automatically apply.

        "},{"location":"links/related-software/#httpsgithubcomgiannibyoungchezmoi-telescopenvim","title":"https://github.com/GianniBYoung/chezmoi-telescope.nvim","text":"

        Custom Telescope Picker for Chez Moi Managed Dot files.

        "},{"location":"links/related-software/#other","title":"Other","text":""},{"location":"links/related-software/#atuinsh","title":"atuin.sh","text":"

        Sync, search and backup shell history .

        "},{"location":"links/related-software/#githubcomb3nj5m1nxdg-ninja","title":"github.com/b3nj5m1n/xdg-ninja","text":"

        A shell script which checks your $HOME for unwanted files and directories.

        "},{"location":"links/related-software/#githubcomhussainwebansible-role-chezmoi","title":"github.com/hussainweb/ansible-role-chezmoi","text":"

        Installs chezmoi on Ubuntu and Debian servers.

        "},{"location":"links/related-software/#githubcomjohan-weitnerchezmoi-ui","title":"github.com/johan-weitner/chezmoi-ui","text":"

        A web UI for managing a list of apps to seed/feed a chezmoi setup.

        "},{"location":"links/related-software/#githubcomjokeasdf-chezmoi","title":"github.com/joke/asdf-chezmoi","text":"

        chezmoi plugin for asdf version manager.

        "},{"location":"links/related-software/#githubcomtcaxledrapeau","title":"github.com/tcaxle/drapeau","text":"

        An add-on to synchronize your colorschemes across systems and allow easy colorscheme switching using chezmoi templates.

        "},{"location":"links/related-software/#githubcomvorpalbladechezmoi_modify_manager","title":"github.com/VorpalBlade/chezmoi_modify_manager","text":"

        An add-on to deal with config files that contain a mix of settings and transient state, such as with GUI program settings files also containing recently used files and window positions.

        "},{"location":"links/related-software/#installdoctor","title":"install.doctor","text":"

        Desktop provisioning system.

        "},{"location":"links/social-media/","title":"Social media","text":"Platform Search term Hacker News chezmoi LinkedIn chezmoi dotfiles Reddit chezmoi Stack Overflow chezmoi YouTube chezmoi dotfiles"},{"location":"links/videos/","title":"Videos","text":"

        Tip

        Recommended video: chezmoi: manage your dotfiles across multiple, diverse machines, securely

        Date Version Language Title 2024-11-18 2.54.0 AR Chezmoi, Dotfiles, Workflow, Templates and Encryption Arabic \u0634\u0631\u062d 2024-06-22 2.47.1 EN Automating Development Environments with Ansible & Chezmoi 2024-02-17 2.47.0 EN 12 GREAT command line programs YOU recommended! 2024-01-14 2.24.0 EN managing dotfiles: a guided tour through my own setup 2023-12-03 2.42.2 EN The ultimate dotfiles setup 2022-12-15 2.27.3 ES Archivos de configuraci\u00f3n f\u00e1cil con chezmoi 2022-09-13 2.22.1 EN Using chezmoi to automate dotfiles / config files (+ my bashrc) 2022-04-27 2.15.1 EN Easily moving Linux installs 2021-12-08 2.9.3 EN How Go makes chezmoi possible 2021-11-27 2.8.0 TH Command \u0e44\u0e23 2021-11-27 : \u0e22\u0e49\u0e32\u0e22 dotfiles \u0e44\u0e1b chezmoi 2021-09-06 2.2.0 EN chezmoi: Organize your dotfiles across multiple computers 2021-02-06 1.8.10 EN chezmoi: manage your dotfiles across multiple, diverse machines, securely 2020-07-06 1.8.3 EN Conf42: chezmoi: Manage your dotfiles across multiple machines, securely 2020-03-12 1.7.16 EN Managing Dotfiles with ChezMoi 2019-11-20 1.7.2 EN FLOSS weekly episode 556: chezmoi"},{"location":"reference/","title":"Reference","text":"

        Welcome to the reference section of the chezmoi documentation.

        This reference covers the following topics:

        • Key concepts
        • Source state attributes
        • Target types
        • Application order of changes
        • Configuration file
        • Special files and special directories
        • Command line flags
        • Commands
        • Templates
        • Variables
        • Directives
        • Functions
        • Plugins support
        • Release history
        "},{"location":"reference/application-order/","title":"Application order","text":"

        chezmoi is deterministic in its order of application. The order is:

        1. Read the source state.
        2. Read the destination state.
        3. Compute the target state.
        4. Run run_before_ scripts in alphabetical order.
        5. Update entries in the target state (files, directories, externals, scripts, symlinks, etc.) in alphabetical order of their target name. Directories (including those created by externals) are updated before the files they contain.
        6. Run run_after_ scripts in alphabetical order.

        Target names are considered after all attributes are stripped.

        Example

        Given create_alpha and modify_dot_beta in the source state, .beta will be updated before alpha because .beta sorts before alpha.

        chezmoi assumes that the source or destination states are not modified while chezmoi is being executed. This assumption permits significant performance improvements, including allowing chezmoi to only read files from the source and destination states if they are needed to compute the target state.

        chezmoi's behavior when the above assumptions are violated is undefined. For example, using a run_before_ script to update files in the source or destination states violates the assumption that the source and destination states do not change while chezmoi is running.

        Note

        External sources are updated during the update phase; it is inadvisable for a run_before_ script to depend on an external applied during the update phase. run_after_ scripts may freely depend on externals.

        "},{"location":"reference/concepts/","title":"Concepts","text":"

        chezmoi computes the target state for the current machine and then updates the destination directory, where:

        • The destination directory is the directory that chezmoi manages, usually your home directory, ~.

        • A target is a file, directory, or symlink in the destination directory.

        • The destination state is the current state of all the targets in the destination directory.

        • The source state declares the desired state of your home directory, including templates that use machine-specific data. It contains only regular files and directories.

        • The source directory is where chezmoi stores the source state. By default it is ~/.local/share/chezmoi.

        • The config file contains machine-specific data. By default it is ~/.config/chezmoi/chezmoi.toml.

        • The target state is the desired state of the destination directory. It is computed from the source state, the config file, and the destination state. The target state includes regular files and directories, and may also include symbolic links, scripts to be run, and targets to be removed.

        • The working tree is the git working tree. Normally it is the same as the source directory, but can be a parent of the source directory.

        "},{"location":"reference/plugins/","title":"Plugins","text":"

        chezmoi supports plugins, similar to git.

        If you run chezmoi command where command is not a builtin chezmoi command then chezmoi will look for a binary called chezmoi-command in your $PATH. If such a binary is found then chezmoi will execute it. Otherwise, chezmoi will report an unknown command error.

        "},{"location":"reference/release-history/","title":"Release history","text":"

        Upcoming changes

        "},{"location":"reference/release-history/#2590-2025-01-28","title":"2.59.0 (2025-01-28)","text":"

        Features

        • 500c677 feat: Add git-auto-commit and git-auto-push hooks
        • fcf2ced feat: Add warnf template function
        • 8540b4e feat: Show original URL in HTTP progress bars
        • 8b42ee8 feat: Support filenames containing # in ignore and remove files

        Fixes

        • 5cbbd6e fix: Fix persistent state mode for commands that execute templates
        • 309d7fd fix: Warn, don't error, when generating git commit messages for unknown states

        Documentation updates

        • 0185fb8 docs: Add link to article
        • 70546ad docs: Update pruneEmptyDicts example
        • bd026f6 docs: Add link to article
        • 8131e3f docs: Add link to article

        Full changelog: v2.58.0...v2.59.0

        "},{"location":"reference/release-history/#2580-2025-01-13","title":"2.58.0 (2025-01-13)","text":"

        Features

        • 621379b feat: Add --git-lfs option to init command
        • 82e5c67 feat: Add builtin mode for gopass
        • 21ef186 feat: Improve placeholders in password prompts
        • 48e23ff feat: Show all contributors in README.md

        Fixes

        • 940cc30 fix: Fix doctor command when --config is specified
        • fc8c20f fix: Correct nested groups for keepassxc builtin mode
        • dda2816 fix: Suppress gitleaks logspam

        Documentation updates

        • 6c4431e docs: Tidy up formatting as suggested by markdownlint

        Full changelog: v2.57.0...v2.58.0

        "},{"location":"reference/release-history/#2570-2024-12-30","title":"2.57.0 (2024-12-30)","text":"

        Features

        • de8efad feat: Add chezmoi:template:format-indent template directive
        • 8f6fea6 feat: Implement builtin mode for keepassxc
        • 0a0d607 feat: Add script hooks that use configured interpreters

        Documentation updates

        • d1cdcd2 docs: Add links to articles

        Full changelog: v2.56.0...v2.57.0

        "},{"location":"reference/release-history/#2560-2024-12-14","title":"2.56.0 (2024-12-14)","text":"

        Features

        • 3558b71 feat: Use textconv with external diff commands
        • 4cb1123 feat: Add interactive config variable
        • bddbf7f feat: Add initial policy on LLM-generated contributions
        • dac078f feat: Warn about future removal of insecure hashes
        • fa4e390 feat: Add .chezmoi.destDir template variable

        Fixes

        • 57ee74a fix: Replace Expand-Archive with System.IO.Compression.ZipFile
        • e038aad fix: More reliable arch detection in install.ps1
        • 23de447 fix: YAML parsing error by escaping | in title

        Documentation updates

        • 058a3c0 docs: Add link to article
        • 3739b0b docs: Describe how to use tools installed with Flatpak
        • ab1b31c docs: Add link to blog

        Full changelog: v2.55.0...v2.56.0

        "},{"location":"reference/release-history/#2550-2024-12-02","title":"2.55.0 (2024-12-02)","text":"

        Features

        • 5f5e106 feat: Add multiple URL support for externals
        • 01eef45 feat: Warn if the user is using the Helix editor with chezmoi edit
        • 4c4bfe9 feat: Support file:// URLs in externals

        Fixes

        • 9ce3b0b fix: Fix error when choice variables are set in flags and config file

        Documentation updates

        • cb86244 docs: Add article info
        • 1d5a3c5 docs: Add Youtube video info

        Full changelog: v2.54.0...v2.55.0

        "},{"location":"reference/release-history/#2540-2024-11-09","title":"2.54.0 (2024-11-09)","text":"

        Features

        • 6916263 feat: Add --path-style=all option to managed command
        • 5bc19ae feat: Inform user when to use get.chezmoi.io/lb

        Fixes

        • 5d568f2 fix: Perform post-run actions on error

        Documentation updates

        • 0837305 docs: Add link to article
        • ba12f36 docs: Add github.com/andre-kotake/nvim-chezmoi to related software
        • 8bfb59f docs: Remove extra 'o' from chezmoi external reference
        • a3193a8 docs: Move command line flags links closer to commands

        Full changelog: v2.53.1...v2.54.0

        "},{"location":"reference/release-history/#2531-2024-10-28","title":"2.53.1 (2024-10-28)","text":"

        Fixes

        • c6f5787 fix: Fix panic in commands that do not use persistent state

        Documentation updates

        • f514a7e docs: Add note that .chezmoiexternal files can be ignored

        Full changelog: v2.53.0...v2.53.1

        "},{"location":"reference/release-history/#2530-2024-10-26","title":"2.53.0 (2024-10-26)","text":"

        Features

        • 9be622a feat: Extend squote template func to handle more types
        • fe2dba7 feat: Extend quote and quoteList template funcs to handle more types
        • 35148c7 feat: Add common --parent-dirs/-P flag

        Fixes

        • 75e1a52 fix: Persist results of calls to GitHub API
        • a8dda78 fix: Fix completion for 'archive --format'
        • 3fd20e9 fix: Fix includeTemplate template func search path in init
        • 5b73a4d fix: Accept only supported values to 'unmanaged --path-style'
        • 264f34f fix: Fix incorrect config template change warnings
        • 8ba1988 fix: Fix panic when --keep-going is set
        • 2d0fa36 fix: Fix panic when running chattr on externals
        • d28823d fix: Use builtin age when encryption is unset

        Documentation updates

        • 554ff27 docs: Replace common flags descriptions with snippets
        • b8610d4 docs: Fill reference title page
        • 2a41aeb docs: Update \"how scripts work\" section
        • 6e9281d docs: Update shell completions section
        • 947e88e docs: Improvements for command flags description
        • 56729ce docs: Automatically check that all flags are documented
        • 0fb4392 docs: Split \"Special file and directories\"
        • efb3a14 docs: Split docs for commands into sections
        • e0c314f docs: Split docs into sections for age, secret and state
        • 23777d0 docs: Improve description for command arguments
        • 5b1dbb5 docs: Add example for running script on macOS update
        • 4cae323 docs: Add notes where to place 'encryption' setting

        Full changelog: v2.52.4...v2.53.0

        "},{"location":"reference/release-history/#2524-2024-10-10","title":"2.52.4 (2024-10-10)","text":"

        Documentation updates

        • 092dc65 docs: Add link to blogpost

        Full changelog: v2.52.3...v2.52.4

        "},{"location":"reference/release-history/#2523-2024-09-30","title":"2.52.3 (2024-09-30)","text":"

        Features

        • be16b73 feat: Set GOMAXPROCS based on available resources

        Fixes

        • 5644141 fix: Improve phonetic pronunciation of chezmoi

        Documentation updates

        • 7ed5c1d docs: Add link to article
        • 222aef8 docs: Improve developer documentation
        • 34f415c docs: Use uv for managing Python and dependencies
        • 895055a docs: Add link to blog
        • f84b8e5 docs: Add note on reporting viruses or trojans on Windows
        • 1fc8195 docs: Add note about website build dependencies
        • 353264c docs: Add sequence diagram for chezmoi init
        • dbde967 docs: Add daily usage entry on editing files

        Full changelog: v2.52.2...v2.52.3

        "},{"location":"reference/release-history/#2522-2024-09-10","title":"2.52.2 (2024-09-10)","text":"

        Features

        • 7aee332 feat: Support YubiKeys in KeePassXC open mode

        Documentation updates

        • f67e048 docs: Add home page section on getting help
        • ea8d95d docs: Add Stack Overflow to social media links
        • 37eab81 docs: Add FAQ entry on using delta as the diff tool
        • fdb2065 docs: Add FAQ entry on running scripts periodically
        • a3de4a8 docs: Add FAQ entry on running a script when a git-repo external changes
        • b56a600 docs: Add FAQ entry on literal {{ and }} in templates
        • d414e0f docs: Add warning on using externals for large files or archives
        • d9f4717 docs: Add how to use VSCode as the diff and merge tool
        • 2a64e42 docs: Make features and portability more prominent on home page
        • 3a17101 docs: Add links to articles
        • 0355a62 docs: Add link to blog
        • 1ac3014 docs: Add github.com/b3nj5m1n/xdg-ninja to related software

        Full changelog: v2.52.1...v2.52.2

        "},{"location":"reference/release-history/#2521-2024-08-15","title":"2.52.1 (2024-08-15)","text":"

        Features

        • ca0d133 feat: Add github.com/johan-weitner/chezmoi-ui to related software

        Fixes

        • cba7e40 fix: Set User-Agent header to chezmoi.io/version on all HTTP requests

        Documentation updates

        • 8e40c43 docs: Add link to video
        • 4843d55 docs: Add links to two articles

        Full changelog: v2.52.0...v2.52.1

        "},{"location":"reference/release-history/#2520-2024-08-07","title":"2.52.0 (2024-08-07)","text":"

        Features

        • 48f873b feat: Add gitHubRelease and gitHubReleaseAssetURL template functions

        Fixes

        • 28ebfec fix: Ignore permission changes in re-add command on Windows
        • 73893c1 fix: Don't modify ciphertext in edit command if plaintext did not change

        Documentation updates

        • d5579c7 docs: Clarify requirement to set sourceDir when used in Codespaces

        Full changelog: v2.51.0...v2.52.0

        "},{"location":"reference/release-history/#2510-2024-07-15","title":"2.51.0 (2024-07-15)","text":"

        Features

        • 2a7845f feat: Add 1Password SDK template funcs
        • 676a9a9 feat: Add decompression of file externals

        Fixes

        • 2615c52 fix: keep initFuncs when using 'includeTemplate' in config
        • f6ecfdb fix: Use scriptTempDir for modify_ scripts

        Documentation updates

        • 711534a docs: Add link to article

        Full changelog: v2.50.0...v2.51.0

        "},{"location":"reference/release-history/#2500-2024-07-02","title":"2.50.0 (2024-07-02)","text":"

        Features

        • 2808e7c feat: Add tempDir configuration variable
        • 4241393 feat: Allow private_ and readonly_ attrs to be set for externals
        • 217cdaa feat: Add --no-network flag to doctor command
        • 31b2060 feat: Embed fallback X.509 trusted roots

        Fixes

        • 2a75540 fix: Prevent chezmoi add from adding chezmoi's own executable

        Documentation updates

        • b7cf4ba docs: Add GianniBYoung/chezmoi-telescope.nvim to related software

        Full changelog: v2.49.1...v2.50.0

        "},{"location":"reference/release-history/#2491-2024-06-23","title":"2.49.1 (2024-06-23)","text":"

        Fixes

        • af65574 fix: Accept line-endings template directive as well as line-ending

        Full changelog: v2.49.0...v2.49.1

        "},{"location":"reference/release-history/#2490-2024-06-10","title":"2.49.0 (2024-06-10)","text":"

        Features

        • 0f45cb4 feat: Add stub for removed remove command
        • ca643ce feat: Rename remove command to destroy

        Fixes

        • f781976 fix: Fix panic when parsing some commands

        Documentation updates

        • bcd52b9 docs: Update comparison-table.md

        Full changelog: v2.48.2...v2.49.0

        "},{"location":"reference/release-history/#2482-2024-05-31","title":"2.48.2 (2024-05-31)","text":"

        Fixes

        • 788f805 fix: Don't panic on unexpected bubbletea messages
        • 5cf451a fix: Respect umask when creating files
        • 24a990d fix: fix error when determining GOARCH in install.ps1

        Documentation updates

        • 1a16b49 docs: Add link to article

        Full changelog: v2.48.1...v2.48.2

        "},{"location":"reference/release-history/#2481-2024-05-12","title":"2.48.1 (2024-05-12)","text":"

        Features

        • a396e3a feat: Add gitHubLatestReleaseAssetURL template function

        Fixes

        • 6a90b3e fix: Links section is broken in docs

        Documentation updates

        • 9d332c6 docs: Add link to article

        Full changelog: v2.48.0...v2.48.1

        "},{"location":"reference/release-history/#2480-2024-04-26","title":"2.48.0 (2024-04-26)","text":"

        Features

        • 2e04dcf feat: Add --tree flag to unmanaged command
        • 91823e3 feat: Add --tree flag to managed command
        • 278e2be feat: Add --tree flag to ignored command
        • 4a9d0e4 feat: Include name of target in error message

        Fixes

        • c758a1c fix: Apply .chezmoiignore to dirs in external archives
        • 7dfcfcf fix: Remove unmanaged files from exact_ directories containing external files
        • 153ff43 fix: Better detect username on Android/Termux systems

        Documentation updates

        • b1b40b2 docs: Add link to article
        • 9c817ce docs: Document --tree flag
        • 89fab4b docs: Fix origin URL in quick start guide

        Full changelog: v2.47.4...v2.48.0

        "},{"location":"reference/release-history/#2474-2024-04-12","title":"2.47.4 (2024-04-12)","text":"

        Fixes

        • d6ad485 fix: Fix potential panic when textconv interpreter is empty
        • b4df44d fix: Fix panic on empty external

        Documentation updates

        • 872c584 docs: Add troubleshooting entry on missing /bin/bash on Nix
        • 8b2a435 docs: Add install.doctor to related software
        • 3a3dd13 docs: Add links to articles

        Full changelog: v2.47.3...v2.47.4

        "},{"location":"reference/release-history/#2473-2024-03-31","title":"2.47.3 (2024-03-31)","text":"

        Fixes

        • 2e4236c fix: Don't traverse into ignored directories when adding files
        • 8a83dcc fix: Skip adding entries in external dirs instead of erroring
        • b366d0e fix: Fix panic when adding children in exact_ dirs
        • ad77158 fix: Increase range of types accepted by promptChoice template function

        Full changelog: v2.47.2...v2.47.3

        "},{"location":"reference/release-history/#2472-2024-03-17","title":"2.47.2 (2024-03-17)","text":"

        Fixes

        • f490429 fix: pass the --needed flag to pacman
        • 88b586d fix: Remove fig support
        • c8dc9a4 fix: Explicitly tell user when then should use a config file template
        • fccc759 fix: Handle copies in automatic commit messages
        • 3a0b19e fix: Add missing newlines in error messages

        Documentation updates

        • 490cc3a docs: Add link to article
        • eb62958 docs: Fix incomplete sentence in usage docs
        • ce46858 docs: Add link to article

        Full changelog: v2.47.1...v2.47.2

        "},{"location":"reference/release-history/#2471-2024-03-03","title":"2.47.1 (2024-03-03)","text":"

        Fixes

        • 59764c8 fix: Fix panic in unmanaged on some dir permission errors
        • dc99169 fix: Make splitList return []any
        • 0405763 fix: Set CHEZMOI_ environment variables for plugins
        • 1f44189 fix: Ensure that all .chezmoi.config template variables have simple types
        • 5bb87f1 fix: a grammar mistake

        Documentation updates

        • 85d015b docs: Refactor developer guide
        • 885487b docs: Add link to blog post
        • 18c99c3 docs: Add link to video

        Full changelog: v2.47.0...v2.47.1

        "},{"location":"reference/release-history/#2470-2024-02-25","title":"2.47.0 (2024-02-25)","text":"

        Features

        • 6788c54 feat: 1Password Secrets Automation Support

        Fixes

        • 3b3541c fix: Ensure default mode is set
        • c6b867b fix: Fix marshaling of severities
        • 523fd84 fix: Fix marshaling of autobools
        • 5224e11 fix: Fix marshaling of absolute paths
        • e925b0f fix: Fix --keep-going flag for unmanaged command
        • 5201ddc fix: Don't leak internal default sentinel values in template data
        • 1abcfa5 fix: Fix panic when merging unmanaged file
        • c0b7e92 fix: Don't attempt to add entries in external_ directories
        • d14bdd5 fix: Use uname -o to detect Android in install script
        • 302a3b8 fix: Move documentation of --output flag to correct section
        • ccde612 fix: Prioritize $HOME when Cygwin or msys2 is detected

        Documentation updates

        • 3e5f0c8 docs: Fix type of .chezmoi.kernel and .chezmoi.osRelease variables
        • 0269f80 docs: Update docs on auto applying changes on edit in VIM
        • b5fc7b6 docs: Document config vars for command-specific flags
        • f52062e docs: Cross link \"See REF\" in config variables doc

        Full changelog: v2.46.1...v2.47.0

        "},{"location":"reference/release-history/#2461-2024-02-11","title":"2.46.1 (2024-02-11)","text":"

        Features

        • 8a20f91 feat: Add update.apply configuration variable
        • 431ec39 feat: Set CHEZMOI_SOURCE_FILE env var for scripts

        Fixes

        • 0eb98a9 fix: Fix age/rage check in doctor command

        Documentation updates

        • baeaf6b docs: typo

        Other

        • deb5adf chore(deps-dev): bump ruff from 0.1.9 to 0.1.15 in /assets

        Full changelog: v2.46.0...v2.46.1

        "},{"location":"reference/release-history/#2460-2024-01-25","title":"2.46.0 (2024-01-25)","text":"

        Features

        • c7539b0 feat: Build for Android (Termux)
        • efcf32d feat: Support rage as an alternative age encryption command
        • 53f7b92 feat: Add re-add --recursive flag and make it the default
        • 85983f0 feat: Promote hooks to stable
        • 114030c feat: Promote HCP Vault Secrets template functions to stable
        • 24c0ea2 feat: Promote Doppler template functions to stable
        • c209c2a feat: Promote edit --watch to stable

        Fixes

        • 15f4eb1 fix: Defer lookup of git in $PATH for git-repo externals
        • 569601a fix: Change init to default to --config if --config-path is absent
        • 031b267 fix: Handle more keepassxc-cli errors
        • 74d6b2a fix: Reduce injection of terminal control characters into keepassxc-cli output

        Documentation updates

        • 1418f74 docs: Fix broken release history page
        • 2dffe64 docs: links to testing-templates
        • 8dd6c86 docs: combine testing and debugging templates
        • 5e7c295 docs: Add links to article and video
        • 2e3bd95 docs: add link
        • 80717f4 docs: Fix names of age recipients files config variables

        Full changelog: v2.45.0...v2.46.0

        "},{"location":"reference/release-history/#2450-2024-01-13","title":"2.45.0 (2024-01-13)","text":"

        Features

        • 7d915c0 feat: Scan for secrets with gitleaks when adding files
        • 404878c feat: Add add.encrypt configuration variable

        Fixes

        • 3436563 fix: Improve robustness of keepassxc-cli integration in open mode
        • 49791f9 fix: Handle keepassxc-cli localization
        • 85464dd fix: Restore user args to keepassxc-cli in cache password mode
        • 9437b62 fix: Always use forward slashes to separate Windows paths

        Full changelog: v2.44.0...v2.45.0

        "},{"location":"reference/release-history/#2440-2024-01-10","title":"2.44.0 (2024-01-10)","text":"

        Features

        • 6a5d4a3 feat: Add support for YubiKeys with KeePassXC

        Documentation updates

        • ff3deb9 docs: Add explanation of status characters

        Full changelog: v2.43.0...v2.44.0

        "},{"location":"reference/release-history/#2430-2024-01-02","title":"2.43.0 (2024-01-02)","text":"

        Features

        • d99e8bd feat: Extend rbw and rbwFields template funcs to take extra args
        • 7323f6a feat: Extend remove_ attribute to directories

        Fixes

        • 44b4c6d fix: Fix detection of changes to remove_ directories
        • 5f40268 fix: Only invoke diff pager if there is diff output
        • 084add0 fix: Handle implicit directories in externals
        • 54dce1b fix: add missing command annotations
        • d85b5e4 fix: Make execute-template --init not read .chezmoitemplates
        • db9b4dd fix: key.txt is not written to home, but home/.config

        Documentation updates

        • 774d053 docs: Add upcoming changes to release history
        • 9f9d2d9 docs: Add link to article
        • 6eb139b docs: Add links to articles
        • 08e9b0b docs: Fix guide on clearing state of run_onchange_ scripts

        Other

        • a450748 chore(deps-dev): bump ruff from 0.1.6 to 0.1.9 in /assets

        Full changelog: v2.42.3...v2.43.0

        "},{"location":"reference/release-history/#2423-2023-12-16","title":"2.42.3 (2023-12-16)","text":"

        Features

        • 538169a feat: Remove nested subshell check
        • 31780bf feat: Make mackupApplicationsDir func agnostic to mackup's installation method

        Documentation updates

        • ef01881 docs: Add github.com/xvzc/chezmoi.nvim to related software
        • e530e7c docs: Add link to article
        • 31e6207 docs: Add link to video
        • 854ea06 docs: Add entry on declarative package installation
        • 0cf9f29 docs: add warning for GitHub SSH key deletion

        Full changelog: v2.42.2...v2.42.3

        "},{"location":"reference/release-history/#2422-2023-12-02","title":"2.42.2 (2023-12-02)","text":"

        Features

        • a9d389e feat: Add CHEZMOI_COMMAND_DIR env var for hooks

        Fixes

        • 649c758 fix: Fix fromJson template function deserializing non-objects
        • c68ddac fix: Handle extra slashes in path arguments

        Full changelog: v2.42.1...v2.42.2

        "},{"location":"reference/release-history/#2421-2023-11-29","title":"2.42.1 (2023-11-29)","text":"

        Fixes

        • d07689e fix: Set env vars from config file when re-reading config

        Documentation updates

        • 0b38793 docs: Clarify prefix order for regular files

        Full changelog: v2.42.0...v2.42.1

        "},{"location":"reference/release-history/#2420-2023-11-26","title":"2.42.0 (2023-11-26)","text":"

        Features

        • 694977b feat: Preserve numeric types when reading from .chezmoidata JSON and JSONC files
        • 1f11386 feat: Preserve integer values in fromJson and fromJsonc template funcs
        • 711a39a feat: Add read-source-state hook

        Documentation updates

        • 47609a3 docs: Add admonitions linking remove and forget
        • 8784a67 docs: Add links to blog posts

        Full changelog: v2.41.0...v2.42.0

        "},{"location":"reference/release-history/#2410-2023-11-14","title":"2.41.0 (2023-11-14)","text":"

        Features

        • 26fd133 feat: Add git-commit-message to generate command
        • c6688d2 feat: Make commit message templates regular templates
        • f7c3745 feat: Add git.commitMessageTemplateFile config variable
        • 1f016e8 feat: Add edit-config-template command

        Fixes

        • d9cb6b0 fix: Don't escape HTML characters in JSON strings

        Documentation updates

        • b94f954 docs: Document support for the passage password manager
        • a1fba75 docs: add how-to for gpg \u2194 age migration
        • 8d58c3e docs: Fix default value of persistentState variable

        Other

        • e8ed4c4 refactor: Allow mkdocs build from any origin

        Full changelog: v2.40.4...v2.41.0

        "},{"location":"reference/release-history/#2404-2023-10-29","title":"2.40.4 (2023-10-29)","text":"

        Fixes

        • 797e3cf fix: Make stdinIsATTY return false if --no-tty is passed

        Full changelog: v2.40.3...v2.40.4

        "},{"location":"reference/release-history/#2403-2023-10-12","title":"2.40.3 (2023-10-12)","text":"

        Features

        • b64f2bc feat: Add env config var as an alternative to scriptEnv
        • f47c268 feat: Warn when overriding CHEZMOI_ env vars
        • 7203d6b feat: Set CHEZMOI_ and scriptEnv env vars for all invoked commands

        Documentation updates

        • 319dd20 docs: Tidy up release notes

        Full changelog: v2.40.2...v2.40.3

        "},{"location":"reference/release-history/#2402-2023-10-09","title":"2.40.2 (2023-10-09)","text":"

        Internal changes only

        Full changelog: v2.40.1...v2.40.2

        "},{"location":"reference/release-history/#2401-2023-10-09","title":"2.40.1 (2023-10-09)","text":"

        Features

        • fc56533 feat: Add Path Separator and Path List Separator to provided template values.
        • 61f7ed1 feat: Ignore AppleDouble files in externals
        • 4a52e5c feat: find[One]Executable in user-supplied paths
        • bb6f952 feat: Use Goreleaser's Chocolatey support

        Fixes

        • eecf015 fix: Only invoke diff pager if command modifies filesystem
        • 5c0140d fix: Don't use replace-executable for WinGet installations
        • 7976373 fix: Add chattr +remove support for files

        Documentation updates

        • 784d38b doc: Add information how to ignore cache files in external dependencies
        • 66070dc docs: Added an example for promptChoice
        • 5f14f10 docs: Added an example for promptChoiceOnce
        • c96a4b7 docs: Fix cross-function link references

        Full changelog: v2.40.0...v2.40.1

        "},{"location":"reference/release-history/#2400-2023-09-19","title":"2.40.0 (2023-09-19)","text":"

        Features

        • 2858a0c feat: Implement the path-style flag for status
        • 5918296 feat: Add plugin support
        • 63cda81 feat: Allow overlapping, non-conflicting externals
        • f15b158 feat: Add decryption of non-armored files to age command

        Fixes

        • cdd4f16 fix: Use diff pager for all diff output if configured
        • 3667788 fix: provide a consistent error for cd to file

        Documentation updates

        • 284baf6 docs: Add links to articles

        Full changelog: v2.39.1...v2.40.0

        "},{"location":"reference/release-history/#2391-2023-09-06","title":"2.39.1 (2023-09-06)","text":"

        Fixes

        • 46e13ed fix: Ensure default template data when reading .chezmoidata in subdir

        Documentation updates

        • fe10a69 docs: Improve developer experience under fish
        • 5b738bd docs: Fix documentation on dirs vs content in .chezmoiignore

        Full changelog: v2.39.0...v2.39.1

        "},{"location":"reference/release-history/#2390-2023-09-03","title":"2.39.0 (2023-09-03)","text":"

        Features

        • acb8937 feat: add .chezmoi.targetFile template variable
        • 205fd6c feat: Add age command
        • f6947d3 feat: Add bitwardenSecrets template function

        Fixes

        • 40b711d fix: Handle .chezmoidata files in subdirectories when template has already been executed
        • 6fa4fe4 fix: Update goreleaser changelog

        Documentation updates

        • a89e0e0 docs: Tweak location of private key in age onetime passphrase how-to
        • da9f3c6 docs: Use age command in onetime passphrase how-to
        • fe903d4 docs: Minor expansion of application order docs
        • 02ffbd7 docs: Add link to article

        Full changelog: v2.38.0...v2.39.0

        "},{"location":"reference/release-history/#2380-2023-08-21","title":"2.38.0 (2023-08-21)","text":"

        Other

        • 0ce82b3 chore: Update dependencies
        • 7b300e4 chore: Miscellaneous website improvements
        • 166feaf docs: Linuxbrew -> Homebrew
        • d00de72 feat: Add gitHubReleases and gitHubTags
        • a51179e feat: Support nushell scripts on Windows
        • 7d143c3 docs: Improve documentation on using separate source files
        • ba985c9 chore: Reformat long lines
        • 5e8d2b3 feat: Add promptChoice and promptChoiceOnce template functions
        • 29e8c30 fix: Fix minor issues with promptBool docs and errors
        • f0efc5c chore: Generate release notes from git log, not GitHub
        • 3c72387 chore: Remove dependency on go.uber.org/multierr
        • 424189b chore: Use io/fs.Skip{All,Dir} sentinel errors
        • dbc1b4b chore: Bump golangci-lint to version 1.54.0
        • 3f636c1 chore: Build with Go 1.21.0
        • 187f734 chore: Update dependencies
        • a028598 feat: Restore --autotemplate flag to add command
        • 4e67850 docs: Document --source-path flag
        • 4fc3203 fix: Fix race condition in concurrent parsing of externals

        Full changelog: v2.37.0...v2.38.0

        "},{"location":"reference/release-history/#2370-2023-08-06","title":"2.37.0 (2023-08-06)","text":"
        • feat: Read personal mackup config files by @twpayne in #3133
        • chore(deps): bump github/codeql-action from 2.20.1 to 2.21.2 by @dependabot in #3135
        • chore: Build with Go 1.20.7 by @twpayne in #3140
        • feat: Add support for Doppler by @equals03 in #3134
        • feat: Extend re-add command to accept an optional list of targets by @twpayne in #3146
        • chore: Update dependencies by @twpayne in #3150
        • fix: Avoid concurrent map access when evaluating multiple templates by @twpayne in #3155
        • feat: Add isExecutable template function by @twpayne in #3157
        • chore: Fix isExecutable tests on Windows by @twpayne in #3158
        • chore: Update dependencies by @twpayne in #3159

        New Contributors

        • @equals03 made their first contribution in #3134

        Full changelog: v2.36.1...v2.37.0

        "},{"location":"reference/release-history/#2361-2023-07-30","title":"2.36.1 (2023-07-30)","text":"
        • fix: Make detection of mackup config dir more robust by @twpayne in #3128
        • fix: Ensure that templates cannot modify each other's data by @twpayne in #3129
        • chore: Move core packages back to internal by @twpayne in #3130

        Full changelog: v2.36.0...v2.36.1

        "},{"location":"reference/release-history/#2360-2023-07-28","title":"2.36.0 (2023-07-28)","text":"
        • feat: Add .chezmoiexternals directory for multiple externals by @twpayne in #3108
        • fix: Respect setting diff.pager to the empty string as disabling the pager by @twpayne in #3117
        • chore: Update dependencies by @twpayne in #3124
        • feat: Add undocumented mackup command by @twpayne in #3121

        Full changelog: v2.35.2...v2.36.0

        "},{"location":"reference/release-history/#2352-2023-07-19","title":"2.35.2 (2023-07-19)","text":"

        Internal changes only

        Full changelog: v2.35.1...v2.35.2

        "},{"location":"reference/release-history/#2351-2023-07-18","title":"2.35.1 (2023-07-18)","text":"
        • feat: Allow executable bits to be overridden in archive-file externals by @twpayne in #3102
        • docs: Clarify use of exclude patterns in .chezmoiignore by @twpayne in #3103
        • feat: Add work-around for Docker Desktop breaking /etc/hosts by @twpayne in #3104
        • chore: Update dependencies by @twpayne in #3105

        Full changelog: v2.35.0...v2.35.1

        "},{"location":"reference/release-history/#2350-2023-07-16","title":"2.35.0 (2023-07-16)","text":"
        • feat: Add archive-file externals by @twpayne in #3080
        • fix: Never consider localhost.localdomain in /etc/hosts as the FQDN by @twpayne in #3082
        • chore: Miscellaneous fixes by @twpayne in #3091
        • chore: Use golang/govulncheck-action by @twpayne in #3094
        • feat: Add support for HCP Vault Secrets by @twpayne in #3067
        • chore: Use Goreleaser's WinGet support by @twpayne in #3059

        Full changelog: v2.34.3...v2.35.0

        "},{"location":"reference/release-history/#2343-2023-07-03","title":"2.34.3 (2023-07-03)","text":"
        • fix: Check .chezmoiignore before protected paths by @twpayne in #3052
        • chore: Add actionlint linter by @twpayne in #3053
        • fix: Parse hostnames from all loopback addresses in /etc/hosts by @twpayne in #3055
        • chore: Update dependencies by @twpayne in #3058
        • fix: Respect persistentState config variable by @twpayne in #3066
        • chore: Miscellaneous fixes by @twpayne in #3068
        • docs: Remove reference to tar and /dev/stdin so code works on Windows by @Sacro in #3069
        • chore: Update goreleaser config for version 1.19 by @twpayne in #3071
        • fix: Drop Solaris and Illumos support by @twpayne in #3060
        • chore(deps): bump github.com/rogpeppe/go-internal from 1.10.1-0.20230524175051-ec119421bb97 to 1.11.0 by @dependabot in #3073
        • chore(deps): bump sigstore/cosign-installer from 3.0.5 to 3.1.1 by @dependabot in #3074
        • chore(deps): bump reviewdog/action-misspell from 1.12.4 to 1.13.1 by @dependabot in #3075
        • chore(deps): bump github/codeql-action from 2.20.0 to 2.20.1 by @dependabot in #3076

        New Contributors

        • @Sacro made their first contribution in #3069

        Full changelog: v2.34.2...v2.34.3

        "},{"location":"reference/release-history/#2342-2023-06-17","title":"2.34.2 (2023-06-17)","text":"
        • chore: Simplify code by using strings.EqualFold, time.Before by @twpayne in #3038
        • chore: Use http.NoBody instead of nil by @alexandear in #3040
        • chore: Miscellaneous clean-ups by @twpayne in #3041
        • fix: Handle multiple files in .chezmoidata directory by @twpayne in #3042
        • chore: Update dependencies by @twpayne in #3043
        • chore(deps): bump golangci/golangci-lint-action from 3.4.0 to 3.6.0 by @dependabot in #3044
        • chore(deps): bump dessant/lock-threads from 4.0.0 to 4.0.1 by @dependabot in #3045
        • chore(deps): bump github/codeql-action from 2.3.5 to 2.20.0 by @dependabot in #3046
        • chore(deps): bump goreleaser/goreleaser-action from 4.2.0 to 4.3.0 by @dependabot in #3047
        • chore(deps): bump actions/checkout from 3.5.2 to 3.5.3 by @dependabot in #3048

        Full changelog: v2.34.1...v2.34.2

        "},{"location":"reference/release-history/#2341-2023-06-10","title":"2.34.1 (2023-06-10)","text":"
        • chore: Build with Go 1.20.5 by @twpayne in #3030
        • feat: Add git.commitMessageTemplate configuration variable by @twpayne in #3032

        Full changelog: v2.34.0...v2.34.1

        "},{"location":"reference/release-history/#2340-2023-06-05","title":"2.34.0 (2023-06-05)","text":"
        • feat: Add support for .chezmoidata directory by @twpayne in #3009
        • chore(deps): bump github/codeql-action from 2.3.3 to 2.3.5 by @dependabot in #3010
        • chore(deps): bump actions/setup-go from 4.0.0 to 4.0.1 by @dependabot in #3012
        • chore: Misc fixes by @twpayne in #3019
        • chore: Update dependencies by @twpayne in #3018
        • chore(deps): bump sigstore/cosign-installer from 3.0.3 to 3.0.5 by @dependabot in #3011
        • chore: Bump golangci-lint to version 1.53.1 by @twpayne in #3020
        • fix: Fix init --debug flag by @twpayne in #3021
        • feat: Add get.chezmoi.io/lb and chezmoi.io/getlb install scripts by @twpayne in #3024
        • chore: Update dependencies by @twpayne in #3026
        • fix: Fix parsing of flags to secret keyring delete command by @twpayne in #3027

        Full changelog: v2.33.6...v2.34.0

        "},{"location":"reference/release-history/#2336-2023-05-15","title":"2.33.6 (2023-05-15)","text":"
        • chore(deps): bump github.com/cloudflare/circl from 1.3.2 to 1.3.3 by @dependabot in #2991
        • fix: Only create empty files if they have the empty_ attribute by @twpayne in #2997
        • chore: Refactor internal handling of remove_ directories by @twpayne in #2999
        • chore(editorconfig): Remove quotes from editorconfig file by @aarondill in #3000
        • fix: Set CHEZMOI_SOURCE_DIR env var in init when using .chezmoiroot by @twpayne in #3001
        • chore: Update dependencies by @twpayne in #3002

        New Contributors

        • @aarondill made their first contribution in #3000

        Full changelog: v2.33.5...v2.33.6

        "},{"location":"reference/release-history/#2335-2023-05-11","title":"2.33.5 (2023-05-11)","text":"
        • chore: Build with Go 1.20.4 by @twpayne in #2970
        • chore: Use github.com/alecthomas/assert instead of github.com/stretchr/testify by @twpayne in #2974
        • fix: Fix commands for managed files in exact_ directories by @twpayne in #2980
        • docs: Improved Bitwarden login documentation by @halostatue in #2955
        • chore: Update dependencies by @twpayne in #2983
        • chore(deps): bump github/codeql-action from 2.3.2 to 2.3.3 by @dependabot in #2986
        • chore(deps): bump cpina/github-action-push-to-another-repository from 1.6 to 1.7 by @dependabot in #2987
        • chore(deps): bump reviewdog/action-misspell from 1.12.3 to 1.12.4 by @dependabot in #2985
        • fix: Ensure the sourceDir is updated before creating config file by @twpayne in #2989

        Full changelog: v2.33.4...v2.33.5

        "},{"location":"reference/release-history/#2334-2023-05-02","title":"2.33.4 (2023-05-02)","text":"
        • fix: Fix init --promptBool for promptBoolOnce template function by @twpayne in #2950
        • docs: update encryption md to account for chezmoiroot by @danielo515 in #2952
        • chore(deps): bump sigstore/cosign-installer from 3.0.1 to 3.0.3 by @dependabot in #2957
        • chore(deps): bump github/codeql-action from 2.2.9 to 2.3.2 by @dependabot in #2958
        • chore(deps): bump actions/checkout from 3.5.0 to 3.5.2 by @dependabot in #2959
        • fix: Respect executable file modes in external_ directories by @twpayne in #2966
        • fix: Fix chezmoi rm with files in exact_ directories by @twpayne in #2967

        New Contributors

        • @danielo515 made their first contribution in #2952

        Full changelog: v2.33.3...v2.33.4

        "},{"location":"reference/release-history/#2333-2023-04-21","title":"2.33.3 (2023-04-21)","text":"
        • fix: Correct capitalization of .chezmoi.config template variables by @twpayne in #2943

        Full changelog: v2.33.2...v2.33.3

        "},{"location":"reference/release-history/#2332-2023-04-21","title":"2.33.2 (2023-04-21)","text":"
        • chore: Add test for reported .chezmoiroot issue by @twpayne in #2930
        • chore: Update dependencies by @twpayne in #2932
        • fix: Set CHEZMOI_ environment variables for modify_ scripts by @twpayne in #2935
        • fix: Don't download ignored git-repo externals by @twpayne in #2939
        • feat: Add .chezmoi.config template variable by @twpayne in #2940
        • chore: Update dependencies by @twpayne in #2941

        Full changelog: v2.33.1...v2.33.2

        "},{"location":"reference/release-history/#2331-2023-04-07","title":"2.33.1 (2023-04-07)","text":"
        • chore: Update dependencies by @twpayne in #2889
        • chore: Add rbw version check to doctor command by @twpayne in #2893
        • chore(deps): bump sigstore/cosign-installer from 2.8.1 to 3.0.1 by @dependabot in #2897
        • chore(deps): bump actions/cache from 3.2.6 to 3.3.1 by @dependabot in #2898
        • chore(deps): bump github/codeql-action from 2.2.5 to 2.2.9 by @dependabot in #2899
        • chore(deps): bump actions/checkout from 3.3.0 to 3.5.0 by @dependabot in #2900
        • chore: Update dependencies by @twpayne in #2903
        • chore: Update dependencies by @twpayne in #2908
        • fix: Allow source dir to be a git worktree by @twpayne in #2911
        • fix: Change where fish completions are installed by @J-M0 in #2912
        • chore: Tidy up persistent state tests by @twpayne in #2914
        • chore: Update dependencies by @twpayne in #2915

        New Contributors

        • @J-M0 made their first contribution in #2912

        Full changelog: v2.33.0...v2.33.1

        "},{"location":"reference/release-history/#2330-2023-03-24","title":"2.33.0 (2023-03-24)","text":"
        • chore(deps): bump google.golang.org/protobuf from 1.29.0 to 1.29.1 by @dependabot in #2856
        • docs: Miscellaneous fixes by @twpayne in #2860
        • fix: Don't list entries in git-repo externals as unmanaged by @twpayne in #2862
        • chore: Minor fixes by @twpayne in #2863
        • feat: Add support for ejson by @XaF in #2857
        • chore: Tidy up ejson default key dir by @twpayne in #2870
        • feat: Add jq template function by @twpayne in #2833
        • Update dependencies by @twpayne in #2874
        • docs: Add missing jsonc to some formats by @bradenhilton in #2876
        • docs: Wait for elevated PS process to return by @alexvy86 in #2872
        • chore: Deprecate --autotemplate by @halostatue in #2877
        • Update build infrastructure by @twpayne in #2881
        • feat: Set $CHEZMOI_VERBOSE based on --verbose by @halostatue in #2875
        • fix: Only set $CHEZMOI_VERBOSE when --verbose is set by @twpayne in #2883

        Full changelog: v2.32.0...v2.33.0

        "},{"location":"reference/release-history/#2320-2023-03-12","title":"2.32.0 (2023-03-12)","text":"
        • chore: Add test for target-path, .chezmoiscripts, and .chezmoiroot by @twpayne in #2811
        • fix: Allow underscores and dots in GitHub dotfile repo name guesses by @twpayne in #2817
        • Improve chezmoi cd command by @twpayne in #2823
        • docs: Fix typo by @hezhizhen in #2829
        • feat: Add support for the JSONC format by @twpayne in #2827
        • chore: Add test that diff.exclude excludes dirs from external diff tool by @twpayne in #2830
        • feat: Refuse to add chezmoi files to chezmoi by @twpayne in #2822
        • feat: Add pre- and post-command hooks by @twpayne in #2832
        • chore: Update dependencies by @twpayne in #2834
        • chore: Tidy up nolint directives by @twpayne in #2842
        • docs: Updated config / flags documentation information by @halostatue in #2843
        • chore: Miscellaneous password manager cleanups by @twpayne in #2845
        • chore: Remove +build comments from modules by @alexandear in #2846
        • chore: Use run.go instead of deprecated lang-version by @alexandear in #2847
        • feat: Add rbw template function for Bitwarden by @twpayne in #2841
        • chore: Miscellaneous fixes by @twpayne in #2848

        New Contributors

        • @hezhizhen made their first contribution in #2829

        Full changelog: v2.31.1...v2.32.0

        "},{"location":"reference/release-history/#2311-2023-03-02","title":"2.31.1 (2023-03-02)","text":"
        • chore: Bump golangci-lint to v1.51.2 by @twpayne in #2782
        • docs: Improve documentation on git-repo externals by @twpayne in #2785
        • chore: Update dependencies by @twpayne in #2788
        • chore: Enable most govet linters by @twpayne in #2794
        • chore: Update dependencies by @twpayne in #2795
        • feat: Add Dashlane password manager support by @twpayne in #2792
        • fix: Detect absolute paths in externals on Windows by @twpayne in #2796
        • feat: Add Dashlane secure notes support by @XaF in #2797
        • chore(deps): bump cpina/github-action-push-to-another-repository from 9e487f29582587eeb4837c0552c886bb0644b6b9 to 0a14457bb28b04dfa1652e0ffdfda866d2845c73 by @dependabot in #2802
        • chore(deps): bump github/codeql-action from 2.2.1 to 2.2.5 by @dependabot in #2803
        • chore(deps): bump actions/cache from 3.2.4 to 3.2.6 by @dependabot in #2804
        • chore: Update dependencies by @twpayne in #2809

        New Contributors

        • @XaF made their first contribution in #2797

        Full changelog: v2.31.0...v2.31.1

        "},{"location":"reference/release-history/#2310-2023-02-17","title":"2.31.0 (2023-02-17)","text":"
        • feat: Print a warning when chezmoi add is called with an ignored entry by @twpayne in #2762
        • feat: Cache GitHub API results by default to stay under rate limit by @twpayne in #2763
        • feat: Display progress bars by default when stdout is a TTY by @twpayne in #2767
        • feat(bitwarden): Grab attachment by object name by @cawaltrip in #2765
        • fix: Eliminate [DEFAULT] section for fromIni map by @halostatue in #2770
        • chore: Update dependencies by @twpayne in #2772
        • feat: Add --with-stdin flag to execute-template command by @twpayne in #2774
        • docs: Fix typo, improve grammar in init doc page by @bradenhilton in #2776
        • docs: Improve documentation on externals by @twpayne in #2775
        • chore: Update dependencies by @twpayne in #2781

        New Contributors

        • @cawaltrip made their first contribution in #2765

        Full changelog: v2.30.1...v2.31.0

        "},{"location":"reference/release-history/#2301-2023-02-11","title":"2.30.1 (2023-02-11)","text":"
        • Add deleteValueAtPath and pruneEmptyDicts template functions by @twpayne in #2750
        • feat: Extend toPrettyJson template function to take indent by @twpayne in #2751
        • fix: Fix chezmoi target-path when using .chezmoiroot by @twpayne in #2755
        • chore: Use strings.Cut{Prefix,Suffix} by @twpayne in #2756

        Full changelog: v2.30.0...v2.30.1

        "},{"location":"reference/release-history/#2300-2023-02-06","title":"2.30.0 (2023-02-06)","text":"
        • feat: Add zstd compression support by @twpayne in #2715
        • feat: Add external_ attribute for directories by @twpayne in #2716
        • chore(deps): bump golangci/golangci-lint-action from 3.3.1 to 3.4.0 by @dependabot in #2720
        • chore(deps): bump actions/checkout from 3.2.0 to 3.3.0 by @dependabot in #2721
        • chore(deps): bump github/codeql-action from 2.1.37 to 2.2.1 by @dependabot in #2722
        • chore(deps): bump actions/upload-artifact from 3.1.1 to 3.1.2 by @dependabot in #2723
        • chore: Miscellaneous fixes by @twpayne in #2719
        • chore(deps): bump ludeeus/action-shellcheck from 1.1.0 to 2.0.0 by @dependabot in #2724
        • chore(deps): bump actions/cache from 3.2.2 to 3.2.4 by @dependabot in #2726
        • chore(deps): bump goreleaser/goreleaser-action from 4.1.0 to 4.2.0 by @dependabot in #2727
        • feat: Build with Go 1.20 by @twpayne in #2731
        • fix: Make chezmoi init --purge-binary always remove binary by @twpayne in #2729
        • chore: Bump golangci-lint to version 1.51.0 by @twpayne in #2732
        • docs: Add install command for winget by @bradenhilton in #2735
        • Miscellaneous fixes by @twpayne in #2737
        • Set CHEZMOI* environment variables when running cd command by @twpayne in #2743
        • docs: Improve documentation on scripts by @twpayne in #2745

        Full changelog: v2.29.4...v2.30.0

        "},{"location":"reference/release-history/#2294-2023-01-24","title":"2.29.4 (2023-01-24)","text":"
        • fix: Revert buggy diff library by @twpayne in #2707
        • docs: note about actual auth types for GitHub private repos by @Avendattor in #2690

        New Contributors

        • @Avendattor made their first contribution in #2690

        Full changelog: v2.29.3...v2.29.4

        "},{"location":"reference/release-history/#2293-2023-01-19","title":"2.29.3 (2023-01-19)","text":"
        • feat: Add --recursive flag to chattr command by @twpayne in #2697
        • feat: Check config file format in doctor command by @twpayne in #2696
        • docs: Fix typo in merge user guide by @mumumumu in #2698
        • fix: Support .zip files with empty internal directories by @szinn in #2701
        • fix: Only prompt once for KeePassXC password by @twpayne in #2704
        • fix: Remove problematic username guessing in init command by @twpayne in #2705

        New Contributors

        • @mumumumu made their first contribution in #2698
        • @szinn made their first contribution in #2701

        Full changelog: v2.29.2...v2.29.3

        "},{"location":"reference/release-history/#2292-2023-01-15","title":"2.29.2 (2023-01-15)","text":"
        • chore: Update goreleaser config for v1.14 by @twpayne in #2667
        • feat: Add keepassxc.prompt config variable by @jcapiitao in #2677
        • docs: Update documentation on encryption by @twpayne in #2683
        • chore: Update dependencies by @twpayne in #2679
        • chore: Fix umask tests by @twpayne in #2688
        • chore: Update dependencies by @twpayne in #2694

        New Contributors

        • @jcapiitao made their first contribution in #2677

        Full changelog: v2.29.1...v2.29.2

        "},{"location":"reference/release-history/#2291-2023-01-02","title":"2.29.1 (2023-01-02)","text":"
        • fix: Fix init --ssh by @twpayne in #2666

        Full changelog: v2.29.0...v2.29.1

        "},{"location":"reference/release-history/#2290-2023-01-01","title":"2.29.0 (2023-01-01)","text":"
        • feat: Allow .chezmoi{external,ignore,remove} files to have a .tmpl suffix by @twpayne in #2632
        • feat: Add support for source paths in managed command by @twpayne in #2633
        • chore: Update dependencies by @twpayne in #2634
        • docs: Fix passphrase-once encryption instructions by @twpayne in #2636
        • chore: Update dependencies by @twpayne in #2639
        • chore(deps): bump actions/cache from 3.0.11 to 3.2.2 by @dependabot in #2641
        • chore(deps): bump github/codeql-action from 2.1.29 to 2.1.37 by @dependabot in #2642
        • chore(deps): bump goreleaser/goreleaser-action from 3.2.0 to 4.1.0 by @dependabot in #2643
        • chore(deps): bump actions/setup-go from 3.3.1 to 3.5.0 by @dependabot in #2644
        • chore(deps): bump dessant/lock-threads from 3.0.0 to 4.0.0 by @dependabot in #2645
        • feat: Allow cd command to take the destination directory as an argument by @twpayne in #2648
        • fix: Improve error message when state database cannot be locked by @twpayne in #2651
        • fix: Fix authentication when git is not installed by @twpayne in #2650
        • fix: Fix bug where edit --watch only applied the first change by @twpayne in #2654
        • chore: Miscellaneous updates by @twpayne in #2655
        • feat: Add hexDecode and hexEncode template functions by @twpayne in #2658
        • chore(deps): bump actions/checkout from 3.1.0 to 3.2.0 by @dependabot in #2659

        Full changelog: v2.28.0...v2.29.0

        "},{"location":"reference/release-history/#2280-2022-12-18","title":"2.28.0 (2022-12-18)","text":"
        • feat: Add lstat template function by @twpayne in #2616
        • feat: Add --path-style option to managed and unmanaged commands by @twpayne in #2617
        • chore: Build with Go 1.19.4 by @twpayne in #2619
        • feat: Add verification of external checksums by @twpayne in #2621
        • chore: Update dependencies by @twpayne in #2623

        Full changelog: v2.27.3...v2.28.0

        "},{"location":"reference/release-history/#2273-2022-12-05","title":"2.27.3 (2022-12-05)","text":"
        • chore: Move GitHub Actions off soon-to-be-deprecated Ubuntu 18.04 by @twpayne in #2604
        • chore(deps): bump golangci/golangci-lint-action from 3.3.0 to 3.3.1 by @dependabot in #2605
        • chore(deps): bump github.com/Masterminds/sprig/v3 from 3.2.2 to 3.2.3 by @dependabot in #2607
        • chore(deps): bump reviewdog/action-misspell from 1.12.2 to 1.12.3 by @dependabot in #2606
        • chore: Update dependencies by @twpayne in #2611
        • fix: Don't attempt to run empty scripts by @twpayne in #2612
        • fix: Respect config file umask setting when creating entries by @twpayne in #2613

        Full changelog: v2.27.2...v2.27.3

        "},{"location":"reference/release-history/#2272-2022-11-25","title":"2.27.2 (2022-11-25)","text":"
        • fix: Make re-add command respect --interactive flag by @twpayne in #2569
        • feat: Add an optional path argument to the cd command by @twpayne in #2579
        • feat: Make it easier to use non-git VCSes by @twpayne in #2580
        • fix: Allow underscores in SourceHut usernames by @twpayne in #2582
        • fix: Respect diff filter in removes with external diff tool by @twpayne in #2592
        • chore: Release fixes by @twpayne in #2593
        • chore: Update dependencies by @twpayne in #2596

        Full changelog: v2.27.1...v2.27.2

        "},{"location":"reference/release-history/#2271-2022-11-13","title":"2.27.1 (2022-11-13)","text":"
        • fix: Don't show always scripts in apply --verbose when excluded from diffs by @twpayne in #2565
        • feat: Remember HTTP username in URL in init command by @twpayne in #2562
        • chore: Make generation of versioninfo.json work without tags or git repo by @twpayne in #2566

        Full changelog: v2.27.0...v2.27.1

        "},{"location":"reference/release-history/#2270-2022-11-09","title":"2.27.0 (2022-11-09)","text":"
        • fix: Revert cpina/github-action-push-to-another-repository version bump by @bradenhilton in #2527
        • chore: Install Go in test-website and deploy-website jobs by @twpayne in #2528
        • feat: Suppress newlines from onepasswordRead by @halostatue in #2532
        • chore(deps): bump golangci/golangci-lint-action from 3.2.0 to 3.3.0 by @dependabot in #2533
        • feat: Allow modify_ scripts to be executed as templates by @twpayne in #2529
        • chore: Blacklist buggy version of github.com/bmatcuk/doublestar/v4 by @twpayne in #2537
        • chore: Build with Go 1.19.3 by @twpayne in #2541
        • feat: Add line ending template directive by @twpayne in #2540
        • feat: Add setValueAtPath template function by @twpayne in #2542
        • fix: Don't merge non-files in merge-all command by @twpayne in #2543
        • feat: Add --script-contents flag to diff command by @twpayne in #2544
        • docs: Add line endings directive documentation by @bradenhilton in #2547
        • docs: Fix typos in Sourcehut repo patterns by @kjerstadius in #2552
        • chore: Better handle errors when globbing by @twpayne in #2538
        • feat: Add cat-config and dump-config commands by @twpayne in #2553
        • chore: Remove unused field by @twpayne in #2554
        • chore: Refactor handling of annotations by @twpayne in #2555
        • feat: Allow prompt*Once template functions to take paths by @twpayne in #2557
        • fix: Fix exclusion of externals by @twpayne in #2558
        • chore: Update dependencies by @twpayne in #2559
        • feat: Add completion template function by @twpayne in #2560

        New Contributors

        • @kjerstadius made their first contribution in #2552

        Full changelog: v2.26.0...v2.27.0

        "},{"location":"reference/release-history/#2260-2022-10-31","title":"2.26.0 (2022-10-31)","text":"
        • feat: Improve handling of include and exclude for externals and encrypted files by @twpayne in #2451
        • feat: Extend --include and --exclude flags to include templates by @twpayne in #2455
        • feat: Add per-template configurable delimiters by @twpayne in #2457
        • chore: Fix user guide link in support issue template by @bradenhilton in #2464
        • chore(deps): bump github/codeql-action from 2.1.26 to 2.1.27 by @dependabot in #2459
        • docs: Update homepage by @twpayne in #2458
        • chore(deps): bump dorny/paths-filter from 2.10.2 to 2.11.1 by @dependabot in #2460
        • chore(deps): bump actions/cache from 3.0.9 to 3.0.11 by @dependabot in #2461
        • chore(deps): bump sigstore/cosign-installer from 2.7.0 to 2.8.0 by @dependabot in #2462
        • chore(deps): bump cpina/github-action-push-to-another-repository from 9e487f29582587eeb4837c0552c886bb0644b6b9 to 940a2857e598a6392bd336330b07416c1ae8ea1f by @dependabot in #2466
        • chore: Update dependencies by @twpayne in #2465
        • chore(deps): bump actions/checkout from 3.0.2 to 3.1.0 by @dependabot in #2463
        • chore: Tweak template directive implementation by @twpayne in #2467
        • chore: Miscellaneous fixes by @twpayne in #2469
        • feat: Add option to exclude scripts that are always run by @twpayne in #2473
        • fix: Extend template directives functionality by @halostatue in #2471
        • chore: Update dependencies by @twpayne in #2474
        • docs: Add faq entry for templates pre-requisites by @felipecrs in #2476
        • docs: Add release notes and release history by @twpayne in #2477
        • docs: Add note on setting .ps1 interpreter to pwsh by @bradenhilton in #2478
        • chore: Fix comments that start from an incorrect name by @alexandear in #2481
        • chore: Add package descriptions by @twpayne in #2485
        • fix: Include git repo external state in state dump output by @twpayne in #2487
        • docs: Add FAQ entry on snap stdin/stdout redirect bug by @twpayne in #2488
        • chore: Use fs.ModePerm instead of 0o777 for all permissions by @twpayne in #2489
        • chore: GitHub Actions fixes by @twpayne in #2492
        • docs(bitwarden): Correct bitwardenFields example by @choznerol in #2493
        • feat: Populate VERSIONINFO on Windows builds by @bradenhilton in #2479
        • chore: Update dependencies by @twpayne in #2494
        • docs: Remove duplicate words by @bradenhilton in #2497
        • chore: Improve error messages from git-repo externals by @twpayne in #2501
        • fix: Construct templateDataMap manually by @halostatue in #2503
        • feat: Add --recurse-submodules flag to init command by @twpayne in #2511
        • feat: Add --recurse-submodules flag to update command by @twpayne in #2512
        • chore: Reorder eqFold template function reference page by @bradenhilton in #2513
        • chore: Fix refactored --include and --exclude flags by @twpayne in #2514
        • chore: Add test for .chezmoiignore and scripts by @twpayne in #2515
        • chore: Update dependencies by @twpayne in #2516
        • chore: Minor documentation tweaks by @twpayne in #2518
        • chore: Release improvements by @twpayne in #2517
        • chore(deps): bump goreleaser/goreleaser-action from 3.1.0 to 3.2.0 by @dependabot in #2519
        • chore(deps): bump actions/upload-artifact from 3.1.0 to 3.1.1 by @dependabot in #2520
        • chore(deps): bump actions/setup-go from 3.3.0 to 3.3.1 by @dependabot in #2522
        • chore(deps): bump github/codeql-action from 2.1.27 to 2.1.29 by @dependabot in #2523
        • chore(deps): bump sigstore/cosign-installer from 2.8.0 to 2.8.1 by @dependabot in #2521

        Full changelog: v2.25.0...v2.26.0

        "},{"location":"reference/release-history/#2250-2022-10-13","title":"2.25.0 (2022-10-13)","text":"
        • docs: Add FAQ entry on multiple source states by @twpayne in #2391
        • chore: Separate out test-release step by @twpayne in #2392
        • chore: Add check for keepassxc-cli version in keepassxcAttachment by @twpayne in #2397
        • chore: Fix typo in entrytypeset.go by @sm1999 in #2400
        • chore: Add test that chezmoi apply uses textconv by @twpayne in #2401
        • fix: Use textconv in interactive diffs by @twpayne in #2402
        • chore(deps): bump actions/cache from 3.0.8 to 3.0.9 by @dependabot in #2410
        • chore(deps): bump github/codeql-action from 2.1.21 to 2.1.26 by @dependabot in #2411
        • feat: Add shell completion for --include and --exclude flags by @twpayne in #2419
        • chore: Bump Go and golangci-lint versions by @twpayne in #2420
        • chore: Update dependencies by @twpayne in #2421
        • chore: Copy github.com/twpayne/go-shell into module by @twpayne in #2422
        • feat: Add eqFold template function by @bradenhilton in #2409
        • feat: Add scriptEnv configuration variable by @twpayne in #2423
        • chore: Set Go version in govulncheck by @twpayne in #2428
        • chore: Only read .chezmoiroot once by @twpayne in #2431
        • feat: Sign release assets by @twpayne in #2394
        • chore: Use build info to set commit and date, if available by @twpayne in #2434
        • chore: Use ReadDir to find config files and templates by @twpayne in #2435
        • chore: Use GitHub native changelogs for releases by @twpayne in #2438
        • feat: Use target paths in automatically generated commit messages by @twpayne in #2439
        • chore: Automatically deploy website after release by @twpayne in #2437
        • feat: 1Password account lookup table by @halostatue in #2425
        • chore: Refactor 1Password account map by @twpayne in #2440
        • docs: Use get.chezmoi.io for install links by @twpayne in #2441
        • feat: Add get.chezmoi.io/ps1 by @twpayne in #2443
        • chore: Fail if multiple config file templates or config files are found by @twpayne in #2444
        • fix: Make chattr {no,}encrypted decrypt and encrypt source file by @twpayne in #2447
        • chore: Update dependencies by @twpayne in #2448
        • feat: Expose template data in environment variables by @twpayne in #2429
        • chore: Use GitHub output in govulncheck workflow by @twpayne in #2450

        Full changelog: v2.24.0...v2.25.0

        "},{"location":"reference/release-history/#2240-2022-09-25","title":"2.24.0 (2022-09-25)","text":"
        • bb8d579 docs: Add FAQ entry on --verbose and --debug flags
        • fb595f2 docs: Add link to article
        • 0f58586 docs: Elaborate on once vs onchange attributes
        • b970bc1 feat: Add always/auto/never options to --refresh-externals flag
        • 21e99c7 feat: Add option to suppress warnings
        • a29abcf feat: Improve performance of the externals cache
        • da407b6 fix: Avoid double read of source state in merge-all and status commands
        • 1fbe862 fix: Preserve case in user template data
        • 9dda54a fix: Respect .chezmoiroot in source-path command with no arguments

        Full changelog: v2.23.0...v2.24.0

        "},{"location":"reference/release-history/#2230-2022-09-19","title":"2.23.0 (2022-09-19)","text":"
        • 6e49147 docs: Add hints about escaping diff and merge args in config file template
        • f1b404d docs: Add link to video
        • 2c3a349 docs: Change remote origin from ssh to https
        • 4d68612 docs: Update symlink design question with docs on edit --watch
        • 8b4b856 feat: Add --progress flag to show progress when downloading externals
        • ccb897c feat: Add passhole password manager support
        • 994a0c7 feat: Always set and restore Windows console
        • cf51259 feat: Use bubbletea for user input
        • 8054dff fix: Don't write file specified by --output atomically
        • 80576f5 fix: Ignore commands when creating archives
        • 83f01eb fix: Only read source state if needed in source-path command
        • c1a53e1 fix: Treat git-repo externals as directories of include/exclude purposes

        Full changelog: v2.22.1...v2.23.0

        "},{"location":"reference/release-history/#2221-2022-09-04","title":"2.22.1 (2022-09-04)","text":"
        • 64b9c1f fix: Fix handling of newlines in comment template function
        • 4950fc3 fix: Make includeTemplate function first search in .chezmoitemplates

        Full changelog: v2.22.0...v2.22.1

        "},{"location":"reference/release-history/#2220-2022-09-01","title":"2.22.0 (2022-09-01)","text":"
        • 6625f29 docs: Add FAQ entry on sharing shell history
        • 097a88c docs: Add note on script execution order
        • 3b6edaf docs: Fix a coloring issue that lines and texts in Mermaid diagrams are hardly visible in dark mode
        • 3e6e26d feat: Add includeTemplate template function
        • bf5b674 feat: Add initial fig support
        • 41644bb feat: Add support for loong64 architecture
        • 7a525b7 fix: Apply changes to directories recursively when editing directories
        • 03a91ca fix: Only use quotes if necessary in toIni template function

        Full changelog: v2.21.1...v2.22.0

        "},{"location":"reference/release-history/#2211-2022-08-29","title":"2.21.1 (2022-08-29)","text":"
        • f4be0e0 docs: Add link to package installation
        • 9f207f4 docs: Add summary paragraph
        • c60b406 feat: Add edit.apply configuration variable
        • 75b0569 feat: Add secret.args configuration variable
        • b59f127 fix: Detect SSH clones from URL when using builtin git
        • 4919c1a fix: Fix panic when absolute paths are used in externals
        • 8b420af fix: Respect format configuration variable in data, dump, and state commands

        Full changelog: v2.21.0...v2.21.1

        "},{"location":"reference/release-history/#2210-2022-08-23","title":"2.21.0 (2022-08-23)","text":"
        • c8399bc docs: Add FAQ entry on init template functions
        • e2ec7c5 docs: Add instructions for using chezmoi with Watchman
        • dc2ec23 docs: Add link to repology.org
        • 4d086c2 docs: Remove unmaintained Guix package
        • 485850f docs: Use install-from-git-working-copy in installation instructions
        • 9e4629f feat: Add --interactive flag
        • 8602622 feat: Add --prompt flag to init command
        • f98264b feat: Add --prompt* flags to init command
        • 02b8954 feat: Add fromIni template function
        • ffbb367 feat: Add gitHubLatestTag template function
        • ac0c759 feat: Add initial --watch flag to edit command
        • 3af5c7f feat: Add toIni template function
        • db4da31 feat: Improve support for external diff commands
        • 84afa19 fix: Handle .chezmoiroot in init command
        • 7583387 fix: Remove broken symbolic links in exact_ directories

        Full changelog: v2.20.0...v2.21.0

        "},{"location":"reference/release-history/#2200-2022-07-29","title":"2.20.0 (2022-07-29)","text":"
        • 5fdc580 docs: Add Termux package install instructions
        • 150144e docs: Add dark mode option
        • 24db084 docs: Prioritize package installation over curl | sh installation
        • 199d62e feat: Add comment template function
        • c0e2f53 feat: Add generate command to generate install script
        • 4dfd206 feat: Add onepasswordRead template function
        • 06b212b feat: Add promptBoolOnce, promptIntOnce, and promptStringOnce init template functions
        • ebeb8df feat: Add replaceAllRegex template function
        • 84e7a93 feat: Make managed command accept destination directory args
        • f8eabef feat: Make unmanaged command accept destination directory args
        • 9316c5a feat: Track source state origins more precisely
        • 851efe3 fix: Fix dropping of input when prompting for multiple values from piped stdin

        Full changelog: v2.19.0...v2.20.0

        "},{"location":"reference/release-history/#2190-2022-07-17","title":"2.19.0 (2022-07-17)","text":"
        • 47db454 docs: Add section on muting gpg output
        • 9dea4ea feat: Add fromToml and toToml template functions
        • ac6af02 feat: Add support for AWS Secrets Manager
        • 074899d feat: Allow dashes in keys in template data in config file
        • 132d184 fix: Fix FQDN hostname on FreeBSD
        • 03eb672 fix: Fix forget command when asked to forget an external
        • 304f52a fix: Fix merge command for encrypted files in subdirectories
        • 50dd19c fix: make install creates the bin/ dir if necessary, and uses the unambiguous --target-directory form of install.

        Full changelog: v2.18.1...v2.19.0

        "},{"location":"reference/release-history/#2181-2022-06-23","title":"2.18.1 (2022-06-23)","text":"
        • b944a84 docs: Add CPU cores/threads template
        • 1c60734 docs: Improve documentation of chezmoi's concepts
        • 2ee341c feat: Re-enable building of snaps

        Full changelog: v2.18.0...v2.18.1

        "},{"location":"reference/release-history/#2180-2022-06-20","title":"2.18.0 (2022-06-20)","text":"
        • 817d3e7 feat: Stop building snaps\\n ab6bc8d feat: Make add command add empty files, remove --empty flag\\n 755e02f fix: Don't return an error when the user chooses quit from a prompt\\n b554329 feat: Implement documented add --prompt flag\\n b95449f docs: Remove stray whitespace\\n ebeebcb docs: Add extra documentation to autotemplate\\n 991a630 docs: Clarify what 'source state' means\\n 2421da8 fix: Check .chezmoiversion in init command\\n 25b32fb feat: Give more context in Windows errors\\n 9605e40 feat: Make --autotemplate escape template markers\\n 2c89541 feat: Support determining FQDN via /etc/myname\\n 281e770 feat: Support multiple GPG recipients\\n cbed719 feat: Include git working tree state in doctor output\\n 87c1a91 docs: Use modeline to set filetype in VIM\\n 1af0576 feat: Include last modified time of config file in doctor output\\n 44762fd feat: Add quoteList template function\\n 2bf1210 feat: Add textconv configuration for friendlier binary diffs\\n 814f1f2 docs: Refactor Windows chassisType template\\n 7199cb2 docs: Add link to blog\\n d29344f fix: Improve quality of POSIX shell scripts\\n f2f8d87 docs: Add link to blog post\\n

        Full changelog: v2.17.1...v2.18.0

        "},{"location":"reference/release-history/#2171-2022-05-30","title":"2.17.1 (2022-05-30)","text":"
        • 1f92965 docs: Add information about chezmoi_modify_manager
        • 8b78d2b docs: Add link to podcast
        • fdd29a5 docs: Fix typo in kubeconfig documentation
        • 7d2d629 docs: Organize related software page into sub-sections
        • 7084bd5 fix: Fix dump command in the presence of config file templates
        • 2d27229 fix: Include git repo commands in dump command output

        Full changelog: v2.17.0...v2.17.1

        "},{"location":"reference/release-history/#2170-2022-05-26","title":"2.17.0 (2022-05-26)","text":"
        • d178db4 feat: Add uid and gid template variables
        • 658be53 feat: Add windowsVersion to builtin template data
        • 21e2666 fix: Parse $EDITOR and $VISUAL environment variables as shell commands

        Full changelog: v2.16.0...v2.17.0

        "},{"location":"reference/release-history/#2160-2022-05-19","title":"2.16.0 (2022-05-19)","text":"
        • e0b3ace feat: Add support for Keeper password manager
        • c4a4779 feat: Build for mips64 and mips64le
        • 17c480b feat: Build for riscv64
        • 1a63dc2 feat: Complete auto bool, format, and mode flag values
        • 187112d fix: Connect password manager std{in,err} to os.Std{in,err}
        • 7485aea fix: Don't complete _chezmoi in zsh completion
        • ef2be28 fix: Fix use of slashes in glob on Windows

        Full changelog: v2.15.4...v2.16.0

        "},{"location":"reference/release-history/#2154-2022-05-09","title":"2.15.4 (2022-05-09)","text":"
        • 8168ab9 docs: Add chezmoiexternal related links to user-guide/reference docs
        • a0d699c docs: Add example of extracting selected files from external archive
        • 47a2940 docs: Add some additional details to contributing-changes.md
        • 1c11ff1 fix: Fix external archive, sub-directory include, no excludes

        Full changelog: v2.15.3...v2.15.4

        "},{"location":"reference/release-history/#2153-2022-05-08","title":"2.15.3 (2022-05-08)","text":"
        • ccb709c docs: Add hint on random access in modify_ scripts
        • b525c50 feat: Add --guess-repo option to init command

        Full changelog: v2.15.2...v2.15.3

        "},{"location":"reference/release-history/#2152-2022-05-01","title":"2.15.2 (2022-05-01)","text":"
        • cbfe388 docs: Add clarification about all lowercase custom data fields
        • 84ac2e2 docs: Add guide on encrypting files with GPG and a passphrase
        • 8552a4c docs: Add links to blog and video
        • 7b83a17 docs: Add troubleshooting entry on scripts on Termux
        • 4de3fdc docs: Document workaround for #1574
        • d507609 docs: Minor tweaks
        • 956b449 docs: Use index function to access an item in the example
        • 58f9f45 feat: Add glob template function
        • fe0b6cf feat: Build with Go 1.18.1
        • eaa27b3 fix: Don't cache negative results of path lookups

        Full changelog: v2.15.1...v2.15.2

        "},{"location":"reference/release-history/#2151-2022-04-10","title":"2.15.1 (2022-04-10)","text":"
        • d297409 docs: Add section on understanding chezmoi's files and directories
        • cd74d0c docs: Document KeepassXC with YubiKey limitations
        • f0817a0 docs: Fix path to config file template
        • 462e547 docs: Tidy up KeepassXC reference documentation
        • 6cd2766 feat: Use diff.command for all verbose output
        • 58c458c fix: Fix apply --verbose when diff.command is set
        • f45b73a fix: Fix concurrent map writes on sourcestate.ignoredRelPaths
        • 95d5298 fix: Ignore exit status 1 from external diff commands

        Full changelog: v2.15.0...v2.15.1

        "},{"location":"reference/release-history/#2150-2022-04-03","title":"2.15.0 (2022-04-03)","text":"
        • 2fa910f docs: Add command overview
        • d051e7a docs: Add link to blog post
        • d2a4417 docs: Add link to podcast
        • ecdb07b docs: Adjust documents for 1Password CLI 2.0.0 changes
        • 9b1b5fb docs: Document that the ioreg template function is deprecated
        • 8e7bbde docs: Factor out GitHub template functions into a separate section
        • 4cabbc2 docs: Factor out init template functions into a separate section
        • 19e6d00 docs: Factor out password manager functions into separate sections
        • f3ef8be docs: Improve FAQ entry on source state filenames
        • cb02477 docs: Improve docs on empty files in chezmoi edit
        • caa9120 docs: Update dconf example as dconf only reads stdin
        • 08138ab docs: Use $VARIABLE instead of
        • 3f035a6 feat: Add diff.reverse configuration variable
        • d1374cf feat: Add ignored command
        • 38be385 feat: Add keepassxcAttachment template function
        • 4e6b843 feat: Build for s390x architecture
        • 523fdb2 fix: Fix one line install instructions for Windows
        • 8d052c0 fix: Fix op signin for 1Password CLI 2.0.0
        • 8910adb fix: Fix parsing of multiline KeepassXC attributes
        • a08c891 fix: Fix use of drives as home directories on Windows
        • b999509 fix: Prefer id over label for onepasswordDetailsFields template function
        • Full changelog: v2.14.0...v2.15.0

          "},{"location":"reference/release-history/#2140-2022-03-09","title":"2.14.0 (2022-03-09)","text":"
          • a3a1e17 docs: Add contributors image
          • 28c2718 docs: Add license to website
          • 538b982 docs: Add link to article
          • 32c0f02 feat: Add include and exclude patterns to external archives
          • ebfd5b2 feat: Add license command
          • 5a14326 feat: Release raw binaries

          Full changelog: v2.13.1...v2.14.0

          "},{"location":"reference/release-history/#2131-2022-03-04","title":"2.13.1 (2022-03-04)","text":"
          • dd0037b feat: Add scriptTempDir config var for temporary scripts
          • 816e5ee feat: Change default Python interpreter to python3
          • a4d989b fix: Allow user and repo to set in install script
          • e2e199b fix: Fix confusing error message when using builtin git to init over SSH

          Full changelog: v2.13.0...v2.13.1

          "},{"location":"reference/release-history/#2130-2022-02-26","title":"2.13.0 (2022-02-26)","text":"
          • e8ee359 docs: Add link to article
          • 3f36946 docs: Document extracting a single file from an archive
          • 843ba33 docs: Improve scripts user guide
          • 585adb1 feat: Add initial git-repo external type
          • e299d90 feat: Add option to exclude externals
          • 5f39fec feat: Add status.exclude configuration variable
          • 2451314 feat: Add verify.exclude configuration variable
          • fd47686 feat: Allow overriding GitHub user in shell installer
          • 08991d1 feat: Enable GNOME Keyring support on FreeBSD
          • 881cb7e fix: Correctly cut hostname off at . character

          Full changelog: v2.12.1...v2.13.0

          "},{"location":"reference/release-history/#2121-2022-02-20","title":"2.12.1 (2022-02-20)","text":"
          • 1fbc2ae feat: Be more strict about presence of source directory
          • baac6fc feat: Support arguments in Windows SHELL environment variable

          Full changelog: v2.12.0...v2.12.1

          "},{"location":"reference/release-history/#2120-2022-02-15","title":"2.12.0 (2022-02-15)","text":"
          • e9342a8 feat: Add target-path command
          • d228a50 feat: add support for xz archives
          • 6228e09 fix: Fix bug where chezmoi init --apply did not configure encryption

          Full changelog: v2.11.2...v2.12.0

          "},{"location":"reference/release-history/#2112-2022-02-03","title":"2.11.2 (2022-02-03)","text":"
          • 13de45f fix: Disable problematic concurrent source dir read

          Full changelog: v2.11.1...v2.11.2

          "},{"location":"reference/release-history/#2111-2022-02-02","title":"2.11.1 (2022-02-02)","text":"
          • 46c6766 fix: Fix race condition with multiple .chezmoiignore files

          Full changelog: v2.11.0...v2.11.1

          "},{"location":"reference/release-history/#2110-2022-02-02","title":"2.11.0 (2022-02-02)","text":"
          • c1271ff feat: Add initial support for 1Password CLI 2.0
          • 86ec4b8 feat: Add remove_ attribute for directories
          • dc919e6 feat: Include removed directories in diff output of external diff command
          • 8a84b31 feat: Make chezmoi's core functionality available as a Go module

          Full changelog: v2.10.1...v2.11.0

          "},{"location":"reference/release-history/#2101-2022-01-23","title":"2.10.1 (2022-01-23)","text":"
          • b4841ec fix: Fix add command when parent dir permissions have changed
          • 71ca1f6 fix: Ignore files and directories beginning with . in .chezmoitemplates
          • 2fd7a02 fix: Make data and execute-commands not depend on valid source state

          Full changelog: v2.10.0...v2.10.1

          "},{"location":"reference/release-history/#2100-2022-01-16","title":"2.10.0 (2022-01-16)","text":"
          • 724227b feat: Add chezmoi.io/get install URL
          • 65b6cb3 feat: Add list command as an alias for managed
          • ed62bbf feat: Append / to completed directories
          • 5aca99a feat: Disable custom completions by default
          • 7cd21aa feat: Remove docs command
          • 3129886 feat: Switch to Material for MkDocs for website

          Full changelog: v2.9.5...v2.10.0

          "},{"location":"reference/release-history/#295-2022-01-05","title":"2.9.5 (2022-01-05)","text":"
          • b9aeae9 feat: Add passFields template function
          • 326b578 feat: Prompt for 1password password if no session token is set
          • 2b98c14 fix: Fix shell completion for relative paths
          • 35af862 fix: Make exit template function init only

          Full changelog: v2.9.4...v2.9.5

          "},{"location":"reference/release-history/#294-2021-12-19","title":"2.9.4 (2021-12-19)","text":"
          • e25d501 feat: Add exit template function
          • cdac464 feat: Add secret keyring delete command
          • e2899b8 feat: Improve inconsistent state error with removes
          • 05e94c6 fix: Add missing --value flag to secret keyring set command
          • 5b50963 fix: Avoid panic when unknown URL schemes are used
          • 68fff1c fix: Fix include template function on Windows with absolute path

          Full changelog: v2.9.3...v2.9.4

          "},{"location":"reference/release-history/#293-2021-12-13","title":"2.9.3 (2021-12-13)","text":"
          • 126cb0c feat: Add --cache option and .chezmoi.cacheDir template variable
          • 89aec79 feat: Add more intelligent completion of targets, attributes, and docs
          • 66728aa feat: Follow symlinks in .chezmoitemplates
          • e1f2d15 fix: Fix .chezmoiversion check when using dev version

          Full changelog: v2.9.2...v2.9.3

          "},{"location":"reference/release-history/#292-2021-12-02","title":"2.9.2 (2021-12-02)","text":"
          • 8e8ef0f fix: Don't mark .chezmoiscripts as suspicious in doctor command
          • a2c5685 fix: Read .chezmoiversion before other files

          Full changelog: v2.9.1...v2.9.2

          "},{"location":"reference/release-history/#291-2021-11-30","title":"2.9.1 (2021-11-30)","text":"
          • ecb6c1d feat: Add .chezmoi.configFile template variable
          • 3560b20 feat: Add .chezmoi.workingTree template variable
          • d70de7a feat: Extend upgrade command to work on more operating systems
          • d23b428 fix: Check for .chezmoiversion outside .chezmoiroot
          • ccf6971 fix: Fix use of .chezmoiroot in multiple commands

          Full changelog: v2.9.0...v2.9.1

          "},{"location":"reference/release-history/#290-2021-11-28","title":"2.9.0 (2021-11-28)","text":"
          • 219a09e feat: Add .chezmoiscripts directory
          • ec2b92a feat: Add edit.hardlink config var and edit --hardlink flag
          • 7d31ecb feat: Add fromYaml template function
          • 988fcdc feat: Add state delete-bucket command
          • ff1e81d feat: Add state get-bucket command
          • da41e0f feat: Add toYaml template function
          • 98b6a39 feat: Apply diff.exclude to all diffs
          • 33c3e97 feat: Make verbose settable in the config file
          • 5672e1f fix: .chezmoiremove with * when destDir is /
          • aac0fd6 fix: Handle symlinks in zip archives
          • e7e6932 fix: Respect .chezmoiroot when generating config file

          Full changelog: v2.8.0...v2.9.0

          "},{"location":"reference/release-history/#280-2021-11-20","title":"2.8.0 (2021-11-20)","text":"
          • 9cbfdf6 feat: Add --persistent-state option for location of persistent state file
          • cbac205 feat: Add --reverse option to diff command
          • dec8789 feat: Add .chezmoi.executable template variable
          • 8a6d4d7 feat: Add .chezmoiroot to allow source state to be subdir of source dir
          • 518313b feat: Add cache HTTP client to cache downloads in .chezmoiexternal.
          • 8e1d647 feat: Add gitHubLatestRelease template function
          • ebacee7 feat: Add support for Homebrew on Linux to upgrade command
          • 3a4c1d0 feat: Add upgrade method to doctor command output
          • 90120fe feat: Caching the response of the GitHub API
          • 240f7ec feat: Make .chezmoidata. and .chezmoitemplates available in .chezmoiignore
          • 53cfa6e fix: Return unparsed gopass output in gopassRaw template func
          • e9e4712 fix: Warn, don't fail, if age version cannot be parsed in doctor command
          • 016da7a fix: lookPath panics when file does not exists
          • Full changelog: v2.7.5...v2.8.0

            "},{"location":"reference/release-history/#275-2021-11-07","title":"2.7.5 (2021-11-07)","text":"
            • 2a39175 feat: Add pinentry as an option for reading passwords
            • 823836c feat: Extend chattr command to change target types
            • bf8a185 fix: Make chezmoi add command respect .chezmoiignore

            Full changelog: v2.7.4...v2.7.5

            "},{"location":"reference/release-history/#274-2021-11-02","title":"2.7.4 (2021-11-02)","text":"
            • 9d621f7 feat: Add .chezmoi.args template variable
            • 27938e6 feat: Allow equivalent directory entries in source state and externals
            • 6113528 feat: Create parent directories for externals if needed
            • 83bad0a fix: Fix upgrade command for non-amd64 packages

            Full changelog: v2.7.3...v2.7.4

            "},{"location":"reference/release-history/#273-2021-10-23","title":"2.7.3 (2021-10-23)","text":"
            • 5d2fb13 feat: Add Illumos support
            • 14a475d feat: Add Solaris support

            Full changelog: v2.7.2...v2.7.3

            "},{"location":"reference/release-history/#272-2021-10-19","title":"2.7.2 (2021-10-19)","text":"
            • 67e0806 fix: Fix promptString default on Windows

            Full changelog: v2.7.1...v2.7.2

            "},{"location":"reference/release-history/#271-2021-10-17","title":"2.7.1 (2021-10-17)","text":"
            • 35eb651 feat: Add default argument to promptBool template function
            • 7e2e64d feat: Add default argument to promptInt template function
            • 951fc7e feat: Add default argument to promptString template function
            • 87033e2 fix: Apply .chezmoiignore to externals

            Full changelog: v2.7.0...v2.7.1

            "},{"location":"reference/release-history/#270-2021-10-12","title":"2.7.0 (2021-10-12)","text":"
            • 91c91f0 docs: fix .chezmoiignore example
            • 92ce33c feat: Add decrypt and encrypt template functions
            • 42e8323 feat: Add merge-all command
            • c8f113f feat: Add onchange_ attribute for scripts
            • f54deef feat: Improve messages and logging when using builtin git init
            • 02abd9a fix: Allow create_ entries to be templates
            • 20abba4 fix: Clarify behavior of run_once_ scripts
            • ebc0149 fix: Fix status for onchange scripts

            Full changelog: v2.6.1...v2.7.0

            "},{"location":"reference/release-history/#261-2021-10-03","title":"2.6.1 (2021-10-03)","text":"
            • 8d9a89b feat: Re-enable building with Go 1.16

            Full changelog: v2.6.0...v2.6.1

            "},{"location":"reference/release-history/#260-2021-10-02","title":"2.6.0 (2021-10-02)","text":"
            • 29464c6 chore(deps): bump assets/chezmoi.io/themes/book
            • c189d22 docs: Improve docs on externals
            • 157b0b7 feat: Add --init flag to all relevant commands
            • 78ae6c6 feat: Add refreshPeriod option to externals
            • 3d18ae8 feat: Make chezmoi edit invoke editor with target filenames
            • 8fda89b fix: Fix upgrade command on non-amd64 Linux machines

            Full changelog: v2.5.1...v2.6.0

            "},{"location":"reference/release-history/#251-2021-09-30","title":"2.5.1 (2021-09-30)","text":"
            • cbc2f1e docs: Add FAQ entry on diff colors not working
            • fa09eff docs: fix error in HOWTO guide
            • 55a4b93 feat: Add --init option to update command
            • f42866b feat: Add working tree config option (#1459)
            • f86d7b5 feat: Make chezmoi edit with no args open working tree (#1455)
            • b7fb215 fix: Allow modify_ scripts to be encrypted

            Full changelog: v2.5.0...v2.5.1

            "},{"location":"reference/release-history/#250-2021-09-23","title":"2.5.0 (2021-09-23)","text":"
            • 48b8096 Add Vagrant-based tests to CI
            • d439e7f Add doctor check for multiple config files
            • a79ba2f Add example to onepasswordItemFields documentation
            • 167638f Add filter option for externals
            • ccf78c5 Add how-to entry on managing file permissions but not contents
            • 74c06e4 Add link to podcast
            • 9e26b17 Add readonly_ attribute for files and directories
            • 47936f6 Add support for .chezmoiexternal files in subdirectories
            • 22c3f68 Add support for readonly attribute to chattr command
            • a909463 Allow the format of external archives to be set explicitly
            • 6f40524 Cache Vagrant Boxes in CI
            • 6ec4d02 Change gitlab link for other people's dotfiles
            • 4f1a977 Detect archive format from content if needed
            • 9996849 Detect when the source directory is already in a git working copy
            • 4d76d93 Disable GPG tests on Windows
            • 402c8cb Enable age tests on Windows CI
            • e79bbb1 Expand FAQ entry on build from source errors
            • 0739933 Fix CLI flags not taking precedence over configuration
            • 0bf08f4 Fix more command line flags overriding config vars
            • cbc6b15 Fix permissions for CodeQL analysis
            • 89a66fa Fix permissions in diff output when user sets a stricter umask
            • 0fa5f5a Guess format of chezmoi archive from output filename
            • b43e26e Improve consistency of source state read from externals
            • 188bae9 Improve internal logging infrastructure
            • 47ce738 Improve logging in Windows CI
            • 717b5d1 Make Makefile more portable
            • a86ca9e Merge test-release job into test-ubuntu
            • 0695b0c Minor docs fixes
            • 59cfe21 Only create .keep files when adding empty directories
            • e653627 Only warn if version or commit are not set in doctor command
            • 839703d Propagate failures in Vagrant CI scripts
            • ab2fa72 Reduce duplication of Go version in CI
            • 69f6a33 Reduce duplication of versions in build and CI system
            • b5bbe67 Revert \"Disable GPG tests on Windows\"
            • e63d0e7 Separate OS-specific CI jobs
            • 420ec58 Skp whitespace linting of temporary Vagrant files
            • e94cd8b Support paths containing spaces in VIM integration
            • 5460876 Tidy up error message when doctor command cannot parse version
            • ea59267 Update Vagrant-based tests
            • eaad1f6 Update dependencies

            Full changelog: v2.4.0...v2.5.0

            "},{"location":"reference/release-history/#240-2021-09-10","title":"2.4.0 (2021-09-10)","text":"
            • 736aaa1 Add decrypt command
            • 0b2692a Add doc on detemining whether the machine is a laptop or desktop
            • ed65ef6 Add encrypt command
            • 98b92c2 Add initial --use-builtin-age flag
            • dd116f7 Build with Go 1.17.1
            • 63610a4 Extend init command to guess the user's username for private repos
            • 34ecd67 Fix internal capitalization of age
            • da04181 Simplify internal use of auto bools
            • 2ff4151 Update dependencies

            Full changelog: v2.3.1...v2.4.0

            "},{"location":"reference/release-history/#231-2021-09-08","title":"2.3.1 (2021-09-08)","text":"
            • 4fa36ee Add link to blog post
            • 778fd4c Add link to podcast
            • 89fd238 Add new media links
            • 60703f8 Add onepasswordItemFields template function
            • 57ab1f2 Append path arguments to diff command if not provided by user
            • a761f3f Append path arguments to merge command if not provided by user
            • 62e02ff Bump age to version 1.0.0
            • 8370209 Bump golangci-lint to version 1.42.1
            • 5a51c9e Conceal the user's username in doctor command output
            • a318652 Require Go 1.17 to build and log Go version in debug mode

            Full changelog: v2.3.0...v2.3.1

            "},{"location":"reference/release-history/#230-2021-09-04","title":"2.3.0 (2021-09-04)","text":"
            • 7cee590 Add how-to entry on using private dotfile repos
            • 9e77ea5 Add remove_ attribute
            • ad1c938 Add support for zip archives to .chezmoiexternal
            • 5c61b95 Add support for zip archives to import command
            • 433bdcc Add umask check to doctor command
            • 091979d Add undocumented --safe=false command line flag
            • 2ff4214 Bump assets/chezmoi.io/themes/book from 50147be to a656d71
            • 01ac1d0 Fix install from source documentation
            • 8ca5448 Improve contributing docs
            • 97a7e0e Log debug information in chezmoi apply
            • 0a2a40c Log version and args on startup in debug mode
            • 767e834 Remove accidentally unimplemented --remove option
            • 570f91a Remove stale FIXMEs

            Full changelog: v2.2.0...v2.3.0

            "},{"location":"reference/release-history/#220-2021-08-30","title":"2.2.0 (2021-08-30)","text":"
            • c03209f Add .chezmoiexternal for external files and archives
            • 0346200 Add support for encrypted externals
            • 49c34ea Add tests for multiple OSes using Vagrant
            • 08822e2 Check all shell scripts with shellcheck
            • 9a9d2f2 Fix bug when using custom diff tool on a file in a subdirectory
            • 0d82773 Make Makefile more consistent
            • d6f48f4 Pass context when reading source state
            • b06c2a6 Recognize .tbz2 files as archives
            • e946bf5 Reduce test verbosity on Cirrus CI
            • 3b84841 Remove Cirrus CI
            • 434c29f Rename internal variables for consistency
            • 78d52d2 Suppress initial branch name hints from git in chezmoi init
            • 00763d2 Tidy up code structure
            • 021eaf1 Tidy up documentation
            • 4937ea6 Update dependencies
            • a6e3d9a Update media links
            • 2cec38f Update tests for OpenBSD tar output

            Full changelog: v2.1.6...v2.2.0

            "},{"location":"reference/release-history/#216-2021-08-22","title":"2.1.6 (2021-08-22)","text":"
            • 3c476d9 Add --recursive flag to remove command
            • 461ea4a Add executable check to doctor command
            • 20b323c Add link to podcast and notes
            • bec5350 Add more explicit documentation on config file location
            • 994e633 Add more related software
            • 81094bf Add note on using -- in chattr
            • 70efaab Add test of the output and fromJson template functions
            • a25b911 Add windows/arm builds
            • 137e07e Build with Go 1.17
            • 11d84ed Bump golangci-lint to v1.42.0
            • 6d5f658 Create .keep files when adding directories
            • 4619b09 Fix bug where adding a dir with a trailing slash added it twice
            • 8eef5e4 Fix creation of .keep files when umask is 002
            • 5afe5a2 Improve how-to on diff and merge customization
            • de5cb42 Improve type safety in encryption code
            • f8d7368 Make remove command remove entries from persistent state
            • ed95a58 Miscellaneous Go 1.17 fixes
            • 5b0138a Tidy up suspicious entries list in doctor command
            • dc319c4 Tidy up test scripts
            • 5d2126b Tranparently decrypt files in merge command

            Full changelog: v2.1.5...v2.1.6

            "},{"location":"reference/release-history/#215-2021-08-11","title":"2.1.5 (2021-08-11)","text":"
            • 817e4d9 Add --config-type option so config file can be read from stdin
            • 7b3e307 Add function for running idempotent commands
            • 002742c Add initial suport for external diff tools
            • e4ac1b5 Add symlink mode
            • 7576466 Build with Go 1.16.7
            • 182b937 Fix chezmoi execute-template --init to not read chezmoidata
            • 60ae6b2 Fix spacing error in docs
            • 8144975 Fix the FreeBSD installation method
            • 0eb5348 Improve error messages for configurable merge tool arguments
            • 3304f6a Improve internal testing functions
            • 2726d9f Include .exe extension in Windows build artifact name
            • 70a85f0 Normalize symlinks on Windows
            • d79c30e Rename internal function for clarity
            • cb4ee88 Tweak doc formatting

            Full changelog: v2.1.4...v2.1.5

            "},{"location":"reference/release-history/#214-2021-08-04","title":"2.1.4 (2021-08-04)","text":"
            • a4eeff4 Add inital undocumented mackup add command
            • 1dfae81 Bump assets/chezmoi.io/themes/book from e939f40 to 50147be
            • 42e1f2f Fix crash when color was set to auto in config file
            • 49e9b46 Fix grammar
            • 43a0f1e Fix some minor internal inconsistencies
            • 91d10b0 Fix tag line in reference manual
            • dc6011b Make order of arguments to merge command configurable
            • b074718 Tidy up order of struct fields
            • 23059eb Update contributing doc
            • cdbc085 Update dependencies

            Full changelog: v2.1.3...v2.1.4

            "},{"location":"reference/release-history/#213-2021-07-31","title":"2.1.3 (2021-07-31)","text":"
            • 62bc51a Add VCSH to comparison chart
            • 69dc0f3 Add hidden internal-test command for internal testing
            • f9771a9 Add more media links
            • f0e7dce Allow entering username/password when using builtin git
            • e23dcc3 Bump golangci-lint to 1.41.1
            • bd9e485 Correct git archive import features
            • 1d433a2 Fix formatting in comparison table
            • bf77f76 Normalize cell length in Markdown table
            • 9820eb2 Reduce test verbosity in CI
            • 74811b2 Remove incorrectly documented short option
            • dde40d0 Set the record straight on some bare-git features
            • d4971ed Tidy up comparison table
            • cfe9084 Tidy up repo guessing code
            • 523496c Tidy up username and password requests when using builtin git
            • b51c080 Update dependencies
            • 4282879 Update dependencies
            • f00f6b5 Update recommended podcast
            • aae3a82 Use golang.org/x/sys/unix package where possible
            • 79d5348 Use target name when editing files
            • 47de173 Use terminal to read password on Windows

            Full changelog: v2.1.2...v2.1.3

            "},{"location":"reference/release-history/#212-2021-07-14","title":"2.1.2 (2021-07-14)","text":"
            • db62a0b Add FAQ entry on chezmoi cd
            • 80d925f Add link to blog
            • 4da300a Add more media entries
            • acc950d Allow install of chezmoi from a powershell where StrictMode is on
            • 19500e0 Allow source directory to be a symlink
            • 7b572a8 Build with Go 1.16.6
            • 1ba3727 Fix doctor check for suspicious entries
            • 7c688ef Make .chezmoi.kernel template variable more generic
            • dcf0ba1 Make .chezmoi.osRelease template variable more generic
            • 38d163d Make modify scripts always overwrite the target without prompting
            • 173ab68 Populate all default template variables
            • 35de5ad Remove .chezmoi.homedir template variable
            • bb0d23e Tidy up issue templates

            Full changelog: v2.1.1...v2.1.2

            "},{"location":"reference/release-history/#211-2021-07-11","title":"2.1.1 (2021-07-11)","text":"
            • 91c4031 Fix config file code snippet in HOWTO
            • 0b499d7 Fix panic when destination directory is /
            • 9660b12 Improve shell completions
            • 9d02a5a Tidy up onepassword template functions
            • f4e004a Update doc on how to migrate away from chezmoi
            • 5705e04 Use fs.WalkDir function
            • d1fef1c Use script extension to determine interpreter

            Full changelog: v2.1.0...v2.1.1

            "},{"location":"reference/release-history/#210-2021-07-02","title":"2.1.0 (2021-07-02)","text":"
            • d506456 Add .literal suffix to make all filenames representable
            • 0f8a0aa Add gopassRaw template function
            • 646f4f3 Add literal_ attribute to make more filenames representable
            • e872fa3 Add mozillaInstallHash template function
            • 7cac834 Add optional account arg to onepassword template functions
            • 79ad5fe Add passRaw template function
            • d84b0a7 Bump assets/chezmoi.io/themes/book from 4540d66 to e939f40
            • efc96d6 Tweak Go modules check

            Full changelog: v2.0.16...v2.1.0

            "},{"location":"reference/release-history/#2016-2021-06-27","title":"2.0.16 (2021-06-27)","text":"
            • 7b57397 Add --config-path option to init command
            • 12fbe0a Fix FreeBSD install instructions
            • 32d4a92 Improve documentation of chezmoi edit
            • 4100279 Include FreeBSD build in tests
            • c5cb349 Make osRelease and kernelInfo template vars available on all systems where present
            • 31a5fb7 Prioritize /etc/hosts over /etc/hostname for FQDN hostname
            • ef49f6a Tweak FAQ on chezmoi edit
            • a441236 Update dependencies
            • e9c2155 Update dependencies
            • 9bf5265 Update docs so that oh-my-zsh tarball goes to TMPDIR instead of HOME
            • af34a92 Update golangci-lint to v1.41.0

            Full changelog: v2.0.15...v2.0.16

            "},{"location":"reference/release-history/#2015-2021-06-17","title":"2.0.15 (2021-06-17)","text":"
            • d02e707 Update GoReleaser GitHub token

            Full changelog: v2.0.13...v2.0.15

            "},{"location":"reference/release-history/#2013-2021-05-27","title":"2.0.13 (2021-05-27)","text":"
            • fba2ec9 Add --ssh option to init command to guess SSH repo URLs
            • 6793811 Add .chezmoi.sourceFile template variable
            • 811fb19 Add age howto
            • 9efc082 Add findtypos check
            • 8b35f3d Add forgotten --include option to add command
            • a706029 Add how to for managing part of a file
            • 2b546b7 Add how to for using chezmoi with brew bundle
            • ca607a4 Add how to on running a script when another file's contents changes
            • 0342271 Add link to github.com/hussainweb/ansible-role-chezmoi
            • 56b3666 Add maximum width to docs output
            • 9fbaba1 Add more media links
            • 7839bfe Add re-add command
            • d8f8add Add test for template data in chezmoi init --apply
            • 7f8716a Add writeToStdout init template function
            • 5497b85 Bump age version to 1.0.0-rc.2 in tests
            • 918c2b7 Bump golangci-lint to v1.40.1
            • ca54fa3 Disable exhaustive linter
            • bfc32b2 Ensure that parent directory exists in import examples
            • c69e066 Fix security table of contents
            • a69d2ff Fix typos
            • bebdceb Fix typos and receiver names
            • 6c952eb Format code blocks in documentation
            • cdaa1d3 Improve code documentation
            • 3539609 Improve consistency
            • f0c11ce Improve consistency of reference documentation
            • 09c3530 Include Linux OS release name and version in doctor output, if available
            • 5023553 Make how to section on ignoring files easier to find
            • 5eb6def Move cmd package to internal/cmd
            • cf97df1 Move internal/cmd to internal/cmds
            • 320cb8d Move security policy into docs
            • 049d7e8 Move security policy into docs
            • 3ca09db Only create templates with chezmoi add --autotemplate if a replacement occurred
            • 98d9607 Reference .chezmoidata in template data documentation
            • 1c0e836 Remove stale FAQ entry
            • 802c6ca Remove stale docs on diff.format
            • df0ea51 Remove unnecessary SourceRelPaths type
            • ab16f1b Rename function argument for clarity
            • 883a5f0 Reword intro commands
            • c0a9fa4 Tidy up how to
            • 8eb212c Tidy up symlink documentation
            • 01c812b Tidy up tests
            • 009a796 Tweak documentation
            • 0e800ad Tweak examples and docs a little more
            • 35ea315 Update Go to 1.16.4
            • cce08bb Update Windows Subsystem for Linux detection how to
            • de341d2 Update dependencies
            • b33ca40 Update golangci-lint to 1.40.0
            • 2bededb Update link to path matching function
            • 034b8d3 Use io/fs package instead of os
            • 66fbcb6 Use neutral names in docs and tests
            • b6ab19e Use pager for docs and make pagers more configurable
            • 891e461 Use quote function instead of literal quotes in docs
            • 7526fa5 Use stringSets for known filenames
            • d858159 Use temporary files, instead of stdin/stdout, when calling gpg

            Full changelog: v2.0.12...v2.0.13

            "},{"location":"reference/release-history/#2012-2021-05-10","title":"2.0.12 (2021-05-10)","text":"
            • 1393e41 Add Architecture guide
            • 942d536 Add another method of detecting OS architecture for robustness
            • da611c9 Bump chezmoi.io/themes/book from 1e4bcc2 to 6200450
            • 3e562c5 Correct and template example in How To guide
            • 8bbf1b8 Don't atempt to use reverse DNS to determine FQDN hostname
            • ce2d86a Handle EINTR from syscall
            • f188ab5 Improve error message when persistent state is locked
            • 89d36ec Improve reliability of Powershell installer
            • 18cf1ef Increase verbosity of tests in CI
            • 06674ab Make chezmoi forget also remove entry from state
            • bc2a07c Move VIM tip from reference to how-to
            • aeb781e Remove debug code
            • 6eb89ab Remove unnecessary AbsPaths type
            • 155e53f Remove unnecessary RelPaths type
            • 361ce17 Remove unnecessary typecasts
            • f51fc68 Simplify EINTR handling
            • b3529bf Sort unexported variables after exported ones
            • fbf260f Suppress warnings in tests about git default branch name
            • 9ae0d58 Tidy up flag parsing and help output
            • bc48485 Update dependencies
            • 08336ad Update dependencies
            • 037a372 Update last written state when target and actual states are equivalent
            • 3c273d6 Update rpm zsh completion directory to match recent Fedora versions.
            • 3a06eb8 Use /etc/hostname to determine hostname, if available
            • 421d43b Use c.errorf instead of cmd.Printf
            • fb616d9 Validate generate config before writing it in init command

            Full changelog: v2.0.11...v2.0.12

            "},{"location":"reference/release-history/#2011-2021-04-26","title":"2.0.11 (2021-04-26)","text":"
            • dfd8145 Add Makefile targets for coverage
            • c2c5ff4 Add import --exclude option
            • 546070b Add related software documentation
            • 179cbfc Add wget one line install instructions
            • ba3c28d Bump Go version to 1.16.3 on Cirrus CI
            • 4a82d68 Do not follow symlinks if the file will be ignored anyway
            • 1a7d396 Explicitly document need for data in template action
            • 4ecd1db Extend include template function to handle absolute paths
            • 4503be6 Fix checksums.txt upload step
            • a7a8ae2 Fix panic when using diff --exclude
            • a19217f Fix typos in comments
            • 5d4f02c Fix typos in docs
            • 07127cf Fix typos in test comments
            • a48a9d8 Ignore whitespace errors in .vscode/settings.json
            • 173732f Improve parsing of auto bools
            • bdab05d Minor tidy-ups
            • b9dcd48 Tidy up path handling
            • 4c51578 Update dependencies
            • 91a2e9f Warn user when add command would remove encrypted, private, or template attribute
            • d2d96b0 Write prompts to stdout, even when --no-tty is specified
            • b1501ad fix typo

            Full changelog: v2.0.10...v2.0.11

            "},{"location":"reference/release-history/#2010-2021-04-15","title":"2.0.10 (2021-04-15)","text":"
            • 6a8855e Add add.templateSymlinks configuration variable
            • e1612f6 Add diff.exclude configuration variable
            • 9b7c35c Add editor config for PowerShell scripts
            • acfec8e Add infrastructure to read entry type sets from config
            • 1d42c99 Add init --data option
            • c3b8073 Add mitigation for when actual state does not match persistent state
            • e8229a9 Add state data, delete, get, and set subcommands
            • 4459193 Add test for re-adding file with and without --encrypt
            • 5331014 Add tests with different umask values
            • 5f47aaa Added --template-symlinks-home and --template-symlinks-source
            • 804e135 Consolidate symlink tests
            • 93c53da Document one-line chezmoi and dotfiles install
            • d41951f Don't assume that gpg is installed in tests
            • 992b923 Make --exclude option per command instead of global
            • b00710b Make --template-symlinks option a bool that checks source dir and home dir
            • 8322943 Make chezmoi init --one-shot also include --purge-binary
            • 38cb1d2 Only install glibc/musl-specific binaries when they are available
            • 3782e93 Re-enable passing test
            • e50575c Release both checksums.txt and chezmoi_${VERSION}_checksums.txt
            • 141a9b1 Replace --template-symlinks-home and --template-symlinks-source with --template-symlinks=value
            • 5920345 Revert to standard actions/cache
            • 2436c92 Store actual umasks in state file
            • 703be4e Tidy up table of configuration variables
            • 45f6429 Tweak documentation
            • 865c379 Update Go module version to match tag
            • 8090122 Update dependencies
            • c48de4c Update prefix documentation
            • 8755cb6 Use default checksums file in install scripts

            Full changelog: v2.0.9...v2.0.10

            "},{"location":"reference/release-history/#209-2021-04-04","title":"2.0.9 (2021-04-04)","text":"
            • 505ca6a Fix import command when destination already exists
            • d34a1b6 Update dependencies

            Full changelog: v2.0.8...v2.0.9

            "},{"location":"reference/release-history/#208-2021-04-03","title":"2.0.8 (2021-04-03)","text":"
            • 2cdbbd7 Add tests for symmetric GPG encryption
            • e444344 Build with Go 1.16.3
            • 6755586 Bump chezmoi.io/themes/book from 60dfd9a to 1e4bcc2
            • b6d33d9 Bump ludeeus/action-shellcheck from 1.0.0 to 1.1.0
            • 0c37c54 Fix absolute path check
            • 5e54964 Fix typo
            • b990f3d Fix typos
            • 7bce9fa Tidy up comparison doc
            • 040ef45 Update PowerShell install script to use checksums.txt
            • 351172f Update install script to use checksums.txt
            • 5976c07 fix: gpg symmetric passing wrong arguments

            Full changelog: v2.0.7...v2.0.8

            "},{"location":"reference/release-history/#207-2021-03-31","title":"2.0.7 (2021-03-31)","text":"
            • 1ce1944 Restore original checksums filename

            Full changelog: v2.0.6...v2.0.7

            "},{"location":"reference/release-history/#206-2021-03-30","title":"2.0.6 (2021-03-30)","text":"
            • de636f1 Add System.IdempotentCmdCombinedOutput
            • 2348d6a Check for libc version in upgrade command
            • 406cdc5 Rename variables for consistency
            • 58aac9b Restore build of non-libc-specific Linux archives
            • 75681a7 Use emojis in comparison

            Full changelog: v2.0.5...v2.0.6

            "},{"location":"reference/release-history/#205-2021-03-29","title":"2.0.5 (2021-03-29)","text":"
            • 1a2e4e9 Add -Force option to Move-Item command.
            • c1e5a8c Add darwin/arm64 to install script
            • 3e7bbde Add link to blog post
            • 5468d3d Add stdinIsATTY template function
            • 5135e06 Correct function name in documentation
            • 639adcf Fix issue in example for trying to use existing boolean vars first in How To section: First arg of get doesn't have to be in quotes.
            • c6271ad Improve install script error handling
            • d5e5afc Make .chezmoi.sourceDir template variable a string
            • 83a1b65 Make install script install glibc or musl libc version as appropriate
            • 382988d Only evaluate target states when needed
            • 03a3780 Reduce severity of doctor warning if gpg is not installed
            • b196247 Simplfy managed test
            • 67c57d5 Split large functions into smaller functions
            • f548ba3 Tidy up handling of script working directories
            • e996856 Tidy up make generate target
            • 30f1ab9 Unlock state when running editor or merge command
            • ff4bf5a Update dependencies
            • 0e824ff Update golangci-lint to 1.39.0
            • 731a622 Use the first existing parent directory for a script's working directory.

            Full changelog: v2.0.4...v2.0.5

            "},{"location":"reference/release-history/#204-2021-03-24","title":"2.0.4 (2021-03-24)","text":"
            • 6dca5aa Add age binary check to doctor command
            • 54ef893 Build libc-specific archives
            • 2eb70bf Fix noupgrade build tags
            • 1833b11 Make doctor command more friendly about missing binaries
            • ae2f0d2 Only update state if target was actually changed
            • b36175d Remove stale reference to go generate
            • f918459 Update howto to use main instead of master

            Full changelog: v2.0.3...v2.0.4

            "},{"location":"reference/release-history/#203-2021-03-22","title":"2.0.3 (2021-03-22)","text":"
            • 17e4976 Document empty_ for file target types
            • 0ee8476 Factor out GitHub client
            • bccd093 Fix editing of encrypted files in subdirectories
            • e35be17 Internal tidy-up
            • 237b3f5 Remove noembeddocs and nodocs build tags
            • 34782e1 Remove symlinks whose targets are empty
            • 20c63f1 Restore upgrade command

            Full changelog: v2.0.2...v2.0.3

            "},{"location":"reference/release-history/#202-2021-03-19","title":"2.0.2 (2021-03-19)","text":"
            • 8c66bbc Add new attributes to chattr reference documentation.
            • ded9ecc Add removeline test function
            • 700db6e Add tests for --exclude=encrypted option
            • 966d45a Connect stderr when invoking encryption tools
            • 058497e Detect encryption if group set in config file
            • 091028f Extend cat command to print scripts
            • 5e5f377 Improve encryption integration tests
            • 9bc28b7 Remove temporary version override

            Full changelog: v2.0.1...v2.0.2

            "},{"location":"reference/release-history/#201-2021-03-18","title":"2.0.1 (2021-03-18)","text":"
            • 0b8b5b0 Fix panic when displaying scripts in diffs
            • 2ba9aed Include scripts to be run in diffs by default
            • 316371f Use notepad.exe, not vi, as the default editor on Windows

            Full changelog: v2.0.0...v2.0.1

            "},{"location":"reference/release-history/#200-2021-03-17","title":"2.0.0 (2021-03-17)","text":"
            • ebdd6f4 Add chezmoi apply --source-path tests
            • 7caf314 Build with Go 1.16.2
            • 45f2ca4 Improve documentation of gitHubKeys template function
            • cb43820 Improve error messages from 1Password template functions
            • a665328 Initialize the keyring cache
            • e9022e5 Minor documentation fixes
            • 2ccc16a Only log when --debug is set
            • 784a08c Preserve homedir template variable for backwards compatibility
            • 09fb2cf Refresh github.com/actions/cache by changing key
            • a8eb3a9 Tidy up changes doc for v2
            • 6f459af Update FAQ for chezmoi v2
            • 4cbc07b Update comparison doc for v2
            • 1c68a53 Update dependencies
            • 08aff38 Update documentation and release process for v2 release
            • 9b6b8f1 Update quick start guide for chezmoi v2

            Full changelog: v1.8.11...v2.0.0

            "},{"location":"reference/release-history/#1811-2021-02-05","title":"1.8.11 (2021-02-05)","text":"

            Internal changes only

            Full changelog: v1.8.10...v1.8.11

            "},{"location":"reference/release-history/#1810-2020-12-20","title":"1.8.10 (2020-12-20)","text":"

            Internal changes only

            Full changelog: v1.8.9...v1.8.10

            "},{"location":"reference/release-history/#189-2020-11-20","title":"1.8.9 (2020-11-20)","text":"
            • 4fd06fa Merge pull request #936 from zb140/1password-cache-arg

            Full changelog: v1.8.8...v1.8.9

            "},{"location":"reference/release-history/#188-2020-10-31","title":"1.8.8 (2020-10-31)","text":"
            • 71e82db Merge pull request #924 from twpayne/templating-docs

            Full changelog: v1.8.7...v1.8.8

            "},{"location":"reference/release-history/#187-2020-10-10","title":"1.8.7 (2020-10-10)","text":"
            • 3b285d9 Fix release tests

            Full changelog: v1.8.6...v1.8.7

            "},{"location":"reference/release-history/#186-2020-09-28","title":"1.8.6 (2020-09-28)","text":"
            • cfa3fd2 Merge pull request #893 from twpayne/static-link-with-musl

            Full changelog: v1.8.5...v1.8.6

            "},{"location":"reference/release-history/#185-2020-08-22","title":"1.8.5 (2020-08-22)","text":"
            • c5dbedc Merge pull request #872 from twpayne/update-testscript

            Full changelog: v1.8.4...v1.8.5

            "},{"location":"reference/release-history/#184-2020-08-12","title":"1.8.4 (2020-08-12)","text":"
            • 99ef18b Merge pull request #834 from twpayne/codespaces

            Full changelog: v1.8.3...v1.8.4

            "},{"location":"reference/release-history/#183-2020-06-25","title":"1.8.3 (2020-06-25)","text":"
            • 6d2be34 Merge pull request #805 from twpayne/update-deps

            Full changelog: v1.8.2...v1.8.3

            "},{"location":"reference/release-history/#182-2020-06-09","title":"1.8.2 (2020-06-09)","text":"
            • 323cba5 Fix release job

            Full changelog: v1.8.1...v1.8.2

            "},{"location":"reference/release-history/#181-2020-05-06","title":"1.8.1 (2020-05-06)","text":"
            • 4def4f3 Fix typo
            • cbf8d4a Merge pull request #731 from twpayne/faq-tidy
            • d604fa5 Improve FAQ
            • b962e36 Merge pull request #729 from twpayne/strings-builder
            • 610701e Use strings.Builder instead of bytes.Buffer
            • 0bc0257 Merge pull request #728 from twpayne/execute-template-improvements
            • e3b3da1 Improve FAQ entry on managing files outside target directory
            • 11aad4d Add --output option to execute-template
            • d6b059c Merge pull request #724 from twpayne/octal-literals
            • 604dca2 Format octal literals consistently
            • b68bd53 Merge pull request #720 from twpayne/fix-git-diff-func-color
            • e16ebda Fix color of hunk context in git format diffs
            • 34fc1b5 Merge pull request #723 from twpayne/auto-escape-templates
            • 7d8c6d2 Auto escape template delimiters when --autotemplate is set
            • 36b1f44 Merge pull request #719 from twpayne/infrastructure-improvements
            • 0cee057 Merge pull request #718 from twpayne/howto-external-modified
            • e800dd0 Use Makefile for CI steps
            • 4e9e654 Separate out local imports
            • 09b38ce Improve how to for tracking externally modified files
            • 5752e26 Merge pull request #717 from twpayne/no-color
            • 519ec22 Update pull request template
            • 590c721 Add support for NO_COLOR environment variable
            • 70c4eda Merge pull request #714 from twpayne/improve-contributing
            • 30a2b81 Remove old linter suppressions
            • 57fbcb7 Make list of enabled linters explicit
            • ec44e08 Improve infrastructure for contributors
            • 3bad347 Add pull request template
            • 81bfc76 Merge pull request #715 from twpayne/fix-git-status-parser
            • 70e8e2c Enable autocommit and autopush for chattr command
            • 94c02a0 Fix git status parsing for renames
            • 175601e Merge pull request #709 from ihommani/master
            • 31c646d Merge pull request #698 from twpayne/color-git-diff
            • 810607c Add colored git diff support
            • 93c03e7 Make --color option accept boolean values
            • b640720 Merge pull request #712 from twpayne/generic-secret-string
            • 1e699ea Make secret template function return a string, not a []byte
            • c9081ac Merge pull request #710 from twpayne/gofumports-tidy
            • e458bed Compact type declarations
            • 6002344 Add images to illustrate chezmoi principles
            • 8b5b0f5 Merge pull request #687 from twpayne/golangci-lint-next
            • 9271f90 Merge pull request #707 from twpayne/no-dev-upgrade
            • f10697b Update golangci-lint to version 1.25.0
            • 1d7dc3d Don't attempt to upgrade dev versions without --force flag
            • 0796dd8 Merge pull request #704 from twpayne/doublestar-glob
            • ceb6307 Use doublestar for all globs
            • 9f0b03e Merge pull request #703 from twpayne/go-generate-completions
            • 0eb3917 Generate completions with go generate instead of make
            • 3ea95e5 Add --output option to completion
            • d256de8 Merge pull request #702 from twpayne/execute-template-init
            • cd42fb0 Add --init and --promptString options to execute-template
            • 1760187 Fix generated docs
            • dd7edf8 Merge pull request #697 from stephengroat/patch-1
            • 442c85d Merge pull request #699 from twpayne/gopass-version
            • f8bd952 Update gopass version detection
            • 124ab05 install from homebrew-core
            • d2d43e9 Merge pull request #695 from twpayne/umask-docs
            • f1cbbd6 Improve reference docs
            • 3e6700e Add more documentation on umask
            • 2d4f690 Merge pull request #689 from stephengroat/patch-1
            • bd72b50 Use goreleaser github action
            • e0c120c Merge pull request #693 from twpayne/doublestar
            • 67d5746 Use doublestar.PathMatch for path matching
            • fd29c6e Merge pull request #692 from twpayne/fix-media-page
            • fe13fc7 Fix media page

            Full changelog: v1.8.0...v1.8.1

            "},{"location":"reference/release-history/#180-2020-04-19","title":"1.8.0 (2020-04-19)","text":"
            • 017a83f Merge pull request #686 from twpayne/tidy-up-github-action
            • 91581ec Tidy up GitHub Actions
            • f642fb4 Merge pull request #685 from twpayne/media
            • 35cc601 Update README.md
            • 79b9ae0 Add media page
            • c02d8e3 Merge pull request #684 from twpayne/gpgrecipient-warning
            • 5e03393 Add warning when source version control system is not git
            • 56436ac Add warning when config file uses gpgRecipient
            • cc816d2 Merge pull request #679 from twpayne/fix-add-dir
            • 89dc01b Add how-to entry about creating empty directories
            • 8499f4d Create .keep files when adding directories non-recursively
            • aba694f Merge pull request #678 from twpayne/git-diff
            • cdb5a0a Add git diff format
            • ca9d8d9 Merge pull request #674 from twpayne/diff-pager
            • 14b1197 Add diff.pager config option
            • edc0d55 Merge pull request #675 from twpayne/autotemplate-implies-template
            • 5ba7692 Make --autotemplate imply --template
            • 0b56b08 Merge pull request #676 from twpayne/fix-snap-path
            • d2bb6fc Update path to goreleaser in GitHub action
            • c603bb3 Merge pull request #672 from twpayne/managed
            • 36bd3f4 Iterate on managed command
            • 1d2c1d1 Merge pull request #671 from twpayne/document-lowercasing
            • 08f2319 Document Viper's lowercasing of variable names
            • 709b141 Merge pull request #670 from twpayne/investigate-668
            • 854a931 Add test for adding empty directory without recursion
            • c1c19fb Merge pull request #669 from twpayne/upgrade-deps
            • 1489cac Upgrade dependencies
            • 987450b Merge pull request #665 from remigourdon/add-managed-command
            • 469ab7c Add managed command
            • f89a8c3 Merge pull request #667 from seberm/feature/add-gpg-command-into-config
            • 2fca0ae Add option to configure gpg command
            • ecb873b Remove stray debug code
            • 49fb084 List repos tagged with chezmoi by most recently updated first
            • 6675562 Merge pull request #658 from twpayne/update-readme
            • 8fc4d38 Update README.md
            • 76e7e03 Merge pull request #657 from twpayne/symlink-template
            • ba47581 Add separate config files how-to entry

            Full changelog: v1.7.19...v1.8.0

            "},{"location":"reference/release-history/#1719-2020-04-06","title":"1.7.19 (2020-04-06)","text":"
            • c4dd796 Merge pull request #656 from twpayne/non-hermetic-functions
            • 82f9922 Include non-hermetic text functions from Sprig
            • 8d538be Merge pull request #653 from twpayne/purge
            • e384392 Add purge command
            • e6b1424 Merge pull request #652 from twpayne/dont-compress-docs
            • 9e2879f Don't compress embedded assets
            • 1767ad7 Merge pull request #651 from twpayne/template-docs
            • 6914b1f Use TOML in reference manual example
            • 53f92d5 Improve template documentation
            • 4e46435 Merge pull request #649 from twpayne/fix-550
            • bcd0750 Fix behavior when adding an empty file without --empty
            • d6f80bb Merge pull request #647 from twpayne/umask
            • 42d04f7 Merge pull request #648 from twpayne/min-go-version
            • 9b2f286 Use umask when creating any file or directory
            • ca416df Ensure that chezmoi is built with Go version 1.13 or later
            • e607dc8 Merge pull request #646 from twpayne/fix-link
            • fced112 Fix link in quickstart guide

            Full changelog: v1.7.18...v1.7.19

            "},{"location":"reference/release-history/#1718-2020-03-29","title":"1.7.18 (2020-03-29)","text":"
            • 8284da7 Update contributing guide with new version embedding mechanism
            • 6ebf442 Merge pull request #644 from twpayne/fix-version
            • 1257ea8 Refactor version number embedding
            • f92a292 Bump golangci-lint to 1.24.0
            • 2db0aad Update chezmoi.io home page to match README.md
            • b1a341b Merge pull request #641 from ihommani/639_enhancement_documentation
            • f9ad39a [639_enhancement] Fix features part documentation
            • 453d152 Merge pull request #640 from twpayne/trim-space
            • bd78980 Strip leading and trailing space from values read from user
            • 96e0dea Merge pull request #635 from ptxmac/windows-trim
            • fe98dde Revert \"Only run CI on pushes\"
            • 7985de8 Regenerate documentation
            • da30f18 Merge pull request #638 from nawordar/patch-1
            • b90fc91 Change . to dot_ in symlink template example
            • 568fb50 Improve windows support by removing carriage return from prompts

            Full changelog: v1.7.17...v1.7.18

            "},{"location":"reference/release-history/#1717-2020-03-21","title":"1.7.17 (2020-03-21)","text":"
            • db03a2b Merge pull request #634 from twpayne/ignore-lookupgroupid-errors
            • d22a3cf Only set group value if user.LookupGroupId succeeds
            • d0ab459 Merge pull request #633 from twpayne/allow-kernel-fail
            • 74297e8 Make reading /proc/sys/kernel more tolerant of errors
            • d289303 Merge pull request #631 from twpayne/update-dependencies
            • f671329 Update dependencies
            • 208de3a Merge pull request #630 from twpayne/template-options
            • 4926a16 Add option to set template options
            • a75a1f7 Switch to functional options for TargetState
            • 21f46e0 Merge pull request #629 from twpayne/execute-template
            • b047430 Add execute-template command
            • 79d7ddf Export TargetState.ExecuteTemplateData
            • 771e4e7 Merge pull request #626 from twpayne/editor-with-args
            • d65ec45 Allow EDITOR and VISUAL to include arguments
            • 733b547 Merge pull request #624 from twpayne/add-thanks-faq
            • a4e76f3 Add thanks FAQ entry
            • 298c27f Merge pull request #623 from twpayne/mark-auto-commit-stable
            • 6d450c1 Mark autoCommit and autoPush as stable
            • cda7249 Merge pull request #622 from twpayne/document-ignore
            • e3caa96 Improve documentation of .chezmoiignore
            • efddb59 Only run CI on pushes
            • ae4bbc9 Merge pull request #620 from twpayne/refresh-readme
            • 07fb826 Refresh documentation
            • ec3b896 Merge pull request #618 from twpayne/go-1.14
            • ea3d8d2 Add freebsd/arm64 and openbsd/arm64 builds
            • 098c28c Build with Go 1.14
            • e05e396 Bump golangci-lint version to 1.23.8

            Full changelog: v1.7.16...v1.7.17

            "},{"location":"reference/release-history/#1716-2020-03-04","title":"1.7.16 (2020-03-04)","text":"
            • ce06ed9 Merge pull request #617 from twpayne/fix-commit-message-template-path
            • eb0129f Fix path to commit message template asset
            • b03639b Tidy up link fixes
            • 37c54ae Add missing punctuation
            • 509b93a Merge pull request #616 from twpayne/fix-chezmoi.io-links
            • 37d35c8 Fix links on chezmoi.io

            Full changelog: v1.7.15...v1.7.16

            "},{"location":"reference/release-history/#1715-2020-02-26","title":"1.7.15 (2020-02-26)","text":"
            • a7b5607 Merge pull request #612 from twpayne/revert-assets
            • 1403b64 Revert \"Move completions into assets directory\"

            Full changelog: v1.7.14...v1.7.15

            "},{"location":"reference/release-history/#1714-2020-02-25","title":"1.7.14 (2020-02-25)","text":"
            • 559da47 Tidy up release process
            • 9f8b2b6 Merge pull request #610 from twpayne/bump-dependencies
            • 0d429c8 Bump dependencies
            • 7192a91 Revert \"Move cmd into internal directory\"
            • 106aef2 Merge pull request #609 from twpayne/misc-fixes
            • 2d466db Move scripts into assets directory
            • 5317fe6 Move cmd into internal directory
            • b34673d Move completions into assets directory
            • 40d92cc Move templates into assets directory
            • c74392a Move images into assets directory
            • 4fc9f6b Tighten up return type
            • d3ff731 Merge pull request #608 from twpayne/lastpass-raw
            • c39b714 Add lastpassRaw template function
            • ff00fed Fix documentation for lastpass note parsing
            • 2c3f7e2 Merge pull request #606 from twpayne/improve-docs
            • 2fbaf35 Improve docs
            • 0cd7bdc Merge pull request #605 from twpayne/strip-symlink-template-whitespace
            • 49ba065 Improve template documentation
            • 251f698 Trim whitespace from evaluated symlink templates
            • 948f293 Merge pull request #603 from twpayne/renable-snap-bash-completion
            • 8840ecf Revert \"Temporarily disable bash completion in snaps\"
            • a9e7cb7 Switch from godoc.org to pkg.go.dev
            • 0b2decb Merge pull request #602 from twpayne/doc-cleanups
            • 27790db Use cobra.Command.Printf instead of Config.warn
            • da9d72a Add custom help command
            • d847c8f Make short helps more consistent
            • 3259503 Fix more typos and clean up docs
            • 3114a51 Fix typo
            • 08cabca Merge pull request #597 from twpayne/cd-command-config
            • 6114041 Add cd.command configuration variable
            • 34c402b Merge pull request #600 from MunifTanjim/docs/fix-reference-sourceDir-default-value
            • 62c9d45 Fix sourceDir default value in docs
            • b7b8e1e Tidy up issue templates

            Full changelog: v1.7.13...v1.7.14

            "},{"location":"reference/release-history/#1713-2020-02-13","title":"1.7.13 (2020-02-13)","text":"
            • ed3584c Temporarily disable bash completion in snaps
            • c11e4c9 Merge pull request #595 from twpayne/fix-594
            • 23bda0a Include relative path in template name
            • 37096b0 Merge pull request #592 from twpayne/update-toml
            • 5d20cbf Use github.com/pelletier/go-toml to handle TOML
            • 1624695 Merge pull request #591 from twpayne/functional-config-options
            • cd49a3f Use standard directories in all tests
            • dc82787 Make tests more verbose by default
            • 1b50624 Simplify I/O handling in Config
            • 4610fec Use newTestConfig function in tests
            • 8bea1b2 Add newTestConfig function
            • c475c5e Use functional options to construct Configs
            • 552151d Don't include destination directory in dump output
            • 5e8b893 Merge pull request #590 from twpayne/template-funcs-in-config-template
            • 8771b2d Make all template functions available in config file template
            • 0d8ddd6 Merge pull request #588 from twpayne/misc-fixes
            • c62befa Bump golangci-lint to v1.23.3
            • de3d05b Check more errors
            • b3dfbea Use more specific receiver
            • 64a30b2 Avoid unnecessary calls to Stat before MkdirAll
            • a65f193 Use Config.warn consistently
            • 3e2fd5b Merge pull request #587 from twpayne/format-assets
            • 02ae747 Compress assets as much as possible
            • 840d00e Wrap generated code at 80 columns
            • 7ac364b Tidy up contributing docs
            • 61a5942 Merge pull request #586 from twpayne/remove-empty-symlinks
            • a13cff2 If a symlink is empty, remove the target
            • c39c254 Merge pull request #584 from twpayne/no-large-diffs
            • bde4d3e Don't print diffs if file is larger than 1MB
            • ecfba0e Merge pull request #582 from twpayne/use-issue-templates
            • f03e442 Link to issue templates in documentation
            • 17ceb5f When looking for an entry, return an error if it does not exist (#581)
            • a5785d3 When looking for an entry, return an error if it does not exist
            • 5099fed Merge pull request #579 from twpayne/upgrade-checksum
            • 7b6fa02 Fix upgrade checksum filename

            Full changelog: v1.7.12...v1.7.13

            "},{"location":"reference/release-history/#1712-2020-01-24","title":"1.7.12 (2020-01-24)","text":"
            • bed22fc Rename internal command for consistency (#576)
            • ac77728 Simplify code generation
            • 395b450 Rename internal command for consistency
            • e938d4c Remove debug code
            • 52e49ad Improve packaging of assets (#575)
            • 7c6d8e7 Improve install-tools target
            • ca61c8d Improve packaging of assets
            • 92deba6 Update dependencies (#571)
            • c8f7305 Update dependencies
            • fe7728e Merge pull request #569 from twpayne/linux-install
            • c9df290 Add NixOS Linux install instructions
            • 1d1230d Update Alpine Linux install instructions
            • 888736a Add note about installation instructions to contributing guide
            • ae3666b Merge pull request #568 from twpayne/issue-templates
            • 0659f65 Tidy up issue template markdown
            • e536db5 Merge pull request #567 from twpayne/support-request
            • 0782706 Add support request issue template
            • 7b5f645 Merge pull request #565 from twpayne/fix-install.sh
            • 699d0b5 Remove no-longer-correct action to build install.sh
            • c882899 Restore default arm builds
            • ddde88b Merge pull request #563 from ndt/patch-1
            • 31d9a40 Update install.sh
            • 185e2c9 Merge pull request #562 from twpayne/commit-faq
            • b5cfe03 Add FAQ entry on committing changes
            • 65694b2 Update tables of contents
            • 48c0d31 Merge pull request #560 from twpayne/source-alias
            • 4ab59df Add hg command
            • c8010c2 Add git command
            • f30445b Document aliases
            • 372c392 Merge pull request #559 from twpayne/zsh-completions
            • 9795d04 Add zsh completions for positional arguments
            • 2d5a384 Fix missing Oxford comma
            • f9bd8bb Don't compute full target state in data command (#557)
            • 1b630ce Don't compute full target state in data command
            • f563a08 Merge pull request #556 from twpayne/windows-colors
            • 6cec157 Enable virtual terminal processing on Windows
            • 0b3aa77 Use golang.org/x/crypto/ssh/terminal instead of github.com/mattn/go-isatty

            Full changelog: v1.7.11...v1.7.12

            "},{"location":"reference/release-history/#1711-2020-01-09","title":"1.7.11 (2020-01-09)","text":"
            • acf3478 Merge pull request #553 from twpayne/keepassxc-show-protected
            • ff4f8d9 Pass --show-protected to keepassxc-cli version 2.5.2 or later
            • 3788d1b Merge pull request #549 from twpayne/improve-template-docs
            • 16e1fa9 Validate variable names in config data
            • 73d2aa7 Improve template how-to
            • cf6b4a7 Merge pull request #543 from twpayne/release-improvements
            • 87881f2 Consolidate GitHub Actions
            • 92ce3c4 Add arm7 builds
            • 1f01859 Tidy up goreleaser config
            • 4be8957 Bump golangci-lint to version 1.22.2
            • 3e733b1 Merge pull request #547 from twpayne/update-glamour
            • 128c291 Use Glamour's ASCII style for rendering docs
            • 3df4931 Fix use of autotemplate in how-to doc (#546)
            • ac494ee Fix use of autotemplate in how-to doc
            • acdd04d Use more reliable install-from-source method (#541)
            • f6fb2dc Use more reliable install-from-source method
            • 73d325e Render docs with github.com/charmbracelet/glamour (#537)
            • 0d2c73d Render long help and docs with github.com/charmbracelet/glamour
            • ea4b6c4 Fix autotemplate docs

            Full changelog: v1.7.10...v1.7.11

            "},{"location":"reference/release-history/#1710-2019-12-27","title":"1.7.10 (2019-12-27)","text":"
            • 74f6b5b Added kernel information to data
            • d318b14 Consolidate data source files
            • b603f77 Don't automatically assign bug label in bug report template
            • 4f65240 Only set osRelease on Linux
            • a402f9e Remove stale entry from .gitignore
            • e271597 Treat adding an empty file without --empty as remove
            • a698afe Treat adding an empty file without --empty as remove (#536)
            • db2e446 Trigger CI on pull requests
            • 6559538 Tweak markdown to avoid Hugo bug
            • b4f0cbc Update homepage in snaps and brews
            • b10aa9f Use standard source directory in tests
            • 14a9c3b typo

            Full changelog: v1.7.9...v1.7.10

            "},{"location":"reference/release-history/#179-2019-12-20","title":"1.7.9 (2019-12-20)","text":"
            • 8908b55 Do not print idempotent commands in verbose mode
            • a1caca6 Don't add files if template would be overwritten
            • 91e562a Don't quote shell args just because of equals signs
            • 2992fce Don't quote shell args just because of equals signs (#515)
            • 8cea741 Improve contributing docs
            • 5b488de Improve contributing docs (#516)
            • 2a164f9 Iterate on GitHub Actions
            • 90c506b Iterate on infrastructure (#524)
            • 5d16890 Preserve but don't enforce private on Windows
            • d58df90 Quote command args in debug mode
            • 035e416 Reformat tables of content with latest Markdown plugin
            • 61611b5 Simplify generated help template
            • ac4f8d0 Update Alpine Linux install instructions
            • 7d84ccf Update Alpine Linux install instructions (#514)
            • ddd0b62 Update all dependencies
            • e349fef Update all dependencies (#520)
            • 5f6943c Update install.sh
            • d6970d1 Update issue templates
            • 8825d44 Use go/format instead of gofmt
            • 7a41df2 Use go:generate more idiomatically
            • 6a9256a Use more specific command for generating help

            Full changelog: v1.7.8...v1.7.9

            "},{"location":"reference/release-history/#178-2019-12-13","title":"1.7.8 (2019-12-13)","text":"
            • d106ef6 Include generate step in release builds

            Full changelog: v1.7.7...v1.7.8

            "},{"location":"reference/release-history/#177-2019-12-10","title":"1.7.7 (2019-12-10)","text":"
            • de86467 Use GORELEASER_GITHUB_TOKEN for releases

            Full changelog: v1.7.6...v1.7.7

            "},{"location":"reference/release-history/#176-2019-12-10","title":"1.7.6 (2019-12-10)","text":"
            • e74485f Add Alpine Linux installation instructions
            • cd50d7b Add ShellQuoteArgs
            • 954b51a Add contributing guide for documentation changes
            • ce5d509 Add link to Windows binaries and GitHub releases page
            • f93c255 Add updating chezmoi.io to contributing docs
            • a0e061a Correct use of setup
            • 123fb2a Enable dupl linter
            • 1db6960 Export MaybeShellQuote
            • e20f00a Fix website automation for when gh-pages branch does not exist
            • f1b4221 Fixed a type in completion example
            • d3c75da Fixed a type in completion example (#508)
            • 5a687a2 Improve documentation (#509)
            • fa8e001 Improve install docs (#506)
            • a23c640 Improve template errors (#504)
            • 34b3fb2 Indent all YAML files consistently
            • ff7dd1b Miscellaneous fixes (#505)
            • c5d9ce0 Omit unknown components from --version output
            • a5321f6 Prepare docs for next release
            • addb0cb Prepare docs for next release (#511)
            • cf457c4 Quote command arguments if needed in template error messages
            • a4c459e Release future Windows binaries in zip archives
            • bcebd2f Set GITHUB_TOKEN for releases
            • 993f87d Switch to GitHub Actions
            • 91e32c3 Switch to GitHub Actions (#494)
            • de4e40b Tidy up package install table
            • eaf7294 Update argument name for consistency with docs
            • d4e1c1b Warn when skipping add of ignored files
            • 4403954 Warn when skipping add of ignored files (#510)

            Full changelog: v1.7.5...v1.7.6

            "},{"location":"reference/release-history/#175-2019-12-02","title":"1.7.5 (2019-12-02)","text":"
            • 243ccc1 Add onepasswordDocument template function
            • 55ecebe Add onepasswordDocument template function (#503)
            • ebe4695 Use more robust shell quoting algorithm

            Full changelog: v1.7.4...v1.7.5

            "},{"location":"reference/release-history/#174-2019-12-01","title":"1.7.4 (2019-12-01)","text":"
            • 13398a8 Add runtime.GOOS and runtime.GOARCH to doctor check
            • 97258b3 Add runtime.GOOS and runtime.GOARCH to doctor check (#498)
            • 770d34e Avoid duplicated first arg in verbose mode
            • 51ca763 Drop coveralls
            • daf6a0e Drop coveralls (#497)
            • 5f98352 Fix links on chezmoi.io
            • 5966624 Fix links on chezmoi.io (#499)
            • fce5ec0 Use go-shell with 32-bit support
            • 2246c5d Use go-shell with 32-bit support (#500)

            Full changelog: v1.7.3...v1.7.4

            "},{"location":"reference/release-history/#173-2019-11-23","title":"1.7.3 (2019-11-23)","text":"
            • 47bb3ce Add --debug flag
            • 4122f12 Add DebugMutator
            • 40fb730 Add FAQ entry on running a command when a file changes
            • 953879e Add FAQ entry on running a command when a file changes (#469)
            • 7d52ca8 Add IdempotentCmdOutput and RunCmd to Mutator
            • 413c8ec Add book theme
            • 948f479 Add content doc dependency on generator
            • 9ea31ce Add debug code (#478)
            • 387cffa Add how to handle externally modified config files
            • 1b655f9 Add how to handle externally modified config files (#487)
            • 1e020e2 Add how to import Oh My Zsh documentation
            • f40fb42 Add how to import Oh My Zsh documentation (#480)
            • 3468c22 Add initial www.chezmoi.io
            • 680cbae Add initial www.chezmoi.io content
            • 616c63a Add smoketest target as default
            • ee0e99b Add sourceDir to default template data
            • 7acba23 Add sourceDir to default template data (#485)
            • add120d Add www.chezmoi.io automation
            • 89e2713 Add www.chezmoi.io website (#471)
            • 7ceb1a9 Build improvements (#488)
            • 011b72c Bump golangci-lint to version 1.21.0
            • 574e74e Clarify Go modules requirement in docs
            • 97987b6 Clarify upgrade command
            • 5dedfdf Disable flaky tests on Windows
            • a362775 Disable flaky tests on Windows (#491)
            • 496c985 Document --debug flag
            • df35378 Don't include tables of contents on chezmoi.io
            • eccc569 Fix debug logging
            • e38d210 Fix debug logging (#482)
            • 9cfd78d Fix grammar and receiver name
            • 4d678ce Fix links on chezmoi.io (#493)
            • 8d0a21e Fix logging (#481)
            • c6af790 Fix logging with --debug and --verbose flags
            • ddac85f Fix typo i make every day, and therefore see everywhere.
            • 7a5c063 Fix typo i make every day, and therefore see everywhere. (#466)
            • 6329176 Improve install docs
            • 51946fa Improve onepassword documentation
            • fde5551 Improve onepassword documentation (#476)
            • 5db37d9 Move fs and mutator into config
            • c5cfcea Only create source parent directory if it does not exist
            • 0840ede Only create source parent directory if it does not exist (#484)
            • 84350bf Quote arguments in verbose mode if necessary
            • 4b04b24 Quote arguments in verbose mode if necessary (#486)
            • f111abd Refactor GitHub Actions
            • 8473c3f Refactor GitHub Actions (#465)
            • df05dff Rename LoggingMutator to VerboseMutator
            • 32359e3 Update modules
            • b286352 Update modules (#470)
            • 05bd6e2 Update reference manual table of contents
            • 07ecbef Use IdempotentCmdOutput in template functions
            • cc9ee40 Use consistent receiver name
            • 62fcb3a Use go vet in golangci-lint
            • 3167f57 Use https://chezmoi.io/ as base URL
            • 7469b97 Use https://chezmoi.io/ as base URL (#473)
            • 0e62d4d Use run instead of exec

            Full changelog: v1.7.2...v1.7.3

            "},{"location":"reference/release-history/#172-2019-10-17","title":"1.7.2 (2019-10-17)","text":"
            • 2445864 Add autocommit and autopush
            • 41c4fdc Add autocommit and autopush (#432)
            • a7bc3b7 Add git status parser
            • f1f9391 Add lines function
            • 963985f Add shell check to doctor command
            • 5033a31 Bump golangci-lint to version 1.20.0
            • 066c9a5 Update dependencies to latest versions

            Full changelog: v1.7.1...v1.7.2

            "},{"location":"reference/release-history/#171-2019-10-13","title":"1.7.1 (2019-10-13)","text":"
            • 88b48f4 Disable source state private check on Windows
            • 0f7bda1 Disable source state private check on Windows (#456)
            • f425bc6 Use Go 1.13's wrapped errors
            • 688bc14 Use Go 1.13's wrapped errors (#453)

            Full changelog: v1.7.0...v1.7.1

            "},{"location":"reference/release-history/#170-2019-10-10","title":"1.7.0 (2019-10-10)","text":"
            • f2cd6e9 Add FAQ entry on source/target filename bijection
            • 2d7d593 Add FAQ entry on source/target filename bijection (#442)
            • 9c67b56 Add GitHub Actions
            • 90d5323 Add gopass support
            • 5fda365 Add gopass.command reference
            • fd38084 Allow persistent state to be opened in read-only mode
            • 9e2ceb7 Don't export internal package
            • a90b01f Fix line-ending-dependent tests on Windows
            • 37ac582 Fix symlink test on Windows
            • 1929a0f Improve detection of the user's shell
            • fd991e7 Improve detection of the user's shell (#446)
            • b5b46db Only lock persistent state when writes are needed (#441)
            • ce09d0d Only open persistent state in read-write mode if needed
            • 3924950 Remove stray debug code
            • 7939fd6 Switch to github.com/pkg/diff
            • 8835998 Unify and improve GitHub workflows
            • c79de4c Unify and improve GitHub workflows (#450)
            • ec449db Update contributing docs
            • a1c7969 Update github.com/twpayne/go-acl to use latest version of golang.org/x/sys
            • 4255f83 Update install.sh from latest godownloader
            • f51a1ce Update install.sh from latest godownloader (#452)
            • f17d668 Update table of contents
            • 681116a Use gpg.recipient in docs, instead of deprecated gpgRecipient
            • eca92ce Use latest golangci-lint release
            • f6a0cd2 Use latest version of github.com/Masterminds/sprig

            Full changelog: v1.6.5...v1.7.0

            "},{"location":"reference/release-history/#165-2019-09-20","title":"1.6.5 (2019-09-20)","text":"
            • 3733485 Add nodocs and noembeddocs build tags (#431)
            • ad21e43 Add nodocs build tag
            • dbe4b67 Add noembeddocs build tag

            Full changelog: v1.6.4...v1.6.5

            "},{"location":"reference/release-history/#164-2019-09-19","title":"1.6.4 (2019-09-19)","text":"
            • e1410ab Make --follow a global option
            • 5212eb3 Make --follow a global option (#430)

            Full changelog: v1.6.3...v1.6.4

            "},{"location":"reference/release-history/#163-2019-09-17","title":"1.6.3 (2019-09-17)","text":"
            • 034ba74 Add Scoop support
            • 9fa8675 Add Scoop support (#429)
            • 850dd8c Execute templates after editing
            • c4190f5 Execute templates after editing (#428)
            • fd24e09 Pin golangci-lint to version 1.18.0
            • 1335bef Pin golangci-lint to version 1.18.0 (#426)

            Full changelog: v1.6.2...v1.6.3

            "},{"location":"reference/release-history/#162-2019-09-10","title":"1.6.2 (2019-09-10)","text":"
            • c29d46c Add Windows build test on Travis
            • 085c025 Add config file template test
            • 8144046 Add init test
            • 283d98e Add init test (#419)
            • 4203598 Add keepassxcAttribute template function
            • 6ccd08c Add keepassxcAttribute template function (#418)
            • d628770 Build with Go 1.13
            • 97dac6f Disable funlen linter
            • 5056d8a Disable funlen linter (#420)
            • e5d4962 Ignore chezmoi.exe
            • 9c02816 Ignore chezmoi.exe (#421)
            • 95759d7 Improve README.md
            • 1dea364 Improve README.md (#407)
            • a08bb5a Re-generate tables of contents
            • 2b5ec69 Remove stray double quote
            • 8ae43e6 Thread fs to exec
            • 1656bf6 Tidy up tables
            • ef1229e Tidy up tables and table of contents (#414)
            • 78dda03 Updated install script to be in line with shlib/uname_os.sh
            • 44e4a24 Use an interface to abstract VCSes

            Full changelog: v1.6.1...v1.6.2

            "},{"location":"reference/release-history/#161-2019-08-11","title":"1.6.1 (2019-08-11)","text":"
            • 140201c Add preview update doc (#391)
            • c157439 Add preview update to HOWTO.md
            • 4c3f2e9 Add \u2018Bug Report\u2019 Issue Template
            • d918f7e Disable autotemplate by default
            • 716bd09 Document PrivacyStater
            • 1792d38 Document PrivacyStater (#402)
            • 7d513f3 Don't run scripts in diff mode
            • 1e70622 Factor out common struct
            • aab0d2c Fix 397 (#405)
            • 76a691e Remove AppVeyor
            • a947359 Remove AppVeyor (#403)
            • 327a26d Update tables of contents with latest VSCode Markdown helper

            Full changelog: v1.6.0...v1.6.1

            "},{"location":"reference/release-history/#160-2019-07-08","title":"1.6.0 (2019-07-08)","text":"
            • b989fa6 Add AppVeyor CI for Windows
            • b32874c Add AppVeyor CI for Windows (#385)
            • 00c05f3 Add CI for OS X
            • 1c7c29e Add Windows release (#390)
            • 8539a1d Add bash completion in snap package (#362)
            • d64fbb1 Add bash completion to snap package
            • f88c88a Add some more template dir tests
            • f007172 Build releases for Windows
            • 835ab33 Disable upgrade command on Windows
            • 1be0691 Don't use github.com/google/renameio on Windows
            • 533b454 Fix IsPrivate
            • 77b8641 Fix IsPrivate (#386)
            • f276df1 Fix Windows IsPrivate to check explicit file permissions instead of effective permissions.
            • 4953b05 Fix execution with partial templates
            • 8e29647 Fix execution with partial templates (#388)
            • 612d56e Fix test filenames
            • 47313ac Fix whitespace in build tags
            • cbfea11 Improve Windows support (#381)
            • 6cbde10 No upgrade on windows (#378)
            • c46bed5 Re-enable the add --recursive tests on Windows
            • 131ed26 Skip add --recursive tests on Windows
            • 6cdf740 Tidy up comments
            • 4b38c75 Update dependencies
            • f6ed345 Update go.mod
            • 2800d6a Use fork of github.com/hectane/go-acl while waiting for upstream to merge
            • 8c81e98 Use latest github.com/twpayne/go-vfs
            • b42b08f Use latest github.com/twpayne/go-vfs
            • c6b5ebd Use latest github.com/twpayne/go-vfs (#380)
            • bff3e1e Use latest modules for Windows support (#377)

            Full changelog: v1.5.10...v1.6.0

            "},{"location":"reference/release-history/#1510-2019-06-29","title":"1.5.10 (2019-06-29)","text":"
            • 8f2f3e0 Add all logo images
            • ca11320 Add all logo images (#372)
            • bfa0198 Add docs command
            • f776ef5 Add docs command (#374)
            • 514bd77 Document where one line install script will install binary
            • 6323f53 Don't execute templates when editing source state
            • 355f650 Don't execute templates when editing source state (#370)
            • fa1d828 Fix issue 336 comments (#368)
            • 9301869 Fix template error messages (#371)
            • 0ea0cca Make remove command prompt by default
            • a2fc377 Make remove command prompt by default (#375)
            • abaabcb Open source directory with editor when edit is run with no arguments
            • 7f1d926 Remove go mod tidy test from CI
            • c711405 Use goreleaser's fine-grained control for releases
            • 542a132 Use goreleaser's fine-grained control for releases (#376)
            • 89ed284 Use text/template's error reporting mechanism

            Full changelog: v1.5.9...v1.5.10

            "},{"location":"reference/release-history/#159-2019-06-24","title":"1.5.9 (2019-06-24)","text":"
            • 79e568d Add Linuxbrew to install doc
            • 01eaf98 Add Linuxbrew to install doc (#365)
            • 0a74170 Document script shebangs and executable bits
            • f6a8d97 Initialize persistent state even when no config file exists
            • 909c6ac Initialize persistent state even when no config file exists (#367)

            Full changelog: v1.5.8...v1.5.9

            "},{"location":"reference/release-history/#158-2019-06-22","title":"1.5.8 (2019-06-22)","text":"
            • c829084 Fix unterminated string
            • 5baa07a Fix unterminated string
            • 1440388 Fix unterminated string (#364)

            Full changelog: v1.5.7...v1.5.8

            "},{"location":"reference/release-history/#157-2019-06-22","title":"1.5.7 (2019-06-22)","text":"
            • 008513f Add --follow option to add command
            • 4906a84 Add bash and fish completions to deb and rpm packages
            • 3805756 Add common templates
            • 822ed49 Add doctor binary check
            • 76f0952 Add issue 353 test
            • 78b908d Add logo to README.md
            • dc31e18 Add logo to README.md (#350)
            • 6fdcc6e Add missing -f
            • 15187ed Add note about completions
            • 5bdbde1 Add note about including version numbers
            • 4db775f Add remove functionality
            • fe8bfc1 Add shell completions
            • a199a64 Add square logo
            • 1817afd Add support for Arch Linux to upgrade command
            • 18ae3c4 Add support for gpg symmetric encryption
            • 25feb88 Add symmetric encryption (#333)
            • 9ed9fd0 Add test for issue #353
            • 2ff163b Clean up whitespace
            • cdfb0c6 Connect gpg to terminal for encryption and decryption
            • 9215412 Correct capitalization of GitHub
            • 4586dfb Correct capitalization of GitHub (#334)
            • 58a7446 Correct order of arguments
            • c91bc9d Document that fish completion exists in REFERENCE.md
            • 5603bef Document that fish completion exists in REFERENCE.md (#346)
            • ea294a3 Documentation cleanups (#358)
            • e90a576 Exec new version after upgrade
            • 36ff00e Exec new version after upgrade (#335)
            • 1e9ba2f Factor out GPG
            • dc52690 Factor out getVersionFromOutput
            • 7a50dd7 Factor out gpgBinaryCheck
            • 6c4353c Fix arch install command
            • be10fe9 Fix formatting
            • d7af42c Fix typos
            • 96f0847 Fix typos (#337)
            • 64d52b4 Ignore downloaded binaries
            • 938185b Improve quick start guide
            • 2983fc8 Improve quick start guide (#359)
            • eb861e7 Improve secret management explanation
            • df82247 Improve section title
            • 483fe60 Improve use of ReadOnlyFS
            • b815ed3 Improve use of goreleaser (#349)
            • 4174a0b Include completions in archives
            • 6c00d56 Install completions (#343)
            • 5a60e95 Install golangci-lint with goreleaser
            • 89ecc76 Install improvements (#351)
            • 119cae6 Install package binaries in /usr/bin, not /usr/local/bin
            • 39fc02f Install shell completions in homebrew
            • 794a1a1 Install zsh completions
            • f1372a4 Install zsh completions (#361)
            • e498d91 Logo
            • 9c9f5ef Make default data available in config file templates
            • 136d229 Pass through stderr output from secret commands
            • 884747e Pass through stderr output from secret commands (#338)
            • e7324df Re-enable update-install.sh target
            • 6a16044 Refactor apply tests
            • 5ac2f33 Refresh install guide
            • b9baa5e Relax gpg version check regexp
            • 8467697 Remove stale sentence
            • 47d2b78 Remove unused tool
            • 508d459 Rename completion files
            • e3814f2 Rename logo files
            • fc84b92 Run apply multiple times to check for idempotency
            • d45c23d Update brews in goreleaser config
            • 8759d79 Update go-github to v26
            • 297567d Update goreleaser configuration
            • a319f04 Update install.sh from goreleaser
            • 8c614a6 Update tables of contents
            • 8e92a90 Update tables of contents
            • 8b91858 Upload Logo (#348)
            • 6ecbff8 Use consistent email in tests
            • 957535f Use consistent path to state database in tests
            • a590114 Use consistent values in tests (#360)
            • d37888f Use tagged version of bolt
            • 6eb98eb chezmoi is now available in official Arch repository
            • 78f646b upload

            Full changelog: v1.5.6...v1.5.7

            "},{"location":"reference/release-history/#156-2019-06-06","title":"1.5.6 (2019-06-06)","text":"
            • 02b902d Add GitHub Release badge
            • 2566544 Add doctor version check
            • d17f54f Add doctor version check (#318)
            • e3b79bb Add fish completion support
            • a4aaed0 Add fish completion support (#320)
            • e40b797 Add fish to completion command description
            • f01f715 Add golangci-lint configuration
            • e34b215 Add install-tools target
            • f2cf3b8 Disable warning about computed URL
            • fa33f40 Don't use a singleton NullMutator instance
            • e2edc9e Don't use references to range-scoped variables
            • 1abbee1 Explain how to customise the merge tool
            • e7576f4 Improve documentation
            • ae968e3 Make script state bucket a parameter, not a global
            • 23c0169 Mark snap releases as stable
            • 36bbdcd Mark snap releases as stable (#317)
            • fd8a72e Remove Go Report Card badge
            • 802b3b1 Remove pre-release-checks target
            • f4c9963 Resolve all lint problems and enable more linters (#310)
            • f7ca727 Update badges (#311)
            • a324c18 Update contribution docs
            • de73d1b Update contribution docs (#309)
            • dac85d2 Update go.mod
            • 3073691 Update snap install instructions with beta channel
            • b006026 Update snap install instructions with beta channel (#307)
            • 1b047e6 Use latest go-difflib with improved colors
            • 377bed9 Use latest go-difflib with improved colors (#328)
            • 24cb155 Use latest go-vfs with Windows support
            • 6963cb9 Use latest go-vfs with Windows support (#319)
            • b0182fe Use relative package paths in documentation
            • 07244d3 Use simpler interfaces where possible
            • dadd7fa go mod tidy to make CI happy

            Full changelog: v1.5.5...v1.5.6

            "},{"location":"reference/release-history/#155-2019-05-18","title":"1.5.5 (2019-05-18)","text":"
            • 19f1d3d Work around snap not creating XDG_RUNTIME_DIR
            • 4fb74c9 Work around snap not creating XDG_RUNTIME_DIR (#306)

            Full changelog: v1.5.4...v1.5.5

            "},{"location":"reference/release-history/#154-2019-05-18","title":"1.5.4 (2019-05-18)","text":"
            • 013e289 Ensure that dist directory is empty before releasing
            • 7d37a3b Release fixes (#304)
            • 60ed2ec Update README.md

            Full changelog: v1.5.3...v1.5.4

            "},{"location":"reference/release-history/#153-2019-05-18","title":"1.5.3 (2019-05-18)","text":"
            • 2b5e1a0 Add KeePassXC support
            • a840bcc Add KeePassXC support (#293)
            • 46822f2 Add gpg doctor check
            • fa87510 Add install.sh
            • 1904a34 Add install.sh (#299)
            • 476b614 Add snap support to upgrade command
            • 121950c Allow file checks to be skipped
            • db75551 Build snap packages
            • a192eb6 Build snap packages (#298)
            • e5bc9db Disable update of install script from buggy godownloader
            • f921559 Fix godownloader-generated install script
            • 590d0ae Goreleaser tweaks (#301)
            • 8b823e8 Misc fixes (#296)
            • d31de11 Move goreleaser config to default location
            • 74befd1 Move goreleaser config to default location (#300)
            • 4db9935 Quote number used as string
            • 2b6cd27 Remove bzr support
            • 239d33a Remove bzr support (#294)
            • 54b09c2 Rework installation (#302)
            • c65f96f Rework installation documentation
            • 8194f9f Strip any leading v when parsing version
            • 9ca08a2 Update archives stanza
            • ffd20c6 Update reference table of contents
            • 8d068c1 Use short URL in installation docs

            Full changelog: v1.5.2...v1.5.3

            "},{"location":"reference/release-history/#152-2019-05-15","title":"1.5.2 (2019-05-15)","text":"
            • 8bd7bc9 Add BoltPersistentState
            • ffc67b4 Add PersistentState
            • a03f4f3 Add go mod tidy check to CI
            • c07dde5 Add go mod tidy check to CI (#290)
            • 5f9b01d Add initial script documentation
            • d75c32b Add script support
            • 8088850 Add script support (#287)
            • 2cd7d3c Documentation fixes (#286)
            • 3efc5c2 Factor out ApplyOptions
            • 0adef48 Fix typo in comment
            • fe1cee7 Fix typo in reference
            • 9d4dba1 Go mod workarounds (#291)
            • e7e0188 Remove CVS and Subversion support skeleton (#288)
            • 4810ef1 Remove CVS support skeleton
            • 309f340 Remove Subversion support skeleton
            • 9f1d435 Sort fields
            • 32e5d4e Update reference table of contents
            • 6630266 Use github.com/twpayne/go-difflib instead of github.com/pmezard/go-difflib
            • ef59741 Use latest go.etcd.io/bbolt at HEAD instead of fork

            Full changelog: v1.5.1...v1.5.2

            "},{"location":"reference/release-history/#151-2019-05-08","title":"1.5.1 (2019-05-08)","text":"
            • e224be0 Add missing newline
            • 770ca59 Add pre-release-checks target
            • 6917265 Add pre-release-checks target (#282)
            • 7b61b9f Document pre-release-checks target
            • 9f0d52c Fixed typo in 1Password instructions
            • b6f35e5 Fixed typo in 1Password instructions (#285)
            • 1e7327f Misc fixes (#281)
            • 4f8ae57 Pre-allocate array
            • 68eea80 Reduce interface requirements
            • fbde75f Remove unnecessary gofumpt
            • 54fd0a8 Remove unnecessary return value
            • a984e58 Update mercurial support
            • 8d7d5b6 Use smaller interface

            Full changelog: v1.5.0...v1.5.1

            "},{"location":"reference/release-history/#150-2019-05-03","title":"1.5.0 (2019-05-03)","text":"
            • 67e6861 Add FAQ entry on origin of chezmoi
            • 0f11911 Add another source-path example
            • 4ce6c61 Add colored diff support
            • f22c1e7 Add example extraction
            • 6ff9ad9 Add excluded ignores
            • 5293105 Add explicit test for #192
            • 1664463 Add generated long help infrastructure
            • e845ac9 Add golangci-lint check
            • f0bcb41 Add initial REFERENCE.md
            • a41c2d3 Add internal extract-long-help tool
            • c866b0c Add internal extract-markdown-ast tool
            • 40abd64 Add long help for all commands
            • 188b88d Add make targets for common tasks
            • 14410e0 Add merge command
            • 993f6a9 Add merge command check to doctor
            • 91071ec Add minimum version assertion to source state
            • 011ba83 Add minimum version check and document special files (#272)
            • 555f8ad Add missing backquote
            • 087d9cf Add missing closing double-quote
            • afdcb33 Add more documentation to README.md
            • 0f6f7eb Add more questions
            • 693ca87 Add note about golangci-lint and gofumpt
            • bc2f2a9 Add note about upgrade to installation doc
            • c0706ce Add note on packaging
            • 34c3f4d Add noupgrade build tag
            • cae1e1d Add noupgrade build tag (#276)
            • 1632584 Add reference manual and long help for all commands (#258)
            • 61f8309 Add table of contents
            • 0553dd9 Add tables of contents
            • 92d520c Add upgrade command
            • 7810b62 Add upgrade command (#265)
            • 738fcd8 Add warning if source VCS command is not supported
            • 4f57699 Change indent to two spaces to match Cobra
            • 1ebf43c Check config file for errors after edit-config
            • 2cb4272 Cosmetic fixes
            • cb554ed De-duplicate goreleaser build ids
            • 467a1d6 De-duplicate goreleaser build ids (#277)
            • a7bfe73 Doc improvements (#267)
            • 4d3e7de Document goinstaller installation
            • d1ef895 Document gpgRecipient
            • bbd1b81 Document merge commands
            • ad89352 Document special files
            • 1415432 Download modules first
            • f322a1c Factor out Encrypt
            • 72318e5 Factor out TargetState.Decrypt
            • ad7a836 Fix FAQ link
            • 8c27153 Fix FAQ link (#260)
            • cedee29 Fix caching of generic secret command output
            • 58bf7e9 Fix calculation of current source dir mode
            • df5c96a Fix destination flag name
            • 2d1ba6e Fix formatting of chattr reference
            • 7606f5e Fix grammar
            • d98b524 Fix grammar (#280)
            • 3273255 Fix grammar in comment
            • 19f9fa0 Fix remaining documentation FIXMEs
            • e4f023c Fix typo
            • 6b4e503 Fix typo
            • c836187 Fixed link to quick start guide
            • ef5d496 Fixed link to quick start guide (#270)
            • 2f94aa5 Generalize chattr implementation
            • 1fa49ba Improve detection of imperfectly-formatted code
            • 066884c Improve documentation (#259)
            • b9d6d87 Improve readability of helps.gen.go and fix examples of last command
            • d25e457 Improve reference manual documentation
            • 87cec4f Make code pass golangci-lint
            • 68b2c6a Make edit work on plaintext, not ciphertext
            • 87571b4 Misc fixes (#263)
            • 4901baf Misc fixes (#266)
            • bf7a42f Misc fixes (#273)
            • add797b More cosmetic fixes
            • 7923310 Move documentation into docs
            • 20c3538 Propagate Encrypted state
            • 259c5f9 Put flags after arguments for consistency with Cobra and add more examples
            • 038e7b5 Refactor documentation
            • 8bcff93 Reformat paragraph
            • fa72a55 Remove --umask flag
            • 6e95959 Remove link to godoc.org
            • 4ac4708 Remove list of template variables
            • e330084 Remove pets vs. cattle comment
            • ac75e01 Remove snap infrastructure
            • 99513e3 Remove snap infrastructure (#269)
            • c56f61d Remove some obvious comments
            • 81d16a0 Remove underscores from filenames
            • 9077575 Rename HOW-TO.md to HOWTO.md
            • f16c811 Rewrite single-case switch as if
            • b60b022 Simplify logic
            • 467ab16 Sort variables
            • b9fe1c9 Split installation and quick start guides
            • ca98784 Support encrypt attribute in chattr
            • 854cfd5 Tolerate config file errors for certain commands
            • b03d480 Update cmd/helps.gen.go
            • f21f9e2 Update long help
            • c86e2ba Upgrade by replacement if executable is in temp dir
            • 696c2f6 Upgrade improvements (#278)
            • da941b8 Use command variable name for commands consistently
            • 5a9f735 Use make targets in CI
            • b3e445f Use mvdan.cc/gofumpt
            • 9d08f18 Verify checksums when upgrading

            Full changelog: v1.4.2...v1.5.0

            "},{"location":"reference/release-history/#142-2019-04-14","title":"1.4.2 (2019-04-14)","text":"
            • 295da27 Abstract out stdin, stdout, and stderr for testing
            • 5fabcff Add apply test
            • a24348b Add archive test
            • da6ac24 Add bash & zsh completion
            • ba462c6 Add coverage badge
            • 7c8e4b6 Add destination directory is a symlink test
            • dbc942d Add dump test
            • 67bc2e0 Add golint test
            • adcd979 Add import test
            • c0f657a Add note about pets vs. cattle
            • 7bf62ae Add permValue test
            • 57d009a Add ppc64 architectures to README.md
            • 9f1232f Add snap generation and tidy up YAML files
            • be5e240 Attempt to build snap
            • 9092c62 Combine coverage profiles for more accurate coverage
            • 3273eee Disable Go modules when installing linters
            • 9619ed6 Disable snapcraft support and re-enable ppc64, ppc64le, and arm
            • 98ec39e Don't trust golang.org/x/lint/golint
            • 2eb4227 Export TemplateSuffix
            • 86859d9 Factor out coverage targets into Makefile
            • 7d0bf1d Fix cosmetics
            • bc2edae Fixes from PR review comments
            • 7e53826 Hint at #243
            • a12313c Implement config file creation from template during init command
            • b7e2346 Make default config file format TOML
            • 6e5813c Remove golint checks while golint is broken
            • eb1c302 Require Go 1.12
            • 93c585d Respect umask in dump command
            • 99068b9 Run gofumpt -s
            • 0109341 Switch to github.com/stretchr/testify for testing
            • 80e441b Tidy up .goreleaser.yaml
            • 31d5fea Tidy up .goreleaser.yaml
            • 4ae22b9 Tidy up config file creation in init
            • 43c26fc Use github.com/twpayne/go-xdg v3
            • 56c0b00 Use github.com/twpayne/go-xdg/v2
            • 9aa00ca Use vfs.Contains
            • f8b2094 add a space before ; fi
            • c53640c add missing ; fi to .travis.yml
            • 5e0b43b disable goveralls on pull requests
            • 7b72952 don't run on PRs instead of exclusively running on them
            • 6374b6c fixing go vet error

            Full changelog: v1.4.1...v1.4.2

            "},{"location":"reference/release-history/#141-2019-03-20","title":"1.4.1 (2019-03-20)","text":"
            • 30bfacf Add git as a dependency for rpm and deb packages
            • 8f40f2e Add ppc64 and ppc64le to goreleaser target
            • b8bbd12 Fix #198 - Use os.UserHomeDir() instead of custom function
            • d7e76e8 Fix new issue link in CONTRIBUTING

            Full changelog: v1.4.0...v1.4.1

            "},{"location":"reference/release-history/#140-2019-03-14","title":"1.4.0 (2019-03-14)","text":"
            • c827046 Add Mutator.Stat
            • 8d8fb55 Add TOML as an output format
            • e13bb89 Add gpg encryption
            • 6075a02 Add manage as an alias for add
            • 8406817 Add unmanage as an alias for forget
            • e47c444 Add unmanaged command, fixes #186
            • cd3d86b Add userHomeDir
            • 4cfdaac Change example configs to TOML and reformat
            • 93d03aa Check lastpass CLI version on first call
            • da8098b Create directory for config file before editing if needed
            • b324637 Fix all markdownlint warnings, except one
            • 72690a6 Fix double word in init help
            • 201e7a5 Fix that accomodates blank lines and comments
            • 4d32cde Make hostname only first part of hostname and add fullHostname
            • 249e2b9 Make it clearer that the rpm packages work on OpenSUSE
            • f2dfbb8 Only display text diffs
            • b477972 Reduce number of semver libraries
            • 02636ad Remove NullMutator
            • d63c406 Remove unused function arguments
            • 306df8b Return ErrNotExist from nullMutator.Stat
            • b41824c Return an error instead of panicking
            • 035988d Revert \"Remove NullMutator\"
            • 9fea286 Revert \"Use vfs.ReadOnlyFS's instead of NullMutators\"
            • 90d4274 Spell out lastpass --json arg
            • ab807b1 Test to demonstrate parsing error
            • ab1de29 Use latest github.com/twpayne/go-xdg
            • 19947c8 Use latest version of github.com/twpayne/go-vfs
            • 2a72a34 Use renameio correctly across multiple filesystems
            • b1cddc3 Use userHomeDir instead of github.com/mitchellh/go-homedir
            • 5bf7ead Use vfs.MkdirAll
            • 18366aa Use vfs.ReadOnlyFS's instead of NullMutators

            Full changelog: v1.3.0...v1.4.0

            "},{"location":"reference/release-history/#130-2019-01-30","title":"1.3.0 (2019-01-30)","text":"
            • 7f4bd2d Add Config.getVCSInfo
            • f385ec1 Add ID as a well-known abbreviation
            • 4daf21d Add check for generic secret command
            • 32146ce Add check for suspicious filenames
            • b3e8085 Add first run git init instructions to README
            • 9b7b268 Add hermetic text functions from sprig, fixes #184
            • 595dcf1 Add init command
            • 2ef2695 Add stow-to-chezmoi.sh migration script
            • 013e419 Add update command, fixes #159
            • 6a1a0ea Always print permissions with three digits
            • 1ef4f89 Consider files only containing whitespace as empty
            • abbc0c1 Don't make init command apply by default
            • 3cc895d Emphasize flexibility first
            • 4dee096 Ensure that source directory exists in cd command
            • f9290fc Factor out doctorCheck interface
            • ed27b49 Factor out doctorCheckResult
            • 1679704 Factor out ensureSourceDirectory
            • a3830ca Factor out runDoctorCheck
            • bd21ee6 Factor out vcs_infos.go
            • 4633ca1 Fix dump command with targets
            • cf18630 Fix handling of missing directories
            • 18911f1 Fix source directory errors in documentation, fixes #171
            • 85b7ece Fix template in example, fixes #161
            • f7edc93 Fix typos in README.md
            • 68a304c Include args in usage
            • d249d15 Init new repo when init is called with no args
            • 792c631 Make source VCS pull command configurable
            • 47b305a Mention init command in README.md
            • dfd18a1 Minor documentation change
            • 7abd4cc Parse permissions in octal
            • 2d3eff1 Refactor doctor command to include versions, fixes #160
            • b8aabb0 Refactor getting started documentation
            • 9abe99d Refactor init command
            • 204a5a7 Remove evident comment
            • fc71c55 Remove unnecessary os.FileInfo.Mode() calls
            • d7be60a Rename onepassword config var to match command
            • 13f5d47 Replace Command with Cmd in internal structure names
            • 61ffbf4 Respect umask when creating source directory
            • cf305f8 Store config file in config struct
            • e0410cd Tidy up doctor check reporting
            • b97f37d Update description
            • 96797da fix: several plausible failure modes for the script during routine running

            Full changelog: v1.2.0...v1.3.0

            "},{"location":"reference/release-history/#120-2019-01-18","title":"1.2.0 (2019-01-18)","text":"
            • 367c0d5 Add 1Password support, fixes #135
            • acbf852 Add advantages
            • 0494cb8 Add doctor command
            • 36cd576 Add generic secret manager support, fixes #51
            • 932a8e9 Add support for \"secret\" command namespace
            • 290d13e Add support for passwordstore
            • e4c8d41 Better position transparency benefit
            • bf45f84 Call pass show explicitly
            • 2ff85c2 Document pass support, fixes #139
            • 333066e Don't disable secret manager commands if binary is not present
            • abf762f Don't export internal config structures
            • 3a63e45 Include binary names in secret manager descriptions
            • 209c1e2 Move keyring command into secret command
            • f2ac9c3 Only add commands that have installed executables
            • 015609d Re-order features based on feedback
            • 24f7131 Remove --bitwarden-session flag
            • 95c14a3 Rename Funcs to TemplateFuncs
            • 718ae00 Rename field for consistency
            • fe18833 Rename source files to match command structure
            • 24c94fe Scan pass output up to the first newline, rather than splitting

            Full changelog: v1.1.0...v1.2.0

            "},{"location":"reference/release-history/#110-2019-01-16","title":"1.1.0 (2019-01-16)","text":"
            • a8aeb1b Add 'Why use chezmoi?' section
            • abfe150 Add --prompt flag to add command, refs #123
            • d676fc6 Add chezmoi in the news section
            • 55746d9 Add data command
            • bbb5b2a Add link to Hacker News discussion
            • 55bfe71 Add link to dotfiles.github.io
            • 8677883 Add link to lobste.rs discussion
            • fe39c57 Add link to reddit.com discussion
            • 39c2645 Add missing dollar
            • 8919b6c Add note about data command
            • bf690dd Add os-release parser
            • 341b99f Add osRelease to .chezmoi data, fixes #126
            • 4044b1e Add table of packages
            • 7a88b12 Add test for CGO
            • 1fe3fe0 Add vault support, fixes #120
            • e0b7bad Avoid potential out-of-range access if string is empty
            • d1ee299 Convert OS release map keys outside getOSRelease
            • c1525d8 Convert os-release keys to JSON-like keys
            • 61f7659 Correct source flag
            • 9921965 Document .chezmoi.osRelease
            • 8cc9fdd Don't add ignored files, fixes #124
            • 4fecad4 Don't delete ignored files in exact directories
            • 99e138e Don't duplicate licence text
            • 34eb20d Extract target dir names when computing ignore pattern
            • 6ac240c Factor out formatMap
            • 6ffb4f1 Fix typo
            • bf67981 Ignore errors from user.LookupGroupId if CGO is disabled, fixes #125
            • 877f0cb Make error messages more consistent
            • 53c20a0 Preserve existing directories in source state instead of renaming them
            • 15a1cd2 Use latest version of github.com/twpayne/go-vfs
            • 125f4ba Wrap comment
            • 9cec1f6 dirNames: use make for init slice of string

            Full changelog: v1.0.0...v1.1.0

            "},{"location":"reference/release-history/#100-2019-01-13","title":"1.0.0 (2019-01-13)","text":"
            • d855c1e Add printing of symlinks to cat command
            • 5529485 Don't check for config files in old locations, fixes #113
            • 05935b1 Remove note about versioning
            • af4b714 Use DestDir instead of TargetDir in code
            • 7484973 Use consistent terminology in help and doc

            Full changelog: v0.0.15...v1.0.0

            "},{"location":"reference/release-history/#0015-2019-01-13","title":"0.0.15 (2019-01-13)","text":"
            • fc3be3e Add CONTRIBUTING.md
            • 2f90eef Add initial chattr test
            • dd7e6c1 Add more tests for chattr on file
            • 744d2cf Add octalIntValue
            • dfc456e Add tests for chattr on symlink
            • f9fefac Allow no- prefix to remove attributes
            • 6ffae71 Fix chattr -private on directories
            • 619b2ed Fix chattr of files in directories, fixes #103
            • 60a26df Print umask in octal in help, fixes #107
            • c42eecf Remove FIXMEs that are now Github issues
            • 0d8551c Remove stale FIXME
            • 32ce15c Remove unused cobra.Command argument
            • 1c8d357 Reorganize functions
            • 1704912 Respect .chezmoiignore in Entry.ConcreteValue
            • 4612ada Respect .chezmoiignore in Entry.Evaluate
            • 84c41c7 Respect .chezmoiignore in Entry.archive
            • d8f8445 Sort functions alphabetically

            Full changelog: v0.0.14...v0.0.15

            "},{"location":"reference/release-history/#0014-2019-01-12","title":"0.0.14 (2019-01-12)","text":"
            • 20ed7e2 Set version in linux-amd64 release

            Full changelog: v0.0.13...v0.0.14

            "},{"location":"reference/release-history/#0013-2019-01-12","title":"0.0.13 (2019-01-12)","text":"
            • d66bf04 Add .chezmoiignore support, fixes #91
            • ac412b6 Add PatternSet
            • 9c6cedf Avoid duplicate filename in template errors
            • 17a590c Avoid infinite loop when template value is empty
            • 81eba36 Remove stale comment
            • 60cb5ff Sort entries in test
            • cab2f01 Use latest github.com/twpayne/go-vfs

            Full changelog: v0.0.12...v0.0.13

            "},{"location":"reference/release-history/#0012-2019-01-11","title":"0.0.12 (2019-01-11)","text":"
            • 4e07b0e Add alphabetical test
            • 721df9f Add edit-config command, fixes #90
            • bb05d54 Add inWord
            • e4f1ca1 Add link to github.com/twpayne/dotfiles
            • 9219d3f Compute valueRegexp when needed
            • 0ec171a Factor out execEditor and runEditor
            • 355aef8 Fix README.md formatting
            • 555ea41 Improve variable substitution, fixes #89
            • 6230dbf Use a tagged version of github.com/google/renameio
            • 313c04b Use subtests in autotemplate tests

            Full changelog: v0.0.11...v0.0.12

            "},{"location":"reference/release-history/#0011-2019-01-05","title":"0.0.11 (2019-01-05)","text":"
            • 02bcd30 Add exact support to chattr
            • 7bb40c2 Add support for exact directories, fixes #11
            • 447e244 Correct path to source directory
            • 532d788 Ensure directory exists before creating .keep file
            • 2abc9a9 Factor out AddOptions
            • e66da3c Factor out ImportTAROptions
            • ba1c8fa Reformat test
            • b28a722 Remove default values
            • a8c5ca1 Remove early reference to go-keyring
            • 5004108 Rename jenkins to user
            • 12d817d Shorten description
            • 7f621cb Use interface{} for root values consistently

            Full changelog: v0.0.10...v0.0.11

            "},{"location":"reference/release-history/#0010-2018-12-22","title":"0.0.10 (2018-12-22)","text":"
            • 5301881 Add --bitwarden-session flag
            • cbd9256 Add initial Bitwarden support
            • d068f60 Automatically parse Lastpass note values
            • 6147683 Compute name argument
            • fe723f8 Correct error text
            • bbaf694 Correct variable name
            • 4f2ddb2 Factor out addDir
            • d9d79dd Factor out addFile
            • 52c1768 Factor out addSymlink
            • 66cb18c Move DirAttributes in to dir.go
            • 703bfd6 Move FileAttributes into file.go
            • 5e7036a Move TargetState tests into target_state_test.go
            • c198aa1 Pass os.FileInfo to TargetState.addFile instead of perm and empty
            • 4b9114a Reformat tests
            • 9264001 Remove last trace of ParsedSourceDirName
            • 72c8d6f Remove unnecessary masks
            • 06559bc Remove unreachable code
            • 7f9cabc Rename DirName to Name
            • 2631a87 Rename FileName to Name
            • c59600e Rename LinkName to linkname
            • 04e1423 Rename ParsedSourceDirName to DirAttributes
            • c2da0c0 Rename ParsedSourceFileName to FileAttributes
            • 7f3b2a8 Rename TargetState.Import to ImportTAR
            • a2bbef6 Rename internal variable
            • 38cd4da Unify error messages across password managers
            • 3db61d1 Use os.FileMode.Perm() consistently

            Full changelog: v0.0.9...v0.0.10

            "},{"location":"reference/release-history/#009-2018-12-16","title":"0.0.9 (2018-12-16)","text":"
            • 39e003c Don't assume that config file exists, fixes #73
            • 3a4ea33 Don't use cgo on linux_i386
            • 0c6aca4 Enable CGO on Linux
            • 5aa794d Make description consistent
            • 4c8054f Make parameter documentation more consistent
            • 4021463 Make usage error output less verbose
            • f6ae4f3 Prefix errors with chezmoi:
            • 2e007a3 Refresh go modules with latest versions
            • 4c7aa0c Remove old version infrastructure
            • 1ddcc7e Revert \"Ignore group lookup errors, fixes #65\"
            • 28346cc Use cobra's --version flag

            Full changelog: v0.0.8...v0.0.9

            "},{"location":"reference/release-history/#008-2018-12-14","title":"0.0.8 (2018-12-14)","text":"
            • 3913e51 Add archive documentation
            • 13edec3 Document cd command
            • 8e9ec60 Ignore group lookup errors, fixes #65
            • 6449e9c Support XDG Base Directory Specification, fixes #19

            Full changelog: v0.0.7...v0.0.8

            "},{"location":"reference/release-history/#007-2018-12-14","title":"0.0.7 (2018-12-14)","text":"
            • baddf0f Generate unified diffs
            • 52feafc Remove remaining references to Windows while Windows is unsupported
            • 52566d9 Remove stray bracket
            • 144b125 Restore default source VCS command
            • 9629996 Update description to emphasize security

            Full changelog: v0.0.6...v0.0.7

            "},{"location":"reference/release-history/#006-2018-12-11","title":"0.0.6 (2018-12-11)","text":"
            • fd2f39b Add --recursive flag
            • 6a33cdc Add Actuator.Rename
            • f5fcdb1 Add Dir.Private
            • c1d38dd Add Entry.ConcreteValue
            • 842097f Add Entry.TargetName
            • 22c530a Add FIXMEs for flags to add
            • f1832ca Add File.Executable
            • 66c2461 Add File.Private
            • 20543f8 Add File.Template
            • 15a3826 Add Symlink.Template
            • ec77a95 Add TargetState.AddArchive
            • 31481f7 Add YAML output
            • 91be5c7 Add cd command
            • 0b84bf5 Add chattr command, fixes #2
            • e26f3ec Add import command, fixes #50
            • 42ecba3 Add package aliases
            • 240ac97 Add source-path command
            • 1f5eba6 Add test to exercise some commands
            • 5bef462 Add type field
            • 4556383 Apply umask last consistently
            • 08a5345 Avoid overwriting argument before first use
            • 8f570ef Bump version of github.com/twpayne/go-vfs
            • 9cbae2a Check format before computing concrete value
            • e8b97cb Clarify LastPass example
            • a78af0e Correct function documentation
            • 5d3ae7d Delete 'practical' section that is explained elsewhere
            • d9fb233 Depersonalize template example
            • bcf98b1 Disable Windows releases
            • 242e549 Document exported struct
            • 97818e0 Dump source and target paths, not names
            • d7e1697 Dump state in JSON format instead of spew
            • 6053e48 Evaluate entries before dumping them
            • d4f8beb Export Entry.Evaluate
            • a05d9c1 Export ParseSourceDirName
            • 8660cb7 Export ParseSourceFileName
            • 165397a Export ParsedSourceDirName
            • e9e4d77 Export ParsedSourceFileName
            • 9925c08 Factor out dir.go
            • efd6dde Factor out file.go
            • 2a6990d Factor out symlink.go
            • 34a1cba Factor out target_state.go
            • 7879a59 Fix capitalization
            • 9312f94 Fix removal of target in remove command
            • 4037322 Format github.com links consistently
            • 166688c Improve short descriptions of commands
            • b3625b2 Make it explicit that error is ignored
            • 9db2ce1 Make it explicit that errors are ignored
            • 5910f22 Make the NullActuator a singleton
            • ae51ba4 Print source dir if no targets are specified
            • c4bad5b Qualify .netrc example
            • a8fcaa9 Quote permissions
            • ad8add0 Refactor individual Entry application
            • 9dc8b10 Remove --source-vcs flag
            • ea5d380 Remove TargetState.AllEntries
            • a35fbb4 Remove docker image building code
            • 01086cc Remove fixed FIXME
            • b62ac56 Remove uneccessary 'note that's
            • 1750988 Remove unused field
            • 307f767 Rename Symlink.Target to Symlink.LinkName
            • bd27c36 Rename TargetState.AddArchive to TargetState.Import
            • 55a947a Rename actuator to mutator
            • ff58780 Rename variable for clarity
            • 9b0e724 Replace getSourceNames with getEntries
            • 2effdf7 Use absolute path to ignore dist directory
            • 4387aa1 Use angle brackets for all examples
            • 764263b Use dir, file, symlink order consistently
            • ca06a88 Use getEntries and Entry.TargetName is remove command
            • 615c3bd Use getEntries in cat command
            • 4e74b17 Use getEntries in chattr command
            • e375f25 Use getEntries in dump command
            • 1d97198 Use targetName in archive
            • 1804974 Use variable name ts for target state consistently
            • a341f75 Use vfs.ReadOnlyFS to ensure all changes are made via an Actuator

            Full changelog: v0.0.5...v0.0.6

            "},{"location":"reference/release-history/#005-2018-12-02","title":"0.0.5 (2018-12-02)","text":"
            • 083d25d Add --apply, --diff, and --prompt flags to edit command, fixes #28
            • 5527d94 Add TargetState.ApplyOne
            • a8670c4 Add prompt
            • f644bf2 Cache keyring lookups
            • 53a12d1 Cache lastpass lookups
            • 900a2e3 Extend apply command to take a list of targets, fixes #3
            • db96d06 Extend diff command to take a list of targets, fixes #4
            • a324b0b Extend verify command to take a list of targets, fixes #5
            • 7e98072 Factor out Config.applyArgs
            • 89440ce Make runRemoveCommand a method on Config
            • c37b9ad Remove trailing E from function names

            Full changelog: v0.0.4...v0.0.5

            "},{"location":"reference/release-history/#004-2018-11-30","title":"0.0.4 (2018-11-30)","text":"
            • a2e6e88 Add LastPass integration
            • 377d68e Add graceful template error handling mechanism
            • cbb5b2d Add installation docs referring to Goreleaser-generated artefacts and Homebrew formula
            • 377999a Add lastpass command as a wrapper for lpass
            • 496c2ba Documentation tweaks
            • 06f8e7a Ensure Go modules are enabled in before hook
            • 273e14f Factor out keyringFunc
            • e612476 Handle errors gracefully in keyring
            • 841d2e7 Handle errors gracefully in lastpass
            • d88b705 Make CI output less verbose
            • 7992f60 Make template execution more strict
            • 4c7aece Only read files and evaluate templates when required
            • a436144 Remove GO111MODULES
            • b45c5ad Set GO111MODULE in .travis.yml

            Full changelog: v0.0.3...v0.0.4

            "},{"location":"reference/release-history/#003-2018-11-30","title":"0.0.3 (2018-11-30)","text":"
            • cfab91b Add newline at end of file
            • 8e8d142 Use Go 1.11.x explicitly
            "},{"location":"reference/source-state-attributes/","title":"Source state attributes","text":"

            chezmoi stores the source state of files, symbolic links, and directories in regular files and directories in the source directory (~/.local/share/chezmoi by default). This location can be overridden with the -S flag or by giving a value for sourceDir in the configuration file. Directory targets are represented as directories in the source state. All other target types are represented as files in the source state. Some state is encoded in the source names.

            The following prefixes and suffixes are special, and are collectively referred to as \"attributes\":

            Prefix Effect after_ Run script after updating the destination before_ Run script before updating the destination create_ Ensure that the file exists, and create it with contents if it does not dot_ Rename to use a leading dot, e.g. dot_foo becomes .foo empty_ Ensure the file exists, even if is empty. By default, empty files are removed encrypted_ Encrypt the file in the source state external_ Ignore attributes in child entries exact_ Remove anything not managed by chezmoi executable_ Add executable permissions to the target file literal_ Stop parsing prefix attributes modify_ Treat the contents as a script that modifies an existing file once_ Only run the script if its contents have not been run before onchange_ Only run the script if its contents have not been run before with the same filename private_ Remove all group and world permissions from the target file or directory readonly_ Remove all write permissions from the target file or directory remove_ Remove the file or symlink if it exists or the directory if it is empty run_ Treat the contents as a script to run symlink_ Create a symlink instead of a regular file Suffix Effect .literal Stop parsing suffix attributes .tmpl Treat the contents of the source file as a template

            Different target types allow different prefixes and suffixes. The order of prefixes is important.

            Target type Source type Allowed prefixes in order Allowed suffixes Directory Directory remove_, external_, exact_, private_, readonly_, dot_ none Regular file File encrypted_, private_, readonly_, empty_, executable_, dot_ .tmpl Create file File create_, encrypted_, private_, readonly_, empty_, executable_, dot_ .tmpl Modify file File modify_, encrypted_, private_, readonly_, executable_, dot_ .tmpl Remove file File remove_, dot_ none Script File run_, once_ or onchange_, before_ or after_ .tmpl Symbolic link File symlink_, dot_ .tmpl

            The literal_ prefix and .literal suffix can appear anywhere and stop attribute parsing. This permits filenames that would otherwise conflict with chezmoi's attributes to be represented.

            In addition, if the source file is encrypted, the suffix .age (when age encryption is used) or .asc (when gpg encryption is used) is stripped. These suffixes can be overridden with the age.suffix and gpg.suffix configuration variables.

            chezmoi ignores all files and directories in the source directory that begin with a . with the exception of files and directories that begin with .chezmoi.

            "},{"location":"reference/target-types/","title":"Target types","text":"

            chezmoi will create, update, and delete files, directories, and symbolic links in the destination directory, and run scripts. chezmoi deterministically performs actions in ASCII order of their target name.

            Example

            Given a file dot_a, a script run_z, and a directory exact_dot_c, chezmoi will first create .a, create .c, and then execute run_z.

            "},{"location":"reference/target-types/#files","title":"Files","text":"

            Files are represented by regular files in the source state. The encrypted_ attribute determines whether the file in the source state is encrypted. The executable_ attribute will set the executable bits in the target state, and the private_ attribute will clear all group and world permissions. The readonly_ attribute will clear all write permission bits in the target state. Files with the .tmpl suffix will be interpreted as templates. If the target contents are empty then the file will be removed, unless it has an empty_ prefix.

            "},{"location":"reference/target-types/#create-file","title":"Create file","text":"

            Files with the create_ prefix will be created in the target state with the contents of the file in the source state if they do not already exist. If the file in the destination state already exists then its contents will be left unchanged.

            "},{"location":"reference/target-types/#modify-file","title":"Modify file","text":"

            Files with the modify_ prefix are treated as scripts that modify an existing file.

            If the file contains a line with the text chezmoi:modify-template then that line is removed and the rest of the script is executed template with the existing file's contents passed as a string in .chezmoi.stdin. The result of executing the template are the new contents of the file.

            Otherwise, the contents of the existing file (which maybe empty if the existing file does not exist or is empty) are passed to the script's standard input, and the new contents are read from the script's standard output.

            "},{"location":"reference/target-types/#remove-entry","title":"Remove entry","text":"

            Files with the remove_ prefix will cause the corresponding entry (file, directory, or symlink) to be removed in the target state.

            "},{"location":"reference/target-types/#directories","title":"Directories","text":"

            Directories are represented by regular directories in the source state. The exact_ attribute causes chezmoi to remove any entries in the target state that are not explicitly specified in the source state, and the private_ attribute causes chezmoi to clear all group and world permissions. The readonly_ attribute will clear all write permission bits.

            "},{"location":"reference/target-types/#symbolic-links","title":"Symbolic links","text":"

            Symbolic links are represented by regular files in the source state with the prefix symlink_. The contents of the file will have a trailing newline stripped, and the result be interpreted as the target of the symbolic link. Symbolic links with the .tmpl suffix in the source state are interpreted as templates. If the target of the symbolic link is empty or consists only of whitespace, then the target is removed.

            "},{"location":"reference/target-types/#scripts","title":"Scripts","text":"

            Scripts are represented as regular files in the source state with prefix run_. The file's contents (after being interpreted as a template if it has a .tmpl suffix) are executed.

            Scripts are executed on every chezmoi apply, unless they have the once_ or onchange_ attribute. run_once_ scripts are only executed if a script with the same contents has not been run before, i.e. if the script is new or if its contents have changed. run_onchange_ scripts are executed whenever their contents change, even if a script with the same contents has run before.

            Scripts with the before_ attribute are executed before any files, directories, or symlinks are updated. Scripts with the after_ attribute are executed after all files, directories, and symlinks have been updated. Scripts without an before_ or after_ attribute are executed in ASCII order of their target names with respect to files, directories, and symlinks.

            Scripts will normally run with their working directory set to their equivalent location in the destination directory. If the equivalent location in the destination directory either does not exist or is not a directory, then chezmoi will walk up the script's directory hierarchy and run the script in the first directory that exists and is a directory.

            Example

            A script in ~/.local/share/chezmoi/dir/run_script will be run with a working directory of ~/dir.

            chezmoi sets a number of CHEZMOI* environment variables when running scripts, corresponding to commonly-used template data variables. Extra environment variables can be set in the env or scriptEnv configuration variables.

            Scripts are executed using an interpreter, if configured. See the section on interpreters.

            "},{"location":"reference/target-types/#symlink-mode","title":"symlink mode","text":"

            By default, chezmoi will create regular files and directories. Setting mode = \"symlink\" will make chezmoi behave more like a dotfile manager that uses symlinks by default, i.e. chezmoi apply will make dotfiles symlinks to files in the source directory if the target is a regular file and is not encrypted, executable, private, or a template.

            "},{"location":"reference/command-line-flags/","title":"Command line flags","text":"

            Command line flags override any values set in the configuration file.

            "},{"location":"reference/command-line-flags/common/","title":"Common command line flags","text":"

            The following flags apply to multiple commands where they are relevant.

            "},{"location":"reference/command-line-flags/common/#flags","title":"Flags","text":""},{"location":"reference/command-line-flags/common/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/command-line-flags/common/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

            Set the output format, json by default.

            "},{"location":"reference/command-line-flags/common/#-h-help","title":"-h, --help","text":"

            Print help.

            "},{"location":"reference/command-line-flags/common/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/command-line-flags/common/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/command-line-flags/common/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/command-line-flags/common/#-p-path-style-style","title":"-p, --path-style style","text":"

            Print paths in the given style. The default is relative.

            Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory source-absolute Absolute paths in the source tree directory source-relative Relative paths to the source tree directory all All path styles, indexed by relative"},{"location":"reference/command-line-flags/common/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories.

            "},{"location":"reference/command-line-flags/common/#-tree","title":"--tree","text":"

            Print paths as a tree instead of a list.

            "},{"location":"reference/command-line-flags/common/#available-entry-types","title":"Available entry types","text":"

            You can provide a list of entry types, separated by commas. Types can be preceded with no to remove them, e.g. scripts,noalways.

            Type Description all All entries none No entries dirs Directories files Files remove Removes scripts Scripts symlinks Symbolic links always Scripts that are always run encrypted Encrypted entries externals External entries templates Templates"},{"location":"reference/command-line-flags/developer/","title":"Developer command line flags","text":"

            The following flags are global but only relevant for developers and debugging.

            "},{"location":"reference/command-line-flags/developer/#flags","title":"Flags","text":""},{"location":"reference/command-line-flags/developer/#-cpu-profile-filename","title":"--cpu-profile filename","text":"

            Write a Go CPU profile to filename.

            "},{"location":"reference/command-line-flags/developer/#-debug","title":"--debug","text":"

            Log information helpful for debugging.

            "},{"location":"reference/command-line-flags/global/","title":"Global command line flags","text":"

            The following flags are available for all chezmoi commands. Note that some flags may not have any effect on certain commands.

            "},{"location":"reference/command-line-flags/global/#flags","title":"Flags","text":""},{"location":"reference/command-line-flags/global/#-cache-directory","title":"--cache directory","text":"

            Configuration: cacheDir

            Use directory as the cache directory.

            "},{"location":"reference/command-line-flags/global/#-color-value","title":"--color value","text":"

            Configuration: color

            Colorize diffs, value can be on, off, auto, or any boolean-like value recognized by promptBool. The default is auto which will colorize diffs only if the environment variable $NO_COLOR is not set and stdout is a terminal.

            "},{"location":"reference/command-line-flags/global/#-c-config-filename","title":"-c, --config filename","text":"

            Read the configuration from filename.

            "},{"location":"reference/command-line-flags/global/#-config-format-format","title":"--config-format format","text":"

            Assume the configuration file is in the given format. This is only needed if the config filename does not have an extension, for example when it is /dev/stdin. Supported formats: json, jsonc, toml, yaml.

            "},{"location":"reference/command-line-flags/global/#-d-destination-directory","title":"-D, --destination directory","text":"

            Configuration: destDir

            Use directory as the destination directory.

            "},{"location":"reference/command-line-flags/global/#-n-dry-run","title":"-n, --dry-run","text":"

            Set dry run mode. In dry run mode, the destination directory is never modified. This is most useful in combination with the -v (verbose) flag to print changes that would be made without making them.

            "},{"location":"reference/command-line-flags/global/#-force","title":"--force","text":"

            Make changes without prompting.

            "},{"location":"reference/command-line-flags/global/#-interactive","title":"--interactive","text":"

            Prompt before applying each target.

            "},{"location":"reference/command-line-flags/global/#-k-keep-going","title":"-k, --keep-going","text":"

            Keep going as far as possible after a encountering an error.

            "},{"location":"reference/command-line-flags/global/#-mode-filesymlink","title":"--mode file|symlink","text":"

            Mode of operation. The default is file.

            "},{"location":"reference/command-line-flags/global/#-no-pager","title":"--no-pager","text":"

            Do not use the pager.

            "},{"location":"reference/command-line-flags/global/#-no-tty","title":"--no-tty","text":"

            Do not attempt to get a TTY for prompts. Instead, read them from stdin.

            "},{"location":"reference/command-line-flags/global/#-o-output-filename","title":"-o, --output filename","text":"

            Write the output to filename instead of stdout.

            "},{"location":"reference/command-line-flags/global/#-persistent-state-filename","title":"--persistent-state filename","text":"

            Configuration: persistentState

            Read and write the persistent state from filename. By default, chezmoi stores its persistent state in chezmoistate.boltdb in the same directory as its configuration file.

            "},{"location":"reference/command-line-flags/global/#-progress-value","title":"--progress value","text":"

            Show progress when downloading externals. value can be on, off, or auto. The default is auto which shows progress bars when stdout is a terminal.

            "},{"location":"reference/command-line-flags/global/#-r-refresh-externals-value","title":"-R, --refresh-externals [value]","text":"

            Control the refresh of the externals cache. value can be any of always, auto, or never and defaults to always if no value is specified. If no --refresh-externals flag is specified then chezmoi defaults to auto.

            always (or any truthy value as accepted by parseBool) causes chezmoi to re-download externals.

            auto means only re-download externals that have not been downloaded within their refresh periods.

            never (or any other falsey value accepted by parseBool) means only download if no cached external is available.

            "},{"location":"reference/command-line-flags/global/#-s-source-directory","title":"-S, --source directory","text":"

            Configuration: sourceDir

            Use directory as the source directory.

            "},{"location":"reference/command-line-flags/global/#-source-path","title":"--source-path","text":"

            Interpret targets passed to the command as paths in the source directory rather than the destination directory.

            "},{"location":"reference/command-line-flags/global/#-use-builtin-age-bool","title":"--use-builtin-age [bool]","text":"

            Configuration: useBuiltinAge

            Use chezmoi's builtin age encryption instead of an external age command. value can be on, off, auto, or any boolean-like value recognized by promptBool. The default is auto which will only use the builtin age if age.command cannot be found in $PATH.

            The builtin age command does not support passphrases, symmetric encryption, or the use of SSH keys.

            "},{"location":"reference/command-line-flags/global/#-use-builtin-diff-bool","title":"--use-builtin-diff [bool]","text":"

            Use chezmoi's builtin diff, even if the diff.command configuration variable is set.

            "},{"location":"reference/command-line-flags/global/#-use-builtin-git-bool","title":"--use-builtin-git [bool]","text":"

            Configuration: useBuiltinGit

            Use chezmoi's builtin git instead of git.command for the init and update commands. value can be on, off, auto, or any boolean-like value recognized by promptBool. The default is auto which will only use the builtin git if git.command cannot be found in $PATH.

            Info

            chezmoi's builtin git has only supports the HTTP and HTTPS transports and does not support git-repo externals.

            "},{"location":"reference/command-line-flags/global/#-v-verbose","title":"-v, --verbose","text":"

            Set verbose mode. In verbose mode, chezmoi prints the changes that it is making as approximate shell commands, and any differences in files between the target state and the destination set are printed as unified diffs.

            "},{"location":"reference/command-line-flags/global/#-version","title":"--version","text":"

            Print the version of chezmoi, the commit at which it was built, and the build timestamp.

            "},{"location":"reference/command-line-flags/global/#-w-working-tree-directory","title":"-w, --working-tree directory","text":"

            Use directory as the git working tree directory. By default, chezmoi searches the source directory and then its ancestors for the first directory that contains a .git directory.

            "},{"location":"reference/commands/","title":"Commands","text":"

            This section provides documentation for chezmoi commands and their arguments.

            All commands accept global flags, though some flags may have no effect on certain commands. Many commands also share common flags.

            "},{"location":"reference/commands/add/","title":"add target...","text":"

            Add targets to the source state. If any target is already in the source state, then its source state is replaced with its current state in the destination directory.

            "},{"location":"reference/commands/add/#flags","title":"Flags","text":""},{"location":"reference/commands/add/#-a-autotemplate","title":"-a, --autotemplate","text":"

            Automatically generate a template by replacing strings that match variable values from the data section of the config file with their respective config names as a template string. Longer substitutions occur before shorter ones. This implies the --template option.

            Warning

            --autotemplate uses a greedy algorithm which occasionally generates templates with unwanted variable substitutions. Carefully review any templates it generates.

            "},{"location":"reference/commands/add/#-create","title":"--create","text":"

            Add files that should exist, irrespective of their contents.

            "},{"location":"reference/commands/add/#-encrypt","title":"--encrypt","text":"

            Configuration: add.encrypt

            Encrypt files using the defined encryption method.

            "},{"location":"reference/commands/add/#-exact","title":"--exact","text":"

            Set the exact attribute on added directories.

            "},{"location":"reference/commands/add/#-follow","title":"--follow","text":"

            If the last part of a target is a symlink, add the target of the symlink instead of the symlink itself.

            "},{"location":"reference/commands/add/#-p-prompt","title":"-p, --prompt","text":"

            Interactively prompt before adding each file.

            "},{"location":"reference/commands/add/#-q-quiet","title":"-q, --quiet","text":"

            Suppress warnings about adding ignored entries.

            "},{"location":"reference/commands/add/#-secrets-ignorewarningerror","title":"--secrets ignore|warning|error","text":"

            Configuration: add.secrets

            Action to take when a secret is found when adding a file. The default is warning.

            "},{"location":"reference/commands/add/#-t-template","title":"-T, --template","text":"

            Set the template attribute on added files and symlinks.

            "},{"location":"reference/commands/add/#-template-symlinks","title":"--template-symlinks","text":"

            Configuration: add.templateSymlinks

            When adding symlink to an absolute path in the source directory or destination directory, create a symlink template with .chezmoi.sourceDir or .chezmoi.homeDir. This is useful for creating portable absolute symlinks.

            "},{"location":"reference/commands/add/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/add/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/add/#-f-force","title":"-f, --force","text":"

            Add targets, even if doing so would cause a source template to be overwritten.

            "},{"location":"reference/commands/add/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/add/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/add/#examples","title":"Examples","text":"
            chezmoi add ~/.bashrc\nchezmoi add ~/.gitconfig --template\nchezmoi add ~/.ssh/id_rsa --encrypt\nchezmoi add ~/.vim --recursive\nchezmoi add ~/.oh-my-zsh --exact --recursive\n
            "},{"location":"reference/commands/add/#notes","title":"Notes","text":"

            Bug

            chezmoi add will fail if the entry being added is in a directory implicitly created by an external. See this GitHub issue for details.

            "},{"location":"reference/commands/age/","title":"age","text":"

            Interact with age's passphrase-based encryption.

            "},{"location":"reference/commands/age/#subcommands","title":"Subcommands","text":""},{"location":"reference/commands/age/#age-encrypt-file","title":"age encrypt [file...]","text":"

            Encrypt file or standard input.

            "},{"location":"reference/commands/age/#-p-passphrase","title":"-p, --passphrase","text":"

            Decrypt with a passphrase.

            "},{"location":"reference/commands/age/#age-decrypt-file","title":"age decrypt [file...]","text":"

            Decrypt file or standard input.

            "},{"location":"reference/commands/age/#-p-passphrase_1","title":"-p, --passphrase","text":"

            Decrypt with a passphrase.

            "},{"location":"reference/commands/age/#examples","title":"Examples","text":"
            chezmoi age encrypt --passphrase plaintext.txt > ciphertext.txt\nchezmoi age decrypt --passphrase ciphertext.txt > decrypted-ciphertext.txt\n
            "},{"location":"reference/commands/apply/","title":"apply [target...]","text":"

            Ensure that target... are in the target state, updating them if necessary. If no targets are specified, the state of all targets are ensured. If a target has been modified since chezmoi last wrote it then the user will be prompted if they want to overwrite the file.

            "},{"location":"reference/commands/apply/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/apply/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/apply/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/apply/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/apply/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/commands/apply/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/apply/#-source-path","title":"--source-path","text":"

            Specify targets by source path, rather than target path. This is useful for applying changes after editing.

            "},{"location":"reference/commands/apply/#examples","title":"Examples","text":"
            chezmoi apply\nchezmoi apply --dry-run --verbose\nchezmoi apply ~/.bashrc\n
            "},{"location":"reference/commands/archive/","title":"archive [target....]","text":"

            Generate an archive of the target state, or only the targets specified. This can be piped into tar to inspect the target state.

            "},{"location":"reference/commands/archive/#flags","title":"Flags","text":""},{"location":"reference/commands/archive/#-f-format-format","title":"-f, --format format","text":"

            Write the archive in format. If --output is set the format is guessed from the extension, otherwise the default is tar.

            Supported formats tar tar.gz tgz zip"},{"location":"reference/commands/archive/#-z-gzip","title":"-z, --gzip","text":"

            Compress the archive with gzip. This is automatically set if the format is tar.gz or tgz and is ignored if the format is zip.

            "},{"location":"reference/commands/archive/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/archive/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/archive/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/archive/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/archive/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/commands/archive/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/archive/#examples","title":"Examples","text":"
            chezmoi archive | tar tvf -\nchezmoi archive --output=dotfiles.tar.gz\nchezmoi archive --output=dotfiles.zip\n
            "},{"location":"reference/commands/cat-config/","title":"cat-config","text":"

            Print the configuration file.

            "},{"location":"reference/commands/cat-config/#examples","title":"Examples","text":"
            chezmoi cat-config\n
            "},{"location":"reference/commands/cat/","title":"cat target...","text":"

            Write the target contents of targets to stdout. targets must be files, scripts, or symlinks. For files, the target file contents are written. For scripts, the script's contents are written. For symlinks, the target is written.

            "},{"location":"reference/commands/cat/#examples","title":"Examples","text":"
            chezmoi cat ~/.bashrc\n
            "},{"location":"reference/commands/cd/","title":"cd [path]","text":"

            Launch a shell in the working tree (typically the source directory). chezmoi will launch the command set by the cd.command configuration variable with any extra arguments specified by cd.args. If this is not set, chezmoi will attempt to detect your shell and finally fall back to an OS-specific default.

            If the optional argument path is present, the shell will be launched in the source directory corresponding to path.

            The shell will have various CHEZMOI* environment variables set, as for scripts.

            Hint

            This does not change the current directory of the current shell. To do that, instead use:

            $ cd $(chezmoi source-path)\n
            "},{"location":"reference/commands/cd/#examples","title":"Examples","text":"
            chezmoi cd\nchezmoi cd ~\nchezmoi cd ~/.config\n
            "},{"location":"reference/commands/chattr/","title":"chattr modifier target...","text":"

            Change the attributes and/or type of targets. modifier specifies what to modify.

            Add attributes by specifying them or their abbreviations directly, optionally prefixed with a plus sign (+). Remove attributes by prefixing them or their attributes with the string no or a minus sign (-). The available attribute modifiers and their abbreviations are:

            Attribute modifier Abbreviation after a before b empty e encrypted none exact none executable x external none once o private p readonly r remove none template t

            The type of a target can be changed using a type modifier:

            Type modifier create modify script symlink

            The negative form of type modifiers, e.g. nocreate, changes the target to be a regular file if it is of that type, otherwise the type is left unchanged.

            Multiple modifications may be specified by separating them with a comma (,). If you use the -modifier form then you must put modifier after a -- to prevent chezmoi from interpreting -modifier as an option.

            "},{"location":"reference/commands/chattr/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/chattr/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories.

            "},{"location":"reference/commands/chattr/#examples","title":"Examples","text":"
            chezmoi chattr template ~/.bashrc\nchezmoi chattr noempty ~/.profile\nchezmoi chattr private,template ~/.netrc\nchezmoi chattr -- -x ~/.zshrc\nchezmoi chattr +create,+private ~/.kube/config\n
            "},{"location":"reference/commands/completion/","title":"completion shell","text":"

            Generate shell completion code for the specified shell (bash, fish, powershell, or zsh).

            "},{"location":"reference/commands/completion/#examples","title":"Examples","text":"
            chezmoi completion bash\nchezmoi completion fish --output=~/.config/fish/completions/chezmoi.fish\n
            "},{"location":"reference/commands/data/","title":"data","text":"

            Write the computed template data to stdout.

            "},{"location":"reference/commands/data/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/data/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

            Set the output format, json by default.

            "},{"location":"reference/commands/data/#examples","title":"Examples","text":"
            chezmoi data\nchezmoi data --format=yaml\n
            "},{"location":"reference/commands/decrypt/","title":"decrypt [file...]","text":"

            Decrypt files using chezmoi's configured encryption. If no files are given, decrypt the standard input. The decrypted result is written to the standard output or a file if the --output flag is set.

            "},{"location":"reference/commands/destroy/","title":"destroy target...","text":"

            Danger

            The destroy command permanently removes files both from your home directory and chezmoi's source directory.

            Only run chezmoi destroy if you have a separate backup of your home directory and your source directory.

            If you want chezmoi to stop managing the file use forget instead.

            If you want to remove all traces of chezmoi from your system use purge instead.

            Remove target from the source state, the destination directory, and the state.

            "},{"location":"reference/commands/destroy/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/destroy/#-force","title":"--force","text":"

            Destroy without prompting.

            "},{"location":"reference/commands/destroy/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories.

            "},{"location":"reference/commands/diff/","title":"diff [target...]","text":"

            Print the difference between the target state and the destination state for targets. If no targets are specified, print the differences for all targets.

            If a diff.pager command is set in the configuration file then the output will be piped into it.

            If diff.command is set then it will be invoked to show individual file differences with diff.args passed as arguments. Each element of diff.args is interpreted as a template with the variables .Destination and .Target available corresponding to the path of the file in the source and target state respectively. The default value of diff.args is [\"{{ .Destination }}\", \"{{ .Target }}\"]. If diff.args does not contain any template arguments then {{ .Destination }} and {{ .Target }} will be appended automatically.

            "},{"location":"reference/commands/diff/#flags","title":"Flags","text":""},{"location":"reference/commands/diff/#-pager-pager","title":"--pager pager","text":"

            Configuration: diff.pager

            Pager to use for output.

            "},{"location":"reference/commands/diff/#-reverse","title":"--reverse","text":"

            Configuration: diff.reverse

            Reverse the direction of the diff, i.e. show the changes to the target required to match the destination.

            "},{"location":"reference/commands/diff/#-script-contents","title":"--script-contents","text":"

            Show script contents, defaults to true.

            "},{"location":"reference/commands/diff/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/diff/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/diff/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/diff/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/diff/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/commands/diff/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories.

            "},{"location":"reference/commands/diff/#examples","title":"Examples","text":"
            chezmoi diff\nchezmoi diff ~/.bashrc\n
            "},{"location":"reference/commands/doctor/","title":"doctor","text":"

            Check for potential problems.

            "},{"location":"reference/commands/doctor/#flags","title":"Flags","text":""},{"location":"reference/commands/doctor/#-no-network","title":"--no-network","text":"

            Do not use any network connections.

            "},{"location":"reference/commands/doctor/#examples","title":"Examples","text":"
            chezmoi doctor\n
            "},{"location":"reference/commands/dump-config/","title":"dump-config","text":"

            Dump the configuration.

            "},{"location":"reference/commands/dump-config/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/dump-config/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

            Set the output format, json by default.

            "},{"location":"reference/commands/dump-config/#examples","title":"Examples","text":"
            chezmoi dump-config\n
            "},{"location":"reference/commands/dump/","title":"dump [target...]","text":"

            Dump the target state of targets. If no targets are specified, then the entire target state.

            "},{"location":"reference/commands/dump/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/dump/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/dump/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

            Set the output format, json by default.

            "},{"location":"reference/commands/dump/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/dump/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/dump/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/commands/dump/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/dump/#examples","title":"Examples","text":"
            chezmoi dump ~/.bashrc\nchezmoi dump --format=yaml\n
            "},{"location":"reference/commands/edit-config-template/","title":"edit-config-template","text":"

            Edit the configuration file template. If no configuration file template exists, then a new one is created with the contents of the current config file.

            "},{"location":"reference/commands/edit-config-template/#examples","title":"Examples","text":"
            chezmoi edit-config-template\n
            "},{"location":"reference/commands/edit-config/","title":"edit-config","text":"

            Edit the configuration file.

            "},{"location":"reference/commands/edit-config/#examples","title":"Examples","text":"
            chezmoi edit-config\n
            "},{"location":"reference/commands/edit/","title":"edit [target...]","text":"

            Edit the source state of targets, which must be files or symlinks. If no targets are given then the working tree of the source directory is opened.

            Encrypted files are decrypted to a private temporary directory and the editor is invoked with the decrypted file. When the editor exits the edited decrypted file is re-encrypted and replaces the original file in the source state.

            If the operating system supports hard links, then the edit command invokes the editor with filenames which match the target filename, unless the edit.hardlink configuration variable is set to false or the --hardlink=false command line flag is set.

            "},{"location":"reference/commands/edit/#flags","title":"Flags","text":""},{"location":"reference/commands/edit/#-a-apply","title":"-a, --apply","text":"

            Configuration: edit.apply

            Apply target immediately after editing. Ignored if there are no targets.

            "},{"location":"reference/commands/edit/#-hardlink-bool","title":"--hardlink bool","text":"

            Configuration: edit.hardlink

            Invoke the editor with a hard link to the source file with a name matching the target filename. This can help the editor determine the type of the file correctly. This is the default.

            "},{"location":"reference/commands/edit/#-watch","title":"--watch","text":"

            Configuration: edit.watch

            Automatically apply changes when files are saved, with the following limitations:

            • Only available when chezmoi edit is invoked with arguments (i.e. argument-free chezmoi edit is not supported).
            • All edited files are applied when any file is saved.
            • Only the edited files are watched, not any dependent files (e.g. .chezmoitemplates and included files in templates are not watched).
            • Only works on operating systems supported by fsnotify.
            "},{"location":"reference/commands/edit/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/edit/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/edit/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/edit/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/edit/#examples","title":"Examples","text":"
            chezmoi edit ~/.bashrc\nchezmoi edit ~/.bashrc --apply\nchezmoi edit\n
            "},{"location":"reference/commands/encrypt/","title":"encrypt [file...]","text":"

            Encrypt files using chezmoi's configured encryption. If no files are given, encrypt the standard input. The encrypted result is written to the standard output or a file if the --output flag is set.

            "},{"location":"reference/commands/execute-template/","title":"execute-template [template...]","text":"

            Execute templates. This is useful for testing templates or for calling chezmoi from other scripts. templates are interpreted as literal templates, with no whitespace added to the output between arguments. If no templates are specified, the template is read from stdin.

            "},{"location":"reference/commands/execute-template/#flags","title":"Flags","text":""},{"location":"reference/commands/execute-template/#-i-init","title":"-i, --init","text":"

            Include simulated functions only available during chezmoi init.

            "},{"location":"reference/commands/execute-template/#-left-delimiter-delimiter","title":"--left-delimiter delimiter","text":"

            Set the left template delimiter.

            "},{"location":"reference/commands/execute-template/#-promptbool-pairs","title":"--promptBool pairs","text":"

            Simulate the promptBool template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptBool is called with a prompt that does not match any of pairs, then it returns false.

            "},{"location":"reference/commands/execute-template/#-promptchoice-pairs","title":"--promptChoice pairs","text":"

            Simulate the promptChoice template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptChoice is called with a prompt that does not match any of pairs, then it returns false.

            "},{"location":"reference/commands/execute-template/#-promptint-pairs","title":"--promptInt pairs","text":"

            Simulate the promptInt template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptInt is called with a prompt that does not match any of pairs, then it returns zero.

            "},{"location":"reference/commands/execute-template/#-p-promptstring-pairs","title":"-p, --promptString pairs","text":"

            Simulate the promptString template function with a function that returns values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptString is called with a prompt that does not match any of pairs, then it returns prompt unchanged.

            "},{"location":"reference/commands/execute-template/#-right-delimiter-delimiter","title":"--right-delimiter delimiter","text":"

            Set the right template delimiter.

            "},{"location":"reference/commands/execute-template/#-stdinisatty-bool","title":"--stdinisatty bool","text":"

            Simulate the stdinIsATTY function by returning bool.

            "},{"location":"reference/commands/execute-template/#-with-stdin","title":"--with-stdin","text":"

            If run with arguments, then set .chezmoi.stdin to the contents of the standard input.

            "},{"location":"reference/commands/execute-template/#examples","title":"Examples","text":"
            chezmoi execute-template '{{ .chezmoi.sourceDir }}'\nchezmoi execute-template '{{ .chezmoi.os }}' / '{{ .chezmoi.arch }}'\necho '{{ .chezmoi | toJson }}' | chezmoi execute-template\nchezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl\n
            "},{"location":"reference/commands/forget/","title":"forget target...","text":"

            Remove targets from the source state, i.e. stop managing them. targets must have entries in the source state. They cannot be externals.

            "},{"location":"reference/commands/forget/#examples","title":"Examples","text":"
            chezmoi forget ~/.bashrc\n
            "},{"location":"reference/commands/generate/","title":"generate output","text":"

            Generates output for use with chezmoi. The currently supported outputs are:

            Output Description git-commit-message A git commit message, describing the changes to the source directory. install.sh An install script, suitable for use with GitHub Codespaces"},{"location":"reference/commands/generate/#examples","title":"Examples","text":"
            chezmoi generate install.sh > install.sh\nchezmoi git commit -m \"$(chezmoi generate git-commit-message)\"\n
            "},{"location":"reference/commands/git/","title":"git [arg...]","text":"

            Run git args in the working tree (typically the source directory).

            Note

            Flags in args must occur after -- to prevent chezmoi from interpreting them.

            "},{"location":"reference/commands/git/#examples","title":"Examples","text":"
            chezmoi git add .\nchezmoi git add dot_gitconfig\nchezmoi git -- commit -m \"Add .gitconfig\"\n
            "},{"location":"reference/commands/help/","title":"help [command...]","text":"

            Print the help associated with command, or general help if no command is given.

            "},{"location":"reference/commands/ignored/","title":"ignored","text":"

            Print the list of entries ignored by chezmoi.

            "},{"location":"reference/commands/ignored/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/ignored/#-t-tree","title":"-t, --tree","text":"

            Print paths as a tree instead of a list.

            "},{"location":"reference/commands/ignored/#examples","title":"Examples","text":"
            chezmoi ignored\n
            "},{"location":"reference/commands/import/","title":"import filename","text":"

            Import the source state from an archive file in to a directory in the source state. This is primarily used to make subdirectories of your home directory exactly match the contents of a downloaded archive. You will generally always want to set the --destination, --exact, and --remove-destination flags.

            The supported archive formats are tar, tar.gz, tgz, tar.bz2, tbz2, txz, tar.zst, and zip.

            "},{"location":"reference/commands/import/#flags","title":"Flags","text":""},{"location":"reference/commands/import/#-d-destination-directory","title":"-d, --destination directory","text":"

            Set the destination (in the source state) where the archive will be imported.

            "},{"location":"reference/commands/import/#-exact","title":"--exact","text":"

            Set the exact attribute on all imported directories.

            "},{"location":"reference/commands/import/#-r-remove-destination","title":"-r, --remove-destination","text":"

            Remove destination (in the source state) before importing.

            "},{"location":"reference/commands/import/#-strip-components-n","title":"--strip-components n","text":"

            Strip n leading components from paths.

            "},{"location":"reference/commands/import/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/import/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/import/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/import/#examples","title":"Examples","text":"
            curl -s -L -o ${TMPDIR}/oh-my-zsh-master.tar.gz https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz\nmkdir -p $(chezmoi source-path)/dot_oh-my-zsh\nchezmoi import --strip-components 1 --destination ~/.oh-my-zsh ${TMPDIR}/oh-my-zsh-master.tar.gz\n
            "},{"location":"reference/commands/init/","title":"init [repo]","text":"

            Setup the source directory, generate the config file, and optionally update the destination directory to match the target state.

            By default, if repo is given, chezmoi will guess the full git repo URL, using HTTPS by default, or SSH if the --ssh option is specified, according to the following patterns:

            Pattern HTTPS Repo SSH repo user https://user@github.com/user/dotfiles.git git@github.com:user/dotfiles.git user/repo https://user@github.com/user/repo.git git@github.com:user/repo.git site/user/repo https://user@site/user/repo.git git@site:user/repo.git sr.ht/~user https://user@git.sr.ht/~user/dotfiles git@git.sr.ht:~user/dotfiles.git sr.ht/~user/repo https://user@git.sr.ht/~user/repo git@git.sr.ht:~user/repo.git

            To disable git repo URL guessing, pass the --guess-repo-url=false option.

            First, if the source directory does not already contain a repository, then if repo is given, it is checked out into the source directory; otherwise a new repository is initialized in the source directory.

            Second, if a file called .chezmoi.$FORMAT.tmpl exists, where $FORMAT is one of the supported file formats (e.g. json, jsonc, toml, or yaml) then a new configuration file is created using that file as a template.

            Then, if the --apply flag is passed, chezmoi apply is run.

            Then, if the --purge flag is passed, chezmoi will remove its source, config, and cache directories.

            Finally, if the --purge-binary is passed, chezmoi will attempt to remove its own binary.

            "},{"location":"reference/commands/init/#flags","title":"Flags","text":""},{"location":"reference/commands/init/#-a-apply","title":"-a, --apply","text":"

            Run chezmoi apply after checking out the repo and creating the config file.

            "},{"location":"reference/commands/init/#-branch-branch","title":"--branch branch","text":"

            Check out branch instead of the default branch.

            "},{"location":"reference/commands/init/#-c-config-path-path","title":"-C, --config-path path","text":"

            Write the generated config file to path instead of the default location.

            "},{"location":"reference/commands/init/#-data-bool","title":"--data bool","text":"

            Include existing template data when creating the config file. This defaults to true. Set this to false to simulate creating the config file with no existing template data.

            "},{"location":"reference/commands/init/#-d-depth-depth","title":"-d, --depth depth","text":"

            Clone the repo with depth depth.

            "},{"location":"reference/commands/init/#-git-lfs-bool","title":"--git-lfs bool","text":"

            Run git lfs pull after cloning the repo.

            "},{"location":"reference/commands/init/#-g-guess-repo-url-bool","title":"-g, --guess-repo-url bool","text":"

            Guess the repo URL from the repo argument. This defaults to true.

            "},{"location":"reference/commands/init/#-one-shot","title":"--one-shot","text":"

            --one-shot is the equivalent of --apply, --depth=1, --force, --purge, and --purge-binary. It attempts to install your dotfiles with chezmoi and then remove all traces of chezmoi from the system. This is useful for setting up temporary environments (e.g. Docker containers).

            "},{"location":"reference/commands/init/#-prompt","title":"--prompt","text":"

            Force the prompt*Once template functions to prompt.

            "},{"location":"reference/commands/init/#-promptbool-pairs","title":"--promptBool pairs","text":"

            Populate the promptBool template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptBool is called with a prompt that does not match any of pairs, then it prompts the user for a value.

            "},{"location":"reference/commands/init/#-promptchoice-pairs","title":"--promptChoice pairs","text":"

            Populate the promptChoice template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptChoice is called with a prompt that does not match any of pairs, then it prompts the user for a value.

            "},{"location":"reference/commands/init/#-promptdefaults","title":"--promptDefaults","text":"

            Make all prompt* template function calls with a default value return that default value instead of prompting.

            "},{"location":"reference/commands/init/#-promptint-pairs","title":"--promptInt pairs","text":"

            Populate the promptInt template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If prompInt is called with a prompt that does not match any of pairs, then it prompts the user for a value.

            "},{"location":"reference/commands/init/#-promptstring-pairs","title":"--promptString pairs","text":"

            Populate the promptString template function with values from pairs. pairs is a comma-separated list of prompt=value pairs. If promptString is called with a prompt that does not match any of pairs, then it prompts the user for a value.

            "},{"location":"reference/commands/init/#-p-purge","title":"-p, --purge","text":"

            Remove the source and config directories after applying.

            "},{"location":"reference/commands/init/#-p-purge-binary","title":"-P, --purge-binary","text":"

            Attempt to remove the chezmoi binary after applying.

            "},{"location":"reference/commands/init/#-recurse-submodules-bool","title":"--recurse-submodules bool","text":"

            Recursively clone submodules. This defaults to true.

            "},{"location":"reference/commands/init/#-ssh","title":"--ssh","text":"

            Guess an SSH repo URL instead of an HTTPS repo.

            "},{"location":"reference/commands/init/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/init/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/init/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/init/#examples","title":"Examples","text":"
            chezmoi init user\nchezmoi init user --apply\nchezmoi init user --apply --purge\nchezmoi init user/dots\nchezmoi init codeberg.org/user\nchezmoi init gitlab.com/user\n
            "},{"location":"reference/commands/license/","title":"license","text":"

            Print chezmoi's license.

            "},{"location":"reference/commands/license/#examples","title":"Examples","text":"
            chezmoi license\n
            "},{"location":"reference/commands/list/","title":"list","text":"

            list is an alias for managed.

            "},{"location":"reference/commands/manage/","title":"manage target...","text":"

            manage is an alias for add for symmetry with unmanage.

            "},{"location":"reference/commands/managed/","title":"managed [path...]","text":"

            List all managed entries in the destination directory under all paths in alphabetical order. When no paths are supplied, list all managed entries in the destination directory in alphabetical order.

            "},{"location":"reference/commands/managed/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/managed/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/managed/#-f-format-jsonyaml","title":"-f, --format json|yaml","text":"

            Set the output format, json by default.

            "},{"location":"reference/commands/managed/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/managed/#-p-path-style-style","title":"-p, --path-style style","text":"

            Print paths in the given style. The default is relative.

            Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory source-absolute Absolute paths in the source tree directory source-relative Relative paths to the source tree directory all All path styles, indexed by relative"},{"location":"reference/commands/managed/#-t-tree","title":"-t, --tree","text":"

            Print paths as a tree instead of a list.

            "},{"location":"reference/commands/managed/#examples","title":"Examples","text":"
            chezmoi managed\nchezmoi managed --include=files\nchezmoi managed --include=files,symlinks\nchezmoi managed -i dirs\nchezmoi managed -i dirs,files\nchezmoi managed -i files ~/.config\nchezmoi managed --exclude=encrypted --path-style=source-relative\n
            "},{"location":"reference/commands/merge-all/","title":"merge-all","text":"

            Perform a three-way merge for file whose actual state does not match its target state. The merge is performed with chezmoi merge.

            "},{"location":"reference/commands/merge-all/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/merge-all/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/merge-all/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/merge-all/#examples","title":"Examples","text":"
            chezmoi merge-all\n
            "},{"location":"reference/commands/merge/","title":"merge target...","text":"

            Perform a three-way merge between the destination state, the target state, and the source state for each target. The merge tool is defined by the merge.command configuration variable, and defaults to vimdiff. If multiple targets are specified the merge tool is invoked separately and sequentially for each target. If the target state cannot be computed (for example if source is a template containing errors or an encrypted file that cannot be decrypted) a two-way merge is performed instead.

            The order of arguments to merge.command is set by merge.args. Each argument is interpreted as a template with the variables .Destination, .Source, and .Target available corresponding to the path of the file in the destination state, the source state, and the target state respectively. The default value of merge.args is [\"{{ .Destination }}\", \"{{ .Source }}\", \"{{ .Target }}\"]. If merge.args does not contain any template arguments then {{ .Destination }}, {{ .Source }}, and {{ .Target }} will be appended automatically.

            "},{"location":"reference/commands/merge/#examples","title":"Examples","text":"
            chezmoi merge ~/.bashrc\n
            "},{"location":"reference/commands/purge/","title":"purge","text":"

            Remove chezmoi's configuration, state, and source directory, but leave the target state intact.

            "},{"location":"reference/commands/purge/#flags","title":"Flags","text":""},{"location":"reference/commands/purge/#-p-binary","title":"-P, --binary","text":"

            Purge chezmoi binary.

            "},{"location":"reference/commands/purge/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/purge/#-force","title":"--force","text":"

            Remove without prompting.

            "},{"location":"reference/commands/purge/#examples","title":"Examples","text":"
            chezmoi purge\nchezmoi purge --force\n
            "},{"location":"reference/commands/re-add/","title":"re-add [target...]","text":"

            Re-add modified files in the target state, preserving any encrypted_ attributes. chezmoi will not overwrite templates, and all entries that are not files are ignored. Directories are recursed into by default.

            If no targets are specified then all modified files are re-added. If one or more targets are given then only those targets are re-added.

            "},{"location":"reference/commands/re-add/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/re-add/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/re-add/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/re-add/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/re-add/#examples","title":"Examples","text":"
            chezmoi re-add\nchezmoi re-add ~/.bashrc\nchezmoi re-add --recursive=false ~/.config/git\n
            "},{"location":"reference/commands/re-add/#notes","title":"Notes","text":"

            Hint

            If you want to re-add a single file unconditionally, use chezmoi add --force instead.

            "},{"location":"reference/commands/remove/","title":"remove","text":"

            The remove command has been removed. Use the forget command or the destroy command instead.

            "},{"location":"reference/commands/rm/","title":"rm","text":"

            The rm command has been removed. Use the forget command or the destroy command instead.

            "},{"location":"reference/commands/secret/","title":"secret","text":"

            Run a secret manager's CLI, passing any extra arguments to the secret manager's CLI. This is primarily for verifying chezmoi's integration with a custom secret manager. Normally you would use chezmoi's existing template functions to retrieve secrets.

            Note

            If you need to pass flags to the secret manager's CLI you must separate them with -- to prevent chezmoi from interpreting them.

            "},{"location":"reference/commands/secret/#subcommands","title":"Subcommands","text":""},{"location":"reference/commands/secret/#secret-keyring-delete","title":"secret keyring delete","text":""},{"location":"reference/commands/secret/#-service-string","title":"--service string","text":"

            Name of the service.

            "},{"location":"reference/commands/secret/#-user-string","title":"--user string","text":"

            Name of the user.

            "},{"location":"reference/commands/secret/#secret-keyring-get","title":"secret keyring get","text":""},{"location":"reference/commands/secret/#-service-string_1","title":"--service string","text":"

            Name of the service.

            "},{"location":"reference/commands/secret/#-user-string_1","title":"--user string","text":"

            Name of the user.

            "},{"location":"reference/commands/secret/#secret-keyring-set","title":"secret keyring set","text":""},{"location":"reference/commands/secret/#-service-string_2","title":"--service string","text":"

            Name of the service.

            "},{"location":"reference/commands/secret/#-user-string_2","title":"--user string","text":"

            Name of the user.

            "},{"location":"reference/commands/secret/#-value-string","title":"--value string","text":"

            New value.

            "},{"location":"reference/commands/secret/#examples","title":"Examples","text":"
            chezmoi secret keyring set --service=service --user=user --value=password\nchezmoi secret keyring get --service=service --user=user\nchezmoi secret keyring delete --service=service --user=user\n
            "},{"location":"reference/commands/secret/#notes","title":"Notes","text":"

            Warning

            On FreeBSD, the secret keyring command is only available if chezmoi was compiled with cgo enabled. The official release binaries of chezmoi are not compiled with cgo enabled, and secret keyring command is not available.

            "},{"location":"reference/commands/source-path/","title":"source-path [target...]","text":"

            Print the path to each target's source state. If no targets are specified then print the source directory.

            "},{"location":"reference/commands/source-path/#examples","title":"Examples","text":"
            chezmoi source-path\nchezmoi source-path ~/.bashrc\n
            "},{"location":"reference/commands/state/","title":"state","text":"

            Manipulate the persistent state.

            Hint

            To get a full list of subcommands run:

            $ chezmoi state help\n
            "},{"location":"reference/commands/state/#subcommands","title":"Subcommands","text":""},{"location":"reference/commands/state/#data","title":"data","text":"

            Print the raw data in the persistent state.

            "},{"location":"reference/commands/state/#delete","title":"delete","text":"

            Delete a value from the persistent state.

            "},{"location":"reference/commands/state/#delete-bucket","title":"delete-bucket","text":"

            Delete a bucket from the persistent state.

            "},{"location":"reference/commands/state/#dump","title":"dump","text":"

            Generate a dump of the persistent state.

            "},{"location":"reference/commands/state/#get","title":"get","text":"

            Get a value from the persistent state.

            "},{"location":"reference/commands/state/#get-bucket","title":"get-bucket","text":"

            Get a bucket from the persistent state.

            "},{"location":"reference/commands/state/#reset","title":"reset","text":"

            Reset the persistent state.

            "},{"location":"reference/commands/state/#set","title":"set","text":"

            Set a value from the persistent state

            "},{"location":"reference/commands/state/#examples","title":"Examples","text":"
            chezmoi state data\nchezmoi state delete --bucket=$BUCKET --key=$KEY\nchezmoi state delete-bucket --bucket=$BUCKET\nchezmoi state dump\nchezmoi state get --bucket=$BUCKET --key=$KEY\nchezmoi state get-bucket --bucket=$BUCKET\nchezmoi state set --bucket=$BUCKET --key=$KEY --value=$VALUE\nchezmoi state reset\n
            "},{"location":"reference/commands/status/","title":"status","text":"

            Print the status of the files and scripts managed by chezmoi in a format similar to git status.

            The first column of output indicates the difference between the last state written by chezmoi and the actual state. The second column indicates the difference between the actual state and the target state, and what effect running chezmoi apply will have.

            Character Meaning First column Second column Space No change No change No change A Added Entry was created Entry will be created D Deleted Entry was deleted Entry will be deleted M Modified Entry was modified Entry will be modified R Run Not applicable Script will be run"},{"location":"reference/commands/status/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/status/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/status/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/status/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/status/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/commands/status/#-p-path-style-style","title":"-p, --path-style style","text":"

            Print paths in the given style. The default is relative.

            Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory source-absolute Absolute paths in the source tree directory source-relative Relative paths to the source tree directory all All path styles, indexed by relative"},{"location":"reference/commands/status/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/status/#examples","title":"Examples","text":"
            chezmoi status\n
            "},{"location":"reference/commands/target-path/","title":"target-path [source-path...]","text":"

            Print the target path of each source path. If no source paths are specified then print the target directory.

            "},{"location":"reference/commands/target-path/#examples","title":"Examples","text":"
            chezmoi target-path\nchezmoi target-path ~/.local/share/chezmoi/dot_zshrc\n
            "},{"location":"reference/commands/unmanage/","title":"unmanage target...","text":"

            unmanage is an alias for forget for symmetry with manage.

            "},{"location":"reference/commands/unmanaged/","title":"unmanaged [path...]","text":"

            List all unmanaged files in paths. When no paths are supplied, list all unmanaged files in the destination directory.

            It is an error to supply paths that are not found on the filesystem.

            "},{"location":"reference/commands/unmanaged/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/unmanaged/#-p-path-style-style","title":"-p, --path-style style","text":"

            Print paths in the given style. The default is relative.

            Style Description absolute Absolute paths in the destination directory relative Relative paths to the destination directory"},{"location":"reference/commands/unmanaged/#-t-tree","title":"-t, --tree","text":"

            Print paths as a tree instead of a list.

            "},{"location":"reference/commands/unmanaged/#examples","title":"Examples","text":"
            chezmoi unmanaged\nchezmoi unmanaged ~/.config/chezmoi ~/.ssh\n
            "},{"location":"reference/commands/update/","title":"update","text":"

            Pull changes from the source repo and apply any changes.

            If update.command is set then chezmoi will run update.command with update.args in the working tree. Otherwise, chezmoi will run git pull --autostash --rebase [--recurse-submodules] , using chezmoi's builtin git if useBuiltinGit is true or if git.command cannot be found in $PATH.

            "},{"location":"reference/commands/update/#flags","title":"Flags","text":""},{"location":"reference/commands/update/#-a-apply","title":"-a, --apply","text":"

            Apply changes after pulling, true by default. Can be disabled with --apply=false.

            "},{"location":"reference/commands/update/#-recurse-submodules","title":"--recurse-submodules","text":"

            Update submodules recursively. This defaults to true. Can be disabled with --recurse-submodules=false.

            "},{"location":"reference/commands/update/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/update/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/update/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/update/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/update/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/commands/update/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/update/#examples","title":"Examples","text":"
            chezmoi update\n
            "},{"location":"reference/commands/upgrade/","title":"upgrade","text":"

            Upgrade chezmoi by downloading and installing the latest released version. This will call the GitHub API to determine if there is a new version of chezmoi available, and if so, download and attempt to install it in the same way as chezmoi was previously installed.

            If the any of the $CHEZMOI_GITHUB_ACCESS_TOKEN, $CHEZMOI_GITHUB_TOKEN, $GITHUB_ACCESS_TOKEN, or $GITHUB_TOKEN environment variables are set, then the first value found will be used to authenticate requests to the GitHub API, otherwise unauthenticated requests are used which are subject to stricter rate limiting. Unauthenticated requests should be sufficient for most cases.

            Warning

            If you installed chezmoi using a package manager, the upgrade command might have been removed by the package maintainer.

            "},{"location":"reference/commands/upgrade/#flags","title":"Flags","text":""},{"location":"reference/commands/upgrade/#-executable-filename","title":"--executable filename","text":"

            Set name of executable to replace.

            "},{"location":"reference/commands/upgrade/#-method-method","title":"--method method","text":"

            Override the upgrade method that was automatically detected by chezmoi.

            Danger

            This flag should only be used when recommended by chezmoi developers.

            Methods Description brew-upgrade Run brew upgrade chezmoi. replace-executable Download the latest released executable from Github. snap-refresh Run snap refresh chezmoi. sudo-upgrade-package Same as upgrade-package but use sudo. upgrade-package Download and install .apk, .deb or .rpm package. Run pacman on Arch Linux."},{"location":"reference/commands/verify/","title":"verify [target...]","text":"

            Verify that all targets match their target state. chezmoi exits with code 0 (success) if all targets match their target state, or 1 (failure) otherwise. If no targets are specified then all targets are checked.

            "},{"location":"reference/commands/verify/#common-flags","title":"Common flags","text":""},{"location":"reference/commands/verify/#-x-exclude-types","title":"-x, --exclude types","text":"

            Exclude target state entries of specific types. The default is none.

            Types can be explicitly included with the --include flag.

            Example

            --exclude=scripts will cause the command to not run scripts and --exclude=encrypted will exclude encrypted files.

            "},{"location":"reference/commands/verify/#-i-include-types","title":"-i, --include types","text":"

            Include target state entries of specific types. The default is all.

            Types can be explicitly excluded with the --exclude flag.

            Example

            --include=files specifies all files.

            "},{"location":"reference/commands/verify/#-init","title":"--init","text":"

            Regenerate and reload the config file from its template before computing the target state.

            "},{"location":"reference/commands/verify/#-p-parent-dirs","title":"-P, --parent-dirs","text":"

            Execute the command on target and all its parent directories.

            "},{"location":"reference/commands/verify/#-r-recursive","title":"-r, --recursive","text":"

            Recurse into subdirectories. Enabled by default. Can be disabled with --recursive=false.

            "},{"location":"reference/commands/verify/#examples","title":"Examples","text":"
            chezmoi verify\nchezmoi verify ~/.bashrc\n
            "},{"location":"reference/configuration-file/","title":"Configuration file","text":"

            chezmoi searches for its configuration file according to the XDG Base Directory Specification and supports JSON, JSONC, TOML, and YAML. The basename of the config file is chezmoi. If multiple configuration file formats are present, chezmoi will report an error.

            In most installations, the config file will be read from $HOME/.config/chezmoi/chezmoi.$FORMAT (%USERPROFILE%/.config/chezmoi/chezmoi.$FORMAT), where $FORMAT is one of json, jsonc, toml, or yaml. The config file can be set explicitly with the --config command line option. By default, the format is detected based on the extension of the config file name, but can be overridden with the --config-format command line option.

            "},{"location":"reference/configuration-file/#examples","title":"Examples","text":"JSONJSONCTOMLYAML ~/.config/chezmoi/chezmoi.json
            {\n    \"sourceDir\": \"/home/user/.dotfiles\",\n    \"git\": {\n        \"autoPush\": true\n    }\n}\n
            ~/.config/chezmoi/chezmoi.jsonc
            {\n    // The chezmoi source files are stored here\n    \"sourceDir\": \"/home/user/.dotfiles\",\n    \"git\": {\n        \"autoPush\": true\n    }\n}\n
            ~/.config/chezmoi/chezmoi.toml
            sourceDir = \"/home/user/.dotfiles\"\n[git]\n    autoPush = true\n
            ~/.config/chezmoi/chezmoi.yaml
            sourceDir: /home/user/.dotfiles\ngit:\n    autoPush: true\n
            "},{"location":"reference/configuration-file/editor/","title":"Editor","text":"

            The editor used is the first non-empty string of the edit.command configuration variable, the $VISUAL environment variable, the $EDITOR environment variable. If none are set then chezmoi falls back to notepad.exe on Windows systems and vi on non-Windows systems.

            When the edit.command configuration variable is used, extra arguments can be passed to the editor with the edit.args configuration variable.

            chezmoi will emit a warning if the editor returns in less than edit.minDuration (default 1s). To disable this warning, set edit.minDuration to 0.

            "},{"location":"reference/configuration-file/hooks/","title":"Hooks","text":"

            Hook commands are executed before and after events. Unlike scripts, hooks are always run, even if --dry-run is specified. Hooks should be fast and idempotent.

            The following events are defined:

            Event Trigger command, e.g. add Running chezmoi command, e.g. chezmoi add git-auto-commit Generating an automatic git commit git-auto-push Running an automatic git push read-source-state Reading the source state

            Each event can have a .pre and/or a .post command. The event.pre command is executed before event occurs and the event.post command is executed after event has occurred.

            A command contains a command or script and an optional array of strings args. commands are executed directly. scripts are executed with configured interpreter for the script's extension, see the section on interpreters.

            Example

            ~/.config/chezmoi/chezmoi.toml
            [hooks.read-source-state.pre]\ncommand = \"echo\"\nargs = [\"pre-read-source-state-hook\"]\n\n[hooks.apply.post]\ncommand = \"echo\"\nargs = [\"post-apply-hook\"]\n\n[hooks.add.post]\nscript = \"post-add-hook.ps1'\n

            When running hooks, the CHEZMOI=1 and CHEZMOI_* environment variables will be set. CHEZMOI_COMMAND is set to the chezmoi command being run, CHEZMOI_COMMAND_DIR is set to the directory where chezmoi was run from, and CHEZMOI_ARGS contains the full arguments to chezmoi, starting with the path to chezmoi's executable.

            "},{"location":"reference/configuration-file/interpreters/","title":"Interpreters","text":"

            The execution of scripts and hooks on Windows depends on the file extension. Windows will natively execute scripts with a .bat, .cmd, .com, and .exe extensions. Other extensions require an interpreter, which must be in your %PATH%.

            The default script interpreters are:

            Extension Command Arguments .nu nu none .pl perl none .py python3 none .ps1 powershell -NoLogo .rb ruby none

            Script interpreters can be added or overridden by adding the corresponding extension (without the leading dot) as a key under the interpreters section of the configuration file.

            Note

            The leading . is dropped from extension, for example to specify the interpreter for .pl files you configure interpreters.pl (where . in this case just means \"a child of\" in the configuration file, however that is specified in your preferred format).

            Example

            To change the Python interpreter to C:\\Python39\\python3.exe and add a Tcl/Tk interpreter, include the following in your config file:

            ~/.config/chezmoi/chezmoi.toml
            [interpreters.py]\n    command = 'C:\\Python39\\python3.exe'\n[interpreters.tcl]\n    command = \"tclsh\"\n

            Or if using YAML:

            ~/.config/chezmoi/chezmoi.yaml
            interpreters:\n  py:\n    command: \"C:\\Python39\\python3.exe\"\n  tcl:\n    command: \"tclsh\"\n

            Note that the TOML version can also be written like this, which resembles the YAML version more and makes it clear that the key for each file extension should not have a leading .:

            ~/.config/chezmoi/chezmoi.toml
            [interpreters]\npy = { command = 'C:\\Python39\\python3.exe' }\ntcl = { command = \"tclsh\" }\n

            Note

            If you intend to use PowerShell Core (pwsh.exe) as the .ps1 interpreter, include the following in your config file:

            ~/.config/chezmoi/chezmoi.toml
            [interpreters.ps1]\n    command = \"pwsh\"\n    args = [\"-NoLogo\"]\n

            If the script in the source state is a template (with a .tmpl extension), then chezmoi will strip the .tmpl extension and use the next remaining extension to determine the interpreter to use.

            "},{"location":"reference/configuration-file/pinentry/","title":"pinentry","text":"

            By default, chezmoi will request passwords from the terminal.

            If the --no-tty option is passed, then chezmoi will instead read passwords from the standard input.

            Otherwise, if the configuration variable pinentry.command is set then chezmoi will instead used the given command to read passwords, assuming that it follows the Assuan protocol like GnuPG's pinentry. The configuration variable pinentry.args specifies extra arguments to be passed to pinentry.command and the configuration variable pinentry.options specifies extra options to be set. The default pinentry.options is [\"allow-external-password-cache\"].

            Example

            ~/.config/chezmoi/chezmoi.toml
            [pinentry]\n    command = \"pinentry\"\n
            "},{"location":"reference/configuration-file/textconv/","title":"textconv","text":"

            A section called textconv in the configuration file controls how file contents are modified before being passed to diff.

            The textconv must contain an array of objects where each object has the following properties:

            Name Type Description pattern string Target path pattern to match command string Command to transform contents args []string Extra arguments to command

            Files whose target path matches pattern are transformed by passing them to the standard input of command with args, and new contents are read from the command's standard output.

            If a target path does not match any patterns then the file contents are passed unchanged to diff. If a target path matches multiple patterns then element with the longest pattern is used.

            "},{"location":"reference/configuration-file/umask/","title":"umask","text":"

            By default, chezmoi uses your current umask as set by your operating system and shell. chezmoi only stores crude permissions in its source state, namely in the executable and private attributes, corresponding to the umasks of 0o111 and 0o077 respectively.

            For machine-specific control of umask, set the umask configuration variable in chezmoi's configuration file.

            Example

            ~/.config/chezmoi/chezmoi.toml
            umask = 0o22\n
            "},{"location":"reference/configuration-file/variables/","title":"Variables","text":"

            The following configuration variables are available:

            Section Variable Type Default value Description Top level cacheDir string $XDG_CACHE_HOME/chezmoi $HOME/.cache/chezmoi %USERPROFILE%/.cache/chezmoi Cache directory color string auto Colorize output data object none Template data destDir string $HOME %USERPROFILE% Destination directory encryption string none Encryption type, either age or gpg env object none Extra environment variables for scripts and commands format string json Format for data output, either json or yaml interactive string false Prompt for all changes mode string file Mode in target dir, either file or symlink pager string $PAGER Default pager CLI command persistentState string $XDG_CONFIG_HOME/chezmoi/chezmoi.boltdb $HOME/.config/chezmoi/chezmoi.boltdb %USERPROFILE%/.config/chezmoi/chezmoi.boltdb Location of the persistent state file progress bool false Display progress bars scriptEnv object none Extra environment variables for scripts and commands scriptTempDir string none Temporary directory for scripts sourceDir string $XDG_SHARE_HOME/chezmoi $HOME/.local/share/chezmoi %USERPROFILE%/.local/share/chezmoi Source directory tempDir string from system Temporary directory umask int from system Umask useBuiltinAge string auto Use builtin age if age command is not found in $PATH useBuiltinGit string auto Use builtin git if git command is not found in $PATH verbose bool false Make output more verbose workingTree string source directory git working tree directory add encrypt bool false Encrypt by default secrets string warning Action when secrets are found when adding files templateSymlinks bool false Template symlinks to source and home dirs age args []string none Extra args to age CLI command command string age age CLI command identities []string none age identity files identity string none age identity file passphrase bool false Use age passphrase instead of identity recipient string none age recipient recipients []string none age recipients recipientsFile string none age recipients file recipientsFiles []string none age recipients files suffix string .age Suffix appended to age-encrypted files symmetric bool false Use age symmetric encryption awsSecretsManager profile string none AWS shared profile name region string none AWS region azureKeyVault defaultVault string none Default Azure Key Vault name bitwarden command string bw Bitwarden CLI command bitwardenSecrets command string bws Bitwarden Secrets CLI command cd args []string none Extra args to shell in cd command command string none Shell to run in cd command completion custom bool false Enable custom shell completions dashlane args []string none Extra args to Dashlane CLI command command string dcli Dashlane CLI command diff args []string see diff Extra args to external diff command command string none External diff command exclude []string none Entry types to exclude from diffs pager string none Diff-specific pager reverse bool false Reverse order of arguments to diff scriptContents bool true Show script contents doppler args []string none Extra args to Doppler CLI command command string doppler Doppler CLI command config string none Default config (aka environment) if none is specified project string none Default project name if none is specified edit apply bool false Apply changes on exit args []string none Extra args to edit command command string $EDITOR / $VISUAL Edit command hardlink bool true Invoke editor with a hardlink to the source file minDuration duration 1s Minimum duration for edit command watch bool false Automatically apply changes when files are saved ejson key string none The private key to use for decryption, will supersede using the keyDir if set. keyDir string none Path to directory containing private keys. Defaults to /opt/ejson/keys. Setting the EJSON_KEYDIR environment will also set this value, with lower precedence. git autoAdd bool false Add changes to the source state after any change autoCommit bool false Commit changes to the source state after any change autoPush bool false Push changes to the source state after any change command string git git CLI command commitMessageTemplate string none Commit message template commitMessageTemplateFile string none Commit message template file (relative to source directory) lfs bool false Run git lfs pull after cloning gitHub refreshPeriod duration 1m Minimum duration between identical GitHub API requests gopass command string gopass gopass CLI command mode string none See gopass functions gpg args []string none Extra args to GPG CLI command command string gpg GPG CLI command recipient string none GPG recipient recipients []string none GPG recipients suffix string .asc Suffix appended to GPG-encrypted files symmetric bool false Use symmetric GPG encryption hcpVaultSecrets applicationName string none Default application name if none is specified args []string none Extra args to HCP Vault Secrets CLI command command string vlt HCP Vault Secrets CLI command organizationId string none Default organization ID if none is specified projectId string none Default project ID if none is specified hooks command.post.args []string none Extra arguments to command to run after command command.post.command []string none Command to run after command command.pre.args []string none Extra arguments to command to run before command command.pre.command []string none Command to run before command interpreters extension.args []string none See Interpreters extension.command string special See Interpreters keepassxc args []string none Extra args to KeePassXC CLI command command string keepassxc-cli KeePassXC CLI command database string none KeePassXC database mode string cache-password See KeePassXC functions prompt bool true Prompt for password keeper args []string none Extra args to Keeper CLI command command string keeper Keeper CLI command lastpass command string lpass LastPass CLI command merge args []string See merge Extra args to three-way merge CLI command command string none Three-way merge CLI command onepassword cache bool true Enable optional caching provided by op command string op 1Password CLI command mode string account See 1Password Secrets Automation prompt bool true Prompt for sign-in when no valid session is available onepasswordSDK token string none See 1Password SDK functions tokenEnvVar string none See 1Password SDK functions pass command string pass Pass CLI command passhole args []string none Extra args to Passhole CLI command command string ph Passhole CLI command prompt bool true Prompt for password pinentry args []string none Extra args to pinentry CLI command command string none pinentry CLI command options []string See pinentry Extra options for pinentry rbw command string rbw Unofficial Bitwarden CLI command secret args []string none Extra args to secret CLI command command string none Generic secret CLI command status exclude []string none Entry types to exclude from status pathStyle string relative How to present the path to files in status output template options []string [\"missingkey=error\"] Template options textconv []object none See textconv update apply bool true Apply after pulling args []string none Extra args to update command command string none Update command recurseSubmodules bool true Update submodules recursively vault command string vault Vault CLI command verify exclude []string none Entry types to exclude from verify warnings object none See Warnings"},{"location":"reference/configuration-file/warnings/","title":"Warnings","text":"

            By default, chezmoi will warn you when it encounters potential problems. Some of these warnings can be suppressed by setting values in configuration file.

            Variable Type Default Description configFileTemplateHasChanged bool true Warn when the config file template has changed

            Example

            ~/.config/chezmoi/chezmoi.toml
            [warnings]\n    configFileTemplateHasChanged = false\n
            "},{"location":"reference/special-directories/","title":"Special directories","text":"

            All directories in the source state whose name begins with . are ignored by default, unless they are one of the special directories listed here. .chezmoitemplates is read before all other files so that they can be used in templates.

            "},{"location":"reference/special-directories/chezmoidata/","title":".chezmoidata","text":"

            If a directory called .chezmoidata exists in the source state, then all files in it are interpreted as template data in the format given by their extension.

            "},{"location":"reference/special-directories/chezmoiexternals/","title":".chezmoiexternals","text":"

            If a directory called .chezmoiexternals exists, then all files in this directory are treated as .chezmoiexternal.<format> files.

            "},{"location":"reference/special-directories/chezmoiscripts/","title":".chezmoiscripts","text":"

            If a directory called .chezmoiscripts exists in the root of the source directory then any scripts in it are executed as normal scripts without creating a corresponding directory in the target state.

            "},{"location":"reference/special-directories/chezmoitemplates/","title":".chezmoitemplates","text":"

            If a directory called .chezmoitemplates exists, then all files in this directory are available as templates with a name equal to the relative path to the .chezmoitemplates directory.

            The template action can be used to include these templates in another template. The value of . must be set explicitly if needed, otherwise the template will be executed with nil data.

            Example

            Given:

            ~/.local/share/chezmoi/.chezmoitemplates/foo
            {{ if true }}bar{{ end }}\n
            ~/.local/share/chezmoi/dot_file.tmpl
            {{ template \"foo\" . }}\n

            The target state of .file will be bar.

            "},{"location":"reference/special-files/","title":"Special files","text":"

            All files in the source state whose name begins with . are ignored by default, unless they are one of the special files listed here. .chezmoidata.$FORMAT is read before all other files so that it can be used in templates.

            "},{"location":"reference/special-files/chezmoi-format-tmpl/","title":".chezmoi.$FORMAT.tmpl","text":"

            If a file called .chezmoi.$FORMAT.tmpl exists then chezmoi init will use it to create an initial config file. $FORMAT must be one of the supported config file formats, e.g. json, jsonc, toml, or yaml. Templates defined in .chezmoitemplates are not available because the template is executed before the source state is read.

            Example

            ~/.local/share/chezmoi/.chezmoi.yaml.tmpl
            {{ $email := promptString \"email\" -}}\n\ndata:\n    email: {{ $email | quote }}\n
            "},{"location":"reference/special-files/chezmoidata-format/","title":".chezmoidata.$FORMAT","text":"

            If a file called .chezmoidata.$FORMAT exists in the source state, it is interpreted as template data in the given format.

            Example

            If .chezmoidata.toml contains the following:

            ~/.local/share/chezmoi/.chezmoidata.toml
            fontSize = 12\n

            Then the .fontSize variable is available in templates, e.g.

            FONT_SIZE={{ .fontSize }}\n

            Will result in:

            FONT_SIZE=12\n
            "},{"location":"reference/special-files/chezmoiexternal-format/","title":".chezmoiexternal.$FORMAT{,.tmpl}","text":"

            If a file called .chezmoiexternal.$FORMAT (with an optional .tmpl extension) exists anywhere in the source state (either ~/.local/share/chezmoi or directory defined inside .chezmoiroot), it is interpreted as a list of external files and archives to be included as if they were in the source state.

            $FORMAT must be one of chezmoi's supported configuration file formats, e.g. json, jsonc, toml, or yaml.

            .chezmoiexternal.$FORMAT is interpreted as a template. This allows different externals to be included on different machines.

            If a .chezmoiexternal.$FORMAT file is located in an ignored directory (one listed in .chezmoiignore), all entries within the file are also ignored.

            Entries are indexed by target name relative to the directory of the .chezmoiexternal.$FORMAT file, and must have a type and a url and/or a urls field. type can be either file, archive, archive-file, or git-repo. If the entry's parent directories do not already exist in the source state then chezmoi will create them as regular directories.

            Entries may have the following fields:

            Variable Type Default value Description type string none External type (file, archive, archive-file, or git-repo) decompress string none Decompression for file encrypted bool false Whether the external is encrypted exact bool false Add exact_ attribute to directories in archive exclude []string none Patterns to exclude from archive executable bool false Add executable_ attribute to file private bool false Add private_ attribute to file readonly bool false Add readonly_ attribute to file format string autodetect Format of archive path string none Path to file in archive include []string none Patterns to include from archive refreshPeriod duration 0 Refresh period stripComponents int 0 Number of leading directory components to strip from archives url string none URL urls []string none Extra URLs to try, in order checksum.sha256 string none Expected SHA256 checksum of data checksum.sha384 string none Expected SHA384 checksum of data checksum.sha512 string none Expected SHA512 checksum of data checksum.size int none Expected size of data clone.args []string none Extra args to git clone filter.command string none Command to filter contents filter.args []string none Extra args to command to filter contents pull.args []string none Extra args to git pull archive.extractAppleDouble bool false If true, AppleDouble files are extracted

            url must be an https://, http://, or file:// URL. If urls is specified then they are tried in order and the first URL that succeeds is used.

            If any of the optional checksum.sha256, checksum.sha384, or checksum.sha512 fields are set, chezmoi will verify that the downloaded data has the given checksum.

            The optional boolean encrypted field specifies whether the file or archive is encrypted.

            The optional string decompress specifies how the file should be decompressed. Supported compression formats are bzip2, gzip, xz, and zstd. Note the .zip files are archives and you must use the archive-file type to extract a single file from a .zip archive.

            If optional string filter.command and array of strings filter.args are specified, the file or archive is filtered by piping it into the command's standard input and reading the command's standard output.

            If type is file then the target is a file with the contents of url. The optional boolean field executable may be set, in which case the target file will be executable.

            If type is archive then the target is a directory with the contents of the archive at url. The optional boolean field exact may be set, in which case the directory and all subdirectories will be treated as exact directories, i.e. chezmoi apply will remove entries not present in the archive. The optional integer field stripComponents will remove leading path components from the members of archive. The optional string field format sets the archive format. The supported archive formats are tar, tar.gz, tgz, tar.bz2, tbz2, xz, .tar.zst, and zip. If format is not specified then chezmoi will guess the format using firstly the path of the URL and secondly its contents.

            When type is archive or archive-file, the optional setting archive.extractAppleDouble controls whether AppleDouble files are extracted. It is false by default, so AppleDouble files will not be extracted.

            The optional include and exclude fields are lists of patterns specify which archive members to include or exclude respectively. Patterns match paths in the archive, not the target state. chezmoi uses the following algorithm to determine whether an archive member is included:

            1. If the archive member name matches any exclude pattern, then the archive member is excluded. In addition, if the archive member is a directory, then all contained files and sub-directories will be excluded, too (recursively).
            2. Otherwise, if the archive member name matches any include pattern, then the archive member is included.
            3. Otherwise, if only include patterns were specified then the archive member is excluded.
            4. Otherwise, if only exclude patterns were specified then the archive member is included.
            5. Otherwise, the archive member is included.

            Excluded archive members do not generate source state entries, and, if they are directories, all of their children are also excluded.

            If type is archive-file then the target is a file or symlink with the contents of the entry path in the archive at url. The optional integer field stripComponents will remove leading path components from the members of the archive before comparing them with path. The behavior of format is the same as for archive. If executable is true then chezmoi will set the executable bits on the target file, even if they are not set in the archive.

            If type is git-repo then chezmoi will run git clone $URL $TARGET_NAME with the optional clone.args if the target does not exist. If the target exists, then chezmoi will run git pull with the optional pull.args to update the target.

            For file and archive externals, chezmoi will cache downloaded URLs. The optional duration refreshPeriod field specifies how often chezmoi will re-download the URL. The default is zero meaning that chezmoi will never re-download unless forced. To force chezmoi to re-download URLs, pass the -R/--refresh-externals flag. Suitable refresh periods include one day (24h), one week (168h), or four weeks (672h).

            Example

            ~/.local/share/chezmoi/.chezmoiexternal.toml
            [\".vim/autoload/plug.vim\"]\n    type = \"file\"\n    url = \"https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim\"\n    refreshPeriod = \"168h\"\n[\".oh-my-zsh\"]\n    type = \"archive\"\n    url = \"https://github.com/ohmyzsh/ohmyzsh/archive/master.tar.gz\"\n    exact = true\n    stripComponents = 1\n    refreshPeriod = \"168h\"\n[\".oh-my-zsh/custom/plugins/zsh-syntax-highlighting\"]\n    type = \"archive\"\n    url = \"https://github.com/zsh-users/zsh-syntax-highlighting/archive/master.tar.gz\"\n    exact = true\n    stripComponents = 1\n    refreshPeriod = \"168h\"\n[\".oh-my-zsh/custom/themes/powerlevel10k\"]\n    type = \"archive\"\n    url = \"https://github.com/romkatv/powerlevel10k/archive/v1.15.0.tar.gz\"\n    exact = true\n    stripComponents = 1\n[\".local/bin/age\"]\n    type = \"archive-file\"\n    url = \"https://github.com/FiloSottile/age/releases/download/v1.1.1/age-v1.1.1-{{ .chezmoi.os }}-{{ .chezmoi.arch }}.tar.gz\"\n    path = \"age/age\"\n[\"www/adminer/plugins\"]\n    type = \"archive\"\n    url = \"https://api.github.com/repos/vrana/adminer/tarball\"\n    refreshPeriod = \"744h\"\n    stripComponents = 2\n    include = [\"*/plugins/**\"]\n

            Some more examples can be found in the user guide.

            "},{"location":"reference/special-files/chezmoiignore/","title":".chezmoiignore{,.tmpl}","text":"

            If a file called .chezmoiignore (with an optional .tmpl extension) exists in the source state then it is interpreted as a set of patterns to ignore. Patterns are matched using doublestar.Match and match against the target path, not the source path.

            Patterns can be excluded by prefixing them with a ! character. All excludes take priority over all includes.

            Comments are introduced with the # character and run until the end of the line.

            .chezmoiignore is interpreted as a template, whether or not it has a .tmpl extension. This allows different files to be ignored on different machines.

            .chezmoiignore files in subdirectories apply only to that subdirectory.

            Example

            ~/.local/share/chezmoi/.chezmoiignore
            README.md\n\n*.txt   # ignore *.txt in the target directory\n*/*.txt # ignore *.txt in subdirectories of the target directory\n        # but not in subdirectories of subdirectories;\n        # so a/b/c.txt would *not* be ignored\n\nbackups/   # ignore the backups folder, but not its contents\nbackups/** # ignore the contents of backups folder but not the folder itself\n\n{{- if ne .email \"firstname.lastname@company.com\" }}\n# Ignore .company-directory unless configured with a company email\n.company-directory # note that the pattern is not dot_company-directory\n{{- end }}\n\n{{- if ne .email \"me@home.org\" }}\n.personal-file\n{{- end }}\n
            "},{"location":"reference/special-files/chezmoiremove/","title":".chezmoiremove{,.tmpl}","text":"

            If a file called .chezmoiremove (with an optional .tmpl extension) exists in the source state then it is interpreted as a list of targets to remove. .chezmoiremove is interpreted as a template, whether or not it has a .tmpl extension.

            "},{"location":"reference/special-files/chezmoiroot/","title":".chezmoiroot","text":"

            If a file called .chezmoiroot exists in the root of the source directory then the source state is read from the directory specified in .chezmoiroot interpreted as a relative path to the source directory. .chezmoiroot is read before all other files in the source directory.

            "},{"location":"reference/special-files/chezmoiversion/","title":".chezmoiversion","text":"

            If a file called .chezmoiversion exists, then its contents are interpreted as a semantic version defining the minimum version of chezmoi required to interpret the source state correctly. chezmoi will refuse to interpret the source state if the current version is too old.

            Example

            ~/.local/share/chezmoi/.chezmoiversion
            1.5.0\n
            "},{"location":"reference/templates/","title":"Templates","text":"

            chezmoi executes templates using text/template. The result is treated differently depending on whether the target is a file or a symlink.

            If target is a file, then:

            • If the result is an empty string, then the file is removed.

            • Otherwise, the target file contents are result.

            If the target is a symlink, then:

            • Leading and trailing whitespace are stripped from the result.

            • If the result is an empty string, then the symlink is removed.

            • Otherwise, the target symlink target is the result.

            chezmoi executes templates using text/template's missingkey=error option, which means that misspelled or missing keys will raise an error. This can be overridden by setting a list of options in the configuration file.

            Hint

            For a full list of template options, see Template.Option.

            Example

            ~/.config/chezmoi/chezmoi.toml
            [template]\n    options = [\"missingkey=zero\"]\n
            "},{"location":"reference/templates/directives/","title":"Directives","text":"

            File-specific template options can be set using template directives in the template of the form:

            chezmoi:template:$KEY=$VALUE\n

            which sets the template option $KEY to $VALUE. $VALUE must be quoted if it contains spaces or double quotes. Multiple key/value pairs may be specified on a single line.

            Lines containing template directives are removed to avoid parse errors from any delimiters. If multiple directives are present in a file, later directives override earlier ones.

            "},{"location":"reference/templates/directives/#delimiters","title":"Delimiters","text":"

            By default, chezmoi uses the standard text/template delimiters {{ and }}. If a template contains the string:

            chezmoi:template:left-delimiter=$LEFT right-delimiter=$RIGHT\n

            Then the delimiters $LEFT and $RIGHT are used instead. Either or both of left-delimiter=$LEFT and right-delimiter=$RIGHT may be omitted. If either $LEFT or $RIGHT is empty then the default delimiter ({{ and }} respectively) is set instead.

            The delimiters are specific to the file in which they appear and are not inherited by templates called from the file.

            Example

            #!/bin/sh\n# chezmoi:template:left-delimiter=\"# [[\" right-delimiter=]]\n\n# [[ \"true\" ]]\n
            "},{"location":"reference/templates/directives/#format-indent","title":"Format indent","text":"

            By default, chezmoi's toJson, toToml, and toYaml template functions use the default indent of two spaces. The indent can be overidden with:

            chezmoi:template:format-indent=$STRING\n

            to set the indent to be the literal $STRING, or

            chezmoi:template:format-indent-width=$WIDTH\n

            to set the indent to be $WIDTH spaces.

            Example

            {{/* chezmoi:template:format-indent=\"\\t\" */}}\n{{ dict \"key\" \"value\" | toJson }}\n

            Example

            {{/* chezmoi:template:format-indent-width=4 */}}\n{{ dict \"key\" \"value\" | toYaml }}\n
            "},{"location":"reference/templates/directives/#line-endings","title":"Line endings","text":"

            Many of the template functions available in chezmoi primarily use UNIX-style line endings (lf/\\n), which may result in unexpected output when running chezmoi diff on a modify_ template. These line endings can be overridden with a template directive:

            chezmoi:template:line-endings=$VALUE\n

            $VALUE can be an arbitrary string or one of:

            Value Effect crlf Use Windows line endings (\\r\\n) lf Use UNIX-style line endings (\\n) native Use platform-native line endings (crlf on Windows, lf elsewhere)"},{"location":"reference/templates/directives/#missing-keys","title":"Missing keys","text":"

            By default, chezmoi will return an error if a template indexes a map with a key that is not present in the map. This behavior can be changed globally with the template.options configuration variable or with a template directive:

            chezmoi:template:missing-key=$VALUE\n

            $VALUE can be one of:

            Value Effect error Return an error on any missing key (default) invalid Ignore missing keys. If printed, the result of the index operation is the string <no value> zero Ignore missing keys. If printed, the result of the index operation is the zero value"},{"location":"reference/templates/variables/","title":"Variables","text":"

            chezmoi provides the following automatically-populated variables:

            Variable Type Value .chezmoi.arch string Architecture, e.g. amd64, arm, etc. as returned by runtime.GOARCH .chezmoi.args []string The arguments passed to the chezmoi command, starting with the program command .chezmoi.cacheDir string The cache directory .chezmoi.config object The configuration, as read from the config file .chezmoi.configFile string The path to the configuration file used by chezmoi .chezmoi.destDir string The destination directory .chezmoi.executable string The path to the chezmoi executable, if available .chezmoi.fqdnHostname string The fully-qualified domain name hostname of the machine chezmoi is running on .chezmoi.gid string The primary group ID .chezmoi.group string The group of the user running chezmoi .chezmoi.homeDir string The home directory of the user running chezmoi .chezmoi.hostname string The hostname of the machine chezmoi is running on, up to the first . .chezmoi.kernel object Contains information from /proc/sys/kernel. Linux only, useful for detecting specific kernels (e.g. Microsoft's WSL kernel) .chezmoi.os string Operating system, e.g. darwin, linux, etc. as returned by runtime.GOOS .chezmoi.osRelease object The information from /etc/os-release, Linux only, run chezmoi data to see its output .chezmoi.pathListSeparator string The path list separator, typically ; on Windows and : on other systems. Used to separate paths in environment variables. ie /bin:/sbin:/usr/bin .chezmoi.pathSeparator string The path separator, typically \\ on windows and / on unix. Used to separate files and directories in a path. ie c:\\see\\dos\\run .chezmoi.sourceDir string The source directory .chezmoi.sourceFile string The path of the template relative to the source directory .chezmoi.targetFile string The absolute path of the target file for the template .chezmoi.uid string The user ID .chezmoi.username string The username of the user running chezmoi .chezmoi.version.builtBy string The program that built the chezmoi executable, if set .chezmoi.version.commit string The git commit at which the chezmoi executable was built, if set .chezmoi.version.date string The timestamp at which the chezmoi executable was built, if set .chezmoi.version.version string The version of chezmoi .chezmoi.windowsVersion object Windows version information, if running on Windows .chezmoi.workingTree string The working tree of the source directory

            .chezmoi.windowsVersion contains the following keys populated from the registry key Computer\\HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion.

            Key Type currentBuild string currentMajorVersionNumber integer currentMinorVersionNumber integer currentVersion string displayVersion string editionID string productName string

            Additional variables can be defined in the config file in the data section. Variable names must consist of a letter and be followed by zero or more letters and/or digits.

            "},{"location":"reference/templates/1password-functions/","title":"1Password functions","text":"

            The onepassword* template functions return structured data from 1Password using the 1Password CLI (op).

            Info

            When using the 1Password CLI with biometric authentication, chezmoi derives values from op account list that can resolves into the appropriate 1Password account-uuid.

            As an example, if op account list --format=json returns the following structure:

            [\n  {\n    \"url\": \"account1.1password.ca\",\n    \"email\": \"my@email.com\",\n    \"user_uuid\": \"some-user-uuid\",\n    \"account_uuid\": \"some-account-uuid\"\n  }\n]\n

            The following values can be used in the account parameter and the value some-account-uuid will be passed as the --account parameter to op.

            • some-account-uuid
            • some-user-uuid
            • account1.1password.ca
            • account1
            • my@email.com
            • my
            • my@account1.1password.ca
            • my@account1

            If there are multiple accounts and any value exists more than once, that value will be removed from the account mapping. That is, if you are signed into my@email.com and your@email.com for account1.1password.ca, then account1.1password.ca will not be a valid lookup value, but my@account1, my@account1.1password.ca, your@account1, and your@account1.1password.ca would all be valid lookups.

            Warning

            chezmoi has experimental support for 1Password secrets automation modes. These modes change how the 1Password CLI works and affect all functions. Most notably, account parameters are not allowed on all 1Password template functions.

            "},{"location":"reference/templates/1password-functions/onepassword/","title":"onepassword uuid [vault [account]]","text":"

            onepassword returns structured data from 1Password using the 1Password CLI (op). uuid is passed to op item get $UUID --format json and the output from op is parsed as JSON. The output from op is cached so calling onepassword multiple times with the same uuid will only invoke op once. If the optional vault is supplied, it will be passed along to the op item get call, which can significantly improve performance. If the optional account is supplied, it will be passed along to the op item get call, which will help it look in the right account, in case you have multiple accounts (e.g., personal and work accounts).

            If there is no valid session in the environment, by default you will be interactively prompted to sign in.

            The 1password CLI command can be set with the onePassword.command config variable, and extra arguments can be specified with the onePassword.args config variable.

            Example

            {{ (onepassword \"$UUID\").fields[1].value }}\n{{ (onepassword \"$UUID\" \"$VAULT_UUID\").fields[1].value }}\n{{ (onepassword \"$UUID\" \"$VAULT_UUID\" \"$ACCOUNT_NAME\").fields[1].value }}\n{{ (onepassword \"$UUID\" \"\" \"$ACCOUNT_NAME\").fields[1].value }}\n

            A more robust way to get a password field would be something like:

            {{ range (onepassword \"$UUID\").fields -}}\n{{   if and (eq .label \"password\") (eq .purpose \"PASSWORD\") -}}\n{{     .value -}}\n{{   end -}}\n{{ end }}\n

            Warning

            When using 1Password secrets automation, the account parameter is not allowed.

            "},{"location":"reference/templates/1password-functions/onepasswordDetailsFields/","title":"onepasswordDetailsFields uuid [vault [account]]","text":"

            onepasswordDetailsFields returns structured data from 1Password using the 1Password CLI (op). uuid is passed to op get item $UUID, the output from op is parsed as JSON, and elements of details.fields are returned as a map indexed by each field's id (if set) or label (if set and id is not present).

            If there is no valid session in the environment, by default you will be interactively prompted to sign in.

            The output from op is cached so calling onepasswordDetailsFields multiple times with the same uuid will only invoke op once. If the optional vault is supplied, it will be passed along to the op get call, which can significantly improve performance. If the optional account is supplied, it will be passed along to the op get call, which will help it look in the right account, in case you have multiple accounts (e.g. personal and work accounts).

            Example

            {{ (onepasswordDetailsFields \"$UUID\").password.value }}\n{{ (onepasswordDetailsFields \"$UUID\" \"$VAULT_UUID\").password.value }}\n{{ (onepasswordDetailsFields \"$UUID\" \"$VAULT_UUID\" \"$ACCOUNT_NAME\").password.value }}\n{{ (onepasswordDetailsFields \"$UUID\" \"\" \"$ACCOUNT_NAME\").password.value }}\n

            Example

            Given the output from op:

            {\n    \"uuid\": \"$UUID\",\n    \"details\": {\n        \"fields\": [\n            {\n                \"designation\": \"username\",\n                \"name\": \"username\",\n                \"type\": \"T\",\n                \"value\": \"exampleuser\"\n            },\n            {\n                \"designation\": \"password\",\n                \"name\": \"password\",\n                \"type\": \"P\",\n                \"value\": \"examplepassword\"\n            }\n        ]\n    }\n}\n

            the return value of onepasswordDetailsFields will be the map:

            {\n    \"username\": {\n        \"designation\": \"username\",\n        \"name\": \"username\",\n        \"type\": \"T\",\n        \"value\": \"exampleuser\"\n    },\n    \"password\": {\n        \"designation\": \"password\",\n        \"name\": \"password\",\n        \"type\": \"P\",\n        \"value\": \"examplepassword\"\n    }\n}\n

            Warning

            When using 1Password secrets automation, the account parameter is not allowed.

            "},{"location":"reference/templates/1password-functions/onepasswordDocument/","title":"onepasswordDocument uuid [vault [account]]","text":"

            onepasswordDocument returns a document from 1Password using the 1Password CLI (op). uuid is passed to op get document $UUID and the output from op is returned. The output from op is cached so calling onepasswordDocument multiple times with the same uuid will only invoke op once. If the optional vault is supplied, it will be passed along to the op get call, which can significantly improve performance. If the optional account is supplied, it will be passed along to the op get call, which will help it look in the right account, in case you have multiple accounts (e.g., personal and work accounts).

            If there is no valid session in the environment, by default you will be interactively prompted to sign in.

            Example

            {{- onepasswordDocument \"$UUID\" -}}\n{{- onepasswordDocument \"$UUID\" \"$VAULT_UUID\" -}}\n{{- onepasswordDocument \"$UUID\" \"$VAULT_UUID\" \"$ACCOUNT_NAME\" -}}\n{{- onepasswordDocument \"$UUID\" \"\" \"$ACCOUNT_NAME\" -}}\n

            Warning

            When using 1Password Connect, onepasswordDocument is not available.

            Warning

            When using 1Password Service Accounts, the account parameter is not allowed.

            "},{"location":"reference/templates/1password-functions/onepasswordItemFields/","title":"onepasswordItemFields uuid [vault [account]]","text":"

            onepasswordItemFields returns structured data from 1Password using the 1Password CLI (op). uuid is passed to op item get $UUID --format json, the output from op is parsed as JSON, and each element of details.sections are iterated over and any fields are returned as a map indexed by each field's n.

            If there is no valid session in the environment, by default you will be interactively prompted to sign in.

            Example

            The result of

            {{ (onepasswordItemFields \"abcdefghijklmnopqrstuvwxyz\").exampleLabel.value }}\n

            is equivalent to calling

            $ op item get abcdefghijklmnopqrstuvwxyz --fields label=exampleLabel\n# or\n$ op item get abcdefghijklmnopqrstuvwxyz --fields exampleLabel\n

            Example

            Given the output from op:

            {\n    \"id\": \"$UUID\",\n    \"title\": \"$TITLE\",\n    \"version\": 1,\n    \"vault\": {\n        \"id\": \"$vaultUUID\"\n    },\n    \"category\": \"LOGIN\",\n    \"last_edited_by\": \"userUUID\",\n    \"created_at\": \"2022-01-12T16:29:26Z\",\n    \"updated_at\": \"2022-01-12T16:29:26Z\",\n    \"sections\": [\n        {\n            \"id\": \"$sectionID\",\n            \"label\": \"Related Items\"\n        }\n    ],\n    \"fields\": [\n        {\n            \"id\": \"nerlnqbfzdm5q5g6ydsgdqgdw4\",\n            \"type\": \"STRING\",\n            \"label\": \"exampleLabel\",\n            \"value\": \"exampleValue\"\n        }\n    ],\n}\n

            the return value of onepasswordItemFields will be the map:

            {\n    \"exampleLabel\": {\n        \"id\": \"string\",\n        \"type\": \"D4328E0846D2461E8E455D7A07B93397\",\n        \"label\": \"exampleLabel\",\n        \"value\": \"exampleValue\"\n    }\n}\n

            Warning

            When using 1Password secrets automation, the account parameter is not allowed.

            "},{"location":"reference/templates/1password-functions/onepasswordRead/","title":"onepasswordRead url [account]","text":"

            onepasswordRead returns data from 1Password using the 1Password CLI (op). url is passed to the op read --no-newline command. If account is specified, the extra arguments --account $ACCOUNT are passed to op.

            If there is no valid session in the environment, by default you will be interactively prompted to sign in.

            Example

            The result of

            {{ onepasswordRead \"op://vault/item/field\" }}\n

            is equivalent to calling

            $ op read --no-newline op://vault/item/field\n

            Warning

            When using 1Password secrets automation, the account parameter is not allowed.

            "},{"location":"reference/templates/1password-sdk-functions/","title":"1Password SDK functions","text":"

            Warning

            1Password SDK template functions are experimental and may change.

            The onepasswordSDK* template functions return structured data from 1Password using the 1Password SDK.

            By default, the 1Password service account token is taken from the $OP_SERVICE_ACCOUNT_TOKEN environment variable. The name of the environment variable can be set with onepasswordSDK.tokenEnvVar configuration variable, or the token can be set explicitly by setting the onepasswordSDK.token configuration variable.

            "},{"location":"reference/templates/1password-sdk-functions/onepasswordSDKItemsGet/","title":"onepasswordSDKItemsGet vault-id item-id","text":"

            Warning

            onepasswordSDKItemsGet is an experimental function and may change.

            onepasswordSDKItemsGet returns an item from 1Password using the 1Password SDK.

            The output of onepasswordSDKItemsGet is cached so multiple calls to onepasswordSDKItemsGet with the same vault-id and item-id will return the same value.

            Example

            {{- onepasswordSDKItemsGet \"vault\" \"item\" | toJson -}}\n
            "},{"location":"reference/templates/1password-sdk-functions/onepasswordSDKSecretsResolve/","title":"onepasswordSDKSecretsResolve url","text":"

            Warning

            onepasswordSDKSecretsResolve is an experimental function and may change.

            onepasswordSDKSecretsResolve returns a secret from 1Password using the 1Password SDK.

            The output of onepasswordSDKSecretsResolve is cached so multiple calls to onepasswordSDKSecretsResolve with the same url will return the same value.

            Example

            {{- onepasswordSDKSecretsResolve \"op://vault/item/field\" -}}\n
            "},{"location":"reference/templates/aws-secrets-manager-functions/","title":"AWS Secrets Manager functions","text":"

            The awsSecretsManager* functions return data from AWS Secrets Manager using the GetSecretValue API.

            The profile and region are pulled from the standard environment variables and shared config files but can be overridden by setting awsSecretsManager.profile and awsSecretsManager.region configuration variables respectively.

            "},{"location":"reference/templates/aws-secrets-manager-functions/awsSecretsManager/","title":"awsSecretsManager arn","text":"

            awsSecretsManager returns structured data retrieved from AWS Secrets Manager. arn specifies the SecretId passed to GetSecretValue. This can either be the full ARN or the simpler name if applicable.

            "},{"location":"reference/templates/aws-secrets-manager-functions/awsSecretsManagerRaw/","title":"awsSecretsManagerRaw arn","text":"

            awsSecretsManager returns the raw string value retrieved from AWS Secrets Manager. arn specifies the SecretId passed to GetSecretValue. This can either be the full ARN or the simpler name if applicable.

            "},{"location":"reference/templates/azure-key-vault-functions/azureKeyVault/","title":"azureKeyVault secret name [vault-name]","text":"

            azureKeyVault returns a secret value retrieved from an Azure Key Vault.

            The mandatory secret name argument specifies the name of the secret to retrieve.

            The optional vault name argument specifies the name of the vault, if not set, the default vault name will be used.

            Warning

            The current implementation will always return the latest version of the secret. Retrieving a specific version of a secret is not supported.

            "},{"location":"reference/templates/bitwarden-functions/","title":"Bitwarden functions","text":"

            The bitwarden* and rbw* functions return data from Bitwarden using the Bitwarden CLI (bw), Bitwarden Secrets CLI (bws), and rbw commands.

            "},{"location":"reference/templates/bitwarden-functions/bitwarden/","title":"bitwarden [arg...]","text":"

            bitwarden returns structured data retrieved from Bitwarden using the Bitwarden CLI (bw). args are passed to bw get unchanged and the output from bw get is parsed as JSON.

            The output from bw get is cached so calling bitwarden multiple times with the same arguments will only invoke bw once.

            Example

            username = {{ (bitwarden \"item\" \"$ITEMID\").login.username }}\npassword = {{ (bitwarden \"item\" \"$ITEMID\").login.password }}\n
            "},{"location":"reference/templates/bitwarden-functions/bitwardenAttachment/","title":"bitwardenAttachment filename itemid","text":"

            bitwardenAttachment returns a document from Bitwarden using the Bitwarden CLI (bw). filename and itemid are passed to bw get attachment $FILENAME --itemid $ITEMID and the output is returned.

            The output from bw is cached so calling bitwardenAttachment multiple times with the same filename and itemid will only invoke bw once.

            Example

            {{- bitwardenAttachment \"$FILENAME\" \"$ITEMID\" -}}\n
            "},{"location":"reference/templates/bitwarden-functions/bitwardenAttachmentByRef/","title":"bitwardenAttachmentByRef filename args","text":"

            bitwardenAttachmentByRef returns a document from Bitwarden using the Bitwarden CLI (bw). This method requires two calls to bw to complete:

            1. First, args are passed to bw get in order to retrieve the item's itemid.
            2. Then, filename and itemid are passed to bw get attachment $FILENAME --itemid $ITEMID and the output from bw is returned.

            The output from bw is cached so calling bitwardenAttachmentByRef multiple times with the same filename and itemid will only invoke bw once.

            Example

            {{- bitwardenAttachmentByRef \"$FILENAME\" \"$ARGS\" -}}\n

            Example

            {{- bitwardenAttachmentByRef \"id_rsa\" \"item\" \"example.com\" -}}\n
            "},{"location":"reference/templates/bitwarden-functions/bitwardenFields/","title":"bitwardenFields [arg...]","text":"

            bitwardenFields returns structured data retrieved from Bitwarden using the Bitwarden CLI (bw). args are passed to bw get unchanged, the output from bw get is parsed as JSON, and the elements of fields are returned as a dict indexed by each field's name.

            The output from bw get is cached so calling bitwardenFields multiple times with the same arguments will only invoke bw get once.

            Example

            {{ (bitwardenFields \"item\" \"$ITEMID\").token.value }}\n

            Example

            Given the output from bw get:

            {\n    \"object\": \"item\",\n    \"id\": \"bf22e4b4-ae4a-4d1c-8c98-ac620004b628\",\n    \"organizationId\": null,\n    \"folderId\": null,\n    \"type\": 1,\n    \"name\": \"example.com\",\n    \"notes\": null,\n    \"favorite\": false,\n    \"fields\": [\n        {\n            \"name\": \"hidden\",\n            \"value\": \"hidden-value\",\n            \"type\": 1\n        },\n        {\n            \"name\": \"token\",\n            \"value\": \"token-value\",\n            \"type\": 0\n        }\n    ],\n    \"login\": {\n        \"username\": \"username-value\",\n        \"password\": \"password-value\",\n        \"totp\": null,\n        \"passwordRevisionDate\": null\n    },\n    \"collectionIds\": [],\n    \"revisionDate\": \"2020-10-28T00:21:02.690Z\"\n}\n

            the return value if bitwardenFields will be the map:

            {\n    \"hidden\": {\n        \"name\": \"hidden\",\n        \"type\": 1,\n        \"value\": \"hidden-value\"\n    },\n    \"token\": {\n        \"name\": \"token\",\n        \"type\": 0,\n        \"value\": \"token-value\"\n    }\n}\n
            "},{"location":"reference/templates/bitwarden-functions/bitwardenSecrets/","title":"bitwardenSecrets secret-id [access-token]","text":"

            bitwardenSecrets returns structured data from Bitwarden using the Bitwarden Secrets CLI (bws). secret-id is passed to bws secret get and the output from bws secret get is parsed as JSON and returned.

            If the additional access-token argument is given, it is passed to bws secret get with the --access-token flag.

            The output from bws secret get is cached so calling bitwardenSecrets multiple times with the same secret-id and access-token will only invoke bws secret get once.

            !!!

            ```\n{{ (bitwardenSecrets \"be8e0ad8-d545-4017-a55a-b02f014d4158\").value }}\n```\n
            "},{"location":"reference/templates/bitwarden-functions/rbw/","title":"rbw name [arg...]","text":"

            rbw returns structured data retrieved from Bitwarden using rbw. name is passed to rbw get --raw, along with any extra args, and the output is parsed as JSON.

            The output from rbw get --raw is cached so calling rbw multiple times with the same arguments will only invoke rbw once.

            Example

            username = {{ (rbw \"test-entry\").data.username }}\npassword = {{ (rbw \"test-entry\" \"--folder\" \"my-folder\").data.password }}\n
            "},{"location":"reference/templates/bitwarden-functions/rbwFields/","title":"rbwFields name [arg...]","text":"

            rbw returns structured data retrieved from Bitwarden using rbw. name is passed to rbw get --raw, along with any extra args, the output is parsed as JSON, and the elements of fields are returned as a dict indexed by each field's name.

            The output from rbw get --raw is cached so calling rbwFields multiple times with the same arguments will only invoke rbwFields once.

            Example

            {{ (rbwFields \"item\").name.value }}\n{{ (rbwFields \"item\" \"--folder\" \"my-folder\").name.value }}\n
            "},{"location":"reference/templates/dashlane-functions/","title":"Dashlane functions","text":"

            The dashlane* functions return data from Dashlane using the Dashlane CLI.

            "},{"location":"reference/templates/dashlane-functions/dashlaneNote/","title":"dashlaneNote filter","text":"

            dashlaneNote returns the content of a secure note from Dashlane using the Dashlane CLI (dcli). filter is passed to dcli note, and the output from dcli note is just read as a multiline string.

            The output from dcli note is cached so calling dashlaneNote multiple times with the same filter will only invoke dcli note once.

            Example

            {{ dashlaneNote \"filter\" }}\n
            "},{"location":"reference/templates/dashlane-functions/dashlanePassword/","title":"dashlanePassword filter","text":"

            dashlanePassword returns structured data from Dashlane using the Dashlane CLI (dcli). filter is passed to dcli password --output json, and the output from dcli password is parsed as JSON.

            The output from dcli password cached so calling dashlanePassword multiple times with the same filter will only invoke dcli password once.

            Example

            {{ (index (dashlanePassword \"filter\") 0).password }}\n
            "},{"location":"reference/templates/doppler-functions/","title":"Doppler","text":"

            chezmoi includes support for Doppler using the doppler CLI to expose data through the doppler and dopplerProjectJson template functions.

            "},{"location":"reference/templates/doppler-functions/doppler/","title":"doppler key [project [config]]","text":"

            doppler returns the secret for the specified project and configuration from Doppler using doppler secrets download --json --no-file.

            If either of project or config are empty or omitted, then chezmoi will use the value from the doppler.project and doppler.config config variables if they are set and not empty.

            Example

            {{ doppler \"SECRET_NAME\" \"project_name\" \"configuration_name\" }}\n
            "},{"location":"reference/templates/doppler-functions/dopplerProjectJson/","title":"dopplerProjectJson [project [config]]","text":"

            dopplerProjectJson returns the secret for the specified project and configuration from Doppler using doppler secrets download --json --no-file as json structured data.

            If either of project or config are empty or omitted, then chezmoi will use the value from the doppler.project and doppler.config config variables if they are set and not empty.

            Example

            {{ (dopplerProjectJson \"project_name\" \"configuration_name\").SECRET_NAME }}\n
            "},{"location":"reference/templates/ejson-functions/","title":"ejson functions","text":"

            The ejson* functions return data from ejson-encrypted files.

            "},{"location":"reference/templates/ejson-functions/ejsonDecrypt/","title":"ejsonDecrypt filePath","text":"

            ejsonDecrypt returns the decrypted content of an ejson-encrypted file.

            filePath indicates where the encrypted file is located.

            The decrypted file is cached so calling ejsonDecrypt multiple times with the same filePath will only run through the decryption process once. The cache is shared with ejsonDecryptWithKey.

            Example

            {{ (ejsonDecrypt \"my-secrets.ejson\").password }}\n
            "},{"location":"reference/templates/ejson-functions/ejsonDecryptWithKey/","title":"ejsonDecryptWithKey filePath key","text":"

            ejsonDecryptWithKey returns the decrypted content of an ejson-encrypted file.

            filePath indicates where the encrypted file is located, and key is used to decrypt the file.

            The decrypted file is cached so calling ejsonDecryptWithKey multiple times with the same filePath will only run through the decryption process once. The cache is shared with ejsonDecrypt.

            Example

            {{ (ejsonDecryptWithKey \"my-secrets.ejson\" \"top-secret-key\").password }}\n
            "},{"location":"reference/templates/functions/","title":"Functions","text":"

            All standard text/template and text template functions from sprig are included. chezmoi provides some additional functions.

            "},{"location":"reference/templates/functions/comment/","title":"comment prefix text","text":"

            comment returns text with each line prefixed with prefix.

            Example

            {{ \"Header\" | comment \"# \" }}\n
            "},{"location":"reference/templates/functions/completion/","title":"completion shell","text":"

            completion returns chezmoi's shell completion for shell. shell can be one of bash, fish, powershell, or zsh.

            Example

            {{ completion \"zsh\" }}\n
            "},{"location":"reference/templates/functions/decrypt/","title":"decrypt ciphertext","text":"

            decrypt decrypts ciphertext using chezmoi's configured encryption method.

            Example

            {{ joinPath .chezmoi.sourceDir \".ignored-encrypted-file.age\" | include | decrypt }}\n
            "},{"location":"reference/templates/functions/deleteValueAtPath/","title":"deleteValueAtPath path dict","text":"

            deleteValueAtPath modifies dict to delete the value at path and returns dict. path can be either a string containing a .-separated list of keys or a list of keys.

            If path does not exist in dict then deleteValueAtPath returns dict unchanged.

            Example

            {{ dict \"outer\" (dict \"inner\" \"value\") | deleteValueAtPath \"outer.inner\" | toJson }}\n{{ dict | setValueAtPath \"key1\" \"value1\" | setValueAtPath \"key2.nestedKey\" \"value2\" | toJson }}\n{{ dict | setValueAtPath (list \"key2\" \"nestedKey\") \"value2\" | toJson }}\n
            "},{"location":"reference/templates/functions/encrypt/","title":"encrypt plaintext","text":"

            encrypt encrypts plaintext using chezmoi's configured encryption method.

            "},{"location":"reference/templates/functions/eqFold/","title":"eqFold string1 string2 [extraString...]","text":"

            eqFold returns the boolean truth of comparing string1 with string2 and any number of extraStrings under Unicode case-folding.

            Example

            {{ $commandOutput := output \"path/to/output-FOO.sh\" }}\n{{ if eqFold \"foo\" $commandOutput }}\n# $commandOutput is \"foo\"/\"Foo\"/\"FOO\"...\n{{ else if eqFold \"bar\" $commandOutput }}\n# $commandOutput is \"bar\"/\"Bar\"/\"BAR\"...\n{{ end }}\n
            "},{"location":"reference/templates/functions/findExecutable/","title":"findExecutable file path-list","text":"

            findExecutable searches for an executable named file in directories identified by path-list. The result will be the executable file concatenated with the matching path. If an executable file cannot be found in path-list, findExecutable returns an empty string.

            findExecutable is provided as an alternative to lookPath so that you can interrogate the system PATH as it would be configured after chezmoi apply. Like lookPath, findExecutable is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

            The return value of the first successful call to findExecutable is cached, and future calls to findExecutable with the same parameters will return this path.

            Info

            On Windows, the resulting path will contain the first found executable extension as identified by the environment variable %PathExt%.

            Example

            {{ if findExecutable \"rtx\" (list \"bin\" \"go/bin\" \".cargo/bin\" \".local/bin\") }}\n# $HOME/.cargo/bin/rtx exists and will probably be in $PATH after apply\n{{ end }}\n
            "},{"location":"reference/templates/functions/findOneExecutable/","title":"findOneExecutable file-list path-list","text":"

            findOneExecutable searches for an executable from file-list in directories identified by path-list, finding the first matching executable in the first matching directory (each directory is searched for matching executables in turn). The result will be the executable file concatenated with the matching path. If an executable from file-list cannot be found in path-list, findOneExecutable returns an empty string.

            findOneExecutable is provided as an alternative to lookPath so that you can interrogate the system PATH as it would be configured after chezmoi apply. Like lookPath, findOneExecutable is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

            The return value of the first successful call to findOneExecutable is cached, and future calls to findOneExecutable with the same parameters will return this path.

            Info

            On Windows, the resulting path will contain the first found executable extension as identified by the environment variable %PathExt%.

            Example

            {{ if findOneExecutable (list \"eza\" \"exa\") (list \"bin\" \"go/bin\" \".cargo/bin\" \".local/bin\") }}\n# $HOME/.cargo/bin/exa exists and will probably be in $PATH after apply\n{{ end }}\n
            "},{"location":"reference/templates/functions/fromIni/","title":"fromIni initext","text":"

            fromIni returns the parsed value of initext.

            Example

            {{ (fromIni \"[section]\\nkey = value\").section.key }}\n
            "},{"location":"reference/templates/functions/fromJson/","title":"fromJson jsontext","text":"

            fromJson parses jsontext as JSON and returns the parsed value.

            JSON numbers that can be represented exactly as 64-bit signed integers are returned as such. Otherwise, if the number is in the range of 64-bit IEEE floating point values, it is returned as such. Otherwise, the number is returned as a string. See RFC7159 Section 6.

            "},{"location":"reference/templates/functions/fromJsonc/","title":"fromJsonc jsonctext","text":"

            fromJsonc parses jsonctext as JSONC using github.com/tailscale/hujson and returns the parsed value.

            "},{"location":"reference/templates/functions/fromToml/","title":"fromToml tomltext","text":"

            fromToml returns the parsed value of tomltext.

            Example

            {{ (fromToml \"[section]\\nkey = \\\"value\\\"\").section.key }}\n
            "},{"location":"reference/templates/functions/fromYaml/","title":"fromYaml yamltext","text":"

            fromYaml returns the parsed value of yamltext.

            Example

            {{ (fromYaml \"key1: value\\nkey2: value\").key2 }}\n
            "},{"location":"reference/templates/functions/glob/","title":"glob pattern","text":"

            glob returns the list of files matching pattern according to doublestar.Glob. Relative paths are interpreted relative to the destination directory.

            "},{"location":"reference/templates/functions/hexDecode/","title":"hexDecode hextext","text":"

            hexDecode returns hextext decoded from a hex-encoding string.

            Example

            {{ hexDecode \"68656c6c6f\" }}\n
            "},{"location":"reference/templates/functions/hexEncode/","title":"hexEncode string","text":"

            hexEncode returns string encoded as a hex string.

            Example

            {{ hexEncode \"example\" }}\n
            "},{"location":"reference/templates/functions/include/","title":"include filename","text":"

            include returns the literal contents of the file named *filename*. Relative paths are interpreted relative to the source directory.

            "},{"location":"reference/templates/functions/includeTemplate/","title":"includeTemplate filename [data]","text":"

            includeTemplate returns the result of executing the contents of filename with the optional data. Relative paths are first searched for in .chezmoitemplates and, if not found, are interpreted relative to the source directory.

            "},{"location":"reference/templates/functions/ioreg/","title":"ioreg","text":"

            On macOS, ioreg returns the structured output of the ioreg -a -l command, which includes detailed information about the I/O Kit registry.

            On non-macOS operating systems, ioreg returns nil.

            The output from ioreg is cached so multiple calls to the ioreg function will only execute the ioreg -a -l command once.

            Example

            {{ if eq .chezmoi.os \"darwin\" }}\n{{   $serialNumber := index ioreg \"IORegistryEntryChildren\" 0 \"IOPlatformSerialNumber\" }}\n{{ end }}\n

            Warning

            The ioreg function can be very slow and should not be used. It will be removed in a later version of chezmoi.

            "},{"location":"reference/templates/functions/isExecutable/","title":"isExecutable file","text":"

            isExecutable returns true if a file is executable.

            Example

            {{ if isExecutable \"/bin/echo\" }}\n# echo is executable\n{{ end }}\n
            "},{"location":"reference/templates/functions/joinPath/","title":"joinPath element...","text":"

            joinPath joins any number of path elements into a single path, separating them with the OS-specific path separator. Empty elements are ignored. The result is cleaned. If the argument list is empty or all its elements are empty, joinPath returns an empty string. On Windows, the result will only be a UNC path if the first non-empty element is a UNC path.

            Example

            {{ joinPath .chezmoi.homeDir \".zshrc\" }}\n
            "},{"location":"reference/templates/functions/jq/","title":"jq query input","text":"

            jq runs the jq query query against input and returns a list of results.

            Example

            {{ dict \"key\" \"value\" | jq \".key\" | first }}\n

            Warning

            jq uses github.com/itchyny/gojq, which behaves slightly differently to the jq command in some edge cases.

            "},{"location":"reference/templates/functions/lookPath/","title":"lookPath file","text":"

            lookPath searches for an executable named file in the directories named by the PATH environment variable. If file contains a slash, it is tried directly and the PATH is not consulted. The result may be an absolute path or a path relative to the current directory. If file is not found, lookPath returns an empty string.

            lookPath is not hermetic: its return value depends on the state of the environment and the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

            The return value of the first successful call to lookPath is cached, and future calls to lookPath for the same file will return this path.

            Example

            {{ if lookPath \"diff-so-fancy\" }}\n# diff-so-fancy is in $PATH\n{{ end }}\n
            "},{"location":"reference/templates/functions/lstat/","title":"lstat name","text":"

            lstat runs os.Lstat on name. If name exists it returns structured data. If name does not exist then it returns a false value. If os.Lstat returns any other error then it raises an error. The structured value returned if name exists contains the fields name, size, mode, perm, modTime, isDir, and type.

            lstat is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

            Example

            {{ if eq (joinPath .chezmoi.homeDir \".xinitrc\" | lstat).type \"symlink\" }}\n# ~/.xinitrc exists and is a symlink\n{{ end }}\n
            "},{"location":"reference/templates/functions/mozillaInstallHash/","title":"mozillaInstallHash path","text":"

            mozillaInstallHash returns the Mozilla install hash for path. This is a convenience function to assist the management of Firefox profiles.

            "},{"location":"reference/templates/functions/output/","title":"output name [arg...]","text":"

            output returns the output of executing the command name with args. If executing the command returns an error then template execution exits with an error. The execution occurs every time that the template is executed. It is the user's responsibility to ensure that executing the command is both idempotent and fast.

            Example

            current-context: {{ output \"kubectl\" \"config\" \"current-context\" | trim }}\n
            "},{"location":"reference/templates/functions/pruneEmptyDicts/","title":"pruneEmptyDicts dict","text":"

            pruneEmptyDicts modifies dict to remove nested empty dicts. Properties are pruned from the bottom up, so any nested dicts that themselves only contain empty dicts are pruned.

            Example

            {{ dict \"key\" \"value\" \"inner\" (dict) | pruneEmptyDicts | toJson }}\n
            "},{"location":"reference/templates/functions/quoteList/","title":"quoteList list","text":"

            quoteList returns a list where each element is the corresponding element in list quoted.

            Example

            {{ $args := list \"alpha\" \"beta\" \"gamma\" }}\ncommand {{ $args | quoteList }}\n
            [section]\n    array = [{{- $list | quoteList | join \", \" -}}]\n
            "},{"location":"reference/templates/functions/replaceAllRegex/","title":"replaceAllRegex expr repl text","text":"

            replaceAllRegex returns text with all substrings matching the regular expression expr replaced with repl. It is an alternative to sprig's regexpReplaceAll function with a different argument order that supports pipelining.

            Example

            {{ \"foo subject string\" | replaceAllRegex \"foo\" \"bar\" }}\n
            "},{"location":"reference/templates/functions/setValueAtPath/","title":"setValueAtPath path value dict","text":"

            setValueAtPath modifies dict to set the value at path to value and returns dict. path can be either a string containing a .-separated list of keys or a list of keys. The function will create new key/value pairs in dict if needed.

            This is an alternative to sprig's set function with a different argument order that supports pipelining.

            Example

            {{ dict | setValueAtPath \"key1\" \"value1\" | setValueAtPath \"key2.nestedKey\" \"value2\" | toJson }}\n{{ dict | setValueAtPath (list \"key2\" \"nestedKey\") \"value2\" | toJson }}\n
            "},{"location":"reference/templates/functions/stat/","title":"stat name","text":"

            stat runs os.Stat on name. If name exists it returns structured data. If name does not exist then it returns a false value. If os.Stat returns any other error then it raises an error. The structured value returned if name exists contains the fields name, size, mode, perm, modTime, isDir, and type.

            stat is not hermetic: its return value depends on the state of the filesystem at the moment the template is executed. Exercise caution when using it in your templates.

            Example

            {{ if stat (joinPath .chezmoi.homeDir \".pyenv\") }}\n# ~/.pyenv exists\n{{ end }}\n
            "},{"location":"reference/templates/functions/toIni/","title":"toIni value","text":"

            toIni returns the ini representation of value, which must be a dict.

            Example

            {{ dict \"key\" \"value\" \"section\" (dict \"subkey\" \"subvalue\") | toIni }}\n

            Warning

            The ini format is not well defined, and the particular variant generated by toIni might not be suitable for you.

            "},{"location":"reference/templates/functions/toPrettyJson/","title":"toPrettyJson [indent] value","text":"

            toPrettyJson returns the JSON representation of value. The optional indent specifies how much nested elements are indented relative to their parent. indent defaults to two spaces.

            Examples

            {{ dict \"a\" (dict \"b\" \"c\") | toPrettyJson \"\\t\" }}\n
            "},{"location":"reference/templates/functions/toToml/","title":"toToml value","text":"

            toToml returns the TOML representation of value.

            Example

            {{ dict \"key\" \"value\" | toToml }}\n
            "},{"location":"reference/templates/functions/toYaml/","title":"toYaml value","text":"

            toYaml returns the YAML representation of value.

            Example

            {{ dict \"key\" \"value\" | toYaml }}\n
            "},{"location":"reference/templates/functions/warnf/","title":"warnf format [arg...]","text":"

            warnf prints a message to stderr prefixed by chezmoi: warning: and returns the empty string. format is interpreted as a printf-style format string with the given args.

            "},{"location":"reference/templates/github-functions/","title":"GitHub functions","text":"

            The gitHub* template functions return data from the GitHub API.

            By default, chezmoi makes anonymous GitHub API requests, which are subject to GitHub's rate limits (currently 60 requests per hour per source IP address). chezmoi caches results from identical GitHub API requests for the period defined in gitHub.refreshPeriod (default one minute).

            If any of the environment variables $CHEZMOI_GITHUB_ACCESS_TOKEN, $GITHUB_ACCESS_TOKEN, or $GITHUB_TOKEN are found, then the first one found will be used to authenticate the GitHub API requests which have a higher rate limit (currently 5,000 requests per hour per user).

            In practice, GitHub API rate limits are high enough chezmoi's caching of results mean that you should rarely need to set a token, unless you are sharing a source IP address with many other GitHub users. If needed, the GitHub documentation describes how to create a personal access token.

            "},{"location":"reference/templates/github-functions/gitHubKeys/","title":"gitHubKeys user","text":"

            gitHubKeys returns user's public SSH keys from GitHub using the GitHub API. The returned value is a slice of structs with .ID and .Key fields.

            Warning

            If you use this function to populate your ~/.ssh/authorized_keys file then you potentially open SSH access to anyone who is able to modify or add to your GitHub public SSH keys, possibly including certain GitHub employees. You should not use this function on publicly-accessible machines and should always verify that no unwanted keys have been added, for example by using the -v / --verbose option when running chezmoi apply or chezmoi update.

            Additionally, GitHub automatically removes keys which haven't been used in the last year. This may cause your keys to be removed from ~/.ssh/authorized_keys suddenly, and without any warning or indication of the removal. You should provide one or more keys in plain text alongside this function to avoid unknowingly losing remote access to your machine.

            Example

            {{ range gitHubKeys \"user\" }}\n{{- .Key }}\n{{ end }}\n
            "},{"location":"reference/templates/github-functions/gitHubLatestRelease/","title":"gitHubLatestRelease owner-repo","text":"

            gitHubLatestRelease calls the GitHub API to retrieve the latest release about the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

            Calls to gitHubLatestRelease are cached so calling gitHubLatestRelease with the same owner-repo will only result in one call to the GitHub API.

            Example

            {{ (gitHubLatestRelease \"docker/compose\").TagName }}\n
            "},{"location":"reference/templates/github-functions/gitHubLatestReleaseAssetURL/","title":"gitHubLatestReleaseAssetURL owner-repo pattern","text":"

            gitHubLatestReleaseAssetURL calls the GitHub API to retrieve the latest release about the given owner-repo, returning structured data as defined by the GitHub Go API bindings. It then iterates through all the release's assets, returning the first one that matches pattern. pattern is a shell pattern as described in path.Match.

            Calls to gitHubLatestReleaseAssetURL are cached so calling gitHubLatestReleaseAssetURL with the same owner-repo will only result in one call to the GitHub API.

            Example

            {{ gitHubLatestReleaseAssetURL \"FiloSottile/age\" (printf \"age-*-%s-%s.tar.gz\" .chezmoi.os .chezmoi.arch) }}\n{{ gitHubLatestReleaseAssetURL \"twpayne/chezmoi\" (printf \"chezmoi-%s-%s\" .chezmoi.os .chezmoi.arch) }}\n
            "},{"location":"reference/templates/github-functions/gitHubLatestTag/","title":"gitHubLatestTag owner-repo","text":"

            gitHubLatestTag calls the GitHub API to retrieve the latest tag for the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

            Calls to gitHubLatestTag are cached the same as githubTags, so calling gitHubLatestTag with the same owner-repo will only result in one call to the GitHub API.

            Example

            {{ (gitHubLatestTag \"docker/compose\").Name }}\n

            Warning

            The gitHubLatestTag returns the first tag returned by the list repository tags GitHub API endpoint. Although this seems to be the most recent tag, the GitHub API documentation does not specify the order of the returned tags.

            "},{"location":"reference/templates/github-functions/gitHubRelease/","title":"gitHubRelease owner-repo version","text":"

            gitHubRelease calls the GitHub API to retrieve the latest releases about the given owner-repo, It iterates through all the versions of the release, fetching the first entry equal to version.

            It then returns structured data as defined by the GitHub Go API bindings.

            Calls to gitHubRelease are cached so calling gitHubRelease with the same owner-repo version will only result in one call to the GitHub API.

            Example

            {{ (gitHubRelease \"docker/compose\" \"v2.29.1\").TagName }}\n
            "},{"location":"reference/templates/github-functions/gitHubReleaseAssetURL/","title":"gitHubReleaseAssetURL owner-repo version pattern","text":"

            gitHubReleaseAssetURL calls the GitHub API to retrieve the latest releases about the given owner-repo, returning structured data as defined by the GitHub Go API bindings. It iterates through all the versions of the release, returning the first entry equal to version. It then iterates through all the release's assets, returning the first one that matches pattern. pattern is a shell pattern as described in path.Match.

            Calls to gitHubReleaseAssetURL are cached so calling gitHubReleaseAssetURL with the same owner-repo will only result in one call to the GitHub API.

            Example

            {{ gitHubReleaseAssetURL \"FiloSottile/age\" \"age v1.2.0\" (printf \"age-*-%s-%s.tar.gz\" .chezmoi.os .chezmoi.arch) }}\n{{ gitHubReleaseAssetURL \"twpayne/chezmoi\" \"v2.50.0\" (printf \"chezmoi-%s-%s\" .chezmoi.os .chezmoi.arch) }}\n
            "},{"location":"reference/templates/github-functions/gitHubReleases/","title":"gitHubReleases owner-repo","text":"

            gitHubReleases calls the GitHub API to retrieve the first page of releases for the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

            Calls to gitHubReleases are cached so calling gitHubReleases with the same owner-repo will only result in one call to the GitHub API.

            Example

            {{ (index (gitHubReleases \"docker/compose\") 0).TagName }}\n

            Note

            The maximum number of items returned by gitHubReleases is determined by default page size for the GitHub API.

            Warning

            The values returned by gitHubReleases are not directly queryable via the jq function and must instead be converted through JSON:

            {{ gitHubReleases \"docker/compose\" | toJson | fromJson | jq \".[0].tag_name\" }}\n
            "},{"location":"reference/templates/github-functions/gitHubTags/","title":"gitHubTags owner-repo","text":"

            gitHubTags calls the GitHub API to retrieve the first page of tags for the given owner-repo, returning structured data as defined by the GitHub Go API bindings.

            Calls to gitHubTags are cached so calling gitHubTags with the same owner-repo will only result in one call to the GitHub API.

            Example

            {{ (index (gitHubTags \"docker/compose\") 0).Name }}\n

            Note

            The maximum number of items returned by gitHubReleases is determined by default page size for the GitHub API.

            Warning

            The values returned by gitHubTags are not directly queryable via the jq function and must instead be converted through JSON:

            {{ gitHubTags \"docker/compose\" | toJson | fromJson | jq \".[0].name\" }}\n
            "},{"location":"reference/templates/gopass-functions/","title":"gopass functions","text":"

            The gopass* template functions return data stored in gopass using the gopass CLI (gopass) or builtin code.

            By default, chezmoi will use the gopass CLI (gopass). Depending on your gopass configuration, you may have to enter your passphrase once for each secret.

            When setting gopass.mode to builtin, chezmoi use builtin code to access the goapass database and caches your passphrase in plaintext in memory until chezmoi terminates.

            Warning

            Using the builtin code is experimental and may be removed.

            "},{"location":"reference/templates/gopass-functions/gopass/","title":"gopass gopass-name","text":"

            gopass returns passwords stored in gopass using the gopass CLI (gopass). gopass-name is passed to gopass show --password $GOPASS_NAME and the first line of the output of gopass is returned with the trailing newline stripped. The output from gopass is cached so calling gopass multiple times with the same gopass-name will only invoke gopass once.

            Example

            {{ gopass \"$PASS_NAME\" }}\n
            "},{"location":"reference/templates/gopass-functions/gopassRaw/","title":"gopassRaw gopass-name","text":"

            gopass returns raw passwords stored in gopass using the gopass CLI (gopass). gopass-name is passed to gopass show --noparsing $GOPASS_NAME and the output is returned. The output from gopassRaw is cached so calling gopassRaw multiple times with the same gopass-name will only invoke gopass once.

            "},{"location":"reference/templates/hcp-vault-secrets-functions/","title":"HCP Vault Secrets","text":"

            chezmoi includes support for HCP Vault Secrets using the vlt CLI to expose data through the hcpVaultSecret and hcpVaultSecretJson template functions.

            "},{"location":"reference/templates/hcp-vault-secrets-functions/hcpVaultSecret/","title":"hcpVaultSecret key [application-name [project-id [organization-id]]]","text":"

            hcpVaultSecret returns the plaintext secret from HCP Vault Secrets using vlt secrets get --plaintext.

            If any of application-name, project-id, or organization-id are empty or omitted, then chezmoi will use the value from the hcpVaultSecret.applicationName, hcpVaultSecret.projectId, and hcpVaultSecret.organizationId config variables if they are set and not empty.

            Example

            {{ hcpVaultSecret \"username\" }}\n
            "},{"location":"reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson/","title":"hcpVaultSecretJson key [application-name [project-id [organization-id]]]","text":"

            hcpVaultSecretJson returns structured data from HCP Vault Secrets using vlt secrets get --format=json.

            If any of application-name, project-id, or organization-id are empty or omitted, then chezmoi will use the value from the hcpVaultSecret.applicationName, hcpVaultSecret.projectId, and hcpVaultSecret.organizationId config variables if they are set and not empty.

            Example

            {{ (hcpVaultSecretJson \"secret_name\" \"application_name\").created_by.email }}\n
            "},{"location":"reference/templates/init-functions/","title":"Init functions","text":"

            These template functions are only available when generating a config file with chezmoi init. For testing with chezmoi execute-template, pass the --init flag to enable them.

            "},{"location":"reference/templates/init-functions/exit/","title":"exit code","text":"

            exit stops template execution and causes chezmoi to exit with code.

            "},{"location":"reference/templates/init-functions/promptBool/","title":"promptBool prompt [default]","text":"

            promptBool prompts the user with prompt and returns the user's response interpreted as a boolean. If default is passed and the user's response is empty then it returns default. The user's response is interpreted as follows (case insensitive):

            Response Result 1, on, t, true, y, yes true 0, off, f, false, n, no false"},{"location":"reference/templates/init-functions/promptBoolOnce/","title":"promptBoolOnce map path prompt [default]","text":"

            promptBoolOnce returns the value of map at path if it exists and is a boolean value, otherwise it prompts the user for a boolean value with prompt and an optional default using promptBool.

            Example

            {{ $hasGUI := promptBoolOnce . \"hasGUI\" \"Does this machine have a GUI\" }}\n
            "},{"location":"reference/templates/init-functions/promptChoice/","title":"promptChoice prompt choices [default]","text":"

            promptChoice prompts the user with prompt and choices and returns the user's response. choices must be a list of strings. If default is passed and the user's response is empty then it returns default.

            Example

            {{- $choices := list \"desktop\" \"server\" -}}\n{{- $hosttype := promptChoice \"What type of host are you on\" $choices -}}\n[data]\n    hosttype = {{- $hosttype | quote -}}\n
            "},{"location":"reference/templates/init-functions/promptChoiceOnce/","title":"promptChoiceOnce map path prompt choices [default]","text":"

            promptChoiceOnce returns the value of map at path if it exists and is a string, otherwise it prompts the user for one of choices with prompt and an optional default using promptChoice.

            Example

            {{- $choices := list \"desktop\" \"laptop\" \"server\" \"termux\" -}}\n{{- $hosttype := promptChoiceOnce . \"hosttype\" \"What type of host are you on\" $choices -}}\n[data]\n    hosttype = {{- $hosttype | quote -}}\n
            "},{"location":"reference/templates/init-functions/promptInt/","title":"promptInt prompt [default]","text":"

            promptInt prompts the user with prompt and returns the user's response interpreted as an integer. If default is passed and the user's response is empty then it returns default.

            "},{"location":"reference/templates/init-functions/promptIntOnce/","title":"promptIntOnce map path prompt [default]","text":"

            promptIntOnce returns the value of map at path if it exists and is an integer value, otherwise it prompts the user for a integer value with prompt and an optional default using promptInt.

            Example

            {{ $monitors := promptIntOnce . \"monitors\" \"How many monitors does this machine have\" }}\n
            "},{"location":"reference/templates/init-functions/promptString/","title":"promptString prompt [default]","text":"

            promptString prompts the user with prompt and returns the user's response with all leading and trailing spaces stripped. If default is passed and the user's response is empty then it returns default.

            Example

            {{ $email := promptString \"email\" -}}\n[data]\n    email = {{ $email | quote }}\n
            "},{"location":"reference/templates/init-functions/promptStringOnce/","title":"promptStringOnce map path prompt [default]","text":"

            promptStringOnce returns the value of map at path if it exists and is a string value, otherwise it prompts the user for a string value with prompt and an optional default using promptString.

            Example

            {{ $email := promptStringOnce . \"email\" \"What is your email address\" }}\n
            "},{"location":"reference/templates/init-functions/stdinIsATTY/","title":"stdinIsATTY","text":"

            stdinIsATTY returns true if chezmoi's standard input is a TTY. It is primarily useful for determining whether prompt* functions should be called or default values be used.

            Example

            {{ $email := \"\" }}\n{{ if stdinIsATTY }}\n{{   $email = promptString \"email\" }}\n{{ else }}\n{{   $email = \"user@example.com\" }}\n{{ end }}\n
            "},{"location":"reference/templates/init-functions/writeToStdout/","title":"writeToStdout string...","text":"

            writeToStdout writes each string to stdout.

            Example

            {{- writeToStdout \"Hello, world\\n\" -}}\n
            "},{"location":"reference/templates/keepassxc-functions/","title":"KeePassXC functions","text":"

            The keepassxc* template functions return structured data retrieved from a KeePassXC database using the KeePassXC CLI (keepassxc-cli)

            The database is configured by setting keepassxc.database in the configuration file. You will be prompted for the database password the first time keepassxc-cli is run, and the password is cached, in plain text, in memory until chezmoi terminates.

            The command used can be changed by setting the keepassxc.command configuration variable, and extra arguments can be added by setting keepassxc.args. The password prompt can be disabled by setting keepassxc.prompt to false.

            By default, chezmoi will prompt for the KeePassXC password when required and cache it for the duration of chezmoi's execution. Setting keepassxc.mode to open will tell chezmoi to instead open KeePassXC's console with keepassxc-cli open followed by keepassxc.args. chezmoi will use this console to request values from KeePassXC.

            When setting keepassxc.mode to builtin, chezmoi uses a builtin library to access a keepassxc database, which can be handy if keepassxc-cli is not available. Some KeePassXC features (such as Yubikey-enhanced encryption) may not be available with builtin support.

            "},{"location":"reference/templates/keepassxc-functions/keepassxc/","title":"keepassxc entry","text":"

            keepassxc returns structured data for entry using keepassxc-cli.

            The output from keepassxc-cli is parsed into key-value pairs and cached so calling keepassxc multiple times with the same entry will only invoke keepassxc-cli once.

            Example

            username = {{ (keepassxc \"example.com\").UserName }}\npassword = {{ (keepassxc \"example.com\").Password }}\n
            "},{"location":"reference/templates/keepassxc-functions/keepassxcAttachment/","title":"keepassxcAttachment entry name","text":"

            keepassxcAttachment returns the attachment with name of entry using keepassxc-cli.

            Info

            keepassxcAttachment requires keepassxc-cli version 2.7.0 or later.

            Example

            {{- keepassxcAttachment \"SSH Config\" \"config\" -}}\n
            "},{"location":"reference/templates/keepassxc-functions/keepassxcAttribute/","title":"keepassxcAttribute entry attribute","text":"

            keepassxcAttribute returns the attribute attribute of entry using keepassxc-cli, with any leading or trailing whitespace removed.

            Example

            {{ keepassxcAttribute \"SSH Key\" \"private-key\" }}\n
            "},{"location":"reference/templates/keeper-functions/","title":"Keeper functions","text":"

            The keeper* functions return data from Keeper Commander CLI (keeper).

            The command used can by changed by setting the keeper.command configuration variable, and extra arguments can be added by setting keeper.args.

            "},{"location":"reference/templates/keeper-functions/keeper/","title":"keeper uid","text":"

            keeper returns structured data retrieved from Keeper using the Commander CLI. uid is passed to keeper get --format=json and the output is parsed as JSON.

            "},{"location":"reference/templates/keeper-functions/keeperDataFields/","title":"keeperDataFields uid","text":"

            keeperDataFields returns the .data.fields elements of keeper get --format=json *uid* indexed by type.

            "},{"location":"reference/templates/keeper-functions/keeperDataFields/#examples","title":"Examples","text":"
            url = {{ (keeperDataFields \"$UID\").url }}\nlogin = {{ index (keeperDataFields \"$UID\").login 0 }}\npassword = {{ index (keeperDataFields \"$UID\").password 0 }}\n
            "},{"location":"reference/templates/keeper-functions/keeperFindPassword/","title":"keeperFindPassword query","text":"

            keeperFindPassword returns the output of keeper find-password query. query can be a UID or a path.

            "},{"location":"reference/templates/keyring-functions/keyring/","title":"keyring service user","text":"

            keyring retrieves the value associated with service and user from the user's keyring.

            OS Keyring macOS Keychain Linux GNOME Keyring Windows Windows Credentials Manager FreeBSD GNOME Keyring

            Example

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

            Warning

            On FreeBSD, the keyring template function is only available if chezmoi was compiled with cgo enabled. The official release binaries of chezmoi are not compiled with cgo enabled, and keyring will always return an empty string.

            "},{"location":"reference/templates/lastpass-functions/","title":"LastPass functions","text":"

            The lastpass* template functions return structured data from LastPass using the LastPass CLI (lpass).

            "},{"location":"reference/templates/lastpass-functions/lastpass/","title":"lastpass id","text":"

            lastpass returns structured data from LastPass using the LastPass CLI (lpass). id is passed to lpass show --json $ID and the output from lpass is parsed as JSON. In addition, the note field, if present, is further parsed as colon-separated key-value pairs. The structured data is an array so typically the index function is used to extract the first item. The output from lastpass is cached so calling lastpass multiple times with the same id will only invoke lpass once.

            Example

            githubPassword = {{ (index (lastpass \"GitHub\") 0).password | quote }}\n{{ (index (lastpass \"SSH\") 0).note.privateKey }}\n
            "},{"location":"reference/templates/lastpass-functions/lastpassRaw/","title":"lastpassRaw id","text":"

            lastpassRaw returns structured data from LastPass using the LastPass CLI (lpass). It behaves identically to the lastpass function, except that no further parsing is done on the note field.

            Example

            {{ (index (lastpassRaw \"SSH Private Key\") 0).note }}\n
            "},{"location":"reference/templates/pass-functions/","title":"pass functions","text":"

            The pass template functions return passwords stored in pass using the pass CLI (pass).

            Hint

            To use a pass-compatible password manager like passage, set pass.command to the name of the binary and use chezmoi's pass* template functions as if you were using pass.

            ~/.config/chezmoi/chezmoi.toml
            [pass]\n    command = \"passage\"\n
            "},{"location":"reference/templates/pass-functions/pass/","title":"pass pass-name","text":"

            pass returns passwords stored in pass using the pass CLI (pass). pass-name is passed to pass show $PASS_NAME and the first line of the output of pass is returned with the trailing newline stripped. The output from pass is cached so calling pass multiple times with the same pass-name will only invoke pass once.

            Example

            {{ pass \"$PASS_NAME\" }}\n
            "},{"location":"reference/templates/pass-functions/passFields/","title":"passFields pass-name","text":"

            passFields returns structured data stored in pass using the pass CLI (pass). pass-name is passed to pass show $PASS_NAME and the output is parsed as colon-separated key-value pairs, one per line. The return value is a map of keys to values.

            Example

            Given the output from pass:

            GitHub\nlogin: username\npassword: secret\n

            the return value will be the map:

            {\n    \"login\": \"username\",\n    \"password\": \"secret\"\n}\n

            Example

            {{ (passFields \"GitHub\").password }}\n
            "},{"location":"reference/templates/pass-functions/passRaw/","title":"passRaw pass-name","text":"

            passRaw returns passwords stored in pass using the pass CLI (pass). pass-name is passed to pass show $PASS_NAME and the output is returned. The output from pass is cached so calling passRaw multiple times with the same pass-name will only invoke pass once.

            "},{"location":"reference/templates/passhole-functions/","title":"Passhole","text":"

            chezmoi includes support for KeePass using the Passhole CLI (ph).

            "},{"location":"reference/templates/passhole-functions/passhole/","title":"passhole path field","text":"

            passhole returns the field of path from a KeePass database using passhole's ph command.

            Example

            {{ passhole \"example.com\" \"password\" }}\n
            "},{"location":"reference/templates/secret-functions/","title":"Generic secret functions","text":"

            The secret* template functions return the output of the generic secret command defined by the secret.command configuration variable.

            "},{"location":"reference/templates/secret-functions/secret/","title":"secret [arg...]","text":"

            secret returns the output of the generic secret command defined by the secret.command configuration variable with secret.args and args with leading and trailing whitespace removed. The output is cached so multiple calls to secret with the same args will only invoke the generic secret command once.

            "},{"location":"reference/templates/secret-functions/secretJSON/","title":"secretJSON [arg...]","text":"

            secretJSON returns structured data from the generic secret command defined by the secret.command configuration variable with secret.args and args. The output is parsed as JSON. The output is cached so multiple calls to secret with the same args will only invoke the generic secret command once.

            "},{"location":"reference/templates/vault-functions/vault/","title":"vault key","text":"

            vault returns structured data from Vault using the Vault CLI (vault). key is passed to vault kv get -format=json $KEY and the output from vault is parsed as JSON. The output from vault is cached so calling vault multiple times with the same key will only invoke vault once.

            Example

            {{ (vault \"$KEY\").data.data.password }}\n
            "},{"location":"user-guide/command-overview/","title":"Command overview","text":""},{"location":"user-guide/command-overview/#getting-started","title":"Getting started","text":"
            • chezmoi doctor checks for common problems. If you encounter something unexpected, run this first.

            • chezmoi init creates chezmoi's source directory and a git repo on a new machine.

            "},{"location":"user-guide/command-overview/#daily-commands","title":"Daily commands","text":"
            • chezmoi add $FILE adds $FILEfrom your home directory to the source directory.

            • chezmoi edit $FILE opens your editor with the file in the source directory that corresponds to $FILE.

            • chezmoi status gives a quick summary of what files would change if you ran chezmoi apply.

            • chezmoi diff shows the changes that chezmoi apply would make to your home directory.

            • chezmoi apply updates your dotfiles from the source directory.

            • chezmoi edit --apply $FILE is like chezmoi edit $FILE but also runs chezmoi apply $FILE afterwards.

            • chezmoi cd opens a subshell in the source directory.

            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo H->>W: chezmoi add <file> W->>W: chezmoi edit <file> W-->>H: chezmoi status W-->>H: chezmoi diff W->>H: chezmoi apply W->>H: chezmoi edit --apply <file> H-->>W: chezmoi cd"},{"location":"user-guide/command-overview/#using-chezmoi-across-multiple-machines","title":"Using chezmoi across multiple machines","text":"
            • chezmoi init $GITHUB_USERNAME clones your dotfiles from GitHub into the source directory.

            • chezmoi init --apply $GITHUB_USERNAME clones your dotfiles from GitHub into the source directory and runs chezmoi apply.

            • chezmoi update pulls the latest changes from your remote repo and runs chezmoi apply.

            • Use normal git commands to add, commit, and push changes to your remote repo.

            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init <github-username> R->>H: chezmoi init --apply <github-username> R->>H: chezmoi update <github-username> W->>L: git commit L->>R: git push"},{"location":"user-guide/command-overview/#working-with-templates","title":"Working with templates","text":"
            • chezmoi data prints the available template data.

            • chezmoi add --template $FILE adds $FILE as a template.

            • chezmoi chattr +template $FILE makes an existing file a template.

            • chezmoi cat $FILE prints the target contents of $FILE, without changing $FILE.

            • chezmoi execute-template is useful for testing and debugging templates.

            "},{"location":"user-guide/daily-operations/","title":"Daily operations","text":""},{"location":"user-guide/daily-operations/#edit-your-dotfiles","title":"Edit your dotfiles","text":"

            Edit a dotfile with:

            chezmoi edit $FILENAME\n

            This will edit $FILENAME's source file in your source directory. chezmoi will not make any changes to the actual dotfile until you run chezmoi apply.

            To automatically run chezmoi apply when you quit your editor, run:

            chezmoi edit --apply $FILENAME\n

            To automatically run chezmoi apply whenever you save the file in your editor, run:

            chezmoi edit --watch $FILENAME\n

            You don't have to use chezmoi edit to edit your dotfiles. For more information, see Do I have to use chezmoi edit to edit my dotfiles?

            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo W->>W: chezmoi edit W->>H: chezmoi apply W->>H: chezmoi edit --apply W->>H: chezmoi edit --watch"},{"location":"user-guide/daily-operations/#pull-the-latest-changes-from-your-repo-and-apply-them","title":"Pull the latest changes from your repo and apply them","text":"

            You can pull the changes from your repo and apply them in a single command:

            chezmoi update\n

            This runs git pull --autostash --rebase in your source directory and then chezmoi apply.

            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>H: chezmoi update"},{"location":"user-guide/daily-operations/#pull-the-latest-changes-from-your-repo-and-see-what-would-change-without-actually-applying-the-changes","title":"Pull the latest changes from your repo and see what would change, without actually applying the changes","text":"

            Run:

            chezmoi git pull -- --autostash --rebase && chezmoi diff\n

            This runs git pull --autostash --rebase in your source directory and chezmoi diff then shows the difference between the target state computed from your source directory and the actual state.

            If you're happy with the changes, then you can run

            chezmoi apply\n

            to apply them.

            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi git pull W-->>H: chezmoi diff W->>H: chezmoi apply"},{"location":"user-guide/daily-operations/#automatically-commit-and-push-changes-to-your-repo","title":"Automatically commit and push changes to your repo","text":"

            chezmoi can automatically commit and push changes to your source directory to your repo. This feature is disabled by default. To enable it, add the following to your config file:

            ~/.config/chezmoi/chezmoi.toml
            [git]\n    autoCommit = true\n    autoPush = true\n

            Whenever a change is made to your source directory, chezmoi will commit the changes with an automatically-generated commit message (if autoCommit is true) and push them to your repo (if autoPush is true). autoPush implies autoCommit, i.e. if autoPush is true then chezmoi will auto-commit your changes. If you only set autoCommit to true then changes will be committed but not pushed.

            By default, autoCommit will generate a commit message based on the files changed. You can override this by setting the git.commitMessageTemplate configuration variable. For example, to have chezmoi prompt you for a commit message each time, use:

            ~/.config/chezmoi/chezmoi.toml
            [git]\n    autoCommit = true\n    commitMessageTemplate = \"{{ promptString \\\"Commit message\\\" }}\"\n

            If your commit message is longer than fits in a string then you can set git.commitMessageTemplateFile to specify a path to the commit message template relative to the source directory, for example:

            ~/.config/chezmoi/chezmoi.toml
            [git]\n    autoCommit = true\n    commitMessageTemplateFile = \".commit_message.tmpl\"\n

            Be careful when using autoPush. If your dotfiles repo is public and you accidentally add a secret in plain text, that secret will be pushed to your public repo.

            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo W->>L: autoCommit W->>R: autoPush"},{"location":"user-guide/daily-operations/#install-chezmoi-and-your-dotfiles-on-a-new-machine-with-a-single-command","title":"Install chezmoi and your dotfiles on a new machine with a single command","text":"

            chezmoi's install script can run chezmoi init for you by passing extra arguments to the newly installed chezmoi binary. If your dotfiles repo is github.com/$GITHUB_USERNAME/dotfiles then installing chezmoi, running chezmoi init, and running chezmoi apply can be done in a single line of shell:

            sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --apply $GITHUB_USERNAME\n

            If your dotfiles repo has a different name to dotfiles, or if you host your dotfiles on a different service, then see the reference manual for chezmoi init.

            For setting up transitory environments (e.g. short-lived Linux containers) you can install chezmoi, install your dotfiles, and then remove all traces of chezmoi, including the source directory and chezmoi's configuration directory, with a single command:

            sh -c \"$(curl -fsLS get.chezmoi.io)\" -- init --one-shot $GITHUB_USERNAME\n
            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init $GITHUB_USERNAME R->>H: chezmoi init --apply $GITHUB_USERNAME R->>H: chezmoi init --one-shot $GITHUB_USERNAME"},{"location":"user-guide/include-files-from-elsewhere/","title":"Include dotfiles from elsewhere","text":"

            The sections below contain examples of how to use .chezmoiexternal.toml to include files from external sources. For more details, check the reference manual .

            "},{"location":"user-guide/include-files-from-elsewhere/#include-a-subdirectory-from-a-url","title":"Include a subdirectory from a URL","text":"

            To include a subdirectory from another repository, e.g. Oh My Zsh, you cannot use git submodules because chezmoi uses its own format for the source state and Oh My Zsh is not distributed in this format. Instead, you can use the .chezmoiexternal.$FORMAT to tell chezmoi to import dotfiles from an external source.

            For example, to import Oh My Zsh, the zsh-syntax-highlighting plugin, and powerlevel10k, put the following in ~/.local/share/chezmoi/.chezmoiexternal.toml:

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

            To apply the changes, run:

            chezmoi apply\n

            chezmoi will download the archives and unpack them as if they were part of the source state. chezmoi caches downloaded archives locally to avoid re-downloading them every time you run a chezmoi command, and will only re-download them at most every refreshPeriod (default never).

            In the above example refreshPeriod is set to 168h (one week) for .oh-my-zsh and .oh-my-zsh/custom/plugins/zsh-syntax-highlighting because the URL point to tarballs of the master branch, which changes over time. No refresh period is set for .oh-my-zsh/custom/themes/powerlevel10k because the URL points to the a tarball of a tagged version, which does not change over time. To bump the version of powerlevel10k, change the version in the URL.

            To force a refresh the downloaded archives, use the --refresh-externals flag to chezmoi apply:

            chezmoi --refresh-externals apply\n

            --refresh-externals can be shortened to -R:

            chezmoi -R apply\n

            When using Oh My Zsh, make sure you disable auto-updates by setting DISABLE_AUTO_UPDATE=\"true\" in ~/.zshrc. Auto updates will cause the ~/.oh-my-zsh directory to drift out of sync with chezmoi's source state. To update Oh My Zsh and its plugins, refresh the downloaded archives.

            Note

            If your external dependency target directory can contain cache files that are added during normal use, chezmoi will report that files have changed on chezmoi apply. To avoid this, add the cache directory to your .chezmoiignore file.

            For example, Oh My Zsh may cache completions in .oh-my-zsh/cache/completions/, which should be added to your .chezmoiignore file.

            Warning

            Do not use externals for large files or archives. chezmoi validates the exact contents of externals every time you run chezmoi diff, chezmoi apply, or chezmoi verify. For large externals, use a run_once_ or run_onchange_ script to unpack the archive or file once instead.

            "},{"location":"user-guide/include-files-from-elsewhere/#include-a-subdirectory-with-selected-files-from-a-url","title":"Include a subdirectory with selected files from a URL","text":"

            Use include pattern filters to include only selected files from an archive URL.

            For example, to import just the required source files of the zsh-syntax-highlighting plugin in the example above, add in include filter to the zsh-syntax-highlighting section as shown below:

            ~/.local/share/chezmoi/.chezmoiexternal.toml
            [\".oh-my-zsh/custom/plugins/zsh-syntax-highlighting\"]\n    type = \"archive\"\n    url = \"https://github.com/zsh-users/zsh-syntax-highlighting/archive/master.tar.gz\"\n    exact = true\n    stripComponents = 1\n    refreshPeriod = \"168h\"\n    include = [\"*/*.zsh\", \"*/.version\", \"*/.revision-hash\", \"*/highlighters/**\"]\n
            "},{"location":"user-guide/include-files-from-elsewhere/#include-a-single-file-from-a-url","title":"Include a single file from a URL","text":"

            Including single files uses the same mechanism as including a subdirectory above, except with the external type file instead of archive. For example, to include plug.vim from github.com/junegunn/vim-plug in ~/.vim/autoload/plug.vim put the following in ~/.local/share/chezmoi/.chezmoiexternal.toml:

            ~/.local/share/chezmoi/.chezmoiexternal.toml
            [\".vim/autoload/plug.vim\"]\n    type = \"file\"\n    url = \"https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim\"\n    refreshPeriod = \"168h\"\n
            "},{"location":"user-guide/include-files-from-elsewhere/#extract-a-single-file-from-an-archive","title":"Extract a single file from an archive","text":"

            You can extract a single file from an archive using the archive-file type in .chezmoiexternal.$FORMAT, for example:

            ~/.local/share/chezmoi/.chezmoiexternal.toml
            {{ $ageVersion := \"1.1.1\" -}}\n[\".local/bin/age\"]\n    type = \"archive-file\"\n    url = \"https://github.com/FiloSottile/age/releases/download/v{{ $ageVersion }}/age-v{{ $ageVersion }}-{{ .chezmoi.os }}-{{ .chezmoi.arch }}.tar.gz\"\n    path = \"age/age\"\n

            This will extract the single archive member age/age from the given URL (which is computed for the current OS and architecture) to the target ./local/bin/age.

            "},{"location":"user-guide/include-files-from-elsewhere/#import-archives","title":"Import archives","text":"

            It is occasionally useful to import entire archives of configuration into your source state. The import command does this. For example, to import the latest version github.com/ohmyzsh/ohmyzsh to ~/.oh-my-zsh run:

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

            Note

            This only updates the source state. You will need to run:

            chezmoi apply\n

            to update your destination directory.

            "},{"location":"user-guide/include-files-from-elsewhere/#handle-tar-archives-in-an-unsupported-compression-format","title":"Handle tar archives in an unsupported compression format","text":"

            chezmoi natively understands tar archives. tar archives can be uncompressed or compressed in the bzip2, gzip, xz, or zstd formats.

            If you have a tar archive in an unsupported compression format then you can use a filter to decompress it. For example, before chezmoi natively supported the zstd compression format, you could handle .tar.zst external archives with, for example:

            ~/.local/share/chezmoi/.chezmoiexternal.toml
            [\".Software/anki/2.1.54-qt6\"]\n    type = \"archive\"\n    url = \"https://github.com/ankitects/anki/releases/download/2.1.54/anki-2.1.54-linux-qt6.tar.zst\"\n    filter.command = \"zstd\"\n    filter.args = [\"-d\"]\n    format = \"tar\"\n

            Here filter.command and filter.args together tell chezmoi to filter the downloaded data through zstd -d. The format = \"tar\" line tells chezmoi that output of the filter is an uncompressed tar archive.

            "},{"location":"user-guide/include-files-from-elsewhere/#include-a-subdirectory-from-a-git-repository","title":"Include a subdirectory from a git repository","text":"

            You can configure chezmoi to keep a git repository up to date in a subdirectory by using the external type git-repo, for example:

            ~/.local/share/chezmoi/.chezmoiexternal.toml
            [\".vim/pack/alker0/chezmoi.vim\"]\n    type = \"git-repo\"\n    url = \"https://github.com/alker0/chezmoi.vim.git\"\n    refreshPeriod = \"168h\"\n

            If the directory does not exist then chezmoi will run git clone to clone it. If the directory does exist then chezmoi will run git pull to pull the latest changes, but not more often than every refreshPeriod. In the above example the refreshPeriod is 168h which is one week. The default refreshPeriod is zero, which disables refreshes. You can force a refresh (i.e. force a git pull) by passing the --refresh-externals/-R flag to chezmoi apply.

            Warning

            chezmoi's support for git-repo externals is limited to running git clone and/or git pull in a directory. You must have a git binary in your $PATH.

            Using a git-repo external delegates management of the directory to git. chezmoi cannot manage any other files in that directory.

            The contents of git-repo externals will not be manifested in commands like chezmoi diff or chezmoi dump, and will be listed by chezmoi unmanaged.

            Hint

            If you need to manage extra files in a git-repo external, use an archive external instead with the URL pointing to an archive of the git repo's master or main branch.

            You can customize the arguments to git clone and git pull by setting the $DIR.clone.args and $DIR.pull.args variables in .chezmoiexternal.$FORMAT, for example:

            ~/.local/share/chezmoi/.chezmoiexternal.toml
            [\".vim/pack/alker0/chezmoi.vim\"]\n    type = \"git-repo\"\n    url = \"https://github.com/alker0/chezmoi.vim.git\"\n    refreshPeriod = \"168h\"\n    [\".vim/pack/alker0/chezmoi.vim\".pull]\n        args = [\"--ff-only\"]\n
            "},{"location":"user-guide/include-files-from-elsewhere/#use-git-submodules-in-your-source-directory","title":"Use git submodules in your source directory","text":"

            Important

            If you use git submodules, then you should set the external_ attribute on the subdirectory containing the submodule.

            You can include git repos from elsewhere as git submodules in your source directory. chezmoi init and chezmoi update are aware of git submodules and will run git with the --recurse-submodules flag by default.

            chezmoi assumes that all files and directories in its source state are in chezmoi's format, i.e. their filenames include attributes like private_ and run_. Most git submodules are not in chezmoi's format and so files like run_test.sh will be interpreted by chezmoi as a run_ script. To avoid this problem, set the external_ attribute on all subdirectories that contain submodules.

            You can stop chezmoi from handling git submodules by passing the --recurse-submodules=false flag or setting the update.recurseSubmodules configuration variable to false.

            "},{"location":"user-guide/manage-different-types-of-file/","title":"Manage different types of file","text":""},{"location":"user-guide/manage-different-types-of-file/#have-chezmoi-create-a-directory-but-ignore-its-contents","title":"Have chezmoi create a directory, but ignore its contents","text":"

            If you want chezmoi to create a directory, but ignore its contents, say ~/src, first run:

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

            This creates the directory in the source state, which means that chezmoi will create it (if it does not already exist) when you run chezmoi apply.

            However, as this is an empty directory it will be ignored by git. So, create a file in the directory in the source state that will be seen by git (so git does not ignore the directory) but ignored by chezmoi (so chezmoi does not include it in the target state):

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

            chezmoi automatically creates .keep files when you add an empty directory with chezmoi add.

            "},{"location":"user-guide/manage-different-types-of-file/#ensure-that-a-target-is-removed","title":"Ensure that a target is removed","text":"

            Create a file called .chezmoiremove in the source directory containing a list of patterns of files to remove. chezmoi will remove anything in the target directory that matches the pattern. As this command is potentially dangerous, you should run chezmoi in verbose, dry-run mode beforehand to see what would be removed:

            chezmoi apply --dry-run --verbose\n

            .chezmoiremove is interpreted as a template, so you can remove different files on different machines. Negative matches (patterns prefixed with a !) or targets listed in .chezmoiignore will never be removed.

            "},{"location":"user-guide/manage-different-types-of-file/#manage-part-but-not-all-of-a-file","title":"Manage part, but not all, of a file","text":"

            chezmoi, by default, manages whole files, but there are two ways to manage just parts of a file.

            Firstly, a modify_ script receives the current contents of the file on the standard input and chezmoi reads the target contents of the file from the script's standard output. This can be used to change parts of a file, for example using sed.

            Hint

            If you need random access to the file to modify it, then you can write standard input to a temporary file, modify the temporary file, and then write the temporary file to the standard output, for example:

            #!/bin/sh\ntempfile=\"$(mktemp)\"\ntrap 'rm -rf \"${tempfile}\"' EXIT\ncat > \"${tempfile}\"\n# modify ${tempfile}\ncat \"${tempfile}\"\n

            Note

            If the file does not exist then the standard input to the modify_ script will be empty and it is the script's responsibility to write a complete file to the standard output.

            modify_ scripts that contain the string chezmoi:modify-template are executed as templates with the current contents of the file passed as .chezmoi.stdin and the result of the template execution used as the new contents of the file.

            Example

            To replace the string old with new in a file while leaving the rest of the file unchanged, use the modify script:

            {{- /* chezmoi:modify-template */ -}}\n{{- .chezmoi.stdin | replaceAllRegex \"old\" \"new\" }}\n

            To set individual values in JSON, JSONC, TOML, and YAML files you can use the setValueAtPath template function, for example:

            {{- /* chezmoi:modify-template */ -}}\n{{ fromJson .chezmoi.stdin | setValueAtPath \"key.nestedKey\" \"value\" | toPrettyJson }}\n

            Warning

            Modify templates must not have a .tmpl extension.

            Secondly, if only a small part of the file changes then consider using a template to re-generate the full contents of the file from the current state. For example, Kubernetes configurations include a current context that can be substituted with:

            ~/.local/share/chezmoi/dot_kube/config.tmpl
            current-context: {{ output \"kubectl\" \"config\" \"current-context\" | trim }}\n

            Hint

            For managing ini files with a mix of settings and state (such as recently used files or window positions), there is a third party tool called chezmoi_modify_manager that builds upon modify_ scripts. See related software for more information.

            "},{"location":"user-guide/manage-different-types-of-file/#manage-a-files-permissions-but-not-its-contents","title":"Manage a file's permissions, but not its contents","text":"

            chezmoi's create_ attributes allows you to tell chezmoi to create a file if it does not already exist. chezmoi, however, will apply any permission changes from the executable_, private_, and readonly_ attributes. This can be used to control a file's permissions without altering its contents.

            For example, if you want to ensure that ~/.kube/config always has permissions 600 then if you create an empty file called dot_kube/private_config in your source state, chezmoi will ensure ~/.kube/config's permissions are 0600 when you run chezmoi apply without changing its contents.

            This approach does have the downside that chezmoi will create the file if it does not already exist. If you only want chezmoi apply to set a file's permissions if it already exists and not create the file otherwise, you can use a run_ script. For example, create a file in your source state called run_set_kube_config_permissions.sh containing:

            #!/bin/sh\n\nFILE=\"$HOME/.kube/config\"\nif [ -f \"$FILE\" ]; then\n    if [ \"$(stat -c %a \"$FILE\")\" != \"600\" ] ; then\n        chmod 600 \"$FILE\"\n    fi\nfi\n
            "},{"location":"user-guide/manage-different-types-of-file/#handle-configuration-files-which-are-externally-modified","title":"Handle configuration files which are externally modified","text":"

            Some programs modify their configuration files. When you next run chezmoi apply, any modifications made by the program will be lost.

            You can track changes to these files by replacing with a symlink back to a file in your source directory, which is under version control. Here is a worked example for VSCode's settings.json on Linux:

            Copy the configuration file to your source directory:

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

            Tell chezmoi to ignore this file:

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

            Tell chezmoi that ~/.config/Code/User/settings.json should be a symlink to the file in your source directory:

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

            The prefix private_ is used because the ~/.config and ~/.config/Code directories are private by default.

            Apply the changes:

            chezmoi apply -v\n

            Now, when the program modifies its configuration file it will modify the file in the source state instead.

            "},{"location":"user-guide/manage-different-types-of-file/#populate-sshauthorized_keys-with-your-public-ssh-keys-from-github","title":"Populate ~/.ssh/authorized_keys with your public SSH keys from GitHub","text":"

            chezmoi can retrieve your public SSH keys from GitHub, which can be useful for populating your ~/.ssh/authorized_keys. Put the following in your ~/.local/share/chezmoi/dot_ssh/authorized_keys.tmpl:

            {{ range gitHubKeys \"$GITHUB_USERNAME\" -}}\n{{   .Key }}\n{{ end -}}\n
            "},{"location":"user-guide/manage-machine-to-machine-differences/","title":"Manage machine-to-machine differences","text":""},{"location":"user-guide/manage-machine-to-machine-differences/#use-templates","title":"Use templates","text":"

            The primary goal of chezmoi is to manage configuration files across multiple machines, for example your personal macOS laptop, your work Ubuntu desktop, and your work Linux laptop. You will want to keep much configuration the same across these, but also need machine-specific configurations for email addresses, credentials, etc. chezmoi achieves this functionality by using text/template for the source state where needed.

            For example, your home ~/.gitconfig on your personal machine might look like:

            ~/.gitconfig
            [user]\n    email = \"me@home.org\"\n

            Whereas at work it might be:

            ~/.gitconfig
            [user]\n    email = \"firstname.lastname@company.com\"\n

            To handle this, on each machine create a configuration file called ~/.config/chezmoi/chezmoi.toml defining variables that might vary from machine to machine. For example, for your home machine:

            ~/.config/chezmoi/chezmoi.toml
            [data]\n    email = \"me@home.org\"\n

            If you intend to store private data (e.g. access tokens) in ~/.config/chezmoi/chezmoi.toml, make sure it has permissions 0600.

            If you prefer, you can use JSON, JSONC, or YAML for your configuration file. Variable names must start with a letter and be followed by zero or more letters or digits.

            Then, add ~/.gitconfig to chezmoi using the --template flag to turn it into a template:

            chezmoi add --template ~/.gitconfig\n

            You can then open the template (which will be saved in the file ~/.local/share/chezmoi/dot_gitconfig.tmpl):

            chezmoi edit ~/.gitconfig\n

            Edit the file so it looks something like:

            ~/.local/share/chezmoi/dot_gitconfig.tmpl
            [user]\n    email = {{ .email | quote }}\n

            Templates are often used to capture machine-specific differences. For example, in your ~/.local/share/chezmoi/dot_bashrc.tmpl you might have:

            ~/.local/share/chezmoi/dot_bashrc.tmpl
            # common config\nexport EDITOR=vi\n\n# machine-specific configuration\n{{- if eq .chezmoi.hostname \"work-laptop\" }}\n# this will only be included in ~/.bashrc on work-laptop\n{{- end }}\n

            For a full list of variables, run:

            chezmoi data\n

            For more advanced usage, you can use the full power of the text/template language. chezmoi includes all of the text functions from sprig and its own functions for interacting with password managers.

            Templates can be executed directly from the command line, without the need to create a file on disk, with the execute-template command, for example:

            chezmoi execute-template \"{{ .chezmoi.os }}/{{ .chezmoi.arch }}\"\n

            This is useful when developing or debugging templates.

            Some password managers allow you to store complete files. The files can be retrieved with chezmoi's template functions. For example, if you have a file stored in 1Password with the UUID uuid then you can retrieve it with the template:

            {{- onepasswordDocument \"uuid\" -}}\n

            The -s inside the brackets remove any whitespace before or after the template expression, which is useful if your editor has added any newlines.

            If, after executing the template, the file contents are empty, the target file will be removed. This can be used to ensure that files are only present on certain machines. If you want an empty file to be created anyway, you will need to give it an empty_ prefix.

            "},{"location":"user-guide/manage-machine-to-machine-differences/#ignore-files-or-a-directory-on-different-machines","title":"Ignore files or a directory on different machines","text":"

            For coarser-grained control of files and entire directories managed on different machines, or to exclude certain files completely, you can create .chezmoiignore files in the source directory. These specify a list of patterns that chezmoi should ignore, and are interpreted as templates. An example .chezmoiignore file might look like:

            ~/.local/share/chezmoi/.chezmoiignore
            README.md\n{{- if ne .chezmoi.hostname \"work-laptop\" }}\n.work # only manage .work on work-laptop\n{{- end }}\n

            The use of ne (not equal) is deliberate. What we want to achieve is \"only install .work if hostname is work-laptop\" but chezmoi installs everything by default, so we have to turn the logic around and instead write \"ignore .work unless the hostname is work-laptop\".

            Patterns can be excluded by starting the line with a !, for example:

            ~/.local/share/chezmoi/.chezmoiignore
            dir/f*\n!dir/foo\n

            will ignore all files beginning with an f in dir except for dir/foo.

            You can see what files chezmoi ignores with the command

            chezmoi ignored\n
            "},{"location":"user-guide/manage-machine-to-machine-differences/#handle-different-file-locations-on-different-systems-with-the-same-contents","title":"Handle different file locations on different systems with the same contents","text":"

            If you want to have the same file contents in different locations on different systems, but maintain only a single file in your source state, you can use a shared template.

            Create the common file in the .chezmoitemplates directory in the source state. For example, create .chezmoitemplates/file.conf. The contents of this file are available in templates with the template $NAME . function where $NAME is the name of the file (. passes the current data to the template code in file.conf; see template action for details).

            Then create files for each system, for example Library/Application Support/App/file.conf.tmpl for macOS and dot_config/app/file.conf.tmpl for Linux. Both template files should contain {{- template \"file.conf\" . -}}.

            Finally, tell chezmoi to ignore files where they are not needed by adding lines to your .chezmoiignore file, for example:

            ~/.local/share/chezmoi/.chezmoiignore
            {{ if ne .chezmoi.os \"darwin\" }}\nLibrary/Application Support/App/file.conf\n{{ end }}\n{{ if ne .chezmoi.os \"linux\" }}\n.config/app/file.conf\n{{ end }}\n
            "},{"location":"user-guide/manage-machine-to-machine-differences/#use-completely-different-dotfiles-on-different-machines","title":"Use completely different dotfiles on different machines","text":"

            chezmoi's template functionality allows you to change a file's contents based on any variable. For example, if you want ~/.bashrc to be different on Linux and macOS you would create a file in the source state called dot_bashrc.tmpl containing:

            ~/.local/share/chezmoi/dot_bashrc.tmpl
            {{ if eq .chezmoi.os \"darwin\" -}}\n# macOS .bashrc contents\n{{ else if eq .chezmoi.os \"linux\" -}}\n# Linux .bashrc contents\n{{ end -}}\n

            However, if the differences between the two versions are so large that you'd prefer to use completely separate files in the source state, you can achieve this with the include template function.

            Create the following files:

            ~/.local/share/chezmoi/.bashrc_darwin
            # macOS .bashrc contents\n
            ~/.local/share/chezmoi/.bashrc_linux
            # Linux .bashrc contents\n
            ~/.local/share/chezmoi/dot_bashrc.tmpl
            {{- if eq .chezmoi.os \"darwin\" -}}\n{{-   include \".bashrc_darwin\" -}}\n{{- else if eq .chezmoi.os \"linux\" -}}\n{{-   include \".bashrc_linux\" -}}\n{{- end -}}\n

            This will cause ~/.bashrc to contain ~/.local/share/chezmoi/.bashrc_darwin on macOS and ~/.local/share/chezmoi/.bashrc_linux on Linux.

            If you want to use templates within your templates, then, instead, create:

            ~/.local/share/chezmoi/.chezmoitemplates/bashrc_darwin.tmpl
            # macOS .bashrc template contents\n
            ~/.local/share/chezmoi/.chezmoitemplates/bashrc_linux.tmpl
            # Linux .bashrc template contents\n
            ~/.local/share/chezmoi/dot_bashrc.tmpl
            {{- if eq .chezmoi.os \"darwin\" -}}\n{{-   template \"bashrc_darwin.tmpl\" . -}}\n{{- else if eq .chezmoi.os \"linux\" -}}\n{{-   template \"bashrc_linux.tmpl\" . -}}\n{{- end -}}\n
            "},{"location":"user-guide/setup/","title":"Setup","text":""},{"location":"user-guide/setup/#understand-chezmois-files-and-directories","title":"Understand chezmoi's files and directories","text":"

            chezmoi generates your dotfiles for your local machine. It combines two main sources of data:

            The source directory, ~/.local/share/chezmoi, is common to all your machines, and is a clone of your dotfiles repo. Each file that chezmoi manages has a corresponding file in the source directory.

            The config file, typically ~/.config/chezmoi/chezmoi.toml (although you can use JSON or YAML if you prefer), is specific to the local machine.

            Files whose contents are the same on all of your machines are copied verbatim from the source directory. Files which vary from machine to machine are executed as templates, typically using data from the local machine's config file to tune the final contents specific to the local machine.

            "},{"location":"user-guide/setup/#use-a-hosted-repo-to-manage-your-dotfiles-across-multiple-machines","title":"Use a hosted repo to manage your dotfiles across multiple machines","text":"

            chezmoi relies on your version control system and hosted repo to share changes across multiple machines. You should create a repo on the source code repository of your choice (e.g. Bitbucket, GitHub, or GitLab, many people call their repo dotfiles) and push the repo in the source directory here. For example:

            chezmoi cd\ngit remote add origin https://github.com/$GITHUB_USERNAME/dotfiles.git\ngit push -u origin main\nexit\n

            On another machine you can checkout this repo:

            chezmoi init https://github.com/$GITHUB_USERNAME/dotfiles.git\n

            You can then see what would be changed:

            chezmoi diff\n

            If you're happy with the changes then apply them:

            chezmoi apply\n

            The above commands can be combined into a single init, checkout, and apply:

            chezmoi init --apply --verbose https://github.com/$GITHUB_USERNAME/dotfiles.git\n

            These commands are summarized this sequence diagram:

            sequenceDiagram participant H as home directory participant W as working copy participant L as local repo participant R as remote repo R->>W: chezmoi init <repo> W-->>H: chezmoi diff W->>H: chezmoi apply R->>H: chezmoi init --apply <repo>"},{"location":"user-guide/setup/#use-a-private-repo-to-store-your-dotfiles","title":"Use a private repo to store your dotfiles","text":"

            chezmoi supports storing your dotfiles in both public and private repos.

            chezmoi is designed so that your dotfiles repo can be public by making it easy for you to store your secrets either in your password manager, in encrypted files, or in private configuration files. Your dotfiles repo can still be private, if you choose.

            If you use a private repo for your dotfiles then you will typically need to enter your credentials (e.g. your username and password) each time you interact with the repo, for example when pulling or pushing changes. chezmoi itself does not store any credentials, but instead relies on your local git configuration for these operations.

            When using a private repo on GitHub without --ssh, when prompted for a password you will need to enter a GitHub personal access token. For more information on these changes, read the GitHub blog post on Token authentication requirements for Git operations

            "},{"location":"user-guide/setup/#create-a-config-file-on-a-new-machine-automatically","title":"Create a config file on a new machine automatically","text":"

            chezmoi init can also create a config file automatically, if one does not already exist. If your repo contains a file called .chezmoi.$FORMAT.tmpl where $FORMAT is one of the supported config file formats (e.g. json, jsonc, toml, or yaml) then chezmoi init will execute that template to generate your initial config file.

            Specifically, if you have .chezmoi.toml.tmpl that looks like this:

            ~/.local/share/chezmoi/.chezmoi.toml.tmpl
            {{- $email := promptStringOnce . \"email\" \"Email address\" -}}\n\n[data]\n    email = {{ $email | quote }}\n

            Then chezmoi init will create an initial chezmoi.toml using this template. promptStringOnce is a special function that prompts the user (you) for a value if it is not already set in your data.

            To test this template, use chezmoi execute-template with the --init and --promptString flags, for example:

            chezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl\n
            "},{"location":"user-guide/setup/#re-create-your-config-file","title":"Re-create your config file","text":"

            If you change your config file template, chezmoi will warn you if your current config file was not generated from that template. You can re-generate your config file by running:

            chezmoi init\n

            If you are using any prompt* template functions in your config file template you will be prompted again. However, you can avoid this with the following example template logic:

            {{- $email := promptStringOnce . \"email\" \"Email address\" -}}\n\n[data]\n    email = {{ $email | quote }}\n

            This will cause chezmoi use the email variable from your data and fallback to promptString only if it is not set.

            "},{"location":"user-guide/templating/","title":"Templating","text":""},{"location":"user-guide/templating/#introduction","title":"Introduction","text":"

            Templates are used to change the contents of a file depending on the environment. For example, you can use the hostname of the machine to create different configurations on different machines.

            chezmoi uses the text/template syntax from Go extended with text template functions from sprig.

            When reading files from the source state, chezmoi interprets them as a template if either of the following is true:

            • The file name has a .tmpl suffix.

            • The file is in the .chezmoitemplates directory, or a subdirectory of .chezmoitemplates.

            "},{"location":"user-guide/templating/#template-data","title":"Template data","text":"

            chezmoi provides a variety of template variables. For a full list, run

            chezmoi data\n

            These come from a variety of sources (later data overwrite earlier ones):

            • Variables populated by chezmoi are in .chezmoi, for example .chezmoi.os.

            • Variables created by you in the .chezmoidata.$FORMAT configuration file. The various supported formats (json, jsonc, toml and yaml) are read in alphabetical order.

            • Variables created by you in the data section of the configuration file.

            Furthermore, chezmoi provides a variety of functions to retrieve data at runtime from password managers, environment variables, and the filesystem.

            "},{"location":"user-guide/templating/#creating-a-template-file","title":"Creating a template file","text":"

            There are several ways to create a template:

            • When adding a file for the first time, pass the --template argument, for example:

              chezmoi add --template ~/.zshrc\n
            • If a file is already managed by chezmoi, but is not a template, you can make it a template by running, for example:

              chezmoi chattr +template ~/.zshrc\n
            • You can create a template manually in the source directory by giving it a .tmpl extension, for example:

              chezmoi cd\n$EDITOR dot_zshrc.tmpl\n
            • Templates in .chezmoitemplates must be created manually, for example:

              chezmoi cd\nmkdir -p .chezmoitemplates\ncd .chezmoitemplates\n$EDITOR mytemplate\n
            "},{"location":"user-guide/templating/#editing-a-template-file","title":"Editing a template file","text":"

            The easiest way to edit a template is to use chezmoi edit, for example:

            chezmoi edit ~/.zshrc\n

            This will open the source file for ~/.zshrc in $EDITOR. When you quit the editor, chezmoi will check the template syntax.

            If you want the changes you make to be immediately applied after you quit the editor, use the --apply option, for example:

            chezmoi edit --apply ~/.zshrc\n
            "},{"location":"user-guide/templating/#testing-templates","title":"Testing templates","text":"

            Templates can be tested and debugged with chezmoi execute-template, which treats each of its arguments as a template and executes it. The templates are interpreted and the results are output to standard output, making it useful for testing small template fragments:

            chezmoi execute-template '{{ .chezmoi.hostname }}'\n

            Without arguments, chezmoi execute-template will read the template from standard input, which is useful for testing whole files:

            chezmoi cd\nchezmoi execute-template < dot_zshrc.tmpl\n

            If file redirection does not work (as when using PowerShell), the contents of a file can be piped into chezmoi execute-template:

            cat foo.txt | chezmoi execute-template\n
            "},{"location":"user-guide/templating/#template-syntax","title":"Template syntax","text":"

            Template actions are written inside double curly brackets, {{ and }}. Actions can be variables, pipelines, or control statements. Text outside actions is copied literally.

            Variables are written literally, for example:

            {{ .chezmoi.hostname }}\n

            Conditional expressions can be written using if, else if, else, and end, for example:

            {{ if eq .chezmoi.os \"darwin\" }}\n# darwin\n{{ else if eq .chezmoi.os \"linux\" }}\n# linux\n{{ else }}\n# other operating system\n{{ end }}\n

            For a full description of the template syntax, see the text/template documentation.

            "},{"location":"user-guide/templating/#removing-whitespace","title":"Removing whitespace","text":"

            For formatting reasons you might want to leave some whitespace after or before the template code. This whitespace will remain in the final file, which you might not want.

            A solution for this is to place a minus sign and a space next to the brackets. So {{- for the left brackets and -}} for the right brackets. Here's an example:

            HOSTNAME={{- .chezmoi.hostname }}\n

            This will result in

            HOSTNAME=myhostname\n

            Notice that this will remove any number of tabs, spaces and even newlines and carriage returns.

            "},{"location":"user-guide/templating/#simple-logic","title":"Simple logic","text":"

            A very useful feature of chezmoi templates is the ability to perform logical operations.

            # common config\nexport EDITOR=vi\n\n# machine-specific configuration\n{{- if eq .chezmoi.hostname \"work-laptop\" }}\n# this will only be included in ~/.bashrc on work-laptop\n{{- end }}\n

            In this example chezmoi will look at the hostname of the machine and if that is equal to \"work-laptop\", the text between the if and the end will be included in the result.

            "},{"location":"user-guide/templating/#boolean-functions","title":"Boolean functions","text":"Function Return value eq Returns true if the first argument is equal to any of the other arguments not Returns the boolean negation of its single argument and Returns the boolean AND of its arguments by returning the first empty argument or the last argument, that is, and x y behaves as if x then y else x. All the arguments are evaluated or Returns the boolean OR of its arguments by returning the first non-empty argument or the last argument, that is, or x y behaves as if x then x else y All the arguments are evaluated"},{"location":"user-guide/templating/#integer-functions","title":"Integer functions","text":"Function Return value len Returns the integer length of its argument eq Returns the boolean truth of arg1 == arg2 ne Returns the boolean truth of arg1 != arg2 lt Returns the boolean truth of arg1 < arg2 le Returns the boolean truth of arg1 <= arg2 gt Returns the boolean truth of arg1 > arg2 ge Returns the boolean truth of arg1 >= arg2"},{"location":"user-guide/templating/#more-complicated-logic","title":"More complicated logic","text":"

            Up until now, we have only seen if statements that can handle at most two variables. In this part we will see how to create more complicated expressions.

            You can also create more complicated expressions. The eq command can accept multiple arguments. It will check if the first argument is equal to any of the other arguments.

            {{ if eq \"foo\" \"foo\" \"bar\" }}hello{{end}}\n{{ if eq \"foo\" \"bar\" \"foo\" }}hello{{end}}\n{{ if eq \"foo\" \"bar\" \"bar\" }}hello{{end}}\n

            The first two examples will output hello and the last example will output nothing.

            The operators or and and can also accept multiple arguments.

            "},{"location":"user-guide/templating/#chaining-operators","title":"Chaining operators","text":"

            You can perform multiple checks in one if statement.

            {{ if (and (eq .chezmoi.os \"linux\") (ne .email \"me@home.org\")) }}\n...\n{{ end }}\n

            This will check if the operating system is Linux and the configured email is not the home email. The brackets are needed here, because otherwise all the arguments will be give to the and command.

            This way you can chain as many operators together as you like.

            "},{"location":"user-guide/templating/#helper-functions","title":"Helper functions","text":"

            chezmoi has added multiple helper functions to the text/template syntax.

            chezmoi includes sprig, an extension to the text/template format that contains many helper functions. Take a look at their documentation for a list.

            chezmoi adds a few functions of its own as well. Take a look at the reference for complete list.

            "},{"location":"user-guide/templating/#template-variables","title":"Template variables","text":"

            chezmoi defines a few useful templates variables that depend on the system you are currently on. A list of the variables defined by chezmoi can be found here.

            There are, however more variables than that. To view the variables available on your system, execute:

            chezmoi data\n

            This outputs the variables in JSON format by default. To access the variable chezmoi.kernel.osrelease in a template, use

            {{ .chezmoi.kernel.osrelease }}\n

            This way you can also access the variables you defined yourself.

            "},{"location":"user-guide/templating/#using-chezmoitemplates","title":"Using .chezmoitemplates","text":"

            Files in the .chezmoitemplates subdirectory are parsed as templates and are available to be included in other templates using the template action with a name equal to their relative path to the .chezmoitemplates directory.

            By default, such templates will be executed with nil data. If you want to access template variables (e.g. .chezmoi.os) in the template you must pass the data explicitly.

            For example:

            .chezmoitemplates/part.tmpl:\n{{ if eq .chezmoi.os \"linux\" }}\n# linux config\n{{ else }}\n# non-linux config\n{{ end }}\n\ndot_file.tmpl:\n{{ template \"part.tmpl\" . }}\n
            "},{"location":"user-guide/templating/#using-chezmoitemplates-for-creating-similar-files","title":"Using .chezmoitemplates for creating similar files","text":"

            When you have multiple similar files, but they aren't quite the same, you can create a template file in the directory .chezmoitemplates. This template can be inserted in other template files, for example:

            Create .local/share/chezmoi/.chezmoitemplates/alacritty:

            some: config\nfontsize: {{ . }}\nmore: config\n

            Notice the file name doesn't have to end in .tmpl, as all files in the directory .chezmoitemplates are interpreted as templates.

            Create other files using the template ~/.local/share/chezmoi/small-font.yml.tmpl

            {{- template \"alacritty\" 12 -}}\n

            ~/.local/share/chezmoi/big-font.yml.tmpl

            {{- template \"alacritty\" 18 -}}\n

            Here we're calling the shared alacritty template with the font size as the . value passed in. You can test this with chezmoi cat:

            $ chezmoi cat ~/small-font.yml\nsome: config\nfontsize: 12\nmore: config\n$ chezmoi cat ~/big-font.yml\nsome: config\nfontsize: 18\nmore: config\n
            "},{"location":"user-guide/templating/#passing-multiple-arguments","title":"Passing multiple arguments","text":"

            In the example above only one arguments is passed to the template. To pass more arguments to the template, you can do it in two ways.

            "},{"location":"user-guide/templating/#via-the-config-file","title":"Via the config file","text":"

            This method is useful if you want to use the same template arguments multiple times, because you don't specify the arguments every time. Instead you specify them in the file ~/.config/chezmoi/chezmoi.toml:

            ~/.config/chezmoi/chezmoi.toml
            [data.alacritty.big]\n    fontsize = 18\n    font = \"DejaVu Serif\"\n[data.alacritty.small]\n    fontsize = 12\n    font = \"DejaVu Sans Mono\"\n

            Use the variables in ~/.local/share/chezmoi/.chezmoitemplates/alacritty:

            ~/.local/share/chezmoi/.chezmoitemplates/alacritty
            some: config\nfontsize: {{ .fontsize }}\nfont: {{ .font }}\nmore: config\n

            And connect them with ~/.local/share/chezmoi/small-font.yml.tmpl:

            ~/.local/share/chezmoi/small-font.yml.tmpl
            {{- template \"alacritty\" .alacritty.small -}}\n

            At the moment, this means that you'll have to duplicate the alacritty data in the config file on every machine, but a feature will be added to avoid this.

            "},{"location":"user-guide/templating/#by-passing-a-dictionary","title":"By passing a dictionary","text":"

            Using the same alacritty configuration as above, you can pass the arguments to it with a dictionary, for example ~/.local/share/chezmoi/small-font.yml.tmpl:

            ~/.local/share/chezmoi/small-font.yml.tmpl
            {{- template \"alacritty\" dict \"fontsize\" 12 \"font\" \"DejaVu Sans Mono\" -}}\n
            "},{"location":"user-guide/use-scripts-to-perform-actions/","title":"Use scripts to perform actions","text":""},{"location":"user-guide/use-scripts-to-perform-actions/#understand-how-scripts-work","title":"Understand how scripts work","text":"

            chezmoi supports scripts that are executed when you run chezmoi apply. These scripts can be configured to run every time, only when their contents have changed, or only if they haven't been run before.

            Scripts are any file in the source directory with the prefix run_, and they are executed in alphabetical order.

            • run_ scripts: These scripts are executed every time you run chezmoi apply.
            • run_onchange_ scripts: These scripts are only executed if their content has changed since the last time they were run.
            • run_once_ scripts: These scripts are executed once for each unique version of the content. If the script is a template, the content is hashed after template execution. chezmoi tracks the content's SHA256 hash and stores it in a database. If the content has been run before (even under a different filename), the script will not run again unless the content itself changes.

            Scripts break chezmoi's declarative approach and should be used sparingly. All scripts should be idempotent, including run_onchange_ and run_once_ scripts.

            Scripts are normally run while chezmoi updates your dotfiles. For example, run_b.sh will be run after updating a.txt and before updating c.txt. To run scripts before or after the updates, use the before_ or after_ attributes, respectively, e.g., run_once_before_install-password-manager.sh.

            Scripts must be created manually in the source directory, typically by running chezmoi cd and then creating a file with a run_ prefix. There is no need to set the executable bit on the script.

            Scripts with the .tmpl suffix are treated as templates, with the usual template variables available. If the template resolves to only whitespace or an empty string, the script will not be executed, which is useful for disabling scripts dynamically.

            When executing a script, chezmoi generates the script contents in a file in a temporary directory with the executable bit set and then executes it using exec(3). As a result, the script must either include a #! line or be an executable binary. Script working directory is set to the first existing parent directory in the destination tree.

            If a .chezmoiscripts directory exists at the root of the source directory, scripts in this directory are executed as normal scripts, without creating a corresponding directory in the target state.

            In verbose mode, the scripts' contents are printed before execution. In dry-run mode, scripts are not executed.

            "},{"location":"user-guide/use-scripts-to-perform-actions/#set-environment-variables","title":"Set environment variables","text":"

            You can set extra environment variables for your scripts in the scriptEnv section of your config file. For example, to set the MY_VAR environment variable to my_value, specify:

            ~/.config/chezmoi/chezmoi.toml
            [scriptEnv]\n    MY_VAR = \"my_value\"\n

            chezmoi sets a number of environment variables when running scripts, including CHEZMOI=1 and common template data like CHEZMOI_OS and CHEZMOI_ARCH.

            Note

            By default, chezmoi diff will print the contents of scripts that would be run by chezmoi apply. To exclude scripts from the output of chezmoi diff, set diff.exclude in your configuration file, for example:

            ~/.config/chezmoi/chezmoi.toml
            [diff]\n    exclude = [\"scripts\"]\n

            Similarly, chezmoi status will print the names of the scripts that it will execute with the status R. This can similarly disabled by setting status.exclude to [\"scripts\"] in your configuration file.

            "},{"location":"user-guide/use-scripts-to-perform-actions/#install-packages-with-scripts","title":"Install packages with scripts","text":"

            Change to the source directory and create a file called run_onchange_install-packages.sh. In this file create your package installation script, e.g.

            #!/bin/sh\nsudo apt install ripgrep\n

            The next time you run chezmoi apply or chezmoi update this script will be run. As it has the run_onchange_ prefix, it will not be run again unless its contents change, for example if you add more packages to be installed.

            This script can also be a template. For example, if you create run_onchange_install-packages.sh.tmpl with the contents:

            ~/.local/share/chezmoi/run_onchange_install-packages.sh.tmpl
            {{ if eq .chezmoi.os \"linux\" -}}\n#!/bin/sh\nsudo apt install ripgrep\n{{ else if eq .chezmoi.os \"darwin\" -}}\n#!/bin/sh\nbrew install ripgrep\n{{ end -}}\n

            This will install ripgrep on both Debian/Ubuntu Linux systems and macOS.

            "},{"location":"user-guide/use-scripts-to-perform-actions/#run-a-script-when-the-contents-of-another-file-changes","title":"Run a script when the contents of another file changes","text":"

            chezmoi's run_ scripts are run every time you run chezmoi apply, whereas run_onchange_ scripts are run only when their contents have changed, after executing them as templates. You can use this to cause a run_onchange_ script to run when the contents of another file has changed by including a checksum of the other file's contents in the script.

            For example, if your dconf settings are stored in dconf.ini in your source directory then you can make chezmoi apply only load them when the contents of dconf.ini has changed by adding the following script as run_onchange_dconf-load.sh.tmpl:

            ~/.local/share/chezmoi/run_onchange_dconf-load.sh.tmpl
            #!/bin/bash\n\n# dconf.ini hash: {{ include \"dconf.ini\" | sha256sum }}\ndconf load / < {{ joinPath .chezmoi.sourceDir \"dconf.ini\" | quote }}\n

            As the SHA256 sum of dconf.ini is included in a comment in the script, the contents of the script will change whenever the contents of dconf.ini are changed, so chezmoi will re-run the script whenever the contents of dconf.ini change.

            In this example you should also add dconf.ini to .chezmoiignore so chezmoi does not create dconf.ini in your home directory.

            "},{"location":"user-guide/use-scripts-to-perform-actions/#clear-the-state-of-all-run_onchange_-and-run_once_-scripts","title":"Clear the state of all run_onchange_ and run_once_ scripts","text":"

            chezmoi stores whether and when run_onchange_ and run_once_ scripts have been run in its persistent state.

            To clear the state of run_onchange_ scripts, run:

            chezmoi state delete-bucket --bucket=entryState\n

            To clear the state of run_once_ scripts, run:

            chezmoi state delete-bucket --bucket=scriptState\n
            "},{"location":"user-guide/advanced/customize-your-source-directory/","title":"Customize your source directory","text":""},{"location":"user-guide/advanced/customize-your-source-directory/#use-a-subdirectory-of-your-dotfiles-repo-as-the-root-of-the-source-state","title":"Use a subdirectory of your dotfiles repo as the root of the source state","text":"

            By default, chezmoi uses the root of your dotfiles repo as the root of the source state. If your source state contains many entries in its root, then your target directory (usually your home directory) will in turn be filled with many entries in its root as well. You can reduce the number of entries by keeping .chezmoiignore up to date, but this can become tiresome.

            Instead, you can specify that chezmoi should read the source state from a subdirectory of the source directory instead by creating a file called .chezmoiroot containing the relative path to this subdirectory.

            For example, given:

            ~/.local/share/chezmoi/.chezmoiroot
            home\n

            Then chezmoi will read the source state from the home subdirectory of your source directory, for example the desired state of ~/.gitconfig will be read from ~/.local/share/chezmoi/home/dot_gitconfig (instead of ~/.local/share/chezmoi/dot_gitconfig).

            When migrating an existing chezmoi dotfiles repo to use .chezmoiroot you will need to move the relevant files in to the new root subdirectory manually. You do not need to move files that are ignored by chezmoi in all cases (i.e. are listed in .chezmoiignore when executed as a template on all machines), and you can afterwards remove their entries from home/.chezmoiignore.

            "},{"location":"user-guide/advanced/customize-your-source-directory/#use-a-different-version-control-system-to-git","title":"Use a different version control system to git","text":"

            Although chezmoi is primarily designed to use a git repo for the source state, it does not require git and can be used with other version control systems, such as fossil or pijul.

            The version control system is used in only three places:

            • chezmoi init will use git clone to clone the source repo if it does not already exist.
            • chezmoi update will use git pull by default to pull the latest changes.
            • chezmoi's auto add, commit, and push functionality use git status, git add, git commit and git push.

            Using a different version control system (VCS) to git can be achieved in two ways.

            Firstly, if your VCS is compatible with git's CLI, then you can set the git.command configuration variable to your VCS command and set useBuiltinGit to false.

            Otherwise, you can use your VCS to create the source directory before running chezmoi init, for example:

            fossil clone https://dotfiles.example.com/ dotfiles.fossil\nmkdir -p .local/share/chezmoi/.git\ncd .local/share/chezmoi\nfossil open ~/dotfiles.fossil\nchezmoi init --apply\n

            Note

            The creation of an empty .git directory in the source directory is required for chezmoi to be able to identify the work tree.

            For updates, you can set the update.command and update.args configuration variables and chezmoi update will use these instead of git pull, for example:

            ~/.config/chezmoi/chezmoi.toml
            [update]\n    command = \"fossil\"\n    args = [\"update\"]\n

            Currently, it is not possible to override the auto add, commit, and push behavior for non-git VCSs, so you will have to commit changes manually, for example:

            chezmoi cd\nfossil add .\nfossil commit\n
            "},{"location":"user-guide/advanced/install-packages-declaratively/","title":"Install packages declaratively","text":"

            chezmoi uses a declarative approach for the contents of dotfiles, but package installation requires running imperative commands. However, you can simulate declarative package installation with a combination of a .chezmoidata file and a run_onchange_ script.

            The following example uses homebrew on macOS, but should be adaptable to other operating systems and package managers.

            First, create .chezmoidata/packages.yaml declaring the packages that you want installed, for example:

            ~/.local/share/chezmoi/.chezmoidata/packages.yaml
            packages:\n  darwin:\n    brews:\n    - 'git'\n    casks:\n    - 'google-chrome'\n

            Second, create a run_onchange_darwin-install-packages.sh.tmpl script that uses the package manager to install those packages, for example:

            ~/.local/share/chezmoi/run_onchange_darwin-install-packages.sh.tmpl
            {{ if eq .chezmoi.os \"darwin\" -}}\n#!/bin/bash\n\nbrew bundle --no-lock --file=/dev/stdin <<EOF\n{{ range .packages.darwin.brews -}}\nbrew {{ . | quote }}\n{{ end -}}\n{{ range .packages.darwin.casks -}}\ncask {{ . | quote }}\n{{ end -}}\nEOF\n{{ end -}}\n

            Now, when you run chezmoi apply, chezmoi will execute the install-packages.sh script with when the list of packages defined in .chezmoidata/packages.yaml changes.

            "},{"location":"user-guide/advanced/install-your-password-manager-on-init/","title":"Install your password manager on init","text":"

            If you use a password manager to store your secrets then you may need to install your password manager after you have run chezmoi init on a new machine but before chezmoi init --apply or chezmoi apply executes your run_before_ scripts.

            chezmoi provides a hooks.read-source-state.pre hook that allows you to modify your system after chezmoi init has cloned your dotfile repo but before chezmoi has read the source state. This is the perfect time to install your password manager as you can assume that ~/.local/share/chezmoi is populated but has not yet been read.

            First, write your password manager install hook. chezmoi executes this hook every time any command reads the source state so the hook should terminate as quickly as possible if there is no work to do.

            This hook is not a template so you cannot use template variables and must instead detect the system you are running on yourself.

            For example:

            ~/.local/share/chezmoi/.install-password-manager.sh
            #!/bin/sh\n\n# exit immediately if password-manager-binary is already in $PATH\ntype password-manager-binary >/dev/null 2>&1 && exit\n\ncase \"$(uname -s)\" in\nDarwin)\n    # commands to install password-manager-binary on Darwin\n    ;;\nLinux)\n    # commands to install password-manager-binary on Linux\n    ;;\n*)\n    echo \"unsupported OS\"\n    exit 1\n    ;;\nesac\n

            Note

            The leading . in .install-password-manager.sh is important because it tells chezmoi to ignore .install-password-manager.sh when declaring the state of files in your home directory.

            Finally, tell chezmoi to run your password manager install hook before reading the source state:

            .config/chezmoi/chezmoi.toml
            [hooks.read-source-state.pre]\n    command = \".local/share/chezmoi/.install-password-manager.sh\"\n
            "},{"location":"user-guide/advanced/migrate-away-from-chezmoi/","title":"Migrate away from chezmoi","text":"

            chezmoi provides several mechanisms to help you move to an alternative dotfile manager (or even no dotfile manager at all) in the future:

            chezmoi creates your dotfiles just as if you were not using a dotfile manager at all. Your dotfiles are regular files, directories, and symlinks. You can run chezmoi purge to delete all traces of chezmoi and then, if you're migrating to a new dotfile manager, then you can use whatever mechanism it provides to add your dotfiles to your new system.

            chezmoi has a chezmoi archive command that generates a tarball of your dotfiles. You can replace the contents of your dotfiles repo with the contents of the archive and you've effectively immediately migrated away from chezmoi.

            chezmoi has a chezmoi dump command that dumps the interpreted (target) state in a machine-readable form, so you can write scripts around chezmoi.

            "},{"location":"user-guide/advanced/use-chezmoi-with-watchman/","title":"Use chezmoi with Watchman","text":"

            chezmoi can be used with Watchman to automatically run chezmoi apply whenever your source state changes, but there are some limitations because Watchman runs actions in the background without a terminal.

            Firstly, Watchman spawns a server which runs actions when filesystems change. This server reads its environment variables when it is started, typically on the first invocation of the watchman command. If you use a password manager that uses environment variables to persist login sessions, then you must login to your password manager before you run the first watchman command, and your session might eventually time out.

            Secondly, Watchman runs processes without a terminal, and so cannot run interactive processes. For chezmoi apply, you can use the --force flag to suppress prompts to overwrite files that have been modified since chezmoi last wrote them. However, if any other part of chezmoi apply is interactive, for example if your password manager prompts for a password, then it will not work with Watchman.

            1. Tell watchman to watch your source directory:

              CHEZMOI_SOURCE_PATH=\"$(chezmoi source-path)\"\nwatchman watch \"${CHEZMOI_SOURCE_PATH}\"\n
            2. Tell watchman to run chezmoi apply --force whenever your source directory changes:

              watchman -j <<EOT\n[\"trigger\", \"${CHEZMOI_SOURCE_PATH}\", {\n  \"name\": \"chezmoi-apply\",\n  \"command\": [\"chezmoi\", \"apply\", \"--force\"]\n}]\nEOT\n

            You can now make changes to your source directory and Watchman will run chezmoi apply --force on each change.

            To shutdown the Watchman server, run:

            ```sh\nwatchman shutdown-server\n```\n
            "},{"location":"user-guide/encryption/","title":"Encryption","text":"

            chezmoi supports encrypting files with age and gpg.

            Encrypted files are stored in ASCII-armored format in the source directory with the encrypted_ attribute and are automatically decrypted when needed.

            Add files to be encrypted with the --encrypt flag, for example:

            chezmoi add --encrypt ~/.ssh/id_rsa\n

            chezmoi edit will transparently decrypt the file before editing and re-encrypt it afterwards.

            "},{"location":"user-guide/encryption/age/","title":"age","text":"

            chezmoi supports encrypting files with age.

            Generate a key using age-keygen:

            $ age-keygen -o $HOME/key.txt\nPublic key: age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p\n

            Specify age encryption in your configuration file, being sure to specify at least the identity and one recipient:

            ~/.config/chezmoi/chezmoi.toml
            encryption = \"age\"\n[age]\n    identity = \"/home/user/key.txt\"\n    recipient = \"age1ql3z7hjy54pw3hyww5ayyfg7zqgvc7w3j2elw8zmrj2kg5sfn9aqmcac8p\"\n

            chezmoi supports multiple recipients and recipient files, and multiple identities.

            Note

            Make sure encryption is added to the top level section at the beginning of the config, before any other sections.

            "},{"location":"user-guide/encryption/age/#symmetric-encryption","title":"Symmetric encryption","text":"

            To use age's symmetric encryption, specify a single identity and enable symmetric encryption in your config file, for example:

            ~/.config/chezmoi/chezmoi.toml
            encryption = \"age\"\n[age]\n    identity = \"~/.ssh/id_rsa\"\n    symmetric = true\n
            "},{"location":"user-guide/encryption/age/#symmetric-encryption-with-a-passphrase","title":"Symmetric encryption with a passphrase","text":"

            To use age's symmetric encryption with a passphrase, set age.passphrase to true in your config file, for example:

            ~/.config/chezmoi/chezmoi.toml
            encryption = \"age\"\n[age]\n    passphrase = true\n

            You will be prompted for the passphrase whenever you run chezmoi add --encrypt and whenever chezmoi needs to decrypt the file, for example when you run chezmoi apply, chezmoi diff, or chezmoi status.

            "},{"location":"user-guide/encryption/age/#builtin-age-encryption","title":"Builtin age encryption","text":"

            chezmoi has builtin support for age encryption which is automatically used if the age command is not found in $PATH.

            Info

            The builtin age encryption does not support passphrases, symmetric encryption, or SSH keys.

            Passphrases are not supported because chezmoi needs to decrypt files regularly, e.g. when running a chezmoi diff or a chezmoi status command, not just when running chezmoi apply. Prompting for a passphrase each time would quickly become tiresome.

            Symmetric encryption may be supported in the future. Please open an issue if you want this.

            SSH keys are not supported as the age documentation explicitly recommends not using them:

            When integrating age into a new system, it's recommended that you only support X25519 keys, and not SSH keys. The latter are supported for manual encryption operations.

            "},{"location":"user-guide/encryption/gpg/","title":"gpg","text":"

            chezmoi supports encrypting files with gpg. Encrypted files are stored in the source state and automatically be decrypted when generating the target state or editing a file contents with chezmoi edit.

            "},{"location":"user-guide/encryption/gpg/#asymmetric-privatepublic-key-encryption","title":"Asymmetric (private/public-key) encryption","text":"

            Specify the encryption key to use in your configuration file (chezmoi.toml) with the gpg.recipient key:

            ~/.config/chezmoi/chezmoi.toml
            encryption = \"gpg\"\n[gpg]\n    recipient = \"...\"\n

            chezmoi will encrypt files:

            gpg --armor --recipient $RECIPIENT --encrypt\n

            and store the encrypted file in the source state. The file will automatically be decrypted when generating the target state.

            Note

            Make sure encryption is added to the top level section at the beginning of the config, before any other sections.

            "},{"location":"user-guide/encryption/gpg/#symmetric-encryption","title":"Symmetric encryption","text":"

            Specify symmetric encryption in your configuration file:

            ~/.config/chezmoi/chezmoi.toml
            encryption = \"gpg\"\n[gpg]\n    symmetric = true\n

            chezmoi will encrypt files:

            gpg --armor --symmetric\n
            "},{"location":"user-guide/encryption/gpg/#encrypting-files-with-a-passphrase","title":"Encrypting files with a passphrase","text":"

            If you want to encrypt your files with a passphrase, but don't mind the passphrase being stored in plaintext on your machines, then you can use the following configuration:

            ~/.local/share/chezmoi/.chezmoi.toml.tmpl
            {{ $passphrase := promptStringOnce . \"passphrase\" \"passphrase\" -}}\n\nencryption = \"gpg\"\n[data]\n    passphrase = {{ $passphrase | quote }}\n[gpg]\n    symmetric = true\n    args = [\"--batch\", \"--passphrase\", {{ $passphrase | quote }}, \"--no-symkey-cache\"]\n

            This will prompt you for the passphrase the first time you run chezmoi init on a new machine, and then remember the passphrase in your configuration file.

            "},{"location":"user-guide/encryption/gpg/#muting-gpg-output","title":"Muting gpg output","text":"

            Since gpg sends some info messages to stderr instead of stdout, you will see some output even if you redirect stdout to /dev/null.

            You can mute this by adding --quiet to the gpg.args key in your configuration:

            ~/.local/share/chezmoi/.chezmoi.toml.tmpl
            [gpg]\n    args = [\"--quiet\"]\n
            "},{"location":"user-guide/encryption/rage/","title":"rage","text":"

            chezmoi supports encrypting files with rage.

            To use rage, set age.command to rage in your configuration file, for example:

            ~/.config/chezmoi/chezmoi.toml
            encryption = \"age\"\n[age]\n    command = \"rage\"\n

            Note

            Make sure encryption is added to the top level section at the beginning of the config, before any other sections.

            Then, configure chezmoi as you would for age.

            "},{"location":"user-guide/frequently-asked-questions/design/","title":"Design","text":""},{"location":"user-guide/frequently-asked-questions/design/#do-i-have-to-use-chezmoi-edit-to-edit-my-dotfiles","title":"Do I have to use chezmoi edit to edit my dotfiles?","text":"

            No. chezmoi edit is a convenience command that has a couple of useful features, but you don't have to use it.

            You can also run chezmoi cd and then just edit the files in the source state directly. After saving an edited file you can run chezmoi diff to check what effect the changes would have, and run chezmoi apply if you're happy with them. If there are inconsistencies that you want to keep, then chezmoi merge-all will help you resolve any differences.

            chezmoi edit provides the following useful features:

            • The arguments to chezmoi edit are the files in their target location, so you don't have to think about source state attributes and your editor's syntax highlighting will work.

            • If the dotfile is encrypted in the source state, then chezmoi edit will decrypt it to a private directory, open that file in your $EDITOR, and then re-encrypt the file when you quit your editor. This makes encryption transparent.

            • With the --diff and --apply options you can see what would change and apply those changes without having to run chezmoi diff or chezmoi apply.

            • If you have configured git auto commits or git auto pushes then chezmoi edit will create commits and push them for you.

            If you chose to edit files in the source state and you're using VIM then github.com/alker0/chezmoi.vim gives you syntax highlighting, however you edit your files. Besides using the plugin, you can use modeline to tell VIM the correct filetype. For example, put # vim: filetype=zsh at the top of dot_zshrc, and VIM will treat dot_zshrc as zsh file.

            "},{"location":"user-guide/frequently-asked-questions/design/#why-doesnt-chezmoi-use-symlinks-like-gnu-stow","title":"Why doesn't chezmoi use symlinks like GNU Stow?","text":"

            Symlinks are first class citizens in chezmoi: chezmoi supports creating them, updating them, removing them, and even more advanced features not found in other dotfile managers like having the same symlink point to different targets on different machines by using a template.

            With chezmoi, you only use a symlink where you really need a symlink, in contrast to some other dotfile managers (e.g. GNU Stow) which require the use of symlinks as a layer of indirection between a dotfile's location (which can be anywhere in your home directory) and a dotfile's content (which needs to be in a centralized directory that you manage with version control). chezmoi solves this problem in a different way.

            Instead of using a symlink to redirect from the dotfile's location to the centralized directory, chezmoi generates the dotfile as a regular file in its final location from the contents of the centralized directory. This approach allows chezmoi to provide features that are not possible when using symlinks, for example having files that are encrypted, executable, private, or templates.

            There is nothing special about dotfiles managed by chezmoi whereas dotfiles managed with GNU Stow are special because they're actually symlinks to somewhere else.

            The only advantage to using GNU Stow-style symlinks is that changes that you make to the dotfile's contents in the centralized directory are immediately visible whenever you save them, whereas chezmoi currently requires you to pass the --watch flag to chezmoi edit or set edit.watch to true in your configuration file.

            If you really want to use symlinks, then chezmoi provides a symlink mode which uses symlinks where possible. This configures chezmoi to work like GNU Stow and have it create a set of symlinks back to a central directory, but this currently requires a bit of manual work (as described in #167). chezmoi might get some automation to help (see #886 for example) but it does need some convincing use cases that demonstrate that a symlink from a dotfile's location to its contents in a central directory is better than just having the correct dotfile contents.

            "},{"location":"user-guide/frequently-asked-questions/design/#what-are-the-limitations-of-chezmois-symlink-mode","title":"What are the limitations of chezmoi's symlink mode?","text":"

            In symlink mode chezmoi replaces targets with symlinks to the source directory if the target is a regular file and is not encrypted, executable, private, or a template.

            Symlinks cannot be used for encrypted files because the source state contains the ciphertext, not the plaintext.

            Symlinks cannot be used for executable files as the executable bit would need to be set on the file in the source directory and chezmoi uses only regular files and directories in its source state for portability across operating systems. This may change in the future.

            Symlinks cannot be used for private files because git does not persist group and world permission bits.

            Symlinks cannot be used for templated files because the source state contains the template, not the result of executing the template.

            Symlinks cannot be used for entire directories because of chezmoi's use of attributes in the filename mangles entries in the directory, directories might have the exact_ attribute and contain empty files, and the directory's entries might not be usable with symlinks.

            In symlink mode, running chezmoi add does not immediately replace the targets with a symlink. You must run chezmoi apply to create the symlinks.

            "},{"location":"user-guide/frequently-asked-questions/design/#why-does-chezmoi-use-weird-filenames","title":"Why does chezmoi use weird filenames?","text":"

            There are a number of criticisms of how chezmoi uses filenames:

            1. The long source file names are weird and verbose.
            2. Not all possible file permissions can be represented.
            3. Everything is in a single directory, which can end up containing many entries.

            chezmoi's decision to store metadata in filenames is a deliberate, practical, compromise.

            Firstly, almost all programs store metadata in filenames: the filename's extension. chezmoi extends the filename to storing metadata in attributes in the filename's prefix as well.

            The dot_ attribute makes it transparent which dotfiles are managed by chezmoi and which files are ignored by chezmoi. chezmoi ignores all files and directories that start with . so no special whitelists are needed for version control systems and their control files (e.g. .git and .gitignore).

            chezmoi needs per-file metadata to know how to interpret the source file's contents, for example to know when the source file is a template or if the file's contents are encrypted. By storing this metadata in the filename, the metadata is unambiguously associated with a single file and adding, updating, or removing a single file touches only a single file in the source state. Changes to the metadata (e.g. chezmoi chattr +template $TARGET) are simple file renames and isolated to the affected file.

            If chezmoi were to, say, use a common configuration file listing which files were templates and/or encrypted, then changes to any file would require updates to the common configuration file. Automating updates to configuration files requires a round trip (read config file, update config, write config) and it is not always possible preserve comments and formatting.

            chezmoi's attributes of executable_, private_, and readonly_ allow the file permissions 0o644, 0o755, 0o600, 0o700, 0o444, 0o555, 0o400, and 0o500 to be represented. Directories can only have permissions 0o755, 0o700, or 0o500. In practice, these cover all permissions typically used for dotfiles. If this does cause a genuine problem for you, please open an issue on GitHub.

            File permissions and modes like executable_, private_, readonly_, and symlink_ could also be stored in the filesystem, rather than in the filename. However, this requires the permissions to be preserved and handled by the underlying version control system and filesystem. chezmoi provides first-class support for Windows, where the executable_ and private_ attributes have no direct equivalents and symbolic links are not always permitted. By using regular files and directories, chezmoi avoids variations in the operating system, version control system, and filesystem making it both more robust and more portable.

            chezmoi uses a 1:1 mapping between entries in the source state and entries in the target state. This mapping is bi-directional and unambiguous.

            However, this also means that dotfiles that in the same directory in the target state must be in the same directory in the source state. In particular, every entry managed by chezmoi in the root of your home directory has a corresponding entry in the root of your source directory, which can mean that you end up with a lot of entries in the root of your source directory. This can be mitigated by using .chezmoiroot file.

            If chezmoi were to permit, say, multiple separate source directories (so you could, say, put dot_bashrc in a bash/ subdirectory, and dot_vimrc in a vim/ subdirectory, but have chezmoi apply map these to ~/.bashrc and ~/.vimrc in the root of your home directory) then the mapping between source and target states is no longer bidirectional nor unambiguous, which significantly increases complexity and requires more user interaction. For example, if both bash/dot_bashrc and vim/dot_bashrc exist, what should be the contents of ~/.bashrc? If you run chezmoi add ~/.zshrc, should dot_zshrc be stored in the source bash/ directory, the source vim/ directory, or somewhere else? How does the user communicate their preferences?

            chezmoi has many users and any changes to the source state representation must be backwards-compatible.

            In summary, chezmoi's source state representation is a compromise with both advantages and disadvantages. Changes to the representation will be considered, but must meet the following criteria, in order of importance:

            1. Be fully backwards-compatible for existing users.
            2. Fix a genuine problem encountered in practice.
            3. Be independent of the underlying operating system, version control system, and filesystem.
            4. Not add significant extra complexity to the user interface or underlying implementation.
            "},{"location":"user-guide/frequently-asked-questions/design/#can-chezmoi-support-multiple-sources-or-multiple-source-states","title":"Can chezmoi support multiple sources or multiple source states?","text":"

            With some dotfile managers, dotfiles can be distributed across multiple directories or even multiple repos. For example, the user might have one directory per application, or separate repos for home and work configurations, or even separate git submodules for different applications. These can be considered multiple sources of truth for the target state. This, however, comes with complications:

            1. Multiple sources of truth complicate the user interface. When running chezmoi add $FILE, which source should $FILE be added to?

            2. Multiple sources of truth do not compose easily if target files overlap. For example, if you have two sources, both of which need to set an environment variable in .bashrc, how do you handle this when both, only one, or neither source might be activated? What if the sources are mutually exclusive, e.g. if the VIM source and the Emacs source both want to set the $EDITOR environment variable?

            3. Multiple sources of truth are not always independent. Related to the previous point, consider a source that adds an applications's configuration files and shell completions. Should the shell completions be part of the applications's source or of the shell's source?

            chezmoi instead makes the opinionated choice to use a single source of truth, i.e. a single branch in a single git repo. Using a single source of truth avoids the inherent complexity and ambiguity of multiple sources.

            chezmoi provides mechanisms like templates (for minor differences), .chezmoiignore (for controlling the presence or otherwise of complete files and directories), and password manager integration (so secrets never need to be stored in a repo) handle machine-to-machine differences. Externals make it easy to pull in dotfiles from third-party sources.

            That said, if you are keen to use multiple sources of truth with chezmoi, you have a number of options with some scripting around chezmoi.

            Firstly, you can run chezmoi apply with different arguments to the --config and --source flags which will apply to the same destination. So that you only have to type one command you can wrap this in a shell function, for example:

            chezmoi-apply() {\n    chezmoi apply --config ~/.config/chezmoi-home/chezmoi.toml \\\n                  --source ~/.local/share/chezmoi-home && \\\n    chezmoi apply --config ~/.config/chezmoi-work/chezmoi.toml \\\n                  --source ~/.local/share/chezmoi-work\n}\n

            If you want to generate multiple configuration files with chezmoi init then you will need the --config-path flag. For more advanced use, use the --destination, --cache, and --persistent-state flags.

            Secondly, you can assemble a single source state from multiple sources and then use chezmoi apply. For example, if you have multiple source states in subdirectories of ~/.dotfiles:

            #!/bin/bash\n\n# create a combined source state in a temporary directory\ncombined_source=\"$(mktemp -d)\"\n\n# remove the temporary source state on exit\ntrap 'rm -rf -- \"${combined_source}\"' INT TERM\n\n# copy files from multiple sources into the temporary source state\nfor source in $HOME/.dotfiles/*; do\n    cp -r \"${source}\"/* \"${combined_source}\"\ndone\n\n# apply the temporary source state\nchezmoi apply --source \"${combined_source}\"\n

            Thirdly, you can use a run_ script to invoke a second instance of chezmoi, as used by @felipecrs.

            "},{"location":"user-guide/frequently-asked-questions/design/#why-does-chezmoi-cd-spawn-a-shell-instead-of-just-changing-directory","title":"Why does chezmoi cd spawn a shell instead of just changing directory?","text":"

            chezmoi cd spawns a shell because it is not possible for a program to change the working directory of its parent process. You can add a shell function instead:

            chezmoi-cd() {\n    cd $(chezmoi source-path)\n}\n

            Typing chezmoi-cd will then change the directory of your current shell to chezmoi's source directory.

            "},{"location":"user-guide/frequently-asked-questions/design/#why-are-the-prompt-functions-only-available-in-config-file-templates","title":"Why are the prompt* functions only available in config file templates?","text":"

            chezmoi regularly needs to execute templates to determine the target contents of files. For example, templates are executed for the apply, diff, and status commands, amongst many others. Having to interactively respond each time would quickly become tiresome. Therefore, chezmoi only provides these functions when generating a config file from a config file template (e.g. when you run chezmoi init or chezmoi --init apply).

            "},{"location":"user-guide/frequently-asked-questions/design/#why-not-use-ansiblechefpuppetsalt-or-similar-to-manage-my-dotfiles-instead","title":"Why not use Ansible/Chef/Puppet/Salt, or similar to manage my dotfiles instead?","text":"

            Whole system management tools are more than capable of managing your dotfiles, but they are large systems that entail several disadvantages. Compared to whole system management tools, chezmoi offers:

            • Small, focused feature set designed for dotfiles. There's simply less to learn with chezmoi compared to whole system management tools.

            • Easy installation and execution on every platform, without root access. Installing chezmoi requires only copying a single binary file with no external dependencies. Executing chezmoi just involves running the binary. In contrast, installing and running a whole system management tool typically requires installing a scripting language runtime, several packages, and running a system service, all typically requiring root access.

            chezmoi's focus and simple installation means that it runs almost everywhere: from tiny ARM-based Linux systems to Windows desktops, from inside lightweight containers to FreeBSD-based virtual machines in the cloud.

            "},{"location":"user-guide/frequently-asked-questions/design/#can-i-use-chezmoi-to-manage-files-outside-my-home-directory","title":"Can I use chezmoi to manage files outside my home directory?","text":"

            In practice, yes, you can, but this usage is strongly discouraged beyond using your system's package manager to install the packages you need.

            chezmoi is designed to operate on your home directory, and is explicitly not a full system configuration management tool. That said, there are some ways to have chezmoi manage a few files outside your home directory.

            chezmoi's scripts can execute arbitrary commands, so you can use a run_ script that is run every time you run chezmoi apply, to, for example:

            • Make the target file outside your home directory a symlink to a file managed by chezmoi in your home directory.

            • Copy a file managed by chezmoi inside your home directory to the target file.

            • Execute a template with chezmoi execute-template --output=$FILENAME template where $FILENAME is outside the target directory.

            chezmoi executes all scripts as the user executing chezmoi, so you may need to add extra privilege elevation commands like sudo or PowerShell start -verb runas -wait to your script.

            chezmoi, by default, operates on your home directory but this can be overridden with the --destination command line flag or by specifying destDir in your config file, and could even be the root directory (/ or C:\\). This allows you, in theory, to use chezmoi to manage any file in your filesystem, but this usage is extremely strongly discouraged.

            If your needs extend beyond modifying a handful of files outside your target system, then existing configuration management tools like Puppet, Chef, Ansible, and Salt are much better suited - and of course can be called from a chezmoi run_ script. Put your Puppet Manifests, Chef Recipes, Ansible Modules, and Salt Modules in a directory ignored by .chezmoiignore so they do not pollute your home directory.

            "},{"location":"user-guide/frequently-asked-questions/design/#what-inspired-chezmoi","title":"What inspired chezmoi?","text":"

            chezmoi was inspired by Puppet, but was created because Puppet is an overkill for managing your personal configuration files. The focus of chezmoi will always be personal home directory management. If your needs grow beyond that, switch to a whole system configuration management tool.

            "},{"location":"user-guide/frequently-asked-questions/design/#where-does-the-name-chezmoi-come-from","title":"Where does the name \"chezmoi\" come from?","text":"

            \"chezmoi\" splits to \"chez moi\" and pronounced /\u0283e\u026a mwa/ (shay-mwa) meaning \"at my house\" in French. It's seven letters long, which is an appropriate length for a command that is only run occasionally. If you prefer a shorter command, add an alias to your shell configuration, for example:

            alias cz=chezmoi\n
            "},{"location":"user-guide/frequently-asked-questions/encryption/","title":"Encryption","text":""},{"location":"user-guide/frequently-asked-questions/encryption/#how-do-i-configure-chezmoi-to-encrypt-files-but-only-request-a-passphrase-the-first-time-chezmoi-init-is-run","title":"How do I configure chezmoi to encrypt files but only request a passphrase the first time chezmoi init is run?","text":"

            The following steps use age for encryption.

            This can be achieved with the following process:

            1. Generate an age private key.
            2. Encrypt the private key with a passphrase.
            3. Configure chezmoi to decrypt the private key if needed.
            4. Configure chezmoi to use the private key.
            5. Add encrypted files.

            First, change to chezmoi's root directory:

            chezmoi cd ~\n

            Generate an age private key encrypted with a passphrase in the file key.txt.age with the command:

            $ age-keygen | age --armor --passphrase > key.txt.age\nPublic key: age193wd0hfuhtjfsunlq3c83s8m93pde442dkcn7lmj3lspeekm9g7stwutrl\nEnter passphrase (leave empty to autogenerate a secure one):\nConfirm passphrase:\n

            Use a strong passphrase and make a note of the public key (age193wd0hfuhtjfsunlq3c83s8m93pde442dkcn7lmj3lspeekm9g7stwutrl in this case).

            Add key.txt.age to .chezmoiignore so that chezmoi does not try to create it:

            echo key.txt.age >> .chezmoiignore\n

            Configure chezmoi to decrypt the passphrase-encrypted private key if needed:

            $ cat > run_once_before_decrypt-private-key.sh.tmpl <<EOF\n#!/bin/sh\n\nif [ ! -f \"${HOME}/.config/chezmoi/key.txt\" ]; then\n    mkdir -p \"${HOME}/.config/chezmoi\"\n    chezmoi age decrypt --output \"${HOME}/.config/chezmoi/key.txt\" --passphrase \"{{ .chezmoi.sourceDir }}/key.txt.age\"\n    chmod 600 \"${HOME}/.config/chezmoi/key.txt\"\nfi\nEOF\n

            Specify the public and private keys for encryption. age.recipient must be your public key from above. Make sure encryption is added at the beginning, before any other sections.

            ~/.config/chezmoi/chezmoi.toml
            encryption = \"age\"\n[age]\n    identity = \"~/.config/chezmoi/key.txt\"\n    recipient = \"age193wd0hfuhtjfsunlq3c83s8m93pde442dkcn7lmj3lspeekm9g7stwutrl\"\n

            Run chezmoi init --apply to generate the chezmoi's config file and decrypt the private key:

            $ chezmoi init --apply\nEnter passphrase:\n

            At this stage everything is configured and git status should report:

            $ git status\nOn branch main\nUntracked files:\n        (use \"git add <file>...\" to include in what will be committed)\n        .chezmoi.toml.tmpl\n        .chezmoiignore\n        key.txt.age\n        run_once_before_decrypt-private-key.sh.tmpl\n\nnothing added to commit but untracked files present (use \"git add\" to track)\n

            If you're happy with the changes you can commit them. All four files should be committed.

            Add files that you want to encrypt using the --encrypt argument to chezmoi add, for example:

            chezmoi add --encrypt ~/.ssh/id_rsa\n

            When you run chezmoi init on a new machine you will be prompted to enter your passphrase once to decrypt key.txt.age. Your decrypted private key will be stored in ~/.config/chezmoi/key.txt.

            "},{"location":"user-guide/frequently-asked-questions/encryption/#how-to-re-encrypt-encrypted-files","title":"How to re-encrypt encrypted files","text":"

            To rotate from an expired GPG key to its replacement, or change from GPG to age encryption, the following steps can be used:

            1. Make sure you have applied all encrypted files (e.g. chezmoi apply decrypts files and places them in their destinations).
            2. Update chezmoi configuration to use the new encryption method (examples: gpg, age, age with one-time passphrase).
            3. Remove all encrypted files from the state via chezmoi forget or chezmoi unmanage.
            4. Add them back with chezmoi add --encrypt.
            "},{"location":"user-guide/frequently-asked-questions/encryption/#example-migrate-from-gpg-to-age","title":"Example: Migrate from GPG to age","text":"

            Update chezmoi configuration to use age encryption (with chezmoi edit-config or manually editing the corresponding template):

            - encryption = \"gpg\"\n- [gpg]\n-     recipient = \"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"\n+ encryption = \"age\"\n+ [age]\n+     recipient = \"age1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\"\n+     identity = \"/home/user/key.txt\"\n

            Re-encrypt the files with a script like this:

            for encrypted_file in $(chezmoi managed --include encrypted --path-style absolute)\ndo\n  # optionally, add --force to avoid prompts\n  chezmoi forget \"$encrypted_file\"\n\n  # strip the .asc extension\n  decrypted_file=\"${encrypted_file%.asc}\"\n\n  chezmoi add --encrypt \"$decrypted_file\"\ndone\n
            "},{"location":"user-guide/frequently-asked-questions/general/","title":"General","text":""},{"location":"user-guide/frequently-asked-questions/general/#what-other-questions-have-been-asked-about-chezmoi","title":"What other questions have been asked about chezmoi?","text":"

            See the issues and discussions.

            "},{"location":"user-guide/frequently-asked-questions/general/#where-do-i-ask-a-question-that-isnt-answered-here","title":"Where do I ask a question that isn't answered here?","text":"

            Please open an issue on GitHub or start a discussion.

            "},{"location":"user-guide/frequently-asked-questions/general/#i-like-chezmoi-how-do-i-say-thanks","title":"I like chezmoi. How do I say thanks?","text":"

            Thank you! chezmoi was written to scratch a personal itch, and I'm very happy that it's useful to you. Please give chezmoi a star on GitHub, and if you're happy to share your public dotfile repo then tag it with chezmoi.

            If you write an article or give a talk on chezmoi please inform the author (e.g. by opening an issue) so it can be added to chezmoi's articles, podcasts, and videos pages.

            Contributions are very welcome and every bug report, support request, and feature request helps make chezmoi better. Thank you :)

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/","title":"Troubleshooting","text":""},{"location":"user-guide/frequently-asked-questions/troubleshooting/#how-can-i-quickly-check-for-problems-with-chezmoi-on-my-machine","title":"How can I quickly check for problems with chezmoi on my machine?","text":"

            Run:

            chezmoi doctor\n

            Anything ok is fine, anything warning is only a problem if you want to use the related feature, and anything error indicates a definite problem.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#a-specific-command-is-not-behaving-as-i-expect-how-can-i-debug-it","title":"A specific command is not behaving as I expect. How can I debug it?","text":"

            The --verbose flag makes chezmoi to print extra information about what it is doing.

            The --debug flag makes chezmoi print very detailed step by step information.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#the-output-of-chezmoi-diff-is-broken-and-does-not-contain-color-what-could-be-wrong","title":"The output of chezmoi diff is broken and does not contain color. What could be wrong?","text":"

            By default, chezmoi's diff output includes ANSI color escape sequences (e.g. ESC[37m) and is piped into your pager (by default less). chezmoi assumes that your pager passes through the ANSI color escape sequences, as configured on many systems, but not all. If your pager does not pass through ANSI color escape sequences then you will see monochrome diff output with uninterpreted ANSI color escape sequences.

            This can typically by fixed by setting the environment variable

            export LESS=-R\n

            which instructs less to display \"raw\" control characters via the -R / --RAW-CONTROL-CHARS option.

            You can also set the pager configuration variable in your config file, for example:

            ~/.config/chezmoi/chezmoi.toml
            pager = \"less -R\"\n

            If you have set a different pager (via the pager configuration variable or PAGER environment variable) then you must ensure that it passes through raw control characters. Alternatively, you can use the --color=false option to chezmoi to disable colors or the --no-pager option to chezmoi to disable the pager.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#why-do-i-get-a-blank-buffer-or-empty-file-when-running-chezmoi-edit","title":"Why do I get a blank buffer or empty file when running chezmoi edit?","text":"

            In this case, chezmoi edit typically prints a warning like:

            chezmoi: warning: $EDITOR $TMPDIR/$FILENAME: returned in less than 1s\n

            chezmoi edit performs a bit of magic to improve the experience of editing files in the source state by invoking your editor with filenames in a temporary directory that look like filenames in your home directory. What's happening here is that your editor command is exiting immediately, so chezmoi thinks you've finished editing and so removes the temporary directory, but actually your editor command has forked a edit process in the background, and that edit process opens a now non-existent file.

            To fix this you have to configure your editor command to remain in the foreground until you have finished editing the file, so chezmoi knows when to remove the temporary directory.

            VIMVSCode

            Pass the -f flag, e.g. by setting the edit.flags configuration variable to [\"-f\"], or by setting the EDITOR environment variable to include the -f flag, e.g. export EDITOR=\"vim -f\".

            Pass the --wait flag, e.g. by setting the edit.flags configuration variable to [\"--wait\"] or by setting the EDITOR environment variable to include the --wait flag, e.g. export EDITOR=\"code --wait\".

            The \"bit of magic\" that chezmoi edit performs includes:

            • chezmoi edit makes the filename opened by your editor more closely match the target filename, which can help your editor choose the correct syntax highlighting. For example, if you run chezmoi edit ~/.zshrc, your editor is be opened with $TMPDIR/.zshrc but you'll actually be editing ~/.local/share/chezmoi/dot_zshrc. Under the hood, chezmoi creates a hardlink in a temporary directory to the file in your source directory, so even though your editor thinks it's editing .zshrc, it is really editing dot_zshrc in your source directory.

            • If the source file is encrypted then chezmoi edit transparently decrypts and re-encrypts the file for you. Specifically, chezmoi decrypts the file into a private temporary directory and open your editor with the decrypted file, and re-encrypts the file when you exit your editor.

            • If the source file is a template, then chezmoi edit preserves the .tmpl extension.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-makes-sshconfig-group-writeable-how-do-i-stop-this","title":"chezmoi makes ~/.ssh/config group writeable. How do I stop this?","text":"

            By default, chezmoi uses your system's umask when creating files. On most systems the default umask is 022 but some systems use 002, which means that files and directories are group writeable by default.

            You can override this for chezmoi by setting the umask configuration variable in your configuration file, for example:

            ~/.config/chezmoi/chezmoi.toml
            umask = 0o022\n

            Note

            This will apply to all files and directories that chezmoi manages and will ensure that none of them are group writeable. It is not currently possible to control group write permissions for individual files or directories. Please open an issue on GitHub if you need this.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-user-lookup-userid-nnnnn-inputoutput-error","title":"chezmoi reports chezmoi: user: lookup userid NNNNN: input/output error","text":"

            This is likely because the chezmoi binary you are using was statically compiled with musl and the machine you are running on uses LDAP or NIS.

            The immediate fix is to use a package built for your distribution (e.g a .deb or .rpm) which is linked against glibc and includes LDAP/NIS support instead of the statically-compiled binary.

            If the problem still persists, then please open an issue on GitHub.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-timeout-or-chezmoi-timeout-obtaining-persistent-state-lock","title":"chezmoi reports chezmoi: timeout or chezmoi: timeout obtaining persistent state lock","text":"

            chezmoi will report this when it is unable to lock its persistent state (~/.config/chezmoi/chezmoistate.boltdb), typically because another instance of chezmoi is currently running and holding the lock.

            This can happen, for example, if you have a run_ script that invokes chezmoi, or are running chezmoi in another window.

            Under the hood, chezmoi uses bbolt which permits multiple simultaneous readers, but only one writer (with no readers).

            Commands that take a write lock include add, apply, edit, forget, import, init, state, unmanage, and update. Commands that take a read lock include diff, status, and verify.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-forkexec-tmpxxxxxxxxxxxx-exec-format-error-when-executing-a-template-script","title":"chezmoi reports chezmoi: fork/exec /tmp/XXXXXXXXXX.XX: exec format error when executing a template script","text":"

            This error occurs when you have a newline before the #! in your script. Suppress the newline by including a - before the closing }} on the first line.

            For example, if your template script begins with

            {{ if eq .chezmoi.os \"linux\" }}\n#!/bin/sh\n

            change this to

            {{ if eq .chezmoi.os \"linux\" -}}\n#!/bin/sh\n
            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-forkexec-tmpxxxxxxxxxxxx-permission-denied-when-executing-a-script","title":"chezmoi reports chezmoi: fork/exec /tmp/XXXXXXXXXX.XX: permission denied when executing a script","text":"

            This error occurs when your temporary directory is mounted with the noexec option.

            As chezmoi scripts can be templates, encrypted, or both, chezmoi needs to write the final script's contents to a file so that it can be executed by the operating system. By default, chezmoi will use $TMPDIR for this.

            You can change the temporary directory into which chezmoi writes and executes scripts with the scriptTempDir configuration variable. For example, to use a subdirectory of your home directory you can use:

            ~/.config/chezmoi/chezmoi.toml
            scriptTempDir = \"~/tmp\"\n
            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-chezmoi-mkdir-xxxxx-no-such-file-or-directory-when-trying-to-manage-file-or-directory","title":"chezmoi reports chezmoi: mkdir xxxxx: no such file or directory when trying to manage file or directory","text":"

            This error occurs when you try to add directory/file to be managed via chezmoi but the same directory is only listed in .chezmoiexternal.$FORMAT.

            A workaround can be applied in a such case via manually creating import directory in chezmoi source directory (typically ~/.local/share/chezmoi) and create .keep file.

            For example, if .chezmoiexternal.toml has the configuration:

            [\".config/nvim\"]\n    type = \"git-repo\"\n    url = \"https://github.com/NvChad/NvChad.git\"\n    refreshPeriod = \"168h\"\n    [\".config/nvim\".pull]\n        args = [\"--ff-only\"]\n

            Now chezmoi add ~/.config/direnv/direnvrc will raise the error:

            chezmoi: mkdir /home/<user>/.local/share/chezmoi/dot_config/direnv: no such file or directory\n

            But the workaround can be applied:

            chezmoi cd\nmkdir -p dot_config/\ntouch dot_config/.keep\n

            Now once that done chezmoi add ~/.config/direnv/direnvrc should work. For reference see this issue

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-read-devstdin-permission-denied-or-write-devstdout-permission-denied-when-i-redirect-standard-input-or-standard-output","title":"chezmoi reports read /dev/stdin: permission denied or write /dev/stdout: permission denied when I redirect standard input or standard output","text":"

            This error occurs when you installed chezmoi with snap and is caused by a long-standing bug in snap.

            This is not a bug in chezmoi and there is nothing that chezmoi can do about this. However, there are two workarounds:

            Firstly, you can use alternatives to shell redirection. For standard input:

            chezmoi $COMMAND <$FILENAME       # fails\ncat $FILENAME | chezmoi $COMMAND  # succeeds\n

            For standard output:

            chezmoi $COMMAND >$FILENAME                  # fails\nchezmoi $COMMAND -o $FILENAME                # succeeds\nchezmoi $COMMAND --output=$FILENAME          # succeeds\nchezmoi $COMMAND | tee $FILENAME >/dev/null  # succeeds\n

            Secondly, you can install chezmoi with any of the many supported install methods instead of snap.

            "},{"location":"user-guide/frequently-asked-questions/troubleshooting/#chezmoi-reports-forkexec-no-such-file-or-directory-when-running-scripts-on-nix-or-termux","title":"chezmoi reports fork/exec ...: no such file or directory when running scripts on Nix or Termux","text":"

            You are likely using a hardcoded script interpreter in the shebang line of your scripts, e.g.

            #!/bin/bash\n

            /bin/bash does not exist on Nix or Termux. You must update the shebang line to point to the actual bash interpreter. The easiest way to do this is make the script a template and use the lookPath template function, for example:

            #!{{ lookPath \"bash\" }}\n

            Alternatively, you can use the actual path to bash on your system, for example:

            NixTermux
            #!/usr/bin/env bash\n
            #!/data/data/com.termux/files/usr/bin/bash\n
            "},{"location":"user-guide/frequently-asked-questions/usage/","title":"Usage","text":""},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-edit-my-dotfiles-with-chezmoi","title":"How do I edit my dotfiles with chezmoi?","text":"

            There are five popular approaches:

            1. Use chezmoi edit $FILE. This will open the source file for $FILE in your editor, including opening the template if the file is templated and transparently decrypting and re-encrypting it if it is encrypted. For extra ease, use chezmoi edit --apply $FILE to apply the changes when you quit your editor, and chezmoi edit --watch $FILE to apply the changes whenever you save the file.

            2. Use chezmoi cd and edit the files in the source directory directly. Run chezmoi diff to see what changes would be made, and chezmoi apply to make the changes.

            3. If your editor supports opening directories, run chezmoi edit with no arguments to open the source directory.

            4. Edit the file in your home directory, and then either re-add it by running chezmoi add $FILE or chezmoi re-add.

            5. Edit the file in your home directory, and then merge your changes with source state by running chezmoi merge $FILE.

              Note

              re-add doesn't work with templates.

            "},{"location":"user-guide/frequently-asked-questions/usage/#what-are-the-consequences-of-bare-modifications-to-the-target-files-if-my-zshrc-is-managed-by-chezmoi-and-i-edit-zshrc-without-using-chezmoi-edit-what-happens","title":"What are the consequences of \"bare\" modifications to the target files? If my .zshrc is managed by chezmoi and I edit ~/.zshrc without using chezmoi edit, what happens?","text":"

            Until you run chezmoi apply your modified ~/.zshrc will remain in place. When you run chezmoi apply chezmoi will detect that ~/.zshrc has changed since chezmoi last wrote it and prompt you what to do. You can resolve differences with a merge tool by running chezmoi merge ~/.zshrc.

            "},{"location":"user-guide/frequently-asked-questions/usage/#how-can-i-tell-what-dotfiles-in-my-home-directory-arent-managed-by-chezmoi-is-there-an-easy-way-to-have-chezmoi-manage-a-subset-of-them","title":"How can I tell what dotfiles in my home directory aren't managed by chezmoi? Is there an easy way to have chezmoi manage a subset of them?","text":"

            chezmoi unmanaged will list everything not managed by chezmoi. You can add entire directories with chezmoi add.

            "},{"location":"user-guide/frequently-asked-questions/usage/#how-can-i-tell-what-dotfiles-in-my-home-directory-are-currently-managed-by-chezmoi","title":"How can I tell what dotfiles in my home directory are currently managed by chezmoi?","text":"

            chezmoi managed will list everything managed by chezmoi.

            "},{"location":"user-guide/frequently-asked-questions/usage/#if-theres-a-mechanism-in-place-for-the-above-is-there-also-a-way-to-tell-chezmoi-to-ignore-specific-files-or-groups-of-files-eg-by-directory-name-or-by-glob","title":"If there's a mechanism in place for the above, is there also a way to tell chezmoi to ignore specific files or groups of files (e.g. by directory name or by glob)?","text":"

            By default, chezmoi ignores everything that you haven't explicitly added. If you have files in your source directory that you don't want added to your destination directory when you run chezmoi apply add their names to a file called .chezmoiignore in the source state.

            Patterns are supported, and you can change what's ignored from machine to machine. The full usage and syntax is described in the reference manual.

            "},{"location":"user-guide/frequently-asked-questions/usage/#if-the-target-already-exists-but-is-behind-the-source-can-chezmoi-be-configured-to-preserve-the-target-version-before-replacing-it-with-one-derived-from-the-source","title":"If the target already exists, but is \"behind\" the source, can chezmoi be configured to preserve the target version before replacing it with one derived from the source?","text":"

            Yes. Running chezmoi add will update the source state with the target. To see diffs of what would change, without actually changing anything, use chezmoi diff.

            "},{"location":"user-guide/frequently-asked-questions/usage/#once-ive-made-a-change-to-the-source-directory-how-do-i-commit-it","title":"Once I've made a change to the source directory, how do I commit it?","text":"

            You have several options:

            • chezmoi cd opens a shell in the source directory, where you can run your usual version control commands, like git add and git commit.

            • chezmoi git runs git in the source directory and pass extra arguments to the command. If you're passing any flags, you'll need to use -- to prevent chezmoi from consuming them, for example chezmoi git -- commit -m \"Update dotfiles\".

            • You can configure chezmoi to automatically commit and push changes to your source state, as described in the how-to guide.

            "},{"location":"user-guide/frequently-asked-questions/usage/#ive-made-changes-to-both-the-destination-state-and-the-source-state-that-i-want-to-keep-how-can-i-keep-them-both","title":"I've made changes to both the destination state and the source state that I want to keep. How can I keep them both?","text":"

            chezmoi merge will open a merge tool to resolve differences between the source state, target state, and destination state. Copy the changes you want to keep in to the source state.

            "},{"location":"user-guide/frequently-asked-questions/usage/#can-i-use-chezmoi-to-manage-my-shell-history-across-multiple-machines","title":"Can I use chezmoi to manage my shell history across multiple machines?","text":"

            No. Every change in a file managed by chezmoi requires an explicit command to record it (e.g. chezmoi add) or apply it somewhere else (e.g. chezmoi update), and is recorded as a commit in your dotfiles repository. Creating a commit every time a command is entered would quickly become cumbersome. This makes chezmoi unsuitable for sharing changes to rapidly-changing files like shell histories.

            Instead, consider using a dedicated tool for sharing shell history across multiple machines, like atuin. You can use chezmoi to install and configure atuin.

            "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-install-pre-requisites-for-templates","title":"How do I install pre-requisites for templates?","text":"

            If you have a template that depends on some other tool, like curl, you may need to install it before chezmoi renders the template.

            To do so, use a run_before script that is not a template. Something like:

            run_before_00-install-pre-requisites.sh
            #!/bin/bash\n\nset -eu\n\n# Install curl if it's not already installed\nif ! command -v curl >/dev/null; then\n  sudo apt update\n  sudo apt install -y curl\nfi\n

            chezmoi will make sure to execute it before templating other files.

            Tip

            You can use scriptEnv to inject data into your scripts through environment variables.

            "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-write-a-literal-or-in-a-template","title":"How do I write a literal {{ or }} in a template?","text":"

            {{ and }} are chezmoi's default template delimiters, and so need escaping, for example:

            {{ \"{{\" }}\n{{ \"}}\" }}\n

            results in

            {{\n}}\n

            For longer tokens containing a {{ and a }} you can use a longer literal, for example:

            {{ \"{{ .Target }}\" }}\n

            results in

            {{ .Target }}\n
            "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-run-a-script-when-a-git-repo-external-changes","title":"How do I run a script when a git-repo external changes?","text":"

            Use a run_onchange_after_*.tmpl script that includes the HEAD commit. For example, if ~/.emacs.d is a git-repo external, then create:

            ~/.local/share/chezmoi/run_onchange_after_emacs.d.tmpl
            #!/bin/sh\n\n# {{ output \"git\" \"-C\" (joinPath .chezmoi.homeDir \".emacs.d\") \"rev-parse\" \"HEAD\" }}\necho \"~/emacs.d updated\"\n
            "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-run-a-script-periodically","title":"How do I run a script periodically?","text":"

            Use a run_once_*.tmpl script that includes the current time truncated to a suitable unit. For example, to run a script daily:

            ~/.local/share/chezmoi/run_once_daily.tmpl
            #!/bin/sh\n\n# {{ now | date \"2006-01-02\" }}\necho \"new day\"\n

            For weekly, use the week number from the output of date, for example:

            ~/.local/share/chezmoi/run_once_weekly.tmpl
            #!/bin/sh\n\n# {{ output \"date\" \"+%V\" | trim }}\necho \"new week\"\n

            Or, approximate the week number with template functions:

            ~/.local/share/chezmoi/run_once_weekly.tmpl
            #!/bin/sh\n\n# {{ div now.YearDay 7 }}\necho \"new week\"\n
            "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-enable-shell-completions","title":"How do I enable shell completions?","text":"

            chezmoi includes shell completions for bash, fish, powershell, and zsh. If you have installed chezmoi via your package manager then the shell completion should already be installed. For PowerShell, you need to manually add the completion script to your profile. Please open an issue if this is not working correctly.

            chezmoi provides a completion command and a completion template function which return the shell completions for the given shell. These can be used either as a one-off or as part of your dotfiles repo. The details of how to use these depend on your shell.

            "},{"location":"user-guide/frequently-asked-questions/usage/#how-do-i-use-tools-that-i-installed-with-flatpak","title":"How do I use tools that I installed with Flatpak?","text":"

            Command line programs installed with Flatpak cannot be run directly. Instead, they must be run with flatpak run. This can either be added by using a wrapper script or by configuring chezmoi to invoke flatpak run with the correct arguments directly. Wrapper scripts are recommended, as they work with the doctor command.

            "},{"location":"user-guide/frequently-asked-questions/usage/#use-a-wrapper-script","title":"Use a wrapper script","text":"

            Create a wrapper script with the exact same name as the command that invokes flatpak run and passes all arguments to the wrapped command.

            For example, to wrap KeePassXC installed with Flatpak, create the script:

            keepassxc-cli
            #!/bin/bash\n\nflatpak run --command=keepassxc-cli org.keepassxc.KeePassXC -- \"$@\"\n

            Note that the script is called keepassxc-cli without any .sh extension, so it has the exact same name as the keepassxc-cli command that chezmoi invokes by default. Ensure that this script is in your path and is executable.

            "},{"location":"user-guide/frequently-asked-questions/usage/#configure-chezmoi-to-invoke-flatpak-run","title":"Configure chezmoi to invoke flatpak run","text":"

            For tools that chezmoi invokes with .command and .args configuration variables, you can configure chezmoi to invoke flatpak directly with the correct arguments.

            For example, to use VSCodium installed with Flatpak as your diff command, add the following to your config file:

            ~/.config/chezmoi/chezmoi.toml
            [diff]\n    command = \"flatpak\"\n    args = [\"run\", \"com.vscodium.codium\", \"--wait\", \"--diff\"]\n

            Note that the command is flatpak, the first two arguments are run and the name of app, and any further arguments are passed to the app.

            "},{"location":"user-guide/machines/containers-and-vms/","title":"Containers and VMs","text":"

            You can use chezmoi to manage your dotfiles in GitHub Codespaces, Visual Studio Codespaces, and Visual Studio Code Remote - Containers.

            For a quick start, you can clone the chezmoi/dotfiles repository which supports Codespaces out of the box.

            The workflow is different to using chezmoi on a new machine, notably:

            • These systems will automatically clone your dotfiles repo to ~/dotfiles, so there is no need to clone your repo yourself.

            • The installation script must be non-interactive.

            • When running in a Codespace, the environment variable CODESPACES will be set to true. You can read its value with the env template function.

            First, if you are using a chezmoi configuration file template, ensure that it is non-interactive when running in Codespaces, for example, .chezmoi.toml.tmpl might contain:

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

            Info

            Setting the sourceDir configuration variable to .chezmoi.sourceDir is required because Codespaces clones your dotfiles repo to a different one to chezmoi's default.

            This sets the codespaces template variable, so you don't have to repeat (env \"CODESPACES\") in your templates. It also sets the sourceDir configuration to the --source argument passed in chezmoi init.

            Second, create an install.sh script that installs chezmoi and your dotfiles and add it to .chezmoiignore and your dotfiles repo:

            chezmoi generate install.sh > install.sh\nchmod a+x install.sh\necho install.sh >> .chezmoiignore\ngit add install.sh .chezmoiignore\ngit commit -m \"Add install.sh\"\n

            The generated script installs the latest version of chezmoi in ~/.local/bin if needed, and then chezmoi init ... invokes chezmoi to create its configuration file and initialize your dotfiles. --apply tells chezmoi to apply the changes immediately, and --source=... tells chezmoi where to find the cloned dotfiles repo, which in this case is the same folder in which the script is running from.

            Finally, modify any of your templates to use the codespaces variable if needed. For example, to install vim-gtk on Linux but not in Codespaces, your run_once_install-packages.sh.tmpl might contain:

            {{- if (and (eq .chezmoi.os \"linux\") (not .codespaces)) -}}\n#!/bin/sh\nsudo apt install -y vim-gtk\n{{- end -}}\n
            "},{"location":"user-guide/machines/general/","title":"General","text":""},{"location":"user-guide/machines/general/#determine-whether-the-current-machine-is-a-laptop-or-desktop","title":"Determine whether the current machine is a laptop or desktop","text":"

            The following template sets the $chassisType variable to \"desktop\" or \"laptop\" on macOS, Linux, and Windows.

            {{- $chassisType := \"desktop\" }}\n{{- if eq .chezmoi.os \"darwin\" }}\n{{-   if contains \"MacBook\" (output \"sysctl\" \"-n\" \"hw.model\") }}\n{{-     $chassisType = \"laptop\" }}\n{{-   else }}\n{{-     $chassisType = \"desktop\" }}\n{{-   end }}\n{{- else if eq .chezmoi.os \"linux\" }}\n{{-   $chassisType = (output \"hostnamectl\" \"--json=short\" | mustFromJson).Chassis }}\n{{- else if eq .chezmoi.os \"windows\" }}\n{{-   $chassisType = (output \"powershell.exe\" \"-NoProfile\" \"-NonInteractive\" \"-Command\" \"if ((Get-CimInstance -Class Win32_Battery | Measure-Object).Count -gt 0) { Write-Output 'laptop' } else { Write-Output 'desktop' }\") | trim }}\n{{- end }}\n
            "},{"location":"user-guide/machines/general/#determine-how-many-cpu-cores-and-threads-the-current-machine-has","title":"Determine how many CPU cores and threads the current machine has","text":"

            The following template sets the $cpuCores and $cpuThreads variables to the number of CPU cores and threads on the current machine respectively on macOS, Linux and Windows.

            {{- $cpuCores := 1 }}\n{{- $cpuThreads := 1 }}\n{{- if eq .chezmoi.os \"darwin\" }}\n{{-   $cpuCores = (output \"sysctl\" \"-n\" \"hw.physicalcpu_max\") | trim | atoi }}\n{{-   $cpuThreads = (output \"sysctl\" \"-n\" \"hw.logicalcpu_max\") | trim | atoi }}\n{{- else if eq .chezmoi.os \"linux\" }}\n{{-   $cpuCores = (output \"sh\" \"-c\" \"lscpu --online --parse | grep --invert-match '^#' | sort --field-separator=',' --key='2,4' --unique | wc --lines\") | trim | atoi }}\n{{-   $cpuThreads = (output \"sh\" \"-c\" \"lscpu --online --parse | grep --invert-match '^#' | wc --lines\") | trim | atoi }}\n{{- else if eq .chezmoi.os \"windows\" }}\n{{-   $cpuCores = (output \"powershell.exe\" \"-NoProfile\" \"-NonInteractive\" \"-Command\" \"(Get-CimInstance -ClassName 'Win32_Processor').NumberOfCores\") | trim | atoi }}\n{{-   $cpuThreads = (output \"powershell.exe\" \"-NoProfile\" \"-NonInteractive\" \"-Command\" \"(Get-CimInstance -ClassName 'Win32_Processor').NumberOfLogicalProcessors\") | trim | atoi }}\n{{- end }}\n

            Example

            ~/.local/share/chezmoi/.chezmoi.toml.tmpl
            [data.cpu]\ncores = {{ $cpuCores }}\nthreads = {{ $cpuThreads }}\n
            ~/.local/share/chezmoi/is_hyperthreaded.txt.tmpl
            {{- if gt .cpu.threads .cpu.cores -}}\nHyperthreaded!\n{{- else -}}\nNot hyperthreaded!\n{{- end -}}\n
            "},{"location":"user-guide/machines/linux/","title":"Linux","text":""},{"location":"user-guide/machines/linux/#combine-operating-system-and-linux-distribution-conditionals","title":"Combine operating system and Linux distribution conditionals","text":"

            There can be as much variation between Linux distributions as there is between operating systems. Due to text/template's eager evaluation of conditionals, this means you often have to write templates with nested conditionals:

            {{ if eq .chezmoi.os \"darwin\" }}\n# macOS-specific code\n{{ else if eq .chezmoi.os \"linux\" }}\n{{   if eq .chezmoi.osRelease.id \"debian\" }}\n# Debian-specific code\n{{   else if eq .chezmoi.osRelease.id \"fedora\" }}\n# Fedora-specific code\n{{   end }}\n{{ end }}\n

            This can be simplified by combining the operating system and distribution into a single custom template variable. Put the following in your configuration file template:

            {{- $osid := .chezmoi.os -}}\n{{- if hasKey .chezmoi.osRelease \"id\" -}}\n{{-   $osid = printf \"%s-%s\" .chezmoi.os .chezmoi.osRelease.id -}}\n{{- end -}}\n\n[data]\n    osid = {{ $osid | quote }}\n

            This defines the .osid template variable to be {{ .chezmoi.os }} on machines without an os-release file, or to be {{ .chezmoi.os }}-{{ .chezmoi.osRelease.id }} on machines with an os-release file.

            You can then simplify your conditionals to be:

            {{ if eq .osid \"darwin\" }}\n# macOS-specific code\n{{ else if eq .osid \"linux-debian\" }}\n# Debian-specific code\n{{ else if eq .osid \"linux-fedora\" }}\n# Fedora-specific code\n{{ end }}\n
            "},{"location":"user-guide/machines/macos/","title":"macOS","text":""},{"location":"user-guide/machines/macos/#use-brew-bundle-to-manage-your-brews-and-casks","title":"Use brew bundle to manage your brews and casks","text":"

            Homebrew's brew bundle subcommand allows you to specify a list of brews and casks to be installed. You can integrate this with chezmoi by creating a run_once_ script. For example, create a file in your source directory called run_once_before_install-packages-darwin.sh.tmpl containing:

            {{- if eq .chezmoi.os \"darwin\" -}}\n#!/bin/bash\n\nbrew bundle --no-lock --file=/dev/stdin <<EOF\nbrew \"git\"\ncask \"google-chrome\"\nEOF\n{{ end -}}\n

            Note

            The Brewfile is embedded directly in the script with a bash here document. chezmoi will run this script whenever its contents change, i.e. when you add or remove brews or casks.

            "},{"location":"user-guide/machines/macos/#determine-the-hostname","title":"Determine the hostname","text":"

            The result of the hostname command on macOS depends on the network that the machine is connected to. For a stable result, use the scutil command:

            {{ $computerName := output \"scutil\" \"--get\" \"ComputerName\" | trim }}\n
            "},{"location":"user-guide/machines/macos/#run-script-after-every-macos-update","title":"Run script after every macOS update","text":"

            You can automate a script to run after each macOS update by creating a run_onchange_ script and using the output template function to run sw_vers:

            # MacOS build version: {{ output \"sw_vers\" \"--buildVersion\" }}\n
            "},{"location":"user-guide/machines/windows/","title":"Windows","text":""},{"location":"user-guide/machines/windows/#detect-windows-subsystem-for-linux-wsl","title":"Detect Windows Subsystem for Linux (WSL)","text":"

            WSL can be detected by looking for the string Microsoft or microsoft in /proc/sys/kernel/osrelease, which is available in the template variable .chezmoi.kernel.osrelease, for example:

            {{ if eq .chezmoi.os \"linux\" }}\n{{   if (.chezmoi.kernel.osrelease | lower | contains \"microsoft\") }}\n# WSL-specific code\n{{   end }}\n{{ end }}\n
            "},{"location":"user-guide/machines/windows/#run-a-powershell-script-as-admin-on-windows","title":"Run a PowerShell script as admin on Windows","text":"

            Put the following at the top of your script:

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

            If you use gsudo, it has tips on writing self-elevating scripts.

            "},{"location":"user-guide/machines/windows/#notes-on-running-elevated-scripts","title":"Notes on running elevated scripts","text":"

            However you decide to run a script in an elevated prompt, as soon as the non-elevated script returns, chezmoi will move to the next step in its processing (running more scripts, creating files, etc.). Ensure that the elevated script completes before the non-elevated script exits, or subsequent steps may not run as expected. In the example above, this is accomplished by passing -Wait to PowerShell's Start-Process cmdlet.

            Note that by including -NoExit in $CommandLine, the new (elevated) PowerShell process/window will not exit automatically on completion. This means you'll need to close the new window by hand for chezmoi to continue its steps. If this manual intervention is desired, it would be convenient to print a message as the script's last command to indicate completion for you to safely close the elevated window. If you want no manual intervention, you can remove -NoExit from $CommandLine, but then you likely won\u2019t see the output of the elevated script, which will make it more difficult to determine if something went wrong during its execution.

            "},{"location":"user-guide/password-managers/","title":"Password manager integration","text":"

            Template functions allow you to retrieve secrets from many popular password managers. Using a password manager allows you to keep all your secrets in one place, make your dotfiles repo public, and synchronize changes to secrets across multiple machines.

            "},{"location":"user-guide/password-managers/1password/","title":"1Password","text":"

            chezmoi includes support for 1Password using the 1Password CLI to expose data as a template function.

            Log in and get a session using:

            op account add --address $SUBDOMAIN.1password.com --email $EMAIL\neval $(op signin --account $SUBDOMAIN)\n

            This is not necessary if you are using biometric authentication.

            The output of op read $URL is available as the onepasswordRead template function, for example:

            {{ onepasswordRead \"op://app-prod/db/password\" }}\n

            returns the output of

            op read op://app-prod/db/password\n

            Documents can be retrieved with:

            {{- onepasswordDocument \"$UUID\" -}}\n

            The output of op item get $UUID --format json is available as the onepassword template function. chezmoi parses the JSON output and returns it as structured data. For example, if the output is:

            {\n  \"id\": \"$UUID\",\n  \"title\": \"$TITLE\",\n  \"version\": 2,\n  \"vault\": {\n    \"id\": \"$vaultUUID\"\n  },\n  \"category\": \"LOGIN\",\n  \"last_edited_by\": \"$userUUID\",\n  \"created_at\": \"2010-08-23T13:18:43Z\",\n  \"updated_at\": \"2014-07-20T04:40:11Z\",\n  \"fields\": [\n    {\n      \"id\": \"username\",\n      \"type\": \"STRING\",\n      \"purpose\": \"USERNAME\",\n      \"label\": \"username\",\n      \"value\": \"$USERNAME\"\n    },\n    {\n      \"id\": \"password\",\n      \"type\": \"CONCEALED\",\n      \"purpose\": \"PASSWORD\",\n      \"label\": \"password\",\n      \"value\": \"$PASSWORD\",\n      \"password_details\": {\n        \"strength\": \"FANTASTIC\",\n        \"history\": []\n      }\n    }\n  ],\n  \"urls\": [\n    {\n      \"primary\": true,\n      \"href\": \"$URL\"\n    }\n  ]\n}\n

            Then you can access the password field with the syntax

            {{ (index (onepassword \"$UUID\").fields 1).value }}\n

            or:

            {{ range (onepassword \"$UUID\").fields -}}\n{{   if and (eq .label \"password\") (eq .purpose \"PASSWORD\") -}}\n{{     .value -}}\n{{   end -}}\n{{ end }}\n

            onepasswordDetailsFields returns a reworked version of the structure that allows the fields to be queried by key:

            {\n  \"password\": {\n    \"id\": \"password\",\n    \"label\": \"password\",\n    \"password_details\": {\n      \"history\": [],\n      \"strength\": \"FANTASTIC\"\n    },\n    \"purpose\": \"PASSWORD\",\n    \"type\": \"CONCEALED\",\n    \"value\": \"$PASSWORD\"\n  },\n  \"username\": {\n    \"id\": \"username\",\n    \"label\": \"username\",\n    \"purpose\": \"USERNAME\",\n    \"type\": \"STRING\",\n    \"value\": \"$USERNAME\"\n  }\n}\n
            {{- (onepasswordDetailsFields \"$UUID\").password.value }}\n

            Additional fields may be obtained with onepasswordItemFields; not all objects in 1Password have item fields. This can be tested with:

            chezmoi execute-template \"{{ onepasswordItemFields \\\"$UUID\\\" | toJson }}\" | jq .\n
            "},{"location":"user-guide/password-managers/1password/#sign-in-prompt","title":"Sign-in prompt","text":"

            chezmoi will verify the availability and validity of a session token in the current environment. If it is missing or expired, you will be interactively prompted to sign-in again.

            In the past chezmoi used to exit with an error when no valid session was available. If you'd like to restore this behavior, set the onepassword.prompt configuration variable to false, for example:

            ~/.config/chezmoi/chezmoi.toml
            [onepassword]\n    prompt = false\n

            Danger

            Do not use prompt on shared machines. A session token verified or acquired interactively will be passed to the 1Password CLI through a command line parameter, which is visible to other users of the same system.

            "},{"location":"user-guide/password-managers/1password/#secrets-automation","title":"Secrets Automation","text":"

            chezmoi has experimental support for secrets automation with 1Password Connect and 1Password Service Accounts. These might be used on restricted machines where you cannot or do not wish to install a full 1Password desktop application.

            When these features are used, the behavior of the 1Password CLI changes, so chezmoi requires explicit configuration for either connect or service account modes using the onepassword.mode configuration option. The default, if not specified, is account:

            ~/.config/chezmoi/chezmoi.toml
            [onepassword]\n    mode = \"account\"\n

            In account mode, chezmoi will stop with an error if the environment variable OP_SERVICE_ACCOUNT_TOKEN is set, or if both environment variables OP_CONNECT_HOST and OP_CONNECT_TOKEN are set.

            Info

            Both 1Password Connect and Service Accounts prevent the CLI from working with multiple accounts. If you need access to secrets from more than one 1Password account, do not use these features with chezmoi.

            "},{"location":"user-guide/password-managers/1password/#1password-connect","title":"1Password Connect","text":"

            Once 1Password Connect is configured, and OP_CONNECT_HOST and OP_CONNECT_TOKEN are properly set, set onepassword.mode to connect.

            ~/.config/chezmoi/chezmoi.toml
            [onepassword]\n    mode = \"connect\"\n

            In connect mode:

            • the onepasswordDocument template function is not available,
            • account parameters are not allowed in 1Password template functions,
            • chezmoi will stop with an error if one or both of OP_CONNECT_HOST and OP_CONNECT_TOKEN are unset, or if OP_SERVICE_ACCOUNT_TOKEN is set.
            "},{"location":"user-guide/password-managers/1password/#1password-service-accounts","title":"1Password Service Accounts","text":"

            Once a 1Password service account has been created and OP_SERVICE_ACCOUNT_TOKEN is properly set, set onepassword.mode to service.

            ~/.config/chezmoi/chezmoi.toml
            [onepassword]\n    mode = \"service\"\n

            In service mode:

            • account parameters are not allowed in 1Password template functions,
            • chezmoi will stop with an error if OP_SERVICE_ACCOUNT_TOKEN is unset, or if both of OP_CONNECT_HOST and OP_CONNECT_TOKEN are set.
            "},{"location":"user-guide/password-managers/aws-secrets-manager/","title":"AWS Secrets Manager","text":"

            chezmoi includes support for AWS Secrets Manager.

            Structured data can be retrieved with the awsSecretsManager template function, for example:

            exampleUsername = {{ (awsSecretsManager \"my-secret-name\").username }}\nexamplePassword = {{ (awsSecretsManager \"my-secret-name\").password }}\n

            For retrieving unstructured data, the awsSecretsManagerRaw template function can be used. For example:

            exampleSecretString = {{ awsSecretsManagerRaw \"my-secret-string\" }}\n

            The AWS shared profile name and region can be specified in chezmoi's config file with awsSecretsManager.profile and awsSecretsManager.region respectively. By default, these values will be picked up from the standard environment variables and config files used by the standard AWS tooling.

            ~/.config/chezmoi/chezmoi.toml
            [awsSecretsManager]\n    profile = myWorkProfile\n    region = us-east-2\n
            "},{"location":"user-guide/password-managers/azure-key-vault/","title":"Azure Key Vault","text":"

            chezmoi includes support for Azure Key Vault secrets.

            A default Azure Key Vault name can be set in ~/.config/chezmoi/chezmoi.toml with azureKeyVault.defaultVault.

            Ensure Azure CLI is installed and log in. The logged in user must have the Key Vault Secrets User RBAC role on the Azure Key Vault resource.

            Alternatively, use alternate authentication options.

            ~/.config/chezmoi/chezmoi.toml
            [azureKeyVault]\n  defaultVault = \"contoso-vault2\"\n

            A secret value can be retrieved with the azureKeyVault template function.

            Retrieve the secret my-secret-name from the default configured vault.

            exampleSecret = {{ azureKeyVault \"my-secret-name\" }}\n

            Retrieve the secret my-secret-name from the vault named contoso-vault2.

            exampleSecret = {{ azureKeyVault \"my-secret-name\" \"contoso-vault2\" }}\n

            It is also possible to define an alias in the configuration file for an additional vault.

            ~/.config/chezmoi/chezmoi.toml
            [data]\n  vault42 = \"contoso-vault42\"\n\n[azureKeyVault]\n  defaultVault = \"contoso-vault2\"\n

            Retrieve the secret my-secret-name from the vault named contoso-vault42 through the alias.

            exampleSecret = {{ azureKeyVault \"my-secret-name\" .vault42 }}\n
            "},{"location":"user-guide/password-managers/bitwarden/","title":"Bitwarden","text":"

            chezmoi includes support for Bitwarden using the Bitwarden CLI (bw), Bitwarden Secrets CLI (bws), and rbw commands to expose data as a template function.

            "},{"location":"user-guide/password-managers/bitwarden/#bitwarden-cli","title":"Bitwarden CLI","text":"

            Log in to Bitwarden using a normal method

            bw login $BITWARDEN_EMAIL # or\nbw login --apikey # or\nbw login --sso\n

            If required, unlock your Bitwarden vault (API key and SSO logins always require an explicit unlock step):

            bw unlock\n

            Set the BW_SESSION environment variable, as instructed.

            Bitwarden Session One-liner

            The BW_SESSION value can be set directly. The exact combination differs based on whether you are currently logged into Bitwarden and how you log into Bitwarden.

            export BW_SESSION=$(bw unlock --raw)                    # You are already logged in with any method\nexport BW_SESSION=$(bw login $BITWARDEN_EMAIL --raw)    # You are not logged in and log in with an email\nexport BW_SESSION=$(bw login --sso && bw unlock --raw)  # You are not logged in and login with SSO or API key\n

            The structured data from bw get is available as the bitwarden template function in your config files, for example:

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

            Custom fields can be accessed with the bitwardenFields template function. For example, if you have a custom field named token you can retrieve its value with:

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

            Attachments can be accessed with the bitwardenAttachment and bitwardenAttachmentByRef template function. For example, if you have an attachment named id_rsa, you can retrieve its value with:

            {{ bitwardenAttachment \"id_rsa\" \"bf22e4b4-ae4a-4d1c-8c98-ac620004b628\" }}\n

            or

            {{ bitwardenAttachmentByRef \"id_rsa\" \"item\" \"example.com\" }}\n
            "},{"location":"user-guide/password-managers/bitwarden/#bitwarden-secrets-cli","title":"Bitwarden Secrets CLI","text":"

            Generate an access token for a specific service account.

            Either set the BWS_ACCESS_TOKEN environment variable or store the access token in a template variable, e.g.

            ~/.config/chezmoi/chezmoi.toml
            [data]\n    accessToken = \"0.48c78342-1635-48a6-accd-afbe01336365.C0tMmQqHnAp1h0gL8bngprlPOYutt0:B3h5D+YgLvFiQhWkIq6Bow==\"\n

            You can then retrieve secrets using the bitwardenSecrets template function, for example:

            {{ (bitwardenSecrets \"be8e0ad8-d545-4017-a55a-b02f014d4158\" .accessToken).value }}\n
            "},{"location":"user-guide/password-managers/custom/","title":"Custom","text":"

            You can use any command line tool that outputs secrets either as a string or in JSON format. Choose the binary by setting secret.command in your configuration file. You can then invoke this command with the secret and secretJSON template functions which return the raw output and JSON-decoded output respectively. All of the above secret managers can be supported in this way:

            Secret Manager secret.command Template skeleton 1Password op {{ secretJSON \"get\" \"item\" \"$ID\" }} Bitwarden bw {{ secretJSON \"get\" \"$ID\" }} Doppler doppler {{ secretJSON \"secrets\" \"download\" \"--json\" \"--no-file\" }} HashiCorp Vault vault {{ secretJSON \"kv\" \"get\" \"-format=json\" \"$ID\" }} HCP Vault Secrets vlt {{ secret \"secrets\" \"get\" \"--plaintext\" \"$ID\" }} LastPass lpass {{ secretJSON \"show\" \"--json\" \"$ID\" }} KeePassXC keepassxc-cli Not possible (interactive command only) Keeper keeper {{ secretJSON \"get\" \"--format=json\" \"$ID\" }} pass pass {{ secret \"show\" \"$ID\" }} passhole ph {{ secret \"$ID\" \"password\" }}"},{"location":"user-guide/password-managers/dashlane/","title":"Dashlane","text":"

            chezmoi includes support for Dashlane.

            Structured data can be retrieved with the dashlanePassword template function, for example:

            examplePassword = {{ (index (dashlanePassword \"filter\") 0).password }}\n

            Secure notes can be retrieved with the dashlaneNote template function, for example:

            exampleNote = {{ dashlaneNote \"filter\" }}\n
            "},{"location":"user-guide/password-managers/doppler/","title":"Doppler","text":"

            chezmoi includes support for Doppler using the doppler CLI to expose data through the doppler and dopplerProjectJson template functions.

            Log in using:

            doppler login\n

            It is now possible to interact with the doppler CLI in two different, but similar, ways. Both make use of the command doppler secrets download --json --no-file behind the scenes but present a different experience.

            The doppler function is used in the following way:

            {{ doppler \"SECRET_NAME\" \"project name\" \"config\" }}\n

            All secrets from the specified project/config combination are cached for subsequent access and will not requery the doppler CLI for another secret in the same project/config. This caching mechanism enhances performance and reduces unnecessary CLI calls.

            The dopplerProjectJson presents the secrets as json structured data and is used in the following way:

            {{ (dopplerProjectJson \"project\" \"config\").PASSWORD }}\n

            Additionally one can set the default values for the project and config (aka environment) in your config file, for example:

            ~/.config/chezmoi/chezmoi.toml
            [doppler]\n    project = \"my-project\"\n    config = \"dev\"\n

            With these default values, you can omit them in the call to both doppler and dopplerProjectJson, for example:

            {{ doppler \"SECRET_NAME\" }}\n{{ dopplerProjectJson.SECRET_NAME }}\n

            It is important to note that neither of the above parse any individual secret as json. This can be achieved by using the fromJson function, for example:

            {{ (doppler \"SECRET_NAME\" | fromJson).created_by.email_address }}\n{{ (dopplerProjectJson.SECRET_NAME | fromJson).created_by.email_address }}\n

            Obviously the secret would have to be saved in json format for this to work as expected.

            "},{"location":"user-guide/password-managers/ejson/","title":"ejson","text":"

            chezmoi includes support for ejson.

            Structured data can be retrieved with the ejsonDecrypt template function, for example:

            examplePassword = {{ (ejsonDecrypt \"my-secrets.ejson\").password }}\n

            If you want to specify the private key to use for the decryption, structured data can be retrieved with the ejsonDecryptWithKey template function, for example:

            examplePassword = {{ (ejsonDecryptWithKey \"my-secrets.ejson\" \"top-secret-key\").password }}\n
            "},{"location":"user-guide/password-managers/gopass/","title":"gopass","text":"

            chezmoi includes support for gopass using the gopass CLI.

            The first line of the output of gopass show $PASS_NAME is available as the gopass template function, for example:

            {{ gopass \"$PASS_NAME\" }}\n
            "},{"location":"user-guide/password-managers/hcp-vault-secrets/","title":"HCP Vault Secrets","text":"

            chezmoi includes support for HCP Vault Secrets using the vlt CLI to expose data through the hcpVaultSecret and hcpVaultSecretJson template functions.

            Log in using:

            vlt login\n

            The output of the vlt secrets get --plaintext $SECRET_NAME is available as the hcpVaultSecret function, for example:

            {{ hcpVaultSecret \"secret_name\" \"application_name\" \"project_id\" \"organization_id\" }}\n

            You can set the default values for the application name, project ID, and organization ID in your config file, for example:

            ~/.config/chezmoi/chezmoi.toml
            [hcpVaultSecrets]\n    organizationId = \"bf479eab-a292-4b46-92df-e22f5c47eadc\"\n    projectId = \"5907a2fa-d26a-462a-8705-74dfe967e87d\"\n    applicationName = \"my-application\"\n

            With these default values, you can omit them in the call to hcpVaultSecret, for example:

            {{ hcpVaultSecret \"secret_name\" }}\n{{ hcpVaultSecret \"other_secret_name\" \"other_application_name\" }}\n

            Structured data from vlt secrets get --format=json $SECRET_NAME is available as the hcpVaultSecretJson template function, for example:

            {{ (hcpVaultSecretJson \"secret_name\").created_by.email }}\n
            "},{"location":"user-guide/password-managers/keepassxc/","title":"KeePassXC","text":"

            chezmoi includes support for KeePassXC using the KeePassXC CLI (keepassxc-cli) to expose data as a template function.

            Provide the path to your KeePassXC database in your configuration file:

            ~/.config/chezmoi/chezmoi.toml
            [keepassxc]\n    database = \"/home/user/Passwords.kdbx\"\n

            The structured data from keepassxc-cli show $database is available as the keepassxc template function in your config files, for example:

            username = {{ (keepassxc \"example.com\").UserName }}\npassword = {{ (keepassxc \"example.com\").Password }}\n

            Additional attributes are available through the keepassxcAttribute function. For example, if you have an entry called SSH Key with an additional attribute called private-key, its value is available as:

            {{ keepassxcAttribute \"SSH Key\" \"private-key\" }}\n
            "},{"location":"user-guide/password-managers/keepassxc/#non-password-protected-databases","title":"Non-password-protected databases","text":"

            If your database is not password protected, add --no-password to keepassxc.args and keepassxc.prompt = false:

            ~/.config/chezmoi/chezmoi.toml
            [keepassxc]\n    database = \"/home/user/Passwords.kdbx\"\n    args = [\"--no-password\"]\n    prompt = false\n
            "},{"location":"user-guide/password-managers/keepassxc/#yubikey-support","title":"YubiKey support","text":"

            chezmoi includes an experimental mode to support using KeePassXC with YubiKeys. Set keepassxc.mode to open and keepassxc.args to the arguments required to set your YubiKey, for example:

            ~/.config/chezmoi/chezmoi.toml
            [keepassxc]\n    database = \"/home/user/Passwords.kdbx\"\n    args = [\"--no-password\", \"--yubikey\", \"2:7370001\"]\n    mode = \"open\"\n
            "},{"location":"user-guide/password-managers/keeper/","title":"Keeper","text":"

            chezmoi includes support for Keeper using the Commander CLI to expose data as a template function.

            Create a persistent login session as described in the Command CLI documentation.

            Passwords can be retrieved with the keeperFindPassword template function, for example:

            examplePasswordFromPath = {{ keeperFindPassword \"$PATH\" }}\nexamplePasswordFromUid = {{ keeperFindPassword \"$UID\" }}\n

            For retrieving more complex data, use the keeper template function with a UID to retrieve structured data from keeper get or the keeperDataFields template function which restructures the output of keeper get in to a more convenient form, for example:

            keeperDataTitle = {{ (keeper \"$UID\").data.title }}\nexamplePassword = {{ index (keeperDataFields \"$UID\").password 0 }}\n

            Extra arguments can be passed to the Keeper CLI command by setting the keeper.args variable in chezmoi's config file, for example:

            ~/.config/chezmoi/chezmoi.toml
            [keeper]\n    args = [\"--config\", \"/path/to/config.json\"]\n
            "},{"location":"user-guide/password-managers/keychain-and-windows-credentials-manager/","title":"Keychain and Windows Credentials Manager","text":"

            chezmoi includes support for Keychain (on macOS), GNOME Keyring (on Linux and FreeBSD), and Windows Credentials Manager (on Windows) via the zalando/go-keyring library.

            Set values with:

            $ chezmoi secret keyring set --service=$SERVICE --user=$USER\nValue: xxxxxxxx\n

            The value can then be used in templates using the keyring function which takes the service and user as arguments.

            For example, save a GitHub access token in keyring with:

            $ chezmoi secret keyring set --service=github --user=$GITHUB_USERNAME\nValue: xxxxxxxx\n

            and then include it in your ~/.gitconfig file with:

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

            You can query the keyring from the command line:

            chezmoi secret keyring get --service=github --user=$GITHUB_USERNAME\n
            "},{"location":"user-guide/password-managers/lastpass/","title":"LastPass","text":"

            chezmoi includes support for LastPass using the LastPass CLI to expose data as a template function.

            Log in to LastPass using:

            lpass login $LASTPASS_USERNAME\n

            Check that lpass is working correctly by showing password data:

            lpass show --json $LASTPASS_ENTRY_ID\n

            where $LASTPASS_ENTRY_ID is a LastPass Entry Specification.

            The structured data from lpass show --json id is available as the lastpass template function. The value will be an array of objects. You can use the index function and .Field syntax of the text/template language to extract the field you want. For example, to extract the password field from first the \"GitHub\" entry, use:

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

            chezmoi automatically parses the note value of the LastPass entry as colon-separated key-value pairs, so, for example, you can extract a private SSH key like this:

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

            Keys in the note section written as CamelCase Words are converted to camelCaseWords.

            If the note value does not contain colon-separated key-value pairs, then you can use lastpassRaw to get its raw value, for example:

            {{ (index (lastpassRaw \"SSH Private Key\") 0).note }}\n
            "},{"location":"user-guide/password-managers/pass/","title":"pass","text":"

            chezmoi includes support for pass using the pass CLI.

            The first line of the output of pass show $PASS_NAME is available as the pass template function, for example:

            {{ pass \"$PASS_NAME\" }}\n
            "},{"location":"user-guide/password-managers/passhole/","title":"Passhole","text":"

            chezmoi includes support for KeePass using the passhole CLI (ph) to expose data as a template function.

            "},{"location":"user-guide/password-managers/vault/","title":"Vault","text":"

            chezmoi includes support for Vault using the Vault CLI to expose data as a template function.

            The vault CLI needs to be correctly configured on your machine, e.g. the VAULT_ADDR and VAULT_TOKEN environment variables must be set correctly. Verify that this is the case by running:

            vault kv get -format=json $KEY\n

            The structured data from vault kv get -format=json is available as the vault template function. You can use the .Field syntax of the text/template language to extract the data you want. For example:

            {{ (vault \"$KEY\").data.data.password }}\n
            "},{"location":"user-guide/tools/diff/","title":"Diff","text":""},{"location":"user-guide/tools/diff/#use-a-custom-diff-tool","title":"Use a custom diff tool","text":"

            By default, chezmoi uses a built-in diff. You can use a custom tool by setting the diff.command and diff.args configuration variables. The elements of diff.args are interpreted as templates with the variables .Destination and .Target containing filenames of the file in the destination state and the target state respectively. For example, to use meld, specify:

            ~/.config/chezmoi/chezmoi.toml
            [diff]\n    command = \"meld\"\n    args = [\"--diff\", \"{{ .Destination }}\", \"{{ .Target }}\"]\n

            Hint

            If you generate your config file from a config file template, then you'll need to escape the {{ and }} as {{ \"{{\" }} and {{ \"}}\" }}. That way your generated config file contains the {{ and }} you expect.

            "},{"location":"user-guide/tools/diff/#use-vscode-as-the-diff-tool","title":"Use VSCode as the diff tool","text":"

            To use VSCode as the diff tool, add the following to your config:

            TOMLYAML ~/.config/chezmoi/chezmoi.toml
            [diff]\ncommand = \"code\"\nargs = [\"--wait\", \"--diff\"]\n
            ~/.config/chezmoi/chezmoi.yaml
            diff:\n  command: \"code\"\n  args:\n  - \"--wait\"\n  - \"--diff\"\n
            "},{"location":"user-guide/tools/diff/#use-delta-as-the-diff-tool","title":"Use delta as the diff tool","text":"

            To use delta as the diff tool you must set both diff.command and diff.pager to delta, for example:

            TOMLYAML ~/.config/chezmoi/chezmoi.toml
            [diff]\ncommand = \"delta\"\npager = \"delta\"\n
            ~/.config/chezmoi/chezmoi.yaml
            diff:\n  command: \"delta\"\n  pager: \"delta\"\n
            "},{"location":"user-guide/tools/diff/#dont-show-scripts-in-the-diff-output","title":"Don't show scripts in the diff output","text":"

            By default, chezmoi diff will show all changes, including the contents of scripts that will be run. You can exclude scripts from the diff output by setting the diff.exclude configuration variable in your configuration file, for example:

            ~/.config/chezmoi/chezmoi.toml
            [diff]\n    exclude = [\"scripts\"]\n
            "},{"location":"user-guide/tools/diff/#dont-show-externals-in-the-diff-output","title":"Don't show externals in the diff output","text":"

            To exclude diffs from externals, either pass the --exclude=externals flag or set diff.exclude to [\"externals\"] in your config file.

            "},{"location":"user-guide/tools/diff/#customize-the-diff-pager","title":"Customize the diff pager","text":"

            You can change the diff format, and/or pipe the output into a pager of your choice by setting diff.pager configuration variable. For example, to use diff-so-fancy specify:

            ~/.config/chezmoi/chezmoi.toml
            [diff]\n    pager = \"diff-so-fancy\"\n

            The pager can be disabled using the --no-pager flag or by setting diff.pager to an empty string.

            "},{"location":"user-guide/tools/diff/#show-human-friendly-diffs-for-binary-files","title":"Show human-friendly diffs for binary files","text":"

            Similar to git, chezmoi includes a \"textconv\" feature that can transform file contents before passing them to the diff program. This is primarily useful for generating human-readable diffs of binary files.

            For example, to show diffs of macOS .plist files, add the following to your configuration file:

            JSONTOMLYAML ~/.config/chezmoi/chezmoi.json
            {\n    \"textconv\": [\n        \"pattern\": \"**/*.plist\",\n        \"command\": \"plutil\",\n        \"args\": [\n            \"-convert\",\n            \"xml1\",\n            \"-o\",\n            \"-\",\n            \"-\"\n        ]\n    ]\n}\n
            ~/.config/chezmoi/chezmoi.toml
            [[textconv]]\npattern = \"**/*.plist\"\ncommand = \"plutil\"\nargs = [\"-convert\", \"xml1\", \"-o\", \"-\", \"-\"]\n
            ~/.config/chezmoi/chezmoi.yaml
            textconv:\n- pattern: \"**/*.plist\"\n  command: \"plutil\"\n  args:\n  - \"-convert\"\n  - \"xml1\"\n  - \"-o\"\n  - \"-\",\n  - \"-\"\n

            This will pipe all .plist files through plutil -convert xml1 -o - - before showing differences.

            "},{"location":"user-guide/tools/editor/","title":"Editor","text":""},{"location":"user-guide/tools/editor/#use-your-preferred-editor-with-chezmoi-edit-and-chezmoi-edit-config","title":"Use your preferred editor with chezmoi edit and chezmoi edit-config","text":"

            By default, chezmoi will use your preferred editor as defined by the $VISUAL or $EDITOR environment variables, falling back to a default editor depending on your operating system (vi on UNIX-like operating systems, notepad.exe on Windows).

            You can configure chezmoi to use your preferred editor by either setting the $EDITOR environment variable or setting the edit.command variable in your configuration file.

            The editor command must only return when you have finished editing the files. chezmoi will emit a warning if your editor command returns too quickly.

            In the specific case of using VSCode or Codium as your editor, you must pass the --wait flag, for example, in your shell config:

            export EDITOR=\"code --wait\"\n

            Or in chezmoi's configuration file:

            ~/.config/chezmoi/chezmoi.toml
            [edit]\n    command = \"code\"\n    args = [\"--wait\"]\n
            "},{"location":"user-guide/tools/editor/#use-chezmoi-with-vim","title":"Use chezmoi with VIM","text":"

            github.com/alker0/chezmoi.vim provides syntax highlighting for files managed by chezmoi, including for templates.

            github.com/Lilja/vim-chezmoi works with chezmoi edit to apply the edited dotfile on save.

            github.com/xvzc/chezmoi.nvim allows you to edit your chezmoi-managed files and automatically apply.

            Alternatively, you can use an autocmd to run chezmoi apply whenever you save a dotfile, but you must disable chezmoi edit's hardlinking:

            ~/.config/chezmoi/chezmoi.toml
            [edit]\n    hardlink = false\n
            ~/.vimrc
            autocmd BufWritePost ~/.local/share/chezmoi/* ! chezmoi apply --source-path \"%\"\n
            "},{"location":"user-guide/tools/editor/#use-chezmoi-with-emacs","title":"Use chezmoi with emacs","text":"

            github.com/tuh8888/chezmoi.el provides convenience functions for interacting with chezmoi from emacs, and is available in MELPA.

            "},{"location":"user-guide/tools/http-or-socks5-proxy/","title":"HTTP or SOCKS5 proxy","text":"

            chezmoi supports HTTP, HTTPS, and SOCKS5 proxies. Set the HTTP_PROXY, HTTPS_PROXY, and NO_PROXY environment variables, or their lowercase equivalents, for example:

            HTTP_PROXY=socks5://127.0.0.1:1080 chezmoi apply --refresh-externals\n
            "},{"location":"user-guide/tools/merge/","title":"Merge","text":""},{"location":"user-guide/tools/merge/#use-a-custom-merge-command","title":"Use a custom merge command","text":"

            By default, chezmoi uses vimdiff. You can use a custom command by setting the merge.command and merge.args configuration variables. The elements of merge.args are interpreted as templates with the variables .Destination, .Source, and .Target containing filenames of the file in the destination state, source state, and target state respectively. For example, to use neovim's diff mode, specify:

            ~/.config/chezmoi/chezmoi.toml
            [merge]\n    command = \"nvim\"\n    args = [\"-d\", \"{{ .Destination }}\", \"{{ .Source }}\", \"{{ .Target }}\"]\n

            Hint

            If you generate your config file from a config file template, then you'll need to escape the {{ and }} as {{ \"{{\" }} and {{ \"}}\" }}. That way your generated config file contains the {{ and }} you expect.

            "},{"location":"user-guide/tools/merge/#use-vscode-as-the-merge-tool","title":"Use VSCode as the merge tool","text":"

            To use VSCode as the merge tool, add the following to your config:

            TOMLYAML ~/.config/chezmoi/chezmoi.toml
            [merge]\ncommand = \"bash\"\nargs = [\n    \"-c\",\n    \"cp {{ .Target }} {{ .Target }}.base && code --new-window --wait --merge {{ .Destination }} {{ .Target }} {{ .Target }}.base {{ .Source }}\",\n]\n
            ~/.config/chezmoi/chezmoi.yaml
            merge:\n  command: \"bash\"\n  args:\n  - \"-c\"\n  - \"cp {{ .Target }} {{ .Target }}.base && code --new-window --wait --merge {{ .Destination }} {{ .Target }} {{ .Target }}.base {{ .Source }}\"\n
            "}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml index 1bb946e3988..060c07245d0 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -2,1098 +2,1102 @@ https://chezmoi.io/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/comparison-table/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/install/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/license/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/migrating-from-another-dotfile-manager/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/quick-start/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/what-does-chezmoi-do/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/why-use-chezmoi/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/architecture/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/building-on-top-of-chezmoi/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/contributing-changes/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/install-script/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/packaging/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/releases/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/security/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/testing/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/using-make/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/developer-guide/website/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/links/articles/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/links/dotfile-repos/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/links/podcasts/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/links/related-software/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/links/social-media/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/links/videos/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/application-order/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/concepts/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/plugins/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/release-history/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/source-state-attributes/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/target-types/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/command-line-flags/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/command-line-flags/common/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/command-line-flags/developer/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/command-line-flags/global/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/add/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/age/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/apply/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/archive/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/cat-config/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/cat/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/cd/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/chattr/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/completion/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/data/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/decrypt/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/destroy/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/diff/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/doctor/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/dump-config/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/dump/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/edit-config-template/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/edit-config/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/edit/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/encrypt/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/execute-template/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/forget/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/generate/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/git/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/help/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/ignored/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/import/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/init/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/license/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/list/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/manage/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/managed/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/merge-all/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/merge/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/purge/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/re-add/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/remove/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/rm/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/secret/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/source-path/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/state/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/status/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/target-path/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/unmanage/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/unmanaged/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/update/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/upgrade/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/commands/verify/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/editor/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/hooks/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/interpreters/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/pinentry/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/textconv/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/umask/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/variables/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/configuration-file/warnings/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-directories/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-directories/chezmoidata/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-directories/chezmoiexternals/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-directories/chezmoiscripts/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-directories/chezmoitemplates/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/chezmoi-format-tmpl/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/chezmoidata-format/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/chezmoiexternal-format/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/chezmoiignore/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/chezmoiremove/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/chezmoiroot/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/special-files/chezmoiversion/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/directives/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/variables/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-functions/onepassword/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-functions/onepasswordDetailsFields/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-functions/onepasswordDocument/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-functions/onepasswordItemFields/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-functions/onepasswordRead/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-sdk-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-sdk-functions/onepasswordSDKItemsGet/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/1password-sdk-functions/onepasswordSDKSecretsResolve/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/aws-secrets-manager-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/aws-secrets-manager-functions/awsSecretsManager/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/aws-secrets-manager-functions/awsSecretsManagerRaw/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/azure-key-vault-functions/azureKeyVault/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/bitwarden/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/bitwardenAttachment/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/bitwardenAttachmentByRef/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/bitwardenFields/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/bitwardenSecrets/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/rbw/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/bitwarden-functions/rbwFields/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/dashlane-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/dashlane-functions/dashlaneNote/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/dashlane-functions/dashlanePassword/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/doppler-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/doppler-functions/doppler/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/doppler-functions/dopplerProjectJson/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/ejson-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/ejson-functions/ejsonDecrypt/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/ejson-functions/ejsonDecryptWithKey/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/comment/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/completion/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/decrypt/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/deleteValueAtPath/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/encrypt/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/eqFold/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/findExecutable/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/findOneExecutable/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/fromIni/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/fromJson/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/fromJsonc/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/fromToml/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/fromYaml/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/glob/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/hexDecode/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/hexEncode/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/include/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/includeTemplate/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/ioreg/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/isExecutable/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/joinPath/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/jq/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/lookPath/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/lstat/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/mozillaInstallHash/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/output/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/pruneEmptyDicts/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/quoteList/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/replaceAllRegex/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/setValueAtPath/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/stat/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/toIni/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/toPrettyJson/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/toToml/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/functions/toYaml/ - 2025-01-13 + 2025-01-28 + + + https://chezmoi.io/reference/templates/functions/warnf/ + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubKeys/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubLatestRelease/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubLatestReleaseAssetURL/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubLatestTag/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubRelease/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubReleaseAssetURL/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubReleases/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/github-functions/gitHubTags/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/gopass-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/gopass-functions/gopass/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/gopass-functions/gopassRaw/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/hcp-vault-secrets-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/exit/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptBool/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptBoolOnce/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptChoice/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptChoiceOnce/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptInt/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptIntOnce/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptString/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/promptStringOnce/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/stdinIsATTY/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/init-functions/writeToStdout/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keepassxc-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keepassxc-functions/keepassxc/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keepassxc-functions/keepassxcAttachment/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keepassxc-functions/keepassxcAttribute/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keeper-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keeper-functions/keeper/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keeper-functions/keeperDataFields/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keeper-functions/keeperFindPassword/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/keyring-functions/keyring/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/lastpass-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/lastpass-functions/lastpass/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/lastpass-functions/lastpassRaw/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/pass-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/pass-functions/pass/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/pass-functions/passFields/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/pass-functions/passRaw/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/passhole-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/passhole-functions/passhole/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/secret-functions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/secret-functions/secret/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/secret-functions/secretJSON/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/reference/templates/vault-functions/vault/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/command-overview/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/daily-operations/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/include-files-from-elsewhere/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/manage-different-types-of-file/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/manage-machine-to-machine-differences/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/setup/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/templating/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/use-scripts-to-perform-actions/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/advanced/customize-your-source-directory/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/advanced/install-packages-declaratively/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/advanced/install-your-password-manager-on-init/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/advanced/migrate-away-from-chezmoi/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/advanced/use-chezmoi-with-watchman/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/encryption/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/encryption/age/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/encryption/gpg/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/encryption/rage/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/frequently-asked-questions/design/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/frequently-asked-questions/encryption/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/frequently-asked-questions/general/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/frequently-asked-questions/troubleshooting/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/frequently-asked-questions/usage/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/machines/containers-and-vms/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/machines/general/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/machines/linux/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/machines/macos/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/machines/windows/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/1password/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/aws-secrets-manager/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/azure-key-vault/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/bitwarden/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/custom/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/dashlane/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/doppler/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/ejson/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/gopass/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/hcp-vault-secrets/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/keepassxc/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/keeper/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/keychain-and-windows-credentials-manager/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/lastpass/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/pass/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/passhole/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/password-managers/vault/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/tools/diff/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/tools/editor/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/tools/http-or-socks5-proxy/ - 2025-01-13 + 2025-01-28 https://chezmoi.io/user-guide/tools/merge/ - 2025-01-13 + 2025-01-28 \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8204e822e962eedcea993625b8e130c45f316d0e..74b30cab62e495ee7364b6aaa00bbc21a87c9d2d 100644 GIT binary patch delta 2220 zcmV;d2vhf}5wH;lABzYG03Mi;2OfXPOlNvGi97DOxw^?U8QbkmA0co>A_B2Au#l|$ z^#_QQtyqeZ-rZo=FOeXI-w*L~7X%ise!TD9vn7OR(Z4=n-b5SpZ|UoM_1K)heE#x#_56i;`9r>BN*ix{ z_HgHK)G*i&I@pL_k)AoIB5Hjk?OYWtXASsR=ec^@22HuLsCmF%X^+%FPz}=DI#9j# zx`j{$?{!&SJtx|-oY!%H0mfMcXFZ0E?y$rpq0R zp%i!kX34tJF{;va;Gl5MS_TF^1v^Wd=4U$XTZk+mQ|G3l33ebBgh88yZgWPks0VPM zBUA22FezACvxpN!;>z_DOU3W?f~PlF!K~Ohm4$_462QV4&KWJh+qx!`iCTFsM2k3B$Uwdc+hA6bFDnX&Ox%=PSXbcl<{k6}GQ81lFTK>*EQ zJ$MQN>M6lJ<>VzlN$Pc6@MA1>uw}iofLgNB!CPPb{d62)v(Bcm0m^)_1qlSxg$yq) zj?m=B1Ho%2D1*k;rGkLAvz%N=r77`hZx_DLG4z@g<@|q;z*Cyi#3TV{+m-|&jdP_E zNLc0)4wE2?D4S_BR_%3bOr6=I?%2cT$LB-fGLaq$UJN?M6^2I5lQ+d;lEs1^wy9FN zE`hXl@r?!7h|Ro9G^x*?l2pE{e5LFhyap|y3dUw3s;Pd?vy)#pmv2j<#(x3{$Gq80 zv&Uf~q_ zv;6WF)_;_AHoloH`;i*(0;=C3mWMQ%R2M|rbgYBzH}d_ozJ|F>NM>8$DBIMNh=L2V zl{6maB5ZW*oG!ay*gLTUDBGmpkU%2W2X3dU!C`-JA}pYNk|{+V(T9K^!O*XfaXJS+ zmPj}J#rBkA^Zk-#$Hccm{o7KPZ9g_P{vvxMD60@S4XDpZcy<^af@zqm?=DHs6!=5C z1Q+z7{vxGAOgx(r4wBrxLDvWXnOoodyxAmCE%Mmcf!=$N#T2l=@>U25>)^eQVuY~V zV()*1p!}&tppw5KmbRNpR9BGYK(yRi;fa92NMlRLhcM9W!thJXnko7NpNKE5)!e5WWT<;!8PWUCw-ojcO)4TE`U5}9qMZ;ah+&%w({Z1z2t!|}(2`yCN#d%#bmi1rY zx~(72a)$}a`ZNhW>r;?1K^hO|a<0w{(?YK8`ZNAwJI0iM+pI6U;fOBq-ypJDpCy0L zjer7uf&urIq_7MDv&a1tqLWATzJ3JouTcG?Lo1U>US3^!5(gwNmu@K3IuYY9GD*s- zNR9PZ@#6OOPbo;NU5r*5gj1nt}`7v5K?cRplp-an8t}50hzN05_#vkzQFVA&HLXNV^4g(_jFlp&uNM~ zM~aTe72y)X(!#2?ext2ht8z}0u2*As^rxkHV?dViNMmpjRvlD|mb1e$?wWsA;xO*h^x3&8M_Ca*eB1&Ws9szVC=InmrzTs=!rf6WhdxhH&`JU1R#GBL zDQ#HVif)!V7kYDMQY7r{Cs1olK}~Urw*k}EY+T!8iN~{nbJJ;P*Xaeatr=cseFvec=SCe!8os!cTQXR5XJ?67jJ z_|J#c+o5Gt4-5}K4{(?A=$p+F9T(83{4H+x+(p}ZK|p*J^a#{=8jcf0L;+I?^41}8 zjN(VgQe>#%lO0#K)_T(UQ;4eg0LwnIp)ggN2YqLKx@S|*ACNEaSJr!I)DjW^ z@SI=@JByuRKy#_i;!ZJz|qN{i~ u^qz9X{n+1 delta 2214 zcmV;X2wC^A5vmafABzYGfLDZ(2OfX!O=sFp;*MK4S2t;svEAPE5e8QzA`nXh3(3k~ ze}G8Yilr!N?*_Ymi3BnHeu$sDAh3Ax!+r0bEg(dT{^il>@$;i+;0-p`w=a+WxOt_% zJ^JD7s~0J_2=pvp?BmO$j%fJ)i>meRvXiuW)@|SorC7wJ#{_cP1?5k(_ zuiRk#wElbH(43XK#C)6lpFZ?xk1d|OI4M7DU#BDW*qnX+{OfPj^HX*DuYAdrHs1K; z;m%*EVXz-`uo1l?ee0l#sP&Pwb5*pQHQ-~N=jv@6H08>oW&wMpJyHijHApk-K=s<| z7D5%2yJXE=njVI14rdEB57`)+ zN~Y+eejcL@3{*Rl2bc0-SX*@(232PxVOUjGkC=ji;s6jRO`~Z9weujmA1#og)lgkJ zJGR;1YE*9Apk_|D0swzX5_*1)hryd4rFD3#9S=w3lGRPaCfx#?bRK&MLm!(u_Jf0BZE+Danlzg>n6Mg%Pd-vWw*IEEvl*KfP24FM1Y(HRN%XsVg3ccq0=DqTf?a{~g+q~**HNJ=3%c@$d8a@TUB|aoZ z@sRVKZ$>3Rk9-pgq32SL*}vm6E2jDFK~u+uK#XQh5l?IrnA5yIXYMD@JKSva+4`L{ zG>r8x4QaA;XJ{ z12nnuK=9fL%Aj#|sUV=uEGHLIX-d4>n}zQ)480~rIX{0S@RX)BF-gGLv?W1E<6Nl( z5|+7y{UnGY%4XV(ReRkUQ)l+5JNB^o@%a$AOr%GG(?Q3$#L%c&@}^i!vRKf=CRHle z1(3EbzOvvNv6**)CiU4YPZMj&-p8LcSkYS1^+a$!rT8WSe>tQE=gQ zDUFA@2pb(cr^_xF_D*aM$|mV|B#_AUj@#*Ka2S7_2n%SJWJ-}o^e*6gF!XC=oX&yw zCDILlu|4Hjf4^YaG4W+k|FP6%+mDTnzsMd5$|?j-1L`9Zo*hQ}U>fG?yG@ca1^(17 z!8yIFzes5x6VGOZy(D+9&@}=;X4W@9uQy3li#+yuptl}mF$L@|y%j>jI(YA*7$Gb- z*gJnAD1T`YC}m&20E`aqvjKw*$YA-|3t_R|xFm_>hG&!9ULp+8O5lj12BP<9y%1aK z{ha^^hd39KAFk{M5Wvyn2kV@^93vq9qN9Y&!9+unkUK+2*|zKlT3uK}5**pPgamKu z?-<<25+ElTICt&}TDTWL6oF*9kV0BHp$vb2gz#MeqLmPzgiweVK*;I?w3fPbD`1Xw z2P7x_l5StaN*vRh@*`c15d%fToyXiQ{&Dq2CghE7rGW`8RN=*WRWpY4-{88bA4hVF z3Cp@L2|epmkTF3T59czf&J5E6s?EAD{$e}Clz&^V>$>LH)&EZrS*^YjU`9ZJKEZ#0 zdrMMShJe}A{Snd0BYImu^7dz_e(KQ5WRjOxm!8A{$;+i{3bjt6_?t|U@+wke{bfAA zx%o>9(lS_r8@#3l8D}l$u-=1kZv>2T`&b^*WKs!OW&Jt6@jw7pJP`{hcRsG3qkEH9>*e(5ON!%C+Wjsn4T!du@m7>&av5dQwRXNV0RF;3~EU$9d zYqj`?yEJ`vuF4TogbyD#fCj1;R|HB!ZPBU8*0ON7l*?huQ}nS?0J)WvNKQ%{mbRjs zh0cZEoR|~|d;0;@3R6&1eBe!>vK1TG<~ZQ-Oy1md8Zb_mo@D`!A8Vai4}mB)u?f(t zYBBWp(TxYGgVIaA8au$6M@xV2BicG*TrDkiYN^R|IlpQXP5X#yZTZ@-Tr2MKe)V=} z8Px;B!_NZTr9Ap(vqZ-^G%A0Ko4sz)wq6hrUj;n?HJ(D_1QAidRD!E@h#aH%0kRYs zYWQTwl`XBFbp8~gDn7uXk8CJRmF7X;S)cCN)bj`A%loDE4KAzeKec~^1OS{?4Ka8S zWltC@0Z< + + + + + warnf + + + + + + + + +
          diff --git a/user-guide/advanced/install-packages-declaratively/index.html b/user-guide/advanced/install-packages-declaratively/index.html index 34420c70ee2..0f24da0d8b3 100644 --- a/user-guide/advanced/install-packages-declaratively/index.html +++ b/user-guide/advanced/install-packages-declaratively/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
        • + + + + + warnf + + + + +
        • + + + +
        diff --git a/user-guide/advanced/install-your-password-manager-on-init/index.html b/user-guide/advanced/install-your-password-manager-on-init/index.html index 6c0a54873e3..b88652c835b 100644 --- a/user-guide/advanced/install-your-password-manager-on-init/index.html +++ b/user-guide/advanced/install-your-password-manager-on-init/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
      • + + + + + warnf + + + + +
      • + + + +
      diff --git a/user-guide/advanced/migrate-away-from-chezmoi/index.html b/user-guide/advanced/migrate-away-from-chezmoi/index.html index d09c5ee7013..f911244d324 100644 --- a/user-guide/advanced/migrate-away-from-chezmoi/index.html +++ b/user-guide/advanced/migrate-away-from-chezmoi/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
    • + + + + + warnf + + + + +
    • + + + +
    diff --git a/user-guide/advanced/use-chezmoi-with-watchman/index.html b/user-guide/advanced/use-chezmoi-with-watchman/index.html index 7e7dbd360e6..84a801ddea6 100644 --- a/user-guide/advanced/use-chezmoi-with-watchman/index.html +++ b/user-guide/advanced/use-chezmoi-with-watchman/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/command-overview/index.html b/user-guide/command-overview/index.html index 4330e680d5d..0374e72cf46 100644 --- a/user-guide/command-overview/index.html +++ b/user-guide/command-overview/index.html @@ -1696,6 +1696,13 @@ +
  • + + + warnf + + +
  • diff --git a/user-guide/daily-operations/index.html b/user-guide/daily-operations/index.html index 9c14e083237..84456f5e984 100644 --- a/user-guide/daily-operations/index.html +++ b/user-guide/daily-operations/index.html @@ -1703,6 +1703,13 @@ +
  • + + + warnf + + +
  • diff --git a/user-guide/encryption/age/index.html b/user-guide/encryption/age/index.html index 949f354cc8b..58a20181c5d 100644 --- a/user-guide/encryption/age/index.html +++ b/user-guide/encryption/age/index.html @@ -4483,6 +4483,8 @@ + + @@ -5266,6 +5268,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/encryption/gpg/index.html b/user-guide/encryption/gpg/index.html index b73f112f0cf..35c2b552b58 100644 --- a/user-guide/encryption/gpg/index.html +++ b/user-guide/encryption/gpg/index.html @@ -4492,6 +4492,8 @@ + + @@ -5275,6 +5277,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/encryption/index.html b/user-guide/encryption/index.html index 00964ff6e20..2f5163243b1 100644 --- a/user-guide/encryption/index.html +++ b/user-guide/encryption/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/encryption/rage/index.html b/user-guide/encryption/rage/index.html index 4a306480b19..1c515fd7005 100644 --- a/user-guide/encryption/rage/index.html +++ b/user-guide/encryption/rage/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/frequently-asked-questions/design/index.html b/user-guide/frequently-asked-questions/design/index.html index 93a45528921..c858ca57c12 100644 --- a/user-guide/frequently-asked-questions/design/index.html +++ b/user-guide/frequently-asked-questions/design/index.html @@ -4555,6 +4555,8 @@ + + @@ -5338,6 +5340,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/frequently-asked-questions/encryption/index.html b/user-guide/frequently-asked-questions/encryption/index.html index a2ff2365b13..9c2095e6831 100644 --- a/user-guide/frequently-asked-questions/encryption/index.html +++ b/user-guide/frequently-asked-questions/encryption/index.html @@ -4489,6 +4489,8 @@ + + @@ -5272,6 +5274,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/frequently-asked-questions/general/index.html b/user-guide/frequently-asked-questions/general/index.html index 78a6ec59323..c3b1c44dc24 100644 --- a/user-guide/frequently-asked-questions/general/index.html +++ b/user-guide/frequently-asked-questions/general/index.html @@ -4483,6 +4483,8 @@ + + @@ -5266,6 +5268,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/frequently-asked-questions/troubleshooting/index.html b/user-guide/frequently-asked-questions/troubleshooting/index.html index f318285bfb6..0c53f72f234 100644 --- a/user-guide/frequently-asked-questions/troubleshooting/index.html +++ b/user-guide/frequently-asked-questions/troubleshooting/index.html @@ -4564,6 +4564,8 @@ + + @@ -5347,6 +5349,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/frequently-asked-questions/usage/index.html b/user-guide/frequently-asked-questions/usage/index.html index 4c574d116b8..5e8f1b50411 100644 --- a/user-guide/frequently-asked-questions/usage/index.html +++ b/user-guide/frequently-asked-questions/usage/index.html @@ -4615,6 +4615,8 @@ + + @@ -5398,6 +5400,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/include-files-from-elsewhere/index.html b/user-guide/include-files-from-elsewhere/index.html index 4d6c7fff59b..6af6aeac610 100644 --- a/user-guide/include-files-from-elsewhere/index.html +++ b/user-guide/include-files-from-elsewhere/index.html @@ -4528,6 +4528,8 @@ + + @@ -5311,6 +5313,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/machines/containers-and-vms/index.html b/user-guide/machines/containers-and-vms/index.html index 1c2630e7c3e..1685257d9b2 100644 --- a/user-guide/machines/containers-and-vms/index.html +++ b/user-guide/machines/containers-and-vms/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/machines/general/index.html b/user-guide/machines/general/index.html index 37d65f1597d..6820432e9ed 100644 --- a/user-guide/machines/general/index.html +++ b/user-guide/machines/general/index.html @@ -4474,6 +4474,8 @@ + + @@ -5257,6 +5259,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/machines/linux/index.html b/user-guide/machines/linux/index.html index 1a4cf9d99cb..50d7d481a48 100644 --- a/user-guide/machines/linux/index.html +++ b/user-guide/machines/linux/index.html @@ -4465,6 +4465,8 @@ + + @@ -5248,6 +5250,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/machines/macos/index.html b/user-guide/machines/macos/index.html index dba0fabfeb2..be4edd15d0f 100644 --- a/user-guide/machines/macos/index.html +++ b/user-guide/machines/macos/index.html @@ -4483,6 +4483,8 @@ + + @@ -5266,6 +5268,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/machines/windows/index.html b/user-guide/machines/windows/index.html index d31598c2f2d..16fcb251391 100644 --- a/user-guide/machines/windows/index.html +++ b/user-guide/machines/windows/index.html @@ -4483,6 +4483,8 @@ + + @@ -5266,6 +5268,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/manage-different-types-of-file/index.html b/user-guide/manage-different-types-of-file/index.html index 3d70a813db0..cd8ee4d077a 100644 --- a/user-guide/manage-different-types-of-file/index.html +++ b/user-guide/manage-different-types-of-file/index.html @@ -4510,6 +4510,8 @@ + + @@ -5293,6 +5295,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/manage-machine-to-machine-differences/index.html b/user-guide/manage-machine-to-machine-differences/index.html index 2fe036dae04..6d0bd306853 100644 --- a/user-guide/manage-machine-to-machine-differences/index.html +++ b/user-guide/manage-machine-to-machine-differences/index.html @@ -4492,6 +4492,8 @@ + + @@ -5275,6 +5277,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/1password/index.html b/user-guide/password-managers/1password/index.html index 7e3cad22f5b..e9f66149e01 100644 --- a/user-guide/password-managers/1password/index.html +++ b/user-guide/password-managers/1password/index.html @@ -4498,6 +4498,8 @@ + + @@ -5281,6 +5283,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/aws-secrets-manager/index.html b/user-guide/password-managers/aws-secrets-manager/index.html index d1d004a285d..26d901b6439 100644 --- a/user-guide/password-managers/aws-secrets-manager/index.html +++ b/user-guide/password-managers/aws-secrets-manager/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/azure-key-vault/index.html b/user-guide/password-managers/azure-key-vault/index.html index b8a715872d8..8562cab0598 100644 --- a/user-guide/password-managers/azure-key-vault/index.html +++ b/user-guide/password-managers/azure-key-vault/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/bitwarden/index.html b/user-guide/password-managers/bitwarden/index.html index 71269bda6f4..debfdbb9f7a 100644 --- a/user-guide/password-managers/bitwarden/index.html +++ b/user-guide/password-managers/bitwarden/index.html @@ -4474,6 +4474,8 @@ + + @@ -5257,6 +5259,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/custom/index.html b/user-guide/password-managers/custom/index.html index f96a08ec7a8..d862222d40e 100644 --- a/user-guide/password-managers/custom/index.html +++ b/user-guide/password-managers/custom/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/dashlane/index.html b/user-guide/password-managers/dashlane/index.html index f56aa11bcd0..8974c427e7f 100644 --- a/user-guide/password-managers/dashlane/index.html +++ b/user-guide/password-managers/dashlane/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/doppler/index.html b/user-guide/password-managers/doppler/index.html index 15fa59796eb..4afb852390f 100644 --- a/user-guide/password-managers/doppler/index.html +++ b/user-guide/password-managers/doppler/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/ejson/index.html b/user-guide/password-managers/ejson/index.html index 648daec0f6b..6d3d8e93ce1 100644 --- a/user-guide/password-managers/ejson/index.html +++ b/user-guide/password-managers/ejson/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/gopass/index.html b/user-guide/password-managers/gopass/index.html index 0d38a5ce5d3..5b46060765e 100644 --- a/user-guide/password-managers/gopass/index.html +++ b/user-guide/password-managers/gopass/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/hcp-vault-secrets/index.html b/user-guide/password-managers/hcp-vault-secrets/index.html index f0fb506482c..8eae7f6668f 100644 --- a/user-guide/password-managers/hcp-vault-secrets/index.html +++ b/user-guide/password-managers/hcp-vault-secrets/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/index.html b/user-guide/password-managers/index.html index 0cf25346471..eaadb8817e7 100644 --- a/user-guide/password-managers/index.html +++ b/user-guide/password-managers/index.html @@ -4416,6 +4416,8 @@ + + @@ -5199,6 +5201,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/keepassxc/index.html b/user-guide/password-managers/keepassxc/index.html index 555ee2c7ad6..68570afed8e 100644 --- a/user-guide/password-managers/keepassxc/index.html +++ b/user-guide/password-managers/keepassxc/index.html @@ -4474,6 +4474,8 @@ + + @@ -5257,6 +5259,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/keeper/index.html b/user-guide/password-managers/keeper/index.html index 05bdcbc32b0..b539867e8cc 100644 --- a/user-guide/password-managers/keeper/index.html +++ b/user-guide/password-managers/keeper/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/keychain-and-windows-credentials-manager/index.html b/user-guide/password-managers/keychain-and-windows-credentials-manager/index.html index e0a10c07c12..4165e19f381 100644 --- a/user-guide/password-managers/keychain-and-windows-credentials-manager/index.html +++ b/user-guide/password-managers/keychain-and-windows-credentials-manager/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/lastpass/index.html b/user-guide/password-managers/lastpass/index.html index dc12c6459dc..bccdc07f739 100644 --- a/user-guide/password-managers/lastpass/index.html +++ b/user-guide/password-managers/lastpass/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/pass/index.html b/user-guide/password-managers/pass/index.html index 4cd94b562cd..07d776e9ecf 100644 --- a/user-guide/password-managers/pass/index.html +++ b/user-guide/password-managers/pass/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/passhole/index.html b/user-guide/password-managers/passhole/index.html index c9c21bf5b17..ee89ac67d5e 100644 --- a/user-guide/password-managers/passhole/index.html +++ b/user-guide/password-managers/passhole/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/password-managers/vault/index.html b/user-guide/password-managers/vault/index.html index aba4ac81f4f..5bb76d530b0 100644 --- a/user-guide/password-managers/vault/index.html +++ b/user-guide/password-managers/vault/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/setup/index.html b/user-guide/setup/index.html index 6911f6ac26c..40876745d81 100644 --- a/user-guide/setup/index.html +++ b/user-guide/setup/index.html @@ -1703,6 +1703,13 @@ +
  • + + + warnf + + +
  • diff --git a/user-guide/templating/index.html b/user-guide/templating/index.html index 0ae26535923..07b36f59cfc 100644 --- a/user-guide/templating/index.html +++ b/user-guide/templating/index.html @@ -4657,6 +4657,8 @@ + + @@ -5440,6 +5442,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/tools/diff/index.html b/user-guide/tools/diff/index.html index c420f249088..7982e680d4c 100644 --- a/user-guide/tools/diff/index.html +++ b/user-guide/tools/diff/index.html @@ -4519,6 +4519,8 @@ + + @@ -5302,6 +5304,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/tools/editor/index.html b/user-guide/tools/editor/index.html index 658a1f9ab72..a030acd1e1f 100644 --- a/user-guide/tools/editor/index.html +++ b/user-guide/tools/editor/index.html @@ -4483,6 +4483,8 @@ + + @@ -5266,6 +5268,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/tools/http-or-socks5-proxy/index.html b/user-guide/tools/http-or-socks5-proxy/index.html index f10a0499b88..ef80c31c819 100644 --- a/user-guide/tools/http-or-socks5-proxy/index.html +++ b/user-guide/tools/http-or-socks5-proxy/index.html @@ -4426,6 +4426,8 @@ + + @@ -5209,6 +5211,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/tools/merge/index.html b/user-guide/tools/merge/index.html index c5a2d4baefe..437d70c50ba 100644 --- a/user-guide/tools/merge/index.html +++ b/user-guide/tools/merge/index.html @@ -4474,6 +4474,8 @@ + + @@ -5257,6 +5259,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/user-guide/use-scripts-to-perform-actions/index.html b/user-guide/use-scripts-to-perform-actions/index.html index 82c5d98c0f3..be687274b56 100644 --- a/user-guide/use-scripts-to-perform-actions/index.html +++ b/user-guide/use-scripts-to-perform-actions/index.html @@ -4501,6 +4501,8 @@ + + @@ -5284,6 +5286,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/what-does-chezmoi-do/index.html b/what-does-chezmoi-do/index.html index f4c79e11dff..2e7d2134113 100644 --- a/what-does-chezmoi-do/index.html +++ b/what-does-chezmoi-do/index.html @@ -4498,6 +4498,8 @@ + + @@ -5281,6 +5283,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + + diff --git a/why-use-chezmoi/index.html b/why-use-chezmoi/index.html index 06031a6bd2e..4407fd61c75 100644 --- a/why-use-chezmoi/index.html +++ b/why-use-chezmoi/index.html @@ -4498,6 +4498,8 @@ + + @@ -5281,6 +5283,27 @@ + + + + + + +
  • + + + + + warnf + + + + +
  • + + + +