Manage your dotfiles securely across multiple machines.
- Concepts
- Global command line flags
- Common command line flags
- Developer command line flags
- Configuration file
- Source state attributes
- Target types
- Special files and directories
- Commands
add
target...apply
[target...]archive
cat
target...cd
chattr
attributes target...completion
shelldata
diff
[target...]docs
[regexp]doctor
dump
[target...]edit
[target...]edit-config
execute-template
[template...]forget
targetsgit
[arg...]help
[command...]init
[repo]import
filenamemanage
targetsmanaged
merge
target...purge
remove
targetsre-add
rm
targetssecret
source-path
[target...]state
status
unmanage
target...unmanaged
update
upgrade
verify
[target...]
- Editor configuration
- Umask configuration
- Template execution
- Template variables
- Template functions
bitwarden
[arg...]bitwardenAttachment
filename itemidbitwardenFields
[arg...]gitHubKeys
usergopass
gopass-nameinclude
filenameioreg
joinPath
element...keepassxc
entrykeepassxcAttribute
entry attributekeyring
service userlastpass
idlastpassRaw
idlookPath
fileonepassword
uuid [vault-uuid]onepasswordDocument
uuid [vault-uuid]onepasswordDetailsFields
uuid [vault-uuid]output
name [arg...]pass
pass-namepromptBool
promptpromptInt
promptpromptString
promptsecret
[arg...]secretJSON
[arg...]stat
namestdinIsATTY
vault
keywriteToStdout
string...
chezmoi evaluates the source state for the current machine and then updates the destination directory, where:
-
The source state declares the desired state of your home directory, including templates and machine-specific configuration.
-
The source directory is where chezmoi stores the source state, by default
~/.local/share/chezmoi
. -
The target state is the source state computed for the current machine.
-
The destination directory is the directory that chezmoi manages, by default
~
, 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 config file contains machine-specific configuration, by default it is
~/.config/chezmoi/chezmoi.toml
.
Command line flags override any values set in the configuration file.
Colorize diffs, value can be on
, off
, auto
, or any boolean-like value
recognized by parseBool
. The default is auto
which will colorize diffs only
if the the environment variable $NO_COLOR
is not set and stdout is a terminal.
Read the configuration from filename.
Log information helpful for debugging.
Use directory as the destination directory.
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.
Make changes without prompting.
Print help.
Keep going as far as possible after a encountering an error.
Do not use the pager.
Do not attempt to get a TTY to read input and passwords. Instead, read them from stdin.
Write the output to filename instead of stdout.
Also remove targets according to .chezmoiremove
.
Use directory as the source directory.
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 parseBool
. The default is auto
which will only use the builtin
git if git.command
cannot be found in $PATH
.
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.
Print the version of chezmoi, the commit at which it was built, and the build timestamp.
The following flags apply to multiple commands where they are relevant.
Set the output format.
Only operate on target state entries of type types. types is a
comma-separated list of target states (all
, dirs
, files
, remove
,
scripts
, symlinks
, and encrypted
) and can be excluded by preceding them
with a no
. For example, --include=dirs,files
will cause the command to apply
to directories and files only.
Recurse into subdirectories, true
by default.
Exclude target state entries of type types. types is a comma-separated list
of target states (all
, dirs
, files
, remove
, scripts
, symlinks
, and
encrypted
). For example, --exclude=scripts
will cause the command to not run
scripts and --exclude=encrypted
will exclude encrypted files.
The following flags are global but only relevant for developers and debugging.
Write a Go CPU profile to filename.
Enable the gops agent.
chezmoi searches for its configuration file according to the XDG Base Directory
Specification
and supports all formats supported by
github.com/spf13/viper
, namely
JSON,
TOML, YAML, macOS
property file format, and HCL. The basename
of the config file is chezmoi
, and the first config file found is used.
The following configuration variables are available:
Section | Variable | Type | Default value | Description |
---|---|---|---|---|
Top level | color |
string | auto |
Colorize output |
data |
any | none | Template data | |
destDir |
string | ~ |
Destination directory | |
encryption |
string | none | Encryption tool, either age or gpg |
|
format |
string | json |
Format for data output, either json or yaml |
|
remove |
bool | false |
Remove targets | |
sourceDir |
string | ~/.local/share/chezmoi |
Source directory | |
pager |
string | $PAGER |
Default pager | |
umask |
int | from system | Umask | |
useBuiltinGit |
string | auto |
Use builtin git if git command is not found in $PATH |
|
add |
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 | |
identity |
string | none | age identity file | |
identities |
[]string | none | age identity files | |
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 | |
bitwarden |
command |
string | bw |
Bitwarden CLI command |
cd |
args |
[]string | none | Extra args to shell in cd command |
command |
string | none | Shell to run in cd command |
|
diff |
exclude |
[]string | none | Entry types to exclude from diff |
pager |
string | none | Diff-specific pager | |
docs |
maxWidth |
int | 80 | Maximum width of output |
pager |
string | none | Docs-specific pager | |
edit |
args |
[]string | none | Extra args to edit command |
command |
string | $EDITOR / $VISUAL |
Edit command | |
secret |
command |
string | none | Generic secret command |
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 |
Source version control system | |
gopass |
command |
string | gopass |
gopass CLI command |
gpg |
args |
[]string | none | Extra args to GPG CLI command |
command |
string | gpg |
GPG CLI command | |
recipient |
string | none | GPG recipient | |
suffix |
string | .asc |
Suffix appended to GPG-encrypted files | |
symmetric |
bool | false |
Use symmetric GPG encryption | |
interpreters |
extension.args |
[]string | none | See section on "Scripts on Windows" |
extension.command |
string | special | See section on "Scripts on Windows" | |
keepassxc |
args |
[]string | none | Extra args to KeePassXC CLI command |
command |
string | keepassxc-cli |
KeePassXC CLI command | |
database |
string | none | KeePassXC database | |
lastpass |
command |
string | lpass |
Lastpass CLI command |
merge |
args |
[]string | none | Extra args to 3-way merge command |
command |
string | vimdiff |
3-way merge command | |
onepassword |
cache |
bool | true |
Enable optional caching provided by op |
command |
string | op |
1Password CLI command | |
pass |
command |
string | pass |
Pass CLI command |
template |
options |
[]string | ["missingkey=error"] |
Template options |
vault |
command |
string | vault |
Vault CLI command |
{
"sourceDir": "/home/user/.dotfiles",
"git": {
"autoPush": true
}
}
sourceDir = "/home/user/.dotfiles"
[git]
autoPush = true
sourceDir: /home/user/.dotfiles
git:
autoPush: true
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 ~/.config/chezmoi/chezmoi.toml
. 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. |
exact_ |
Remove anything not managed by chezmoi. |
executable_ |
Add executable permissions to the target file. |
modify_ |
Treat the contents as a script that modifies an existing file. |
once_ |
Run script once. |
private_ |
Remove all group and world permissions from the target file or directory. |
run_ |
Treat the contents as a script to run. |
symlink_ |
Create a symlink instead of a regular file. |
Suffix | Effect |
---|---|
.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 | exact_ , private_ , dot_ |
none |
Regular file | File | encrypted_ , private_ , executable_ , dot_ |
.tmpl |
Create file | File | create_ , encrypted_ , private_ , executable_ , dot_ |
.tmpl |
Modify file | File | modify_ , encrypted_ , private_ , executable_ , dot_ |
.tmpl |
Script | File | run_ , once_ , before_ or after_ |
.tmpl |
Symbolic link | File | symlink_ , dot_ , |
.tmpl |
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
.
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. For 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
.
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 when the file is written to
the target state, and the private_
attribute will clear all group and world
permissions. 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.
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.
Files with the modify_
prefix are treated as scripts that modify an existing
file. 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 scripts standard output.
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.
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.
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_
attribute, in which case they are only executed when they are
first found or when their contents have changed.
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. For example, a script in
~/.local/share/chezmoi/dir/run_script
will be run with a working directory of
~/dir
. 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.
The execution of scripts on Windows depends on the script's 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 |
---|---|---|
.pl |
perl |
none |
.py |
python |
none |
.ps1 |
powershell |
-NoLogo |
.rb |
ruby |
none |
Script interpreters can be added or overridden with the
interpreters.
extension section in the configuration file. Note that the
leading .
is dropped from extension.
For example to change the Python interpreter to C:\Python39\python.exe
and add
a Tcl/Tk interpreter, include the following in ~/.config/chezmoi/chezmoi.toml
:
[interpreters.py]
command = 'C:\Python39\python.exe'
[interpreters.tcl]
command = "tclsh"
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.
All files and directories in the source state whose name begins with .
are
ignored by default, unless they are one of the special files listed here.
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 the supported
config file formats.
{{ $email := promptString "email" -}}
data:
email: {{ $email | quote }}
If a file called .chezmoidata.<format>
exists in the source state, it is interpreted
as a datasource available in most templates.
If .chezmoidata.toml
contains the following (and no variable is overwritten in later stages):
editor = "nvim"
[directions]
up = "k"
down = "j"
right = "l"
left = "h"
Then the following template:
EDITOR={{ .editor }}
MOVE_UP={{ .directions.up }}
MOVE_DOWN={{ .directions.down }}
MOVE_RIGHT={{ .directions.right }}
MOVE_LEFT={{ .directions.left }}
Will result in:
EDITOR=nvim
MOVE_UP=k
MOVE_DOWN=j
MOVE_RIGHT=l
MOVE_LEFT=h
If a file called .chezmoiignore
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. This allows different files to be
ignored on different machines.
.chezmoiignore
files in subdirectories apply only to that subdirectory.
README.md
*.txt # ignore *.txt in the target directory
*/*.txt # ignore *.txt in subdirectories of the target directory
backups/** # ignore backups folder in chezmoi directory and all its contents
# but not in subdirectories of subdirectories;
# so a/b/c.txt would *not* be ignored
backups/** # ignore all contents of backups folder in chezmoi directory
# but not backups folder itself
{{- if ne .email "firstname.lastname@company.com" }}
# Ignore .company-directory unless configured with a company email
.company-directory # note that the pattern is not dot_company-directory
{{- end }}
{{- if ne .email "me@home.org }}
.personal-file
{{- end }}
If a file called .chezmoiremove
exists in the source state then it is
interpreted as a list of targets to remove. .chezmoiremove
is interpreted as a
template.
If a directory called .chezmoitemplates
exists, then all files in this
directory are parsed as templates 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.
Given:
.chezmoitemplates/foo
:
{{ if true }}bar{{ end }}
dot_config.tmpl
:
{{ template "foo" . }}
The target state of .config
will be bar
.
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.
1.5.0
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.
Automatically generate a template by replacing strings with variable names from
the data
section of the config file. Longer substitutions occur before shorter
ones. This implies the --template
option.
Set the empty
attribute on added files.
Add targets, even if doing so would cause a source template to be overwritten.
If the last part of a target is a symlink, add the target of the symlink instead of the symlink itself.
Set the exact
attribute on added directories.
Only add entries of type types.
Interactively prompt before adding each file.
Recursively add all files, directories, and symlinks.
Set the template
attribute on added files and symlinks.
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.
$ chezmoi add ~/.bashrc
$ chezmoi add ~/.gitconfig --template
$ chezmoi add ~/.vim --recursive
$ chezmoi add ~/.oh-my-zsh --exact --recursive
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.
Only add entries of type types.
Specify targets by source path, rather than target path. This is useful for applying changes after editing.
$ chezmoi apply
$ chezmoi apply --dry-run --verbose
$ chezmoi apply ~/.bashrc
Generate an archive of the target state. This can be piped into tar
to inspect
the target state.
Write the archive in format.
Only include entries of type types.
Compress the output with gzip.
$ chezmoi archive | tar tvf -
$ chezmoi archive --output=dotfiles.tar
$ chezmoi archive --format=zip --output=dotfiles.zip
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 target is written.
$ chezmoi cat ~/.bashrc
Launch a shell in 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
will finally fall back to an OS-specific default.
$ chezmoi cd
Change the attributes of targets. attributes specifies which attributes 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
attributes and their abbreviations are:
Attribute | Abbreviation |
---|---|
after |
a |
before |
b |
empty |
e |
encrypted |
none |
exact |
none |
executable |
x |
once |
o |
private |
p |
template |
t |
Multiple attributes modifications may be specified by separating them with a
comma (,
).
$ chezmoi chattr template ~/.bashrc
$ chezmoi chattr noempty ~/.profile
$ chezmoi chattr private,template ~/.netrc
Generate shell completion code for the specified shell (bash
, fish
,
powershell
, or zsh
).
$ chezmoi completion bash
$ chezmoi completion fish --output=~/.config/fish/completions/chezmoi.fish
Write the computed template data to stdout.
Set the output format.
$ chezmoi data
$ chezmoi data --format=yaml
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.
Pager to use for output.
$ chezmoi diff
$ chezmoi diff ~/.bashrc
Print the documentation page matching the regular expression regexp. Matching
is case insensitive. If no pattern is given, print REFERENCE.md
.
Pager to use for output.
$ chezmoi docs
$ chezmoi docs faq
$ chezmoi docs howto
Check for potential problems.
$ chezmoi doctor
Dump the target state of targets. If no targets are specified, then the entire target state.
Set the output format.
Only include entries of type types.
$ chezmoi dump ~/.bashrc
$ chezmoi dump --format=yaml
Edit the source state of targets, which must be files or symlinks. If no targets are given the the source directory itself is opened.
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 editor.args
configuration variable.
Apply target immediately after editing. Ignored if there are no targets.
$ chezmoi edit ~/.bashrc
$ chezmoi edit ~/.bashrc --apply
$ chezmoi edit
Edit the configuration file.
$ chezmoi edit-config
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.
Include simulated functions only available during chezmoi init
.
Simulate the promptBool
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.
Simulate the promptInt
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.
Simulate the promptString
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.
Simulate the stdinIsATTY
function by returning bool.
$ chezmoi execute-template '{{ .chezmoi.sourceDir }}'
$ chezmoi execute-template '{{ .chezmoi.os }}' / '{{ .chezmoi.arch }}'
$ echo '{{ .chezmoi | toJson }}' | chezmoi execute-template
$ chezmoi execute-template --init --promptString email=me@home.org < ~/.local/share/chezmoi/.chezmoi.toml.tmpl
Remove targets from the source state, i.e. stop managing them.
$ chezmoi forget ~/.bashrc
Run git
args in the source directory. Note that flags in arguments must
occur after --
to prevent chezmoi from interpreting them.
$ chezmoi git add .
$ chezmoi git add dot_gitconfig
$ chezmoi git -- commit -m "Add .gitconfig"
Print the help associated with command, or general help if no command is given.
Setup the source directory, generate the config file, and optionally update the
destination directory to match the target state. repo is expanded to a 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://github.com/user/dotfiles.git |
git@github.com:user/dotfiles.git |
user/repo |
https://github.com/user/repo.git |
git@github.com:user/repo.git |
site/user/repo |
https://site/user/repo.git |
git@site:user/repo.git |
~sr.ht/user |
https://git.sr.ht/~user/dotfiles |
git@git.sr.ht:~user/dotfiles.git |
~sr.ht/user/repo |
https://git.sr.ht/~user/repo |
git@git.sr.ht:~/user/repo.git |
First, if the source directory is 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
, 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 the source directory
and its config directory.
Finally, if the --purge-binary
is passed, chezmoi will attempt to remove its
own binary.
Run chezmoi apply
after checking out the repo and creating the config file.
Check out branch instead of the default branch.
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.
Clone the repo with depth depth.
--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).
Remove the source and config directories after applying.
Attempt to remove the chezmoi binary after applying.
Guess an SSH repo URL instead of an HTTPS repo.
$ chezmoi init user
$ chezmoi init user --apply
$ chezmoi init user --apply --purge
$ chezmoi init user/dots
$ chezmoi init gitlab.com/user
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 only supported archive format is .tar.gz
.
Set the destination (in the source state) where the archive will be imported.
Set the exact
attribute on all imported directories.
Remove destination (in the source state) before importing.
Strip n leading components from paths.
$ curl -s -L -o ${TMPDIR}/oh-my-zsh-master.tar.gz https://github.com/robbyrussell/oh-my-zsh/archive/master.tar.gz
$ mkdir -p $(chezmoi source-path)/dot_oh-my-zsh
$ chezmoi import --strip-components 1 --destination ~/.oh-my-zsh ${TMPDIR}/oh-my-zsh-master.tar.gz
manage
is an alias for add
for symmetry with unmanage
.
List all managed entries in the destination directory in alphabetical order.
Only include entries of type types.
$ chezmoi managed
$ chezmoi managed --include=files
$ chezmoi managed --include=files,symlinks
$ chezmoi managed -i d
$ chezmoi managed -i d,f
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 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.
$ chezmoi merge ~/.bashrc
Remove chezmoi's configuration, state, and source directory, but leave the target state intact.
Remove without prompting.
$ chezmoi purge
$ chezmoi purge --force
Remove targets from both the source state and the destination directory.
Remove without prompting.
Re-add all modified files in the target state. chezmoi will not overwrite templates, and all entries that are not files are ignored.
$ chezmoi re-add
rm
is an alias for remove
.
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 your secret
manager. Normally you would use template functions to retrieve secrets. Note
that if you want to pass flags to the secret manager's CLI you will need to
separate them with --
to prevent chezmoi from interpreting them.
To get a full list of available commands run:
$ chezmoi secret help
$ chezmoi secret keyring set --service=service --user=user --value=password
$ chezmoi secret keyring get --service=service --user=user
Print the path to each target's source state. If no targets are specified then print the source directory.
$ chezmoi source-path
$ chezmoi source-path ~/.bashrc
Manipulate the persistent state.
$ chezmoi state data
$ chezmoi state delete --bucket=bucket --key=key
$ chezmoi state dump
$ chezmoi state get --bucket=bucket --key=key
$ chezmoi state set --bucket=bucket --key=key --value=value
$ chezmoi state reset
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.
Only include entries of type types.
$ chezmoi status
unmanage
is an alias for forget
for symmetry with manage
.
List all unmanaged files in the destination directory.
$ chezmoi unmanaged
Pull changes from the source repo and apply any changes.
Only update entries of type types.
$ chezmoi update
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
, $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.
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.
Only include entries of type types.
$ chezmoi verify
$ chezmoi verify ~/.bashrc
The edit
and edit-config
commands use the editor specified by the VISUAL
environment variable, the $EDITOR
environment variable, or vi
, whichever is
specified first.
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, for example:
umask = 0o22
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, for example:
[template]
options = ["missingkey=zero"]
For a full list of options, see
Template.Option
.
chezmoi provides the following automatically-populated variables:
Variable | Value |
---|---|
.chezmoi.arch |
Architecture, e.g. amd64 , arm , etc. as returned by runtime.GOARCH. |
.chezmoi.fqdnHostname |
The fully-qualified domain name hostname of the machine chezmoi is running on. |
.chezmoi.group |
The group of the user running chezmoi. |
.chezmoi.homeDir |
The home directory of the user running chezmoi. |
.chezmoi.hostname |
The hostname of the machine chezmoi is running on, up to the first . . |
.chezmoi.kernel |
Contains information from /proc/sys/kernel . Linux only, useful for detecting specific kernels (i.e. Microsoft's WSL kernel). |
.chezmoi.os |
Operating system, e.g. darwin , linux , etc. as returned by runtime.GOOS. |
.chezmoi.osRelease |
The information from /etc/os-release , Linux only, run chezmoi data to see its output. |
.chezmoi.sourceDir |
The source directory. |
.chezmoi.sourceFile |
The path of the template relative to the source directory. |
.chezmoi.username |
The username of the user running chezmoi. |
.chezmoi.version |
The version of chezmoi. |
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.
All standard text/template
and text
template functions from sprig
are
included. chezmoi provides some additional functions.
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.
username = {{ (bitwarden "item" "<itemid>").login.username }}
password = {{ (bitwarden "item" "<itemid>").login.password }}
bitwardenAttachment
returns a document from
Bitwarden using the Bitwarden
CLI (bw
). filename and itemid is
passed to bw get attachment <filename> --itemid <itemid>
and the output from
bw
is returned. The output from bw
is cached so calling
bitwardenAttachment
multiple times with the same filename and itemid will
only invoke bw
once.
{{- (bitwardenAttachment "<filename>" "<itemid>") -}}
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 elements of fields
are returned as a map indexed by each field's name
. For example, given the
output from bw get
:
{
"object": "item",
"id": "bf22e4b4-ae4a-4d1c-8c98-ac620004b628",
"organizationId": null,
"folderId": null,
"type": 1,
"name": "example.com",
"notes": null,
"favorite": false,
"fields": [
{
"name": "text",
"value": "text-value",
"type": 0
},
{
"name": "hidden",
"value": "hidden-value",
"type": 1
}
],
"login": {
"username": "username-value",
"password": "password-value",
"totp": null,
"passwordRevisionDate": null
},
"collectionIds": [],
"revisionDate": "2020-10-28T00:21:02.690Z"
}
the return value will be the map
{
"hidden": {
"name": "hidden",
"type": 1,
"value": "hidden-value"
},
"token": {
"name": "token",
"type": 0,
"value": "token-value"
}
}
The output from bw get
is cached so calling bitwarden
multiple times with
the same arguments will only invoke bw get
once.
{{ (bitwardenFields "item" "<itemid>").token.value }}
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
.
By default, an anonymous GitHub API request will be made, which is subject to
GitHub's rate
limits
(currently 60 requests per hour per source IP address). 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 request, with a higher rate limit (currently 5,000 requests per
hour per user).
In practice, GitHub API rate limits are high enough that you should never 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.
{{ range (gitHubKeys "user") }}
{{- .Key }}
{{ end }}
gopass
returns passwords stored in gopass using the
gopass CLI (gopass
). gopass-name is passed to gopass show <gopass-name>
and 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.
{{ gopass "<pass-name>" }}
include
returns the literal contents of the file named *filename*
. Relative
paths are interpreted relative to the source directory.
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.
{{ if (eq .chezmoi.os "darwin") }}
{{ $serialNumber := index ioreg "IORegistryEntryChildren" 0 "IOPlatformSerialNumber" }}
{{ end }}
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.
{{ joinPath .chezmoi.homeDir ".zshrc" }}
keepassxc
returns 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. database and entry are passed to keepassxc-cli show
. 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 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.
username = {{ (keepassxc "example.com").UserName }}
password = {{ (keepassxc "example.com").Password }}
keepassxcAttribute
returns the attribute attribute of entry using
keepassxc-cli
, with any leading or trailing whitespace removed. It behaves
identically to the keepassxc
function in terms of configuration, password
prompting, password storage, and result caching.
{{ keepassxcAttribute "SSH Key" "private-key" }}
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 |
[github]
user = {{ .github.user | quote }}
token = {{ keyring "github" .github.user | quote }}
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.
githubPassword = {{ (index (lastpass "GitHub") 0).password | quote }}
{{ (index (lastpass "SSH") 0).note.privateKey }}
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.
{{ (index (lastpassRaw "SSH Private Key") 0).note }}
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.
{{ if lookPath "diff-so-fancy" }}
# diff-so-fancy is in $PATH
{{ end }}
onepassword
returns structured data from 1Password
using the 1Password
CLI (op
). uuid
is passed to op get item <uuid>
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-uuid is supplied,
it will be passed along to the op get
call, which can significantly improve
performance.
{{ (onepassword "<uuid>").details.password }}
{{ (onepassword "<uuid>" "<vault-uuid>").details.password }}
onepassword
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-uuid is supplied,
it will be passed along to the op get
call, which can significantly improve
performance.
{{- onepasswordDocument "<uuid>" -}}
{{- onepasswordDocument "<uuid>" "<vault-uuid>" -}}
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
designation
. For example, give the output from op
:
{
"uuid": "<uuid>",
"details": {
"fields": [
{
"designation": "username",
"name": "username",
"type": "T",
"value": "exampleuser"
},
{
"designation": "password",
"name": "password",
"type": "P",
"value": "examplepassword"
}
]
}
}
the return value will be the map:
{
"username": {
"designation": "username",
"name": "username",
"type": "T",
"value": "exampleuser"
},
"password": {
"designation": "password",
"name": "password",
"type": "P",
"value": "examplepassword"
}
}
The output from op
is cached so calling onepasswordDetailsFields
multiple
times with the same uuid will only invoke op
once. If the optional
vault-uuid is supplied, it will be passed along to the op get
call, which
can significantly improve performance.
{{ (onepasswordDetailsFields "<uuid>").password.value }}
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.
current-context: {{ output "kubectl" "config" "current-context" | trim }}
pass
returns passwords stored in pass using
the pass CLI (pass
). pass-name is passed to pass show <pass-name>
and
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.
{{ pass "<pass-name>" }}
promptBool
prompts the user with prompt and returns the user's response with
interpreted as a boolean. It is only available when generating the initial
config file. 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 |
promptInt
prompts the user with prompt and returns the user's response with
interpreted as an integer. It is only available when generating the initial
config file.
promptString
prompts the user with prompt and returns the user's response
with all leading and trailing spaces stripped. It is only available when
generating the initial config file.
{{ $email := promptString "email" -}}
[data]
email = {{ $email | quote }}
secret
returns the output of the generic secret command defined by the
secret.command
configuration variable with 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.
secretJSON
returns structured data from the generic secret command defined by
the secret.command
configuration variable with 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.
stat
runs stat(2)
on name. If name exists it returns structured data. If
name does not exist then it returns a false value. If stat(2)
returns any
other error then it raises an error. The structured value returned if name
exists contains the fields name
, size
, mode
, perm
, modTime
, and
isDir
.
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.
{{ if stat (joinPath .chezmoi.homeDir ".pyenv") }}
# ~/.pyenv exists
{{ end }}
stdinIsATTY
returns true
if chezmoi's standard input is a TTY. It is only
available when generating the initial config file. It is primarily useful for
determining whether prompt*
functions should be called or default values be
used.
{{ $email := "" }}
{{ if stdinIsATTY }}
{{ $email = promptString "email" }}
{{ else }}
{{ $email = "user@example.com" }}
{{ end }}
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.
{{ (vault "<key>").data.data.password }}
writeToStdout
writes each string to stdout. It is only available when
generating the initial config file.
{{- writeToStdout "Hello, world\n" -}}