Patterns are used to define groups for new entries; a group can be used to ignore the given entries, or to automatically set properties when the entry is taken on the entry list.
So the auto-props are assigned when the entry gets known; that happens for the add, prop-set or prop-del, and of course commit commands.
So, to override the auto-props of some new entry, just use the property commands.
FSVS
goes through your working copy it tries to find new (ie. not yet versioned) entries. Every new entry (and only new entries) gets tested (in the given order!) against the defined grouping patterns; if a pattern matches, the corresponding group is assigned to the entry, and no further matching is done.See also entry statii.
"ignore"
assigned, it will not be considered for versioning.This is the only really special group name.
Basically the "take"
group is an ordinary group like all others; it is just predefined, and available with a short-hand notation.
/proc
(see man 5 proc
), or possibly because of security reasons you don't want /etc/shadow
, /etc/sshd/ssh_host_*key
, and/or other password-containing files.Ignore patterns allow you to define which directory entries (files, subdirectories, devices, symlinks etc.) should be taken respectively ignored.
auto-props
feature of subversion; it allows automatically defining properties for new entries, or ignoring them, depending on various criteria.
For example you might want to use encryption for the files in your users' .ssh directory, to secure them against unauthorized access in the repository, and completely ignore the private key files:
Grouping patterns:
group:ignore,/home/*/.ssh/id*
group:encrypt,/home/*/.ssh/**
$FSVS_CONF/groups/encrypt
file would have a definition for the fsvs:commit-pipe
(see here).'#'
(comments) are ignored. ignore
or take
; if neither is specified, the group ignore
has ignore
as default (surprise, surprise!), and all others use take
. auto-prop property-name property-value
can be given; property-name may not include whitespace, as there's no parsing of any quote characters yet. An example:
# This is a comment # This is another auto-props fsvs:commit-pipe gpg -er admin@my.net # End of definition
[group:{name},][dir-only,][insens|nocase,][take,][mode:A:C,]pattern
These kinds of ignore patterns are available:
./
, just like a base-directory-relative path.
? , *
as well as character classes
[a-z] have their usual meaning, and **
is a wildcard for directory levels.
You can use a backslash \
outside of character classes to match usually special characters literally, eg. \*
within a pattern will match a literal asterisk character within a file or directory name. Within character classes all characters except ] are treated literally. If a literal
] should be included in a character class, it can be placed as the first character or also be escaped using a backslash.
Example for /
as the base-directory
./[oa]pt ./sys ./proc/* ./home/**~
This would ignore files and directories called apt
or opt
in the root directory (and files below, in the case of a directory), the directory /sys
and everything below, the contents of /proc
(but take the directory itself, so that upon restore it gets created as a mountpoint), and all entries matching *~
in and below /home
.
./sys
will match only a file or directory named sys
. If you want to exclude a directories' files, but not the directory itself, use something like ./dir/*
or ./dir/**
./
prefix the full path, starting with /
, is used.
/etc/**.dpkg-old /etc/**.dpkg-bak /**.bak /**~
The advantage of using full paths is that a later dump
and load
in another working copy (eg. when moving from versioning /etc
to /
) does simply work; the patterns don't have to be modified.
Internally this simply tries to remove the working copy base directory at the start of the patterns; then they are processed as usually.
If a pattern does not match the wc base, and neither has the wild-wildcard prefix /**
, a warning is issued; this can be handled as usual.
man pcre
(if the manpages are installed), and/or perldoc perlre
(if perldoc is installed)
These patterns have the form PCRE:{pattern}
(with PCRE
in uppercase, to distinguish from modifiers).
An example:
PCRE:./home/.*~
./home/**~
.Another example:
PCRE:./home/[a-s]
This would match /home/anthony
, /home/guest
, /home/somebody
and so on, but would not match /home/theodore
.
Note that the pathnames start with ./ , just like above, and that the patterns are anchored at the beginning. To additionally anchor at the end you could use a
$
at the end.
DEVICE:[<|<=|>|>=]major[:minor]
.
This takes advantage of the major and minor numbers of inodes (see man 1 stat
and man 2 stat
).
The rule is as follows:
This is because the mount-point (ie. the directory, where the other filesystem gets attached) should be versioned (as it's needed after restore), but all entries (and all binding mounts) should not.
The possible options <=
or >=
define a less-or-equal-than respective bigger-or-equal-than relationship, to ignore a set of device classes.
Examples:
tDEVICE:3 ./*
DEVICE:0
proc
, sysfs
, devpts
, etc.; see /proc/filesystems
, the lines with nodev
).Mind NFS and smb-mounts, check if you're using md , lvm and/or device-mapper !
Note: The values are parsed with strtoul()
, so you can use decimal, hexadecimal (with 0x
prepended) and octal (with 0
prepended) notation.
INODE:major:minor:inode
","
as separators; not all combinations make sense.samba
to access files.m:and_value:compare_value
, like m:04:00
; the following examples give only the numbers.
As an example: the file has mode 0750
; a specification of
0700:0700
matches, and 0007:0007
doesn't match.
A real-world example: 0007:0000
would match all entries that have no right bits set for "others", and could be used to exclude private files (like /etc/shadow
). (Alternatively, the others-read bit could be used: 0004:0000
.
FSVS will give an error for invalid specifications, ie. ones that can never match; an example would be 0700:0007
.
For patterns with the m
(mode match) and d
(dironly) modifiers the filename pattern gets optional; so you don't have to give an all-match wildcard pattern (./**
) for these cases.
t,d,./var/vmail/** t./var/vmail/**/.*.sieve ./var/vmail/**
".*.sieve"
files (or directories) below /var/vmail
, in all depths, and all directories there; but no other files.If your files are at a certain depth, and you don't want all other directories taken, too, you can specify that exactly:
td./var/vmail/* td./var/vmail/*/* t./var/vmail/*/*/.*.sieve ./var/vmail/**
m:04:0 t,./etc/ ./**
/etc
, but ignoring the files that are not world-readable (other-read
bit cleared).