2012-10-08 17:16:53 +00:00
|
|
|
git-annex tries to ensure that the configured number of [[copies]] of your
|
|
|
|
data always exist, and leaves it up to you to use commands like `git annex
|
|
|
|
get` and `git annex drop` to move the content to the repositories you want
|
|
|
|
to contain it. But sometimes, it can be good to have more fine-grained
|
|
|
|
control over which repositories prefer to have which content. Configuring
|
2014-01-19 21:35:36 +00:00
|
|
|
this allows the git-annex assistant as well as
|
|
|
|
`git annex get --auto`, `git annex drop --auto`, `git annex sync --content`,
|
|
|
|
etc to do smarter things.
|
2012-10-08 17:16:53 +00:00
|
|
|
|
2013-05-25 16:44:58 +00:00
|
|
|
Preferred content settings can be edited using `git
|
2013-10-28 18:08:38 +00:00
|
|
|
annex vicfg`, or viewed and set at the command line with `git annex wanted`.
|
2014-01-19 21:35:36 +00:00
|
|
|
Each repository can have its own settings, and other repositories will
|
|
|
|
try to honor those settings when interacting with it.
|
|
|
|
So there's no local `.git/config` for preferred content settings.
|
2012-10-08 17:16:53 +00:00
|
|
|
|
2014-03-14 19:14:18 +00:00
|
|
|
[[!template id=note text="""
|
|
|
|
### [[canned preferred content|standard_groups]]
|
2012-10-08 17:16:53 +00:00
|
|
|
|
2014-03-14 19:04:33 +00:00
|
|
|
Rather than writing your own preferred content expression, you can use
|
|
|
|
several canned ones included in git-annex that are tuned to cover different
|
|
|
|
common use cases. You do this by putting a repository in a group,
|
|
|
|
and simply setting its preferred content to "standard" to match whatever
|
2014-03-14 19:14:18 +00:00
|
|
|
is standard for that group. See [[standard_groups]] for a list.
|
|
|
|
"""]]
|
|
|
|
|
|
|
|
The idea is that you write an expression that files are matched against.
|
|
|
|
If a file matches, it's preferred to have its content stored in the
|
|
|
|
repository. If it doesn't, it's preferred to drop its content from
|
|
|
|
the repository (if there are enough copies elsewhere).
|
2014-03-14 19:04:33 +00:00
|
|
|
|
|
|
|
To check at the command line which files are matched by preferred content
|
|
|
|
settings, you can use the --want-get and --want-drop options.
|
|
|
|
|
|
|
|
For example, "git annex find --want-get --not --in ." will find all the
|
|
|
|
files that "git annex get --auto" will want to get, and "git annex find
|
|
|
|
--want-drop --in ." will find all the files that "git annex drop --auto"
|
|
|
|
will want to drop.
|
|
|
|
|
2014-01-18 18:58:56 +00:00
|
|
|
The expressions are very similar to the matching options documented
|
2012-10-08 17:16:53 +00:00
|
|
|
on the [[git-annex]] man page. At the command line, you can use those
|
|
|
|
options in commands like this:
|
|
|
|
|
2012-10-19 20:09:21 +00:00
|
|
|
git annex get --include='*.mp3' --and -'(' --not --largerthan=100mb -')'
|
2012-10-08 17:16:53 +00:00
|
|
|
|
|
|
|
The equivilant preferred content expression looks like this:
|
|
|
|
|
2012-10-19 20:09:21 +00:00
|
|
|
include=*.mp3 and (not largerthan=100mb)
|
2012-10-08 17:16:53 +00:00
|
|
|
|
2012-10-19 20:09:21 +00:00
|
|
|
So, just remove the dashes, basically. However, there are some differences
|
|
|
|
from the command line options to keep in mind:
|
2012-10-08 17:16:53 +00:00
|
|
|
|
2012-10-19 20:09:21 +00:00
|
|
|
### difference: file matching
|
2012-10-10 17:52:24 +00:00
|
|
|
|
2012-10-19 20:09:21 +00:00
|
|
|
While --include and --exclude match files relative to the current
|
2012-10-08 17:16:53 +00:00
|
|
|
directory, preferred content expressions always match files relative to the
|
2012-10-10 17:52:24 +00:00
|
|
|
top of the git repository. Perhaps you put files into `archive` directories
|
2012-10-08 17:16:53 +00:00
|
|
|
when you're done with them. Then you could configure your laptop to prefer
|
|
|
|
to not retain those files, like this:
|
|
|
|
|
2012-10-10 17:52:24 +00:00
|
|
|
exclude=*/archive/*
|
|
|
|
|
2012-10-19 20:09:21 +00:00
|
|
|
### difference: no "in="
|
|
|
|
|
|
|
|
Preferred content expressions have no direct equivilant to `--in`.
|
|
|
|
|
|
|
|
Often, it's best to add repositories to groups, and match against
|
|
|
|
the groups in a preferred content expression. So rather than
|
|
|
|
`--in=usbdrive`, put all the USB drives into a "transfer" group,
|
|
|
|
and use "copies=transfer:1"
|
|
|
|
|
|
|
|
### difference: dropping
|
|
|
|
|
|
|
|
To decide if content should be dropped, git-annex evaluates the preferred
|
|
|
|
content expression under the assumption that the content has *already* been
|
|
|
|
dropped. If the content would not be preferred then, the drop can be done.
|
|
|
|
So, for example, `copies=2` in a preferred content expression lets
|
|
|
|
content be dropped only when there are currently 3 copies of it, including
|
|
|
|
the repo it's being dropped from. This is different than running `git annex
|
2013-03-16 15:17:53 +00:00
|
|
|
drop --copies=2`, which will drop files that currently have 2 copies.
|
2012-10-19 20:09:21 +00:00
|
|
|
|
2013-02-24 21:55:01 +00:00
|
|
|
### difference: "present"
|
2012-10-19 20:09:21 +00:00
|
|
|
|
|
|
|
There's a special "present" keyword you can use in a preferred content
|
|
|
|
expression. This means that content is preferred if it's present,
|
|
|
|
and not otherwise. This leaves it up to you to use git-annex manually
|
|
|
|
to move content around. You can use this to avoid preferred content
|
|
|
|
settings from affecting a subdirectory. For example:
|
|
|
|
|
|
|
|
auto/* or (include=ad-hoc/* and present)
|
|
|
|
|
|
|
|
Note that `not present` is a very bad thing to put in a preferred content
|
|
|
|
expression. It'll make it prefer to get content that's not present, and
|
|
|
|
drop content that is present! Don't go there..
|
|
|
|
|
2013-04-26 03:44:55 +00:00
|
|
|
### difference: "inpreferreddir"
|
2013-04-25 21:28:25 +00:00
|
|
|
|
2013-04-26 03:44:55 +00:00
|
|
|
There's a special "inpreferreddir" keyword you can use in a
|
|
|
|
preferred content expression of a special remote. This means that the
|
|
|
|
content is preferred if it's in a directory (located anywhere in the tree)
|
|
|
|
with a special name.
|
2013-04-25 21:28:25 +00:00
|
|
|
|
|
|
|
The name of the directory can be configured using
|
2013-07-16 17:54:00 +00:00
|
|
|
`git annex enableremote $remote preferreddir=$dirname`
|
2013-04-26 03:44:55 +00:00
|
|
|
|
|
|
|
(If no directory name is configured, it uses "public" by default.)
|
2013-04-25 21:28:25 +00:00
|
|
|
|
2014-03-14 19:04:33 +00:00
|
|
|
### difference: "standard"
|
2013-04-25 16:23:36 +00:00
|
|
|
|
2014-03-14 19:04:33 +00:00
|
|
|
git-annex comes with some standard preferred content expressions, that
|
|
|
|
can be used with repositories that are in some pre-defined groups,
|
|
|
|
as listed in [[standard_groups]].
|
2013-03-31 21:10:25 +00:00
|
|
|
|
2014-03-14 19:04:33 +00:00
|
|
|
When a repository is in exactly one such group, you can use the "standard"
|
|
|
|
keyword in its preferred content expression, to match whatever content
|
|
|
|
the group preferrs to have. (If a repository is put into multiple standard
|
|
|
|
groups, "standard" will match anything.. so don't do that!)
|
2013-03-31 21:10:25 +00:00
|
|
|
|
2014-03-14 19:04:33 +00:00
|
|
|
Most often, the whole preferred content expression is simply "standard".
|
|
|
|
But, you can do more complicated things, for example:
|
|
|
|
"`standard or include=otherdir/*`"
|