guix time-machine command provides access to other
revisions of Guix, for example to install older versions of packages,
or to reproduce a computation in an identical environment. The revision
of Guix to be used is defined by a commit or by a channel
description file created by
Let’s assume that you want to travel to those days of November 2020 when
version 1.2.0 of Guix was released and, once you’re there, run the
guile of that time:
guix time-machine --commit=v1.2.0 -- \ environment -C --ad-hoc guile -- guile
The command above fetches Guix 1.2.0 (and possibly other channels
specified by your channels.scm configuration files—see
below) and runs its
environment command to spawn an environment in a container running
guix environment has since been subsumed by
guix shell; see Invoking
guix shell). It’s like driving a
DeLorean12! The first
invocation can be expensive: it may have to download or even build a
large number of packages; the result is cached though and subsequent
commands targeting the same commit are almost instantaneous.
guix pull, in the absence of any options,
time-machine fetches the latest commits of the channels
specified in ~/.config/guix/channels.scm,
/etc/guix/channels.scm, or the default channels; the -q
option lets you ignore these configuration files. The command:
guix time-machine -q -- build hello
will thus build the package
hello as defined in the main branch
of Guix, without any additional channel, which is in general a newer
revision of Guix than you have installed. Time travel works in both
Note: The history of Guix is immutable and
guix time-machineprovides the exact same software as they are in a specific Guix revision. Naturally, no security fixes are provided for old versions of Guix or its channels. A careless use of
guix time-machineopens the door to security vulnerabilities. See --allow-downgrades.
guix time-machine relying on the “inferiors”
mechanism (see Inferiors), the oldest commit it can travel to is
commit ‘6298c3ff’ (“v1.0.0”), dated May 1st, 2019, which is
the first release that included the inferiors mechanism. An error is
returned when attempting to navigate to older commits.
Note: Although it should technically be possible to travel to such an old commit, the ease to do so will largely depend on the availability of binary substitutes. When traveling to a distant past, some packages may not easily build from source anymore. One such example are old versions of Python 2 which had time bombs in its test suite, in the form of expiring SSL certificates. This particular problem can be worked around by setting the hardware clock to a value in the past before attempting the build.
The general syntax is:
guix time-machine options… -- command arg…
where command and arg… are passed unmodified to the
guix command of the specified revision. The options that define
this revision are the same as for
guix pull (see Invoking
guix channel from the specified url, at the
given commit (a valid Git commit ID represented as a hexadecimal
string or the name of a tag), or branch.
Read the list of channels from file. file must contain Scheme code that evaluates to a list of channel objects. See Channels for more information.
Inhibit loading of the user and system channel files, ~/.config/guix/channels.scm and /etc/guix/channels.scm.
guix time-machine -q is equivalent to the following Bash
command, using the “process substitution” syntax (see Process
Substitution in The GNU Bash Reference Manual):
guix time-machine -C <(echo %default-channels) …
guix time-machine can trigger builds of channels and
their dependencies, and these are controlled by the standard build
options (see Common Build Options).
If you don’t know what a DeLorean is, consider traveling back to the 1980’s.