diff options
| -rw-r--r-- | .gitignore | 18 | ||||
| -rw-r--r-- | README.md | 44 | ||||
| -rw-r--r-- | justfile | 72 | ||||
| -rw-r--r-- | logo.png | bin | 0 -> 565070 bytes | |||
| -rw-r--r-- | unison-manual.txt | 3053 | ||||
| -rw-r--r-- | unison-profile.prf | 52 |
6 files changed, 3239 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f2aa348 --- /dev/null +++ b/.gitignore @@ -0,0 +1,18 @@ +# Private configuration - don't commit +rclone.conf + +# Generated files - don't commit +.unison/ +*.log + +# macOS +.DS_Store + +# Windows +Thumbs.db + +# Temporary files +*.tmp +*.swp +*.swo + diff --git a/README.md b/README.md new file mode 100644 index 0000000..40d53af --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# usync + +<img src="logo.png" width="120" markdown="1"> + +Sync any two paths with cloud backup. + +## Setup + +```bash +git clone <repo> && cd usync +just install-deps +# Edit justfile: set SOURCE and TARGET paths +rclone config +just setup +``` + +## Use + +```bash +just sync-paths # Between paths +just sync-cloud # To cloud +just status # Check +``` + +## Structure + +``` +SOURCE/usync/ # Your files +TARGET/usync/ # Copy +cloud:/usync/ # Backup +``` + +## Commands + +- `setup` - Create directories +- `check` - Verify paths +- `sync-paths` - Fast sync (unison) +- `sync-cloud` - Cloud backup (rclone) +- `status` - Show state + +## Files + +- `justfile` - Set SOURCE and TARGET paths +- `unison-profile.prf` - Sync settings diff --git a/justfile b/justfile new file mode 100644 index 0000000..84b9380 --- /dev/null +++ b/justfile @@ -0,0 +1,72 @@ +# Path synchronization - Core recipes + +# CONFIGURE THESE FOR YOUR SETUP: +SOURCE := "/path/to/source" # Primary location (source for cloud backup) +TARGET := "/path/to/target" # Secondary location + +# Cloud backup configuration +CLOUD_REMOTE := "your-cloud-remote" # Any rclone remote +CLOUD_PATH := "/usync" # Path in cloud storage +CLOUD_MOUNT_PATH := "~/cloud-mount" # Local mount point (default: home directory) + +# Install dependencies for openSUSE +install-deps: + sudo zypper install -y rclone unison + +# Fast sync between paths (unison) +sync-paths: + unison -ui text paths + +# Slow sync to cloud storage (from source) +sync-cloud: check-rclone mount-cloud + rclone sync -P --checkers 32 --transfers 32 --buffer-size 128M --retries 3 --order-by 'size,ascending' {{SOURCE}}/usync {{CLOUD_REMOTE}}:{{CLOUD_PATH}} + just unmount-cloud + +# Dry run to cloud (safety check) +sync-cloud-dry: check-rclone mount-cloud + rclone sync -P --checkers 32 --transfers 32 --buffer-size 128M --retries 3 --order-by 'size,ascending' --dry-run {{SOURCE}}/usync {{CLOUD_REMOTE}}:{{CLOUD_PATH}} + just unmount-cloud + +# Mount management (uses configurable mount point) +mount-cloud: + @mountpoint {{CLOUD_MOUNT_PATH}} 2>/dev/null && echo "Cloud storage already mounted" || (mkdir -p {{CLOUD_MOUNT_PATH}} && rclone mount {{CLOUD_REMOTE}}: --vfs-cache-mode full --daemon {{CLOUD_MOUNT_PATH}} && echo "✓ Cloud storage mounted at {{CLOUD_MOUNT_PATH}}") + +unmount-cloud: + fusermount -u {{CLOUD_MOUNT_PATH}} + +# Verify rclone remote exists +check-rclone: + @rclone config show {{CLOUD_REMOTE}} >/dev/null 2>&1 || (echo "Error: rclone remote '{{CLOUD_REMOTE}}' not found. Run 'rclone config' first." && exit 1) + @echo "✓ rclone remote '{{CLOUD_REMOTE}}' configured" + +# Verify both paths are accessible +check: + @test -d {{SOURCE}} || (echo "Source path not found: {{SOURCE}}" && exit 1) + @test -d {{TARGET}} || (echo "Target path not found: {{TARGET}}" && exit 1) + @echo "✓ Both paths accessible" + @test -w {{SOURCE}} || (echo "Source path not writable" && exit 1) + @test -w {{TARGET}} || (echo "Target path not writable" && exit 1) + @echo "✓ Both paths writable" + +# Create usync directories if they don't exist +setup: + @mkdir -p {{SOURCE}}/usync {{TARGET}}/usync + @echo "✓ Usync directories created" + @just create-unison-profile + +# Create unison profile for non-interactive syncing +create-unison-profile: + @mkdir -p ~/.unison + @sed -e "s|TEMPLATE_SOURCE|{{SOURCE}}|g" -e "s|TEMPLATE_TARGET|{{TARGET}}|g" -e "s|TEMPLATE_HOME_DIR|$(echo $HOME)|g" unison-profile.prf > ~/.unison/paths.prf + @echo "✓ Unison profile created at ~/.unison/paths.prf" + +# Status check (default) +status: + @echo "=== Path Status ===" + @echo "Source path: $(test -d {{SOURCE}}/usync && echo "$(ls -1 {{SOURCE}}/usync/ 2>/dev/null | wc -l) folders, $(du -sh {{SOURCE}}/usync 2>/dev/null | cut -f1)" || echo "missing")" + @echo "Target path: $(test -d {{TARGET}}/usync && echo "$(ls -1 {{TARGET}}/usync/ 2>/dev/null | wc -l) folders, $(du -sh {{TARGET}}/usync 2>/dev/null | cut -f1)" || echo "missing")" + @echo "Cloud storage ({{CLOUD_REMOTE}}): $(mountpoint {{CLOUD_MOUNT_PATH}} >/dev/null 2>&1 && echo "mounted" || echo "not mounted")" + @echo "Unison profile: $(test -f ~/.unison/paths.prf && echo "exists" || echo "missing")" + +default: + just status
\ No newline at end of file diff --git a/logo.png b/logo.png Binary files differnew file mode 100644 index 0000000..a4fff71 --- /dev/null +++ b/logo.png diff --git a/unison-manual.txt b/unison-manual.txt new file mode 100644 index 0000000..a5c5634 --- /dev/null +++ b/unison-manual.txt @@ -0,0 +1,3053 @@ + +Unison File Synchronizer +Version 2.53.3 + +Overview + + Unison is a file-synchronization tool for Unix and Windows. It allows + two replicas of a collection of files and directories to be stored on + different hosts (or different disks on the same host), modified + separately, and then brought up to date by propagating the changes in + each replica to the other. + + Unison shares a number of features with tools such as configuration + management packages (CVS (http://www.cyclic.com/), PRCS + (http://www.XCF.Berkeley.EDU/~jmacd/prcs.html), etc.), distributed + filesystems (Coda (http://www.coda.cs.cmu.edu/), etc.), uni-directional + mirroring utilities (rsync (http://samba.anu.edu.au/rsync/), etc.), and + other synchronizers (Intellisync (http://www.pumatech.com), Reconcile + (http://www.merl.com/reports/TR99-14/), etc). However, there are + several points where it differs: + * Unison runs on both Windows (95, 98, NT, 2k, and XP) and Unix (OSX, + Solaris, Linux, etc.) systems. Moreover, Unison works across + platforms, allowing you to synchronize a Windows laptop with a Unix + server, for example. + * Unlike a distributed filesystem, Unison is a user-level program: + there is no need to modify the kernel or to have superuser + privileges on either host. + * Unlike simple mirroring or backup utilities, Unison can deal with + updates to both replicas of a distributed directory structure. + Updates that do not conflict are propagated automatically. + Conflicting updates are detected and displayed. + * Unison works between any pair of machines connected to the + internet, communicating over either a direct socket link or + tunneling over an encrypted ssh connection. It is careful with + network bandwidth, and runs well over slow links such as PPP + connections. Transfers of small updates to large files are + optimized using a compression protocol similar to rsync. + * Unison has a clear and precise specification, described below. + * Unison is resilient to failure. It is careful to leave the replicas + and its own private structures in a sensible state at all times, + even in case of abnormal termination or communication failures. + * Unison is free; full source code is available under the GNU Public + License. + +Preface + + +People + + Benjamin Pierce (http://www.cis.upenn.edu/~bcpierce/) leads the Unison + project. The current version of Unison was designed and implemented by + Trevor Jim (http://www.research.att.com/~trevor/), Benjamin Pierce + (http://www.cis.upenn.edu/~bcpierce/), and Jérôme Vouillon + (http://www.pps.jussieu.fr/~vouillon/), with Alan Schmitt + (http://alan.petitepomme.net/), Malo Denielou, Zhe Yang + (http://www.brics.dk/~zheyang/), Sylvain Gommier, and Matthieu Goulay. + The Mac user interface was started by Trevor Jim and enormously + improved by Ben Willmore. Our implementation of the rsync + (http://samba.org/rsync/) protocol was built by Norman Ramsey + (http://www.eecs.harvard.edu/~nr/) and Sylvain Gommier. It is based on + Andrew Tridgell (http://samba.anu.edu.au/~tridge/)’s thesis work + (http://samba.anu.edu.au/~tridge/phd_thesis.pdf) and inspired by his + rsync (http://samba.org/rsync/) utility. The mirroring and merging + functionality was implemented by Sylvain Roy, improved by Malo + Denielou, and improved yet further by Stéphane Lescuyer. Jacques + Garrigue (http://wwwfun.kurims.kyoto-u.ac.jp/~garrigue/) contributed + the original Gtk version of the user interface; the Gtk2 version was + built by Stephen Tse. Sundar Balasubramaniam helped build a prototype + implementation of an earlier synchronizer in Java. Insik Shin + (http://www.cis.upenn.edu/~ishin/) and Insup Lee + (http://www.cis.upenn.edu/~lee/) contributed design ideas to this + implementation. Cedric Fournet + (http://research.microsoft.com/~fournet/) contributed to an even + earlier prototype. + + +Obtaining Unison + +Source code + + Unison is primarily distributed as source code, which contains + instructions in INSTALL.md: + + https://github.com/bcpierce00/unison + +Binaries + + The Unison wiki contains information about builds done as part of + Continuous Integration and other sources of binaries; read the entire + wiki at: + + https://github.com/bcpierce00/unison/wiki + + +Community, Maintenance, and Development + + Many people use and contribute to Unison. This community has two main + homes. + +Mailinglists + + Most discussion is appropriate on one of the mailinglists: + + https://github.com/bcpierce00/unison/wiki/Mailing-Lists + +Reporting Bugs + + Bug reports and feature requests may be made after reading the + guidelines: + + https://github.com/bcpierce00/unison/wiki/Reporting-Bugs-and-Feature + -Requests + + Help improving Unison is welcome; see CONTRIBUTING.md in the sources. + + +Copying + + This file is part of Unison. + + Unison is free software: you can redistribute it and/or modify it under + the terms of the GNU General Public License as published by the Free + Software Foundation, either version 3 of the License, or (at your + option) any later version. + + Unison is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + The GNU General Public License can be found at + http://www.gnu.org/licenses. A copy is also included in the Unison + source distribution in the file COPYING. + + +Acknowledgements + + Work on Unison has been supported by the National Science Foundation + under grants CCR-9701826 and ITR-0113226, Principles and Practice of + Synchronization, and by University of Pennsylvania’s Institute for + Research in Cognitive Science (IRCS). + +Upgrading + + (This section is perhaps misplaced, but is early because it is far + better to have at least skimmed it than to not know it exists.) + + Before upgrading, it is a good idea to run the old version one last + time, to make sure all your replicas are completely synchronized. A new + version of Unison will sometimes introduce a different format for the + archive files used to remember information about the previous state of + the replicas. In this case, the old archive will be ignored (not + deleted — if you roll back to the previous version of Unison, you will + find the old archives intact), which means that any differences between + the replicas will show up as conflicts that need to be resolved + manually. + + As of version 2.52, Unison has a degree of backward and forward + compatibility. This means three things. First, it is possible for local + and remote machines to run a different version of Unison. Second, it is + possible for local and remote machines to run a version (same or + different) of Unison built with a different version of OCaml compiler + (this has been problematic historically). Lastly, it is possible to + upgrade Unison on the local machine (compiled with any OCaml version) + and keep the existing archive. + + If version interoperability requirements are followed then Unison 2.52 + and newer can upgrade the archive created by earlier Unison versions. + To avoid rebuilding archive files when upgrading from a version older + than 2.52, you must install version 2.52 or newer built with the same + OCaml version as your previous version of Unison, and then run it at + least once on each root. Doing so will upgrade the archive file. + + After upgrading the archive, you are free to swap the Unison 2.52 or + newer executable to one compiled with a different version of OCaml. The + archive file is no longer dependent on the compiler version. + +Version interoperability + + To ensure interoperability with different Unison versions on local and + remote machines, and to upgrade from an earlier version without + rebuilding the archive files, you have to remember these guidelines. + Upgrading from an incompatible version, while possible and normal, will + require fully scanning both roots, which can be time-consuming with big + replicas. + + Unison 2.52 and newer are compatible with: + * Unison 2.52 or newer (for as long as backwards compatibility is + maintained in the newer versions). You do not have to pay any + attention to OCaml compiler versions. + * Unison 2.51 if both versions are compiled with same OCaml compiler + version (you can see which compiler version was used by running + unison -version). + * Unison 2.48 if both versions are compiled with same OCaml compiler + version. See special notes below. + + Interoperability matrix for quick reference: + + Client versions Server versions + 2.52 or newer 2.51 2.48 + 2.52 or newer full interop same OCaml version same OCaml version + 2.51 same OCaml version full interop no interop + 2.48 same OCaml version* no interop full interop + + Special notes for Unison 2.48: + * Unison 2.48 does not show which OCaml compiler was used to compile + it. If you do not have the option of re-compiling the 2.48 version, + you have two alternatives. First (and most likely to succeed), see + what is the version of the OCaml compiler in the same package + repository where you installed Unison 2.48 from, then use Unison + 2.52 compiled with that version. Second, you can just try Unison + 2.52 executables compiled with different OCaml versions and see + which one works with your copy of Unison 2.48. + * When running Unison 2.48 on the client machine with Unison 2.52 or + newer on the server machine, you have to do some additional + configuration. The Unison executable name on the server must start + with unison-2.48 (just unison-2.48 is ok, as is unison-2.48.exe, + but also unison-2.48+ocaml-4.05). If using TCP socket connection to + the server then you’re all set! If using ssh then you have to add + one of the following options to your profile or as a command-line + argument on the client machine: -addversionno; see the section + “Remote Usage” , or -servercmd; see the section “Remote Shell + Method” . + + +Tutorial + +Preliminaries + + Unison can be used with either of two user interfaces: + 1. a textual interface and + 2. a graphical interface + + The textual interface is more convenient for running from scripts and + works on dumb terminals; the graphical interface is better for most + interactive use. For this tutorial, you can use either. If you are + running Unison from the command line, just typing unison will select + either the text or the graphical interface, depending on which has been + selected as default when the executable you are running was built. You + can force the text interface even if graphical is the default by adding + -ui text. The other command-line arguments to both versions are + identical. + + The graphical version can also be run directly by clicking on its icon. + For this tutorial, we assume that you’re starting it from the command + line. + + Unison can synchronize files and directories on a single machine, or + between two machines on a network. (The same program runs on both + machines; the only difference is which one is responsible for + displaying the user interface.) If you’re only interested in a + single-machine setup, then let’s call that machine the CLIENT . If + you’re synchronizing two machines, let’s call them CLIENT and SERVER . + +Local Usage + + Let’s get the client machine set up first and see how to synchronize + two directories on a single machine. + + Ensure that unison is installed on your system. + + Create a small test directory a.tmp containing a couple of files and/or + subdirectories, e.g., + mkdir a.tmp + touch a.tmp/a a.tmp/b + mkdir a.tmp/d + touch a.tmp/d/f + + Copy this directory to b.tmp: + cp -r a.tmp b.tmp + + Now try synchronizing a.tmp and b.tmp. (Since they are identical, + synchronizing them won’t propagate any changes, but Unison will + remember the current state of both directories so that it will be able + to tell next time what has changed.) Type: + unison a.tmp b.tmp + + (You may need to add -ui text, depending how your unison binary was + built.) + + Textual Interface: + * You should see a message notifying you that all the files are + actually equal and then get returned to the command line. + + Graphical Interface: + * You should get a big empty window with a message at the bottom + notifying you that all files are identical. Choose the Exit item + from the File menu to get back to the command line. + + Next, make some changes in a.tmp and/or b.tmp. For example: + rm a.tmp/a + echo "Hello" > a.tmp/b + echo "Hello" > b.tmp/b + date > b.tmp/c + echo "Hi there" > a.tmp/d/h + echo "Hello there" > b.tmp/d/h + + Run Unison again: + unison a.tmp b.tmp + + This time, the user interface will display only the files that have + changed. If a file has been modified in just one replica, then it will + be displayed with an arrow indicating the direction that the change + needs to be propagated. For example, + <--- new file c [f] + + indicates that the file c has been modified only in the second replica, + and that the default action is therefore to propagate the new version + to the first replica. To follow Unison’s recommendation, press the “f” + at the prompt. + + If both replicas are modified and their contents are different, then + the changes are in conflict: <-?-> is displayed to indicate that Unison + needs guidance on which replica should override the other. + new file <-?-> new file d/h [] + + By default, neither version will be propagated and both replicas will + remain as they are. + + If both replicas have been modified but their new contents are the same + (as with the file b), then no propagation is necessary and nothing is + shown. Unison simply notes that the file is up to date. + + These display conventions are used by both versions of the user + interface. The only difference lies in the way in which Unison’s + default actions are either accepted or overridden by the user. + + Textual Interface: + * The status of each modified file is displayed, in turn. When the + copies of a file in the two replicas are not identical, the user + interface will ask for instructions as to how to propagate the + change. If some default action is indicated (by an arrow), you can + simply press Return to go on to the next changed file. If you want + to do something different with this file, press “<” or “>” to force + the change to be propagated from right to left or from left to + right, or else press “/” to skip this file and leave both replicas + alone. When it reaches the end of the list of modified files, + Unison will ask you one more time whether it should proceed with + the updates that have been selected. + When Unison stops to wait for input from the user, pressing “?” + will always give a list of possible responses and their meanings. + + Graphical Interface: + * The main window shows all the files that have been modified in + either a.tmp or b.tmp. To override a default action (or to select + an action in the case when there is no default), first select the + file, either by clicking on its name or by using the up- and + down-arrow keys. Then press either the left-arrow or “<” key (to + cause the version in b.tmp to propagate to a.tmp) or the + right-arrow or “>” key (which makes the a.tmp version override + b.tmp). + Every keyboard command can also be invoked from the menus at the + top of the user interface. (Conversely, each menu item is annotated + with its keyboard equivalent, if it has one.) + When you are satisfied with the directions for the propagation of + changes as shown in the main window, click the “Go” button to set + them in motion. A check sign will be displayed next to each + filename when the file has been dealt with. + +Remote Usage + + Next, we’ll get Unison set up to synchronize replicas on two different + machines. + + NB: Unison has not been designed to run with elevated privileges (e.g. + setuid), and it has not been audited for that environment. Therefore + Unison should be run with the userid of the owner of the files to be + synchronized, and should never be run setuid or similar. (Problems + encountered when running setuid etc. must be reproduced without setuid + before being reported as bugs.) + + Follow the instructions in the Installation section to download or + build an executable version of Unison on the server machine, and + install it somewhere on your search path. (It doesn’t matter whether + you install the textual or graphical version, since the copy of Unison + on the server doesn’t need to display any user interface at all.) + + It is important that the version of Unison installed on the server + machine is the same as the version of Unison on the client machine. But + some flexibility on the version of Unison at the client side can be + achieved by using the -addversionno option; see the section + “Preferences” . + + Now there is a decision to be made. Unison provides two methods for + communicating between the client and the server: + * Remote shell method: To use this method, you must have some way of + invoking remote commands on the server from the client’s command + line, using a facility such as ssh. This method is more convenient + (since there is no need to manually start a “unison server” process + on the server) and also more secure, assuming you are using ssh). + * TCP socket method: This method requires only that you can get TCP + packets from the client to the server and back. It is insecure and + should not be used. + * Unix socket method: This method only works within a single machine. + It is similar to the TCP sockets method, but it is possible to + configure it securely. + + Decide which of these you want to try, and continue with the section + “Remote Shell Method” or the section “Socket Method” , as appropriate. + +Remote Shell Method + + The standard remote shell facility on Unix systems is ssh. + + Running ssh requires some coordination between the client and server + machines to establish that the client is allowed to invoke commands on + the server; please refer to the ssh documentation for information on + how to set this up. + + First, test that we can invoke Unison on the server from the client. + Typing + ssh remotehostname unison -version + + should print the same version information as running + unison -version + + locally on the client. If remote execution fails, then either something + is wrong with your ssh setup (e.g., “permission denied”) or else the + search path that’s being used when executing commands on the server + doesn’t contain the unison executable (e.g., “command not found”). + + Create a test directory a.tmp in your home directory on the client + machine. + + Test that the local unison client can start and connect to the remote + server. Type + unison -testServer a.tmp ssh://remotehostname/a.tmp + + Now cd to your home directory and type: + unison a.tmp ssh://remotehostname/a.tmp + + The result should be that the entire directory a.tmp is propagated from + the client to your home directory on the server. + + After finishing the first synchronization, change a few files and try + synchronizing again. You should see similar results as in the local + case. + + If your user name on the server is not the same as on the client, you + need to specify it on the command line: + unison a.tmp ssh://username@remotehostname/a.tmp + + Notes: + * If you want to put a.tmp some place other than your home directory + on the remote host, you can give an absolute path for it by adding + an extra slash between remotehostname and the beginning of the + path: + unison a.tmp ssh://remotehostname//absolute/path/to/a.tmp + + * You can give an explicit path for the unison executable on the + server by using the command-line option "-servercmd + /full/path/name/of/unison" or adding + "servercmd=/full/path/name/of/unison" to your profile (see the + section “Profiles” ). Similarly, you can specify an explicit path + for the ssh program using the "-sshcmd" option. Extra arguments can + be passed to ssh by setting the -sshargs preference. + * By leveraging "-sshcmd" and "-sshargs", you can effectively use any + remote shell program, not just ssh; just remember that the roots + are still specified with ssh as the protocol, that is, they have to + start with "ssh://". + +Socket Method + + To run Unison over a socket connection, you must start a Unison daemon + process on the server. This process runs continuously, waiting for + connections over a given socket from client machines running Unison and + processing their requests in turn. + + Since the socket method is not used by many people, its functionality + is rather limited. For example, the server can only deal with one + client at a time. + + Note that the Unison daemon process is always started with a + command-line argument; not from a profile. + +TCP Sockets + + Warning: The TCP socket method is insecure: not only are the texts + of your changes transmitted over the network in unprotected form, it + is also possible for anyone in the world to connect to the server + process and read out the contents of your filesystem! (Of course, to + do this they must understand the protocol that Unison uses to + communicate between client and server, but all they need for this is + a copy of the Unison sources.) The socket method is provided only + for expert users with specific needs; everyone else should use the + ssh method. + + To start the daemon for connections over a TCP socket, type + unison -socket NNNN + + on the server machine, where NNNN is the TCP port number that the + daemon should listen on for connections from clients. (NNNN can be any + large number that is not being used by some other program; if NNNN is + already in use, Unison will exit with an error message.) + + Create a test directory a.tmp in your home directory on the client + machine. Now type: + unison a.tmp socket://remotehostname:NNNN/a.tmp + + Note that paths specified by the client will be interpreted relative to + the directory in which you start the server process; this behavior is + different from the ssh case, where the path is relative to your home + directory on the server. The result should be that the entire directory + a.tmp is propagated from the client to the server (a.tmp will be + created on the server in the directory that the server was started + from). After finishing the first synchronization, change a few files + and try synchronizing again. You should see similar results as in the + local case. + + By default Unison will listen for incoming connections on all + interfaces. If you want to limit this to certain interfaces or + addresses then you can use the -listen command-line argument, + specifying a host name or an IP address to listen on. -listen can be + given multiple times to listen on several addresses. + +Unix Domain Sockets + + To start the daemon for connections over a Unix domain socket, type + unison -socket PPPP + + where PPPP is the path to a Unix socket that the daemon should open for + connections from clients. (PPPP can be any absolute or relative path + the server process has access to but it must not exist yet; the socket + is created at that path when the daemon process is started.) You are + responsible for securing access to the socket path. For example, this + can be done by controlling the permissions of socket’s parent + directory, or ensuring a restrictive umask value when starting Unison. + + Clients can connect to a server over a Unix domain socket by specifying + the absolute or relative path to the socket, instead of a server + address and port number: + unison a.tmp socket://{path/to/unix/socket}/a.tmp + + (socket path is enclosed in curly braces). + + Note that Unix domain sockets are local sockets (they exist in the + filesystem namespace). One could use Unixs socket remotely, by + forwarding access to the socket by other means, for example by using + spiped secure pipe daemon. + +Using Unison for All Your Files + + Once you are comfortable with the basic operation of Unison, you may + find yourself wanting to use it regularly to synchronize your commonly + used files. There are several possible ways of going about this: + 1. Synchronize your whole home directory, using the Ignore facility + (see the section “Ignoring Paths” ) to avoid synchronizing + temporary files and things that only belong on one host. + 2. Create a subdirectory called shared (or current, or whatever) in + your home directory on each host, and put all the files you want to + synchronize into this directory. + 3. Create a subdirectory called shared (or current, or whatever) in + your home directory on each host, and put links to all the files + you want to synchronize into this directory. Use the follow + preference (see the section “Symbolic Links” ) to make Unison treat + these links as transparent. + 4. Make your home directory the root of the synchronization, but tell + Unison to synchronize only some of the files and subdirectories + within it on any given run. This can be accomplished by using the + -path switch on the command line: + unison /home/username ssh://remotehost//home/username -path shared + + The -path option can be used as many times as needed, to + synchronize several files or subdirectories: + unison /home/username ssh://remotehost//home/username \ + -path shared \ + -path pub \ + -path .netscape/bookmarks.html + + These -path arguments can also be put in your preference file. See + the section “Preferences” for an example. + + Most people find that they only need to maintain a profile (or + profiles) on one of the hosts that they synchronize, since Unison is + always initiated from this host. (For example, if you’re synchronizing + a laptop with a fileserver, you’ll probably always run Unison on the + laptop.) This is a bit different from the usual situation with + asymmetric mirroring programs like rdist, where the mirroring operation + typically needs to be initiated from the machine with the most recent + changes. the section “Profiles” covers the syntax of Unison profiles, + together with some sample profiles. + + Some tips on improving Unison’s performance can be found on the + Frequently Asked Questions page + (http://www.cis.upenn.edu/~bcpierce/unison/faq.html). + +Using Unison to Synchronize More Than Two Machines + + Unison is designed for synchronizing pairs of replicas. However, it is + possible to use it to keep larger groups of machines in sync by + performing multiple pairwise synchronizations. + + If you need to do this, the most reliable way to set things up is to + organize the machines into a “star topology,” with one machine + designated as the “hub” and the rest as “spokes,” and with each spoke + machine synchronizing only with the hub. The big advantage of the star + topology is that it eliminates the possibility of confusing “spurious + conflicts” arising from the fact that a separate archive is maintained + by Unison for every pair of hosts that it synchronizes. + +Going Further + + On-line documentation for the various features of Unison can be + obtained either by typing + unison -doc topics + + at the command line, or by selecting the Help menu in the graphical + user interface. The same information is also available in a typeset + User’s Manual (HTML or PostScript format) through + http://www.cis.upenn.edu/~bcpierce/unison. + + If you use Unison regularly, you should subscribe to one of the mailing + lists, to receive announcements of new versions. See the section + “Obtaining Unison” . + + +Basic Concepts + + To understand how Unison works, it is necessary to discuss a few + straightforward concepts. + + These concepts are developed more rigorously and at more length in a + number of papers, available at + http://www.cis.upenn.edu/~bcpierce/papers. But the informal + presentation here should be enough for most users. + +Roots + + A replica’s root tells Unison where to find a set of files to be + synchronized, either on the local machine or on a remote host. For + example, + relative/path/of/root + + specifies a local root relative to the directory where Unison is + started, while + /absolute/path/of/root + + specifies a root relative to the top of the local filesystem, + independent of where Unison is running. Remote roots can begin with + ssh:// to indicate that the remote server should be started with ssh: + ssh://remotehost//absolute/path/of/root + ssh://user@remotehost/relative/path/of/root + + If the remote server is already running (in the socket mode), then the + syntax + socket://remotehost:portnum//absolute/path/of/root + socket://remotehost:portnum/relative/path/of/root + socket://[IPv6literal]:portnum/path + + is used to specify the hostname and the port that the client Unison + should use to contact it. Syntax + socket://{path/of/socket}//absolute/path/of/root + socket://{path/of/socket}/relative/path/of/root + + is used to specify the Unix domain socket the client Unison should use + to contact the server. + + The syntax for roots is based on that of URIs (described in RFC 2396). + The full grammar is: + replica ::= [protocol:]//[user@][host][:port][/path] + | path + + protocol ::= file + | socket + | ssh + + user ::= [-_a-zA-Z0-9]+ + + host ::= [-_a-zA-Z0-9.]+ + | \[ [a-f0-9:.]+ zone? \] IPv6 literals (no future format). + | { [^}]+ } For Unix domain sockets only. + + zone ::= %[-_a-zA-Z0-9~%.]+ + + port ::= [0-9]+ + + When path is given without any protocol prefix, the protocol is assumed + to be file:. Under Windows, it is possible to synchronize with a remote + directory using the file: protocol over the Windows Network + Neighborhood. For example, + unison foo //host/drive/bar + + synchronizes the local directory foo with the directory drive:\bar on + the machine host, provided that host is accessible via Network + Neighborhood. When the file: protocol is used in this way, there is no + need for a Unison server to be running on the remote host. However, + running Unison this way is only a good idea if the remote host is + reached by a very fast network connection, since the full contents of + every file in the remote replica will have to be transferred to the + local machine to detect updates. + + The names of roots are canonized by Unison before it uses them to + compute the names of the corresponding archive files, so + //saul//home/bcpierce/common and //saul.cis.upenn.edu/common will be + recognized as the same replica under different names. + +Paths + + A path refers to a point within a set of files being synchronized; it + is specified relative to the root of the replica. + + Formally, a path is just a sequence of names, separated by /. Note that + the path separator character is always a forward slash, no matter what + operating system Unison is running on. Forward slashes are converted to + backslashes as necessary when paths are converted to filenames in the + local filesystem on a particular host. (For example, suppose that we + run Unison on a Windows system, synchronizing the local root c:\pierce + with the root ssh://saul.cis.upenn.edu/home/bcpierce on a Unix server. + Then the path current/todo.txt refers to the file + c:\pierce\current\todo.txt on the client and + /home/bcpierce/current/todo.txt on the server.) + + The empty path (i.e., the empty sequence of names) denotes the whole + replica. Unison displays the empty path as “[root].” + + If p is a path and q is a path beginning with p, then q is said to be a + descendant of p. (Each path is also a descendant of itself.) + +What is an Update? + + The contents of a path p in a particular replica could be a file, a + directory, a symbolic link, or absent (if p does not refer to anything + at all in that replica). More specifically: + * If p refers to an ordinary file, then the contents of p are the + actual contents of this file (a string of bytes) plus the current + permission bits of the file. + * If p refers to a symbolic link, then the contents of p are just the + string specifying where the link points. + * If p refers to a directory, then the contents of p are just the + token “DIRECTORY” plus the current permission bits of the + directory. + * If p does not refer to anything in this replica, then the contents + of p are the token “ABSENT.” + + Unison keeps a record of the contents of each path after each + successful synchronization of that path (i.e., it remembers the + contents at the last moment when they were the same in the two + replicas). + + We say that a path is updated (in some replica) if its current contents + are different from its contents the last time it was successfully + synchronized. Note that whether a path is updated has nothing to do + with its last modification time—Unison considers only the contents when + determining whether an update has occurred. This means that touching a + file without changing its contents will not be recognized as an update. + A file can even be changed several times and then changed back to its + original contents; as long as Unison is only run at the end of this + process, no update will be recognized. + + What Unison actually calculates is a close approximation to this + definition; see the section “Caveats and Shortcomings” . + +What is a Conflict? + + A path is said to be conflicting if the following conditions all hold: + 1. it has been updated in one replica, + 2. it or any of its descendants has been updated in the other replica, + and + 3. its contents in the two replicas are not identical. + +Reconciliation + + Unison operates in several distinct stages: + 1. On each host, it compares its archive file (which records the state + of each path in the replica when it was last synchronized) with the + current contents of the replica, to determine which paths have been + updated. + 2. It checks for “false conflicts” — paths that have been updated on + both replicas, but whose current values are identical. These paths + are silently marked as synchronized in the archive files in both + replicas. + 3. It displays all the updated paths to the user. For updates that do + not conflict, it suggests a default action (propagating the new + contents from the updated replica to the other). Conflicting + updates are just displayed. The user is given an opportunity to + examine the current state of affairs, change the default actions + for nonconflicting updates, and choose actions for conflicting + updates. + 4. It performs the selected actions, one at a time. Each action is + performed by first transferring the new contents to a temporary + file on the receiving host, then atomically moving them into place. + 5. It updates its archive files to reflect the new state of the + replicas. + + +Invariants + + Given the importance and delicacy of the job that it performs, it is + important to understand both what a synchronizer does under normal + conditions and what can happen under unusual conditions such as system + crashes and communication failures. + + Unison is careful to protect both its internal state and the state of + the replicas at every point in this process. Specifically, the + following guarantees are enforced: + * At every moment, each path in each replica has either (1) its + original contents (i.e., no change at all has been made to this + path), or (2) its correct final contents (i.e., the value that the + user expected to be propagated from the other replica). + * At every moment, the information stored on disk about Unison’s + private state can be either (1) unchanged, or (2) updated to + reflect those paths that have been successfully synchronized. + + The upshot is that it is safe to interrupt Unison at any time, either + manually or accidentally. [Caveat: the above is almost true there are + occasionally brief periods where it is not (and, because of shortcoming + of the Posix filesystem API, cannot be); in particular, when it is + copying a file onto a directory or vice versa, it must first move the + original contents out of the way. If Unison gets interrupted during one + of these periods, some manual cleanup may be required. In this case, a + file called DANGER.README will be left in the .unison directory, + containing information about the operation that was interrupted. The + next time you try to run Unison, it will notice this file and warn you + about it.] + + If an interruption happens while it is propagating updates, then there + may be some paths for which an update has been propagated but which + have not been marked as synchronized in Unison’s archives. This is no + problem: the next time Unison runs, it will detect changes to these + paths in both replicas, notice that the contents are now equal, and + mark the paths as successfully updated when it writes back its private + state at the end of this run. + + If Unison is interrupted, it may sometimes leave temporary working + files (with suffix .tmp) in the replicas. It is safe to delete these + files. Also, if the backups flag is set, Unison will leave around old + versions of files that it overwrites, with names like + file.0.unison.bak. These can be deleted safely when they are no longer + wanted. + + Unison is not bothered by clock skew between the different hosts on + which it is running. It only performs comparisons between timestamps + obtained from the same host, and the only assumption it makes about + them is that the clock on each system always runs forward. + + If Unison finds that its archive files have been deleted (or that the + archive format has changed and they cannot be read, or that they don’t + exist because this is the first run of Unison on these particular + roots), it takes a conservative approach: it behaves as though the + replicas had both been completely empty at the point of the last + synchronization. The effect of this is that, on the first run, files + that exist in only one replica will be propagated to the other, while + files that exist in both replicas but are unequal will be marked as + conflicting. + + Touching a file without changing its contents should never affect + whether or not Unison does an update. (When running with the fastcheck + preference set to true—the default on Unix systems—Unison uses file + modtimes for a quick first pass to tell which files have definitely not + changed; then, for each file that might have changed, it computes a + fingerprint of the file’s contents and compares it against the + last-synchronized contents. Also, the -times option allows you to + synchronize file times, but it does not cause identical files to be + changed; Unison will only modify the file times.) + + It is safe to “brainwash” Unison by deleting its archive files on both + replicas. The next time it runs, it will assume that all the files it + sees in the replicas are new. + + It is safe to modify files while Unison is working. If Unison discovers + that it has propagated an out-of-date change, or that the file it is + updating has changed on the target replica, it will signal a failure + for that file. Run Unison again to propagate the latest change. + + Changes to the ignore patterns from the user interface (e.g., using the + ‘i’ key) are immediately reflected in the current profile. + +Caveats and Shortcomings + + Here are some things to be careful of when using Unison. + * In the interests of speed, the update detection algorithm may + (depending on which OS architecture that you run Unison on) + actually use an approximation to the definition given in the + section “What is an Update?” . + In particular, the Unix implementation does not compare the actual + contents of files to their previous contents, but simply looks at + each file’s inode number and modtime; if neither of these have + changed, then it concludes that the file has not been changed. + Under normal circumstances, this approximation is safe, in the + sense that it may sometimes detect “false updates” but will never + miss a real one. However, it is possible to fool it, for example by + using retouch to change a file’s modtime back to a time in the + past. + * If you synchronize between a single-user filesystem and a shared + Unix server, you should pay attention to your permission bits: by + default, Unison will synchronize permissions verbatim, which may + leave group-writable files on the server that could be written over + by a lot of people. + You can control this by setting your umask on both computers to + something like 022, masking out the “world write” and “group write” + permission bits. + Unison does not synchronize the setuid and setgid bits, for + security. + * The graphical user interface is single-threaded. This means that if + Unison is performing some long-running operation, the display will + not be repainted until it finishes. We recommend not trying to do + anything with the user interface while Unison is in the middle of + detecting changes or propagating files. + * Unison does not understand hard links. + * It is important to be a little careful when renaming directories + containing ignored files. + For example, suppose Unison is synchronizing directory A between + the two machines called the “local” and the “remote” machine; + suppose directory A contains a subdirectory D; and suppose D on the + local machine contains a file or subdirectory P that matches an + ignore directive in the profile used to synchronize. Thus path + A/D/P exists on the local machine but not on the remote machine. + If D is renamed to D’ on the remote machine, and this change is + propagated to the local machine, all such files or subdirectories P + will be deleted. This is because Unison sees the rename as a delete + and a separate create: it deletes the old directory (including the + ignored files) and creates a new one (not including the ignored + files, since they are completely invisible to it). + +Reference Guide + + This section covers the features of Unison in detail. + + +Running Unison + + There are several ways to start Unison. + * Typing “unison profile” on the command line. Unison will look for a + file profile.prf in the .unison directory. If this file does not + specify a pair of roots, Unison will prompt for them and add them + to the information specified by the profile. + * Typing “unison profile root1 root2” on the command line. In this + case, Unison will use profile, which should not contain any root + directives. + * Typing “unison root1 root2” on the command line. This has the same + effect as typing “unison default root1 root2.” + * Typing just “unison” (or invoking Unison by clicking on a desktop + icon). In this case, Unison will ask for the profile to use for + synchronization (or create a new one, if necessary). + +The .unison Directory + + Unison stores a variety of information in a private directory on each + host. If the environment variable UNISON is defined, then its value + will be used as the path/folder name for this directory. This can be + just a name, or a path. + + A name on it’s own, for example UNISON=mytestname will place a folder + in the same directory that the Unison binary was run in, with that + name. Using a path like UNISON=../mytestname2 will place that folder in + the folder above where the Unison binary was run from. + + If UNISON is not defined, then the directory depends on which operating + system you are using. In Unix, the default is to use $HOME/.unison. In + Windows, if the environment variable USERPROFILE is defined, then the + directory will be $USERPROFILE\.unison; otherwise if HOME is defined, + it will be $HOME\.unison; otherwise, it will be c:\.unison. On OS X, + $HOME/.unison will be used if it is present, but + $HOME/Library/Application Support/Unison will be created and used by + default. + + The archive file for each replica is found in the .unison directory on + that replica’s host. Profiles (described below) are always taken from + the .unison directory on the client host. + + Note that Unison maintains a completely different set of archive files + for each pair of roots. + + We do not recommend synchronizing the whole .unison directory, as this + will involve frequent propagation of large archive files. It should be + safe to do it, though, if you really want to. Synchronizing just the + profile files in the .unison directory is definitely OK. + +Archive Files + + The name of the archive file on each replica is calculated from + * the canonical names of all the hosts (short names like saul are + converted into full addresses like saul.cis.upenn.edu), + * the paths to the replicas on all the hosts (again, relative + pathnames, symbolic links, etc. are converted into full, absolute + paths), and + * an internal version number that is changed whenever a new Unison + release changes the format of the information stored in the + archive. + + This method should work well for most users. However, it is + occasionally useful to change the way archive names are generated. + Unison provides two ways of doing this. + + The function that finds the canonical hostname of the local host (which + is used, for example, in calculating the name of the archive file used + to remember which files have been synchronized) normally uses the + gethostname operating system call. However, if the environment variable + UNISONLOCALHOSTNAME is set, its value will be used instead. This makes + it easier to use Unison in situations where a machine’s name changes + frequently (e.g., because it is a laptop and gets moved around a lot). + + A more powerful way of changing archive names is provided by the + rootalias preference. The preference file may contain any number of + lines of the form: + rootalias = //hostnameA//path-to-replicaA -> //hostnameB/path-to-replicaB + + When calculating the name of the archive files for a given pair of + roots, Unison replaces any root that matches the left-hand side of any + rootalias rule by the corresponding right-hand side. + + So, if you need to relocate a root on one of the hosts, you can add a + rule of the form: + rootalias = //new-hostname//new-path -> //old-hostname/old-path + + Note that root aliases are case-sensitive, even on case-insensitive + file systems. + + Warning: The rootalias option is dangerous and should only be used if + you are sure you know what you’re doing. In particular, it should only + be used if you are positive that either (1) both the original root and + the new alias refer to the same set of files, or (2) the files have + been relocated so that the original name is now invalid and will never + be used again. (If the original root and the alias refer to different + sets of files, Unison’s update detector could get confused.) After + introducing a new rootalias, it is a good idea to run Unison a few + times interactively (with the batch flag off, etc.) and carefully check + that things look reasonable—in particular, that update detection is + working as expected. + +Preferences + + Many details of Unison’s behavior are configurable by user-settable + “preferences.” + + Some preferences are boolean-valued; these are often called flags. + Others take numeric or string arguments, indicated in the preferences + list by n or xxx. Some string arguments take the backslash as an escape + to include the next character literally; this is mostly useful to + escape a space or the backslash; a trailing backslash is ignored and is + useful to protect a trailing whitespace in the string that would + otherwise be trimmed. Most of the string preferences can be given + several times; the arguments are accumulated into a list internally. + + There are two ways to set the values of preferences: temporarily, by + providing command-line arguments to a particular run of Unison, or + permanently, by adding commands to a profile in the .unison directory + on the client host. The order of preferences (either on the command + line or in preference files) is not significant. On the command line, + preferences and other arguments (the profile name and roots) can be + intermixed in any order. + + To set the value of a preference p from the command line, add an + argument -p (for a boolean flag) or -p n or -p xxx (for a numeric or + string preference) anywhere on the command line. To set a boolean flag + to false on the command line, use -p=false. + + Here are all the preferences supported by Unison. This list can be + obtained by typing unison -help. + +Usage: unison [options] + or unison root1 root2 [options] + or unison profilename [options] + +Basic options: + + General: + -doc xxx show documentation ('-doc topics' lists topics) + -version print version and exit + + What to sync: + -group synchronize group attributes + -ignore xxx add a pattern to the ignore list + -ignorenot xxx add a pattern to the ignorenot list + -nocreation xxx prevent file creations on one replica + -nodeletion xxx prevent file deletions on one replica + -noupdate xxx prevent file updates and deletions on one replica + -owner synchronize owner + -path xxx path to synchronize + -perms n part of the permissions which is synchronized + -root xxx root of a replica (should be used exactly twice) + -times synchronize modification times + + How to sync: + -batch batch mode: ask no questions at all + + How to sync (text interface (CLI) only): + -auto automatically accept default (nonconflicting) actions + -silent print nothing except error messages + -terse suppress status messages + + Text interface (CLI): + -i interactive profile mode (text UI); command-line only + +Advanced options: + + Fine-tune sync: + -acl synchronize ACLs + -atomic xxx add a pattern to the atomic list + -follow xxx add a pattern to the follow list + -force xxx force changes from this replica to the other + -forcepartial xxx add a pattern to the forcepartial list + -ignorecase xxx identify upper/lowercase filenames (true/false/default) + -immutable xxx add a pattern to the immutable list + -immutablenot xxx add a pattern to the immutablenot list + -links xxx allow the synchronization of symbolic links + (true/false/default) + -merge xxx add a pattern to the merge list + -nocreationpartial xxx add a pattern to the nocreationpartial list + -nodeletionpartial xxx add a pattern to the nodeletionpartial list + -noupdatepartial xxx add a pattern to the noupdatepartial list + -prefer xxx choose this replica's version for conflicting changes + -preferpartial xxx add a pattern to the preferpartial list + -rsrc xxx synchronize resource forks (true/false/default) + -xattrignore xxx add a pattern to the xattrignore list + -xattrignorenot xxx add a pattern to the xattrignorenot list + -xattrs synchronize extended attributes (xattrs) + + How to sync: + -backup xxx add a pattern to the backup list + -backupcurr xxx add a pattern to the backupcurr list + -backupcurrnot xxx add a pattern to the backupcurrnot list + -backupdir xxx directory for storing centralized backups + -backuploc xxx where backups are stored ('local' or 'central') + -backupnot xxx add a pattern to the backupnot list + -backupprefix xxx prefix for the names of backup files + -backups (deprecated) keep backup copies of all files (see also + 'backup') + -backupsuffix xxx a suffix to be added to names of backup files + -confirmbigdel ask about whole-replica (or path) deletes (default true) + -confirmmerge ask for confirmation before committing results of a merge + -copyonconflict keep copies of conflicting files + -dontchmod when set, never use the chmod system call + -fastcheck xxx do fast update detection (true/false/default) + -fat use appropriate options for FAT filesystems + -ignoreinodenumbers ignore inode number changes when detecting updates + -maxbackups n number of backed up versions of a file + -numericids don't map uid/gid values by user/group names + -sortbysize list changed files by size, not name + -sortfirst xxx add a pattern to the sortfirst list + -sortlast xxx add a pattern to the sortlast list + -sortnewfirst list new before changed files + + How to sync (text interface (CLI) only): + -repeat xxx synchronize repeatedly (text interface only) + -retry n re-try failed synchronizations N times (text ui only) + + Text interface (CLI): + -color xxx use color output for text UI (true/false/default) + -dumbtty do not change terminal settings in text UI + + Graphical interface (GUI): + -height n height (in lines) of main window in graphical interface + + Remote connections: + -addversionno add version number to name of unison on server + -clientHostName xxx set host name of client + -halfduplex (deprecated) force half-duplex communication with the + server + -killserver kill server when done (even when using sockets) + -listen xxx listen on this name or addr in server socket mode (can + repeat) + -rsync activate the rsync transfer mode (default true) + -servercmd xxx name of unison executable on remote server + -socket xxx act as a server on a socket + -sshargs xxx other arguments (if any) for remote shell command + -sshcmd xxx path to the ssh executable + -stream (deprecated) use a streaming protocol for transferring + file contents (default true) + -testserver exit immediately after the connection to the server + -xferbycopying optimize transfers using local copies (default true) + + Archive management: + -ignorearchives ignore existing archive files + + Other: + -addprefsto xxx file to add new prefs to + -contactquietly suppress the 'contacting server' message during startup + -copymax n maximum number of simultaneous copyprog transfers + -copyprog xxx external program for copying large files + -copyprogrest xxx variant of copyprog for resuming partial transfers + -copythreshold n use copyprog on files bigger than this (if >=0, in Kb) + -diff xxx set command for showing differences between files + -ignorelocks ignore locks left over from previous run (dangerous!) + -include xxx include a profile's preferences + -key xxx define a keyboard shortcut for this profile (in some UIs) + -label xxx provide a descriptive string label for this profile + -log record actions in logfile (default true) + -logfile xxx logfile name + -maxerrors n maximum number of errors before a directory transfer is + aborted + -maxsizethreshold n prevent transfer of files bigger than this (if >=0, in + Kb) + -maxthreads n maximum number of simultaneous file transfers + -mountpoint xxx abort if this path does not exist + -rootalias xxx register alias for canonical root names + -showarchive show 'true names' (for rootalias) of roots and archive + -source xxx include a file's preferences + -ui xxx select UI ('text' or 'graphic'); command-line only + -unicode xxx assume Unicode encoding in case insensitive mode + -watch when set, use a file watcher process to detect changes + +Expert options: + -debug xxx debug module xxx ('all' -> everything, 'verbose' -> more) + -dumparchives dump contents of archives just after loading + -fastercheckUNSAFE skip computing fingerprints for new files (experts only!) + -selftest run internal tests and exit + + + Here, in more detail, is what they do. Many are discussed in greater + detail in other sections of the manual. + + It should be noted that some command-line arguments are handled + specially during startup, including -doc, -help, -version, -socket, and + -ui. They are expected to appear on the command-line only, not in a + profile. In particular, -version and -doc will print to the standard + output, so they only make sense if invoked from the command-line (and + not a click-launched gui that has no standard output). Furthermore, the + actions associated with these command-line arguments are executed + without loading a profile or doing the usual command-line parsing. + + acl + When this flag is set to true, the ACLs of files and directories + are synchronized. The type of ACLs depends on the platform and + filesystem support. On Unix-like platforms it can be NFSv4 ACLs, + for example. + + addprefsto xxx + By default, new preferences added by Unison (e.g., new ignore + clauses) will be appended to whatever preference file Unison was + told to load at the beginning of the run. Setting the preference + addprefsto filename makes Unison add new preferences to the file + named filename instead. + + addversionno + When this flag is set to true, Unison will use + unison-currentmajorversionnumber instead of just unison as the + remote server command (note that the minor version number is + dropped – e.g., unison-2.51). This allows multiple binaries for + different versions of unison to coexist conveniently on the same + server: whichever version is run on the client, the same version + will be selected on the server. + + atomic xxx + This preference specifies paths for directories whose contents + will be considered as a group rather than individually when they + are both modified. The backups are also made atomically in this + case. The option backupcurr however has no effect on atomic + directories. + + auto + When set to true, this flag causes the user interface to skip + asking for confirmations on non-conflicting changes. (More + precisely, when the user interface is done setting the + propagation direction for one entry and is about to move to the + next, it will skip over all non-conflicting entries and go + directly to the next conflict.) + + backup xxx + Including the preference -backup pathspec causes Unison to keep + backup files for each path that matches pathspec; directories + (nor their permissions or any other metadata) are not backed up. + These backup files are kept in the directory specified by the + backuplocation preference. The backups are named according to + the backupprefix and backupsuffix preferences. The number of + versions that are kept is determined by the maxbackups + preference. + + The syntax of pathspec is described in the section “Path + Specification” . + + backupcurr xxx + Including the preference -backupcurr pathspec causes Unison to + keep a backup of the current version of every file matching + pathspec. This file will be saved as a backup with version + number 000. Such backups can be used as inputs to external + merging programs, for instance. See the documentation for the + merge preference. For more details, see the section “Merging + Conflicting Versions” . + + The syntax of pathspec is described in the section “Path + Specification” . + + backupcurrnot xxx + Exceptions to backupcurr, like the ignorenot preference. + + backupdir xxx + If this preference is set, Unison will use it as the name of the + directory used to store backup files specified by the backup + preference, when backuplocation is set to central. It is checked + after the UNISONBACKUPDIR environment variable. + + backuploc xxx + This preference determines whether backups should be kept + locally, near the original files, or in a central directory + specified by the backupdir preference. If set to local, backups + will be kept in the same directory as the original files, and if + set to central, backupdir will be used instead. + + backupnot xxx + The values of this preference specify paths or individual files + or regular expressions that should not be backed up, even if the + backup preference selects them—i.e., it selectively overrides + backup. + + backupprefix xxx + When a backup for a file NAME is created, it is stored in a + directory specified by backuplocation, in a file called + backupprefixNAMEbackupsuffix. backupprefix can include a + directory name (causing Unison to keep all backup files for a + given directory in a subdirectory with this name), and both + backupprefix and backupsuffix can contain the string $VERSION, + which will be replaced by the age of the backup (1 for the most + recent, 2 for the second most recent, and so on...). This + keyword is ignored if it appears in a directory name in the + prefix; if it does not appear anywhere in the prefix or the + suffix, it will be automatically placed at the beginning of the + suffix. + + One thing to be careful of: If the backuploc preference is set + to local, Unison will automatically ignore all files whose + prefix and suffix match backupprefix and backupsuffix. So be + careful to choose values for these preferences that are + sufficiently different from the names of your real files. + + backups + (Deprecated) Setting this flag to true is equivalent to setting + backuplocation to local and backup to Name *. + + backupsuffix xxx + See backupprefix for full documentation. + + batch + When this is set to true, the user interface will ask no + questions at all. Non-conflicting changes will be propagated; + conflicts will be skipped. + + clientHostName xxx + When specified, the host name of the client will not be guessed + and the provided host name will be used to find the archive. + + color xxx + When set to true, this flag enables color output in text mode + user interface. When set to false, all color output is disabled. + Default is to enable color if the NO_COLOR environment variable + is not set. + + confirmbigdel + When this is set to true, Unison will request an extra + confirmation if it appears that the entire replica has been + deleted, before propagating the change. If the batch flag is + also set, synchronization will be aborted. When the path + preference is used, the same confirmation will be requested for + top-level paths. (At the moment, this flag only affects the text + user interface.) See also the mountpoint preference. + + confirmmerge + Setting this preference causes both the text and graphical + interfaces to ask the user if the results of a merge command may + be committed to the replica or not. Since the merge command + works on temporary files, the user can then cancel all the + effects of applying the merge if it turns out that the result is + not satisfactory. In batch-mode, this preference has no effect. + Default is false. + + contactquietly + If this flag is set, Unison will skip displaying the ‘Contacting + server’ message (which some users find annoying) during startup. + + copymax n + A number indicating how many instances of the external copying + utility Unison is allowed to run simultaneously (default to 1). + + copyonconflict + When this flag is set, Unison will make a copy of files that + would otherwise be overwritten or deleted in case of conflicting + changes, and more generally whenever the default behavior is + overridden. This makes it possible to automatically resolve + conflicts in a fairly safe way when synchronizing continuously, + in combination with the -repeat watch and -prefer newer + preferences. + + copyprog xxx + A string giving the name of an external program that can be used + to copy large files efficiently (plus command-line switches + telling it to copy files in-place). The default setting invokes + rsync with appropriate options—most users should not need to + change it. + + copyprogrest xxx + A variant of copyprog that names an external program that should + be used to continue the transfer of a large file that has + already been partially transferred. Typically, copyprogrest will + just be copyprog with one extra option (e.g., --partial, for + rsync). The default setting invokes rsync with appropriate + options—most users should not need to change it. + + copythreshold n + A number indicating above what filesize (in kilobytes) Unison + should use the external copying utility specified by copyprog. + Specifying 0 will cause all copies to use the external program; + a negative number will prevent any files from using it. The + default is -1. See the section “Making Unison Faster on Large + Files” for more information. + + debug xxx + This preference is used to make Unison print various sorts of + information about what it is doing internally on the standard + error stream. It can be used many times, each time with the name + of a module for which debugging information should be printed. + Possible arguments for debug can be found by looking for calls + to Util.debug in the sources (using, e.g., grep). Setting -debug + all causes information from all modules to be printed (this mode + of usage is the first one to try, if you are trying to + understand something that Unison seems to be doing wrong); + -debug verbose turns on some additional debugging output from + some modules (e.g., it will show exactly what bytes are being + sent across the network). + + diff xxx + This preference can be used to control the name and command-line + arguments of the system utility used to generate displays of + file differences. The default is ‘diff -u OLDER NEWER’. If the + value of this preference contains the substrings CURRENT1 and + CURRENT2, these will be replaced by the names of the files to be + diffed. If the value of this preference contains the substrings + NEWER and OLDER, these will be replaced by the names of files to + be diffed, NEWER being the most recently modified file of the + two. Without any of these substrings, the two filenames will be + appended to the command. In all cases, the filenames are + suitably quoted. + + doc xxx + The command-line argument -doc secname causes unison to display + section secname of the manual on the standard output and then + exit. Use -doc all to display the whole manual, which includes + exactly the same information as the printed and HTML manuals, + modulo formatting. Use -doc topics to obtain a list of the names + of the various sections that can be printed. + + dontchmod + By default, Unison uses the ’chmod’ system call to set the + permission bits of files after it has copied them. But in some + circumstances (and under some operating systems), the chmod call + always fails. Setting this preference completely prevents Unison + from ever calling chmod. + + dumbtty + When set to true, this flag makes the text mode user interface + avoid trying to change any of the terminal settings. (Normally, + Unison puts the terminal in ‘raw mode’, so that it can do things + like overwriting the current line.) This is useful, for example, + when Unison runs in a shell inside of Emacs. + + When dumbtty is set, commands to the user interface need to be + followed by a carriage return before Unison will execute them. + (When it is off, Unison recognizes keystrokes as soon as they + are typed.) + + This preference has no effect on the graphical user interface. + + dumparchives + When this preference is set, Unison will create a file + unison.dump on each host, containing a text summary of the + archive, immediately after loading it. + + fastcheck xxx + When this preference is set to true, Unison will use the + modification time and length of a file as a ‘pseudo inode + number’ when scanning replicas for updates, instead of reading + the full contents of every file. (This does not apply to the + very first run, when Unison will always scan all files + regardless of this switch). Under Windows, this may cause Unison + to miss propagating an update if the modification time and + length of the file are both unchanged by the update. However, + Unison will never overwrite such an update with a change from + the other replica, since it always does a safe check for updates + just before propagating a change. Thus, it is reasonable to use + this switch under Windows most of the time and occasionally run + Unison once with fastcheck set to false, if you are worried that + Unison may have overlooked an update. For backward + compatibility, yes, no, and default can be used in place of + true, false, and auto. See the section “Fast Update Detection” + for more information. + + fastercheckUNSAFE + THIS FEATURE IS STILL EXPERIMENTAL AND SHOULD BE USED WITH + EXTREME CAUTION. + + When this flag is set to true, Unison will compute a + ’pseudo-fingerprint’ the first time it sees a file (either + because the file is new or because Unison is running for the + first time). This enormously speeds update detection, but it + must be used with care, as it can cause Unison to miss + conflicts: If a given path in the filesystem contains files on + both sides that Unison has not yet seen, and if those files have + the same length but different contents, then Unison will not + notice the presence of a conflict. If, later, one of the files + is changed, the changed file will be propagated, overwriting the + other. + + Moreover, even when the files are initially identical, setting + this flag can lead to potentially confusing behavior: if a newly + created file is later touched without being modified, Unison + will treat this conservatively as a potential change (since it + has no record of the earlier contents) and show it as needing to + be propagated to the other replica. + + Most users should leave this flag off – the small time savings + of not fingerprinting new files is not worth the cost in terms + of safety. However, it can be very useful for power users with + huge replicas that are known to be already synchronized (e.g., + because one replica is a newly created duplicate of the other, + or because they have previously been synchronized with Unison + but Unison’s archives need to be rebuilt). In such situations, + it is recommended that this flag be set only for the initial run + of Unison, so that new archives can be created quickly, and then + turned off for normal use. + + fat + When this is set to true, Unison will use appropriate options to + synchronize efficiently and without error a replica located on a + FAT filesystem on a non-Windows machine: do not synchronize + permissions (perms = 0); never use chmod (dontchmod = true); + treat filenames as case insensitive (ignorecase = true); do not + attempt to synchronize symbolic links (links = false); ignore + inode number changes when detecting updates (ignoreinodenumbers + = true). Any of these change can be overridden by explicitly + setting the corresponding preference in the profile. + + follow xxx + Including the preference -follow pathspec causes Unison to treat + symbolic links matching pathspec as ‘invisible’ and behave as if + the object pointed to by the link had appeared literally at this + position in the replica. See the section “Symbolic Links” for + more details. The syntax of pathspec is described in the section + “Path Specification” . + + force xxx + Including the preference -force root causes Unison to resolve + all differences (even non-conflicting changes) in favor of root. + This effectively changes Unison from a synchronizer into a + mirroring utility. + + You can also specify a unique prefix or suffix of the path of + one of the roots or a unique prefix of the hostname of a remote + root. + + You can also specify -force newer (or -force older) to force + Unison to choose the file with the later (earlier) modtime. In + this case, the -times preference must also be enabled. + + This preference is overridden by the forcepartial preference. + + This preference should be used only if you are sure you know + what you are doing! + + forcepartial xxx + Including the preference forcepartial = PATHSPEC -> root causes + Unison to resolve all differences (even non-conflicting changes) + in favor of root for the files in PATHSPEC (see the section + “Path Specification” for more information). This effectively + changes Unison from a synchronizer into a mirroring utility. + + You can also specify a unique prefix or suffix of the path of + one of the roots or a unique prefix of the hostname of a remote + root. + + You can also specify forcepartial PATHSPEC -> newer (or + forcepartial PATHSPEC -> older) to force Unison to choose the + file with the later (earlier) modtime. In this case, the -times + preference must also be enabled. + + This preference should be used only if you are sure you know + what you are doing! + + group + When this flag is set to true, the group attributes of the files + are synchronized. Whether the group names or the group + identifiers are synchronized depends on the preference numerids. + + halfduplex + (Deprecated) When this flag is set to true, Unison network + communication is forced to be half duplex (the client and the + server never simultaneously emit data). If you experience + unstabilities with your network link, this may help. + + height n + Used to set the height (in lines) of the main window in the + graphical user interface. + + i + Provide this preference in the command line arguments to enable + interactive profile manager in the text user interface. + Currently only profile listing and interactive selection are + available. Preferences like batch and silent remain applicable + to synchronization functionality. + + ignore xxx + Including the preference -ignore pathspec causes Unison to + completely ignore paths that match pathspec (as well as their + children). This is useful for avoiding synchronizing temporary + files, object files, etc. The syntax of pathspec is described in + the section “Path Specification” , and further details on + ignoring paths is found in the section “Ignoring Paths” . + + ignorearchives + When this preference is set, Unison will ignore any existing + archive files and behave as though it were being run for the + first time on these replicas. It is not a good idea to set this + option in a profile: it is intended for command-line use. + + ignorecase xxx + When set to true, this flag causes Unison to treat filenames as + case insensitive—i.e., files in the two replicas whose names + differ in (upper- and lower-case) ‘spelling’ are treated as the + same file. When the flag is set to false, Unison will treat all + filenames as case sensitive. Ordinarily, when the flag is set to + default, filenames are automatically taken to be + case-insensitive if either host is running Windows or OSX. In + rare circumstances it may be useful to set the flag manually. + + ignoreinodenumbers + When set to true, this preference makes Unison not take + advantage of inode numbers during fast update detection. This + switch should be used with care, as it is less safe than the + standard update detection method, but it can be useful with + filesystems which do not support inode numbers. + + ignorelocks + When this preference is set, Unison will ignore any lock files + that may have been left over from a previous run of Unison that + was interrupted while reading or writing archive files; by + default, when Unison sees these lock files it will stop and + request manual intervention. This option should be set only if + you are positive that no other instance of Unison might be + concurrently accessing the same archive files (e.g., because + there was only one instance of unison running and it has just + crashed or you have just killed it). It is probably not a good + idea to set this option in a profile: it is intended for + command-line use. + + ignorenot xxx + This preference overrides the preference ignore. It gives a list + of patterns (in the same format as ignore) for paths that should + definitely not be ignored, whether or not they happen to match + one of the ignore patterns. + + Note that the semantics of ignore and ignorenot is a little + counter-intuitive. When detecting updates, Unison examines paths + in depth-first order, starting from the roots of the replicas + and working downwards. Before examining each path, it checks + whether it matches ignore and does not match ignorenot; in this + case it skips this path and all its descendants. This means + that, if some parent of a given path matches an ignore pattern, + then it will be skipped even if the path itself matches an + ignorenot pattern. In particular, putting ignore = Path * in + your profile and then using ignorenot to select particular paths + to be synchronized will not work. Instead, you should use the + path preference to choose particular paths to synchronize. + + immutable xxx + This preference specifies paths for directories whose immediate + children are all immutable files — i.e., once a file has been + created, its contents never changes. When scanning for updates, + Unison does not check whether these files have been modified; + this can speed update detection significantly (in particular, + for mail directories). + + immutablenot xxx + This preference overrides immutable. + + include xxx + Include preferences from a profile. include name reads the + profile "name" (or file "name" in the .unison directory if + profile "name" does not exist) and includes its contents as if + it was part of a profile or given directly on command line. + + key xxx + Used in a profile to define a numeric key (0-9) that can be used + in the user interface to switch immediately to this profile. + + killserver + When set to true, this flag causes Unison to kill the remote + server process when the synchronization is finished. This + behavior is the default for ssh connections, so this preference + is not normally needed when running over ssh; it is provided so + that socket-mode servers can be killed off after a single run of + Unison, rather than waiting to accept future connections. (Some + users prefer to start a remote socket server for each run of + Unison, rather than leaving one running all the time.) + + label xxx + Used in a profile to provide a descriptive string documenting + its settings. (This is useful for users that switch between + several profiles, especially using the ‘fast switch’ feature of + the graphical user interface.) + + links xxx + When set to true, this flag causes Unison to synchronize + symbolic links. When the flag is set to false, symbolic links + will be ignored during update detection. Ordinarily, when the + flag is set to default, symbolic links are synchronized except + when one of the hosts is running Windows. On a Windows client, + Unison makes an attempt to detect if symbolic links are + supported and allowed by user privileges. You may have to get + elevated privileges to create symbolic links. When the flag is + set to default and symbolic links can’t be synchronized then an + error is produced during update detection. + + listen xxx + When acting as a server on a TCP socket, Unison will by default + listen on "any" address (0.0.0.0 and [::]). This command-line + argument allows to specify a different listening address and can + be repeated to listen on multiple addresses. Listening address + can be specified as a host name or an IP address. + + log + When this flag is set, Unison will log all changes to the + filesystems on a file. + + logfile xxx + By default, logging messages will be appended to the file + unison.log in your .unison directory. Set this preference if you + prefer another file. It can be a path relative to your .unison + directory. Sending SIGUSR1 will close the logfile; the logfile + will be re-opened (and created, if needed) automatically, to + allow for log rotation. + + maxbackups n + This preference specifies the number of backup versions that + will be kept by unison, for each path that matches the predicate + backup. The default is 2. + + maxerrors n + This preference controls after how many errors Unison aborts a + directory transfer. Setting it to a large number allows Unison + to transfer most of a directory even when some files fail to be + copied. The default is 1. If the preference is set too high, + Unison may take a long time to abort in case of repeated + failures (for instance, when the disk is full). + + maxsizethreshold n + A number indicating above what filesize (in kilobytes) Unison + should flag a conflict instead of transferring the file. This + conflict remains even in the presence of force or prefer + options. A negative number will allow every transfer + independently of the size. The default is -1. + + maxthreads n + This preference controls how much concurrency is allowed during + the transport phase. Normally, it should be set reasonably high + to maximize performance, but when Unison is used over a + low-bandwidth link it may be helpful to set it lower (e.g. to 1) + so that Unison doesn’t soak up all the available bandwidth. The + default is the special value 0, which mean 20 threads when file + content streaming is deactivated and 1000 threads when it is + activated. + + merge xxx + This preference can be used to run a merge program which will + create a new version for each of the files and the backup, with + the last backup and both replicas. The syntax of pathspec -> cmd + is described in the section “Path Specification” , and further + details on Merging functions are present in the section “Merging + Conflicting Versions” . + + mountpoint xxx + Including the preference -mountpoint PATH causes Unison to + double-check, at the end of update detection, that PATH exists + and abort if it does not. This is useful when Unison is used to + synchronize removable media. This preference can be given more + than once. See the section “Mount Points and Removable Media” . + + nocreation xxx + Including the preference -nocreation root prevents Unison from + performing any file creation on root root. + + You can also specify a unique prefix or suffix of the path of + one of the roots or a unique prefix of the hostname of a remote + root. + + This preference can be included twice, once for each root, if + you want to prevent any creation. + + nocreationpartial xxx + Including the preference nocreationpartial = PATHSPEC -> root + prevents Unison from performing any file creation in PATHSPEC on + root root (see the section “Path Specification” for more + information). It is recommended to use BelowPath patterns when + selecting a directory and all its contents. + + nodeletion xxx + Including the preference -nodeletion root prevents Unison from + performing any file deletion on root root. + + You can also specify a unique prefix or suffix of the path of + one of the roots or a unique prefix of the hostname of a remote + root. + + This preference can be included twice, once for each root, if + you want to prevent any deletion. + + nodeletionpartial xxx + Including the preference nodeletionpartial = PATHSPEC -> root + prevents Unison from performing any file deletion in PATHSPEC on + root root (see the section “Path Specification” for more + information). It is recommended to use BelowPath patterns when + selecting a directory and all its contents. + + noupdate xxx + Including the preference -noupdate root prevents Unison from + performing any file update or deletion on root root. + + You can also specify a unique prefix or suffix of the path of + one of the roots or a unique prefix of the hostname of a remote + root. + + This preference can be included twice, once for each root, if + you want to prevent any update. + + noupdatepartial xxx + Including the preference noupdatepartial = PATHSPEC -> root + prevents Unison from performing any file update or deletion in + PATHSPEC on root root (see the section “Path Specification” for + more information). It is recommended to use BelowPath patterns + when selecting a directory and all its contents. + + numericids + When this flag is set to true, groups and users are synchronized + numerically, rather than by name. + + The special uid 0 and the special group 0 are never mapped via + user/group names even if this preference is not set. + + owner + When this flag is set to true, the owner attributes of the files + are synchronized. Whether the owner names or the owner + identifiers are synchronizeddepends on the preference numerids. + + path xxx + When no path preference is given, Unison will simply synchronize + the two entire replicas, beginning from the given pair of roots. + If one or more path preferences are given, then Unison will + synchronize only these paths and their children. (This is useful + for doing a fast sync of just one directory, for example.) Note + that path preferences are interpreted literally—they are not + regular expressions. + + perms n + The integer value of this preference is a mask indicating which + permission bits should be synchronized. It is set by default to + 0o1777: all bits but the set-uid and set-gid bits are + synchronised (synchronizing these latter bits can be a security + hazard). If you want to synchronize all bits, you can set the + value of this preference to −1. If one of the replica is on a + FAT [Windows] filesystem, you should consider using the fat + preference instead of this preference. If you need Unison not to + set permissions at all, set the value of this preference to 0 + and set the preference dontchmod to true. + + prefer xxx + Including the preference -prefer root causes Unison always to + resolve conflicts in favor of root, rather than asking for + guidance from the user, except for paths marked by the + preference merge. (The syntax of root is the same as for the + root preference, plus the special values newer and older.) + + You can also specify a unique prefix or suffix of the path of + one of the roots or a unique prefix of the hostname of a remote + root. + + This preference is overridden by the preferpartial preference. + + This preference should be used only if you are sure you know + what you are doing! + + preferpartial xxx + Including the preference preferpartial = PATHSPEC -> root causes + Unison always to resolve conflicts in favor of root, rather than + asking for guidance from the user, for the files in PATHSPEC + (see the section “Path Specification” for more information). + (The syntax of root is the same as for the root preference, plus + the special values newer and older.) + + You can also specify a unique prefix or suffix of the path of + one of the roots or a unique prefix of the hostname of a remote + root. + + This preference should be used only if you are sure you know + what you are doing! + + repeat xxx + Setting this preference causes the text-mode interface to + synchronize repeatedly, rather than doing it just once and + stopping. If the argument is a number, Unison will pause for + that many seconds before beginning again. When the argument is + watch, Unison relies on an external file monitoring process to + synchronize whenever a change happens. You can combine the two + with a + character to use file monitoring and also do a full + scan every specificed number of seconds. For example, watch+3600 + will react to changes immediately and additionally do a full + scan every hour. + + retry n + Setting this preference causes the text-mode interface to try + again to synchronize updated paths where synchronization fails. + Each such path will be tried N times. + + root xxx + Each use of this preference names the root of one of the + replicas for Unison to synchronize. Exactly two roots are + needed, so normal modes of usage are either to give two values + for root in the profile, or to give no values in the profile and + provide two on the command line. Details of the syntax of roots + can be found in the section “Roots” . + + The two roots can be given in either order; Unison will sort + them into a canonical order before doing anything else. It also + tries to ‘canonize’ the machine names and paths that appear in + the roots, so that, if Unison is invoked later with a slightly + different name for the same root, it will be able to locate the + correct archives. + + rootalias xxx + When calculating the name of the archive files for a given pair + of roots, Unison replaces any roots matching the left-hand side + of any rootalias rule by the corresponding right-hand side. + + rsrc xxx + When set to true, this flag causes Unison to synchronize + resource forks and HFS meta-data. On filesystems that do not + natively support resource forks, this data is stored in + Carbon-compatible ._ AppleDouble files. When the flag is set to + false, Unison will not synchronize these data. Ordinarily, the + flag is set to default, and these data are automatically + synchronized if either host is running OSX. In rare + circumstances it is useful to set the flag manually. + + rsync + Unison uses the ’rsync algorithm’ for ’diffs-only’ transfer of + updates to large files. Setting this flag to false makes Unison + use whole-file transfers instead. Under normal circumstances, + there is no reason to do this, but if you are having trouble + with repeated ’rsync failure’ errors, setting it to false should + permit you to synchronize the offending files. + + selftest + Run internal tests and exit. This option is mostly for + developers and must be used carefully: in particular, it will + delete the contents of both roots, so that it can install its + own files for testing. This flag only makes sense on the command + line. When it is provided, no preference file is read: all + preferences must be specified on thecommand line. Also, since + the self-test procedure involves overwriting the roots and + backup directory, the names of the roots and of the backupdir + preference must include the string "test" or else the tests will + be aborted. (If these are not given on the command line, dummy + subdirectories in the current directory will be created + automatically.) + + servercmd xxx + This preference can be used to explicitly set the name of the + Unison executable on the remote server (e.g., giving a full path + name), if necessary. + + showarchive + When this preference is set, Unison will print out the ’true + names’of the roots, in the same form as is expected by the + rootalias preference. + + silent + When this preference is set to true, the textual user interface + will print nothing at all, except in the case of errors. Setting + silent to true automatically sets the batch preference to true. + + socket xxx + Start unison as a server listening on a TCP socket (with TCP + port number as argument) or a local socket (aka Unix domain + socket) (with socket path as argument). + + sortbysize + When this flag is set, the user interface will list changed + files by size (smallest first) rather than by name. This is + useful, for example, for synchronizing over slow links, since it + puts very large files at the end of the list where they will not + prevent smaller files from being transferred quickly. + + This preference (as well as the other sorting flags, but not the + sorting preferences that require patterns as arguments) can be + set interactively and temporarily using the ’Sort’ menu in the + graphical and text user interfaces. + + sortfirst xxx + Each argument to sortfirst is a pattern pathspec, which + describes a set of paths. Files matching any of these patterns + will be listed first in the user interface. The syntax of + pathspec is described in the section “Path Specification” . + + sortlast xxx + Similar to sortfirst, except that files matching one of these + patterns will be listed at the very end. + + sortnewfirst + When this flag is set, the user interface will list newly + created files before all others. This is useful, for example, + for checking that newly created files are not ‘junk’, i.e., ones + that should be ignored or deleted rather than synchronized. + + source xxx + Include preferences from a file. source name reads the file + "name" in the .unison directory and includes its contents as if + it was part of a profile or given directly on command line. + + sshargs xxx + The string value of this preference will be passed as additional + arguments (besides the host name and the name of the Unison + executable on the remote system) to the ssh command used to + invoke the remote server. The backslash is an escape character. + + sshcmd xxx + This preference can be used to explicitly set the name of the + ssh executable (e.g., giving a full path name), if necessary. + + stream + (Deprecated) When this preference is set, Unison will use an + experimental streaming protocol for transferring file contents + more efficiently. The default value is true. + + terse + When this preference is set to true, the user interface will not + print status messages. + + testserver + Setting this flag on the command line causes Unison to attempt + to connect to the remote server and, if successful, print a + message and immediately exit. Useful for debugging installation + problems. Should not be set in preference files. + + times + When this flag is set to true, file modification times (but not + directory modtimes) are propagated. + + ui xxx + This preference selects either the graphical or the textual user + interface. Legal values are graphic or text. + + Because this option is processed specially during Unison’s + start-up sequence, it can only be used on the command line. In + preference files it has no effect. + + If the Unison executable was compiled with only a textual + interface, this option has no effect. (The pre-compiled binaries + are all compiled with both interfaces available.) + + unicode xxx + When set to true, this flag causes Unison to perform case + insensitive file comparisons assuming Unicode encoding. This is + the default. When the flag is set to false, Latin 1 encoding is + assumed (this means that all bytes that are not letters in Latin + 1 encoding will be compared byte-for-byte, even if they may be + valid characters in some other encoding). When Unison runs in + case sensitive mode, this flag only makes a difference if one + host is running Mac OS X. Under Mac OS X, it selects whether + comparing the filenames up to decomposition, or byte-for-byte. + + version + Print the current version number and exit. (This option only + makes sense on the command line.) + + watch + Unison uses a file watcher process, when available, to detect + filesystem changes; this is used to speed up update detection. + Setting this flag to false disables the use of this process. + + xattrignore xxx + Preference -xattrignore namespec causes Unison to ignore + extended attributes with names that match namespec. This can be + used to exclude extended attributes that would fail + synchronization due to lack of permissions or technical + differences at replicas. The syntax of namespec is the same as + used for path specification (described in the section “Path + Specification” ); prefer the Path and Regex forms over the Name + form. The pattern is applied to the name of extended attribute, + not to path. On Linux, attributes in the security and trusted + namespaces are ignored by default (this is achieved by pattern + Regex !(security|trusted)[.].*); also attributes used to store + POSIX ACL are ignored by default (this is achieved by pattern + Path !system.posix_acl_*). To sync attributes in one or both of + these namespaces, see the xattrignorenot preference. Note that + the namespace name must be prefixed with a "!" (applies on Linux + only). All names not prefixed with a "!" are taken as strictly + belonging to the user namespace and therefore the "!user." + prefix is never used. + + xattrignorenot xxx + This preference overrides the preference xattrignore. It gives a + list of patterns (in the same format as xattrignore) for + extended attributes that should not be ignored, whether or not + they happen to match one of the xattrignore patterns. It is + possible to synchronize only desired attributes by ignoring all + attributes (for example, by setting xattrignore to Path * and + then adding xattrignorenot for extended attributes that should + be synchronized. On Linux, attributes in the security and + trusted namespaces are ignored by default. To sync attributes in + one or both of these namespaces, you may add an xattrignorenot + pattern like Path !security.* to sync all attributes in the + security namespace, or Path !security.selinux to sync a specific + attribute in an otherwise ignored namespace. A pattern like Path + !system.posix_acl_* can be used to sync POSIX ACLs on Linux. + Note that the namespace name must be prefixed with a "!" + (applies on Linux only). All names not prefixed with a "!" are + taken as strictly belonging to the user namespace and therefore + the "!user." prefix is never used. + + xattrs + When this flag is set to true, the extended attributes of files + and directories are synchronized. System extended attributes are + not synchronized. + + xferbycopying + When this preference is set, Unison will try to avoid + transferring file contents across the network by recognizing + when a file with the required contents already exists in the + target replica. This usually allows file moves to be propagated + very quickly. The default value is true. + +Profiles + + A profile is a text file that specifies permanent settings for roots, + paths, ignore patterns, and other preferences, so that they do not need + to be typed at the command line every time Unison is run. Profiles + should reside in the .unison directory on the client machine. If Unison + is started with just one argument name on the command line, it looks + for a profile called name.prf in the .unison directory. If it is + started with no arguments, it scans the .unison directory for files + whose names end in .prf and offers a menu (provided that the Unison + executable is compiled with the graphical user interface). If a file + named default.prf is found, its settings will be offered as the default + choices. + + To set the value of a preference p permanently, add to the appropriate + profile a line of the form + p = true + + for a boolean flag or + p = <value> + + for a preference of any other type. + + A profile may include blank lines and lines beginning with #; both are + ignored. + + Spaces and tabs before and after p and xxx are ignored. Spaces, tabs, + and non-printable characters within values are not treated specially, + so that e.g. root = /foo bar refers to a directory containing a space. + (On systems using newline for line ending, carriage returns are + currently ignored, but this is not part of the specification.) + + When Unison starts, it first reads the profile and then the command + line, so command-line options will override settings from the profile. + + Profiles may also include lines of the form include name, which will + cause the file name (or name.prf, if name does not exist in the .unison + directory) to be read at the point, and included as if its contents, + instead of the include line, was part of the profile. Include lines + allows settings common to several profiles to be stored in one place. A + similar line of the form source name does the same except that it does + not attempt to add a suffix to name. Similar lines of the form include? + name or source? name do the same as their respective lines without the + question mark except that it does not constitute an error to specify a + non-existing file name. In name the backslash is an escape character. + + A profile may include a preference ‘label = desc’ to provide a + description of the options selected in this profile. The string desc is + listed along with the profile name in the profile selection dialog, and + displayed in the top-right corner of the main Unison window in the + graphical user interface. + + The graphical user-interface also supports one-key shortcuts for + commonly used profiles. If a profile contains a preference of the form + ‘key = n’, where n is a single digit, then pressing this digit key will + cause Unison to immediately switch to this profile and begin + synchronization again from scratch. In this case, all actions that have + been selected for a set of changes currently being displayed will be + discarded. + +Sample Profiles + +A Minimal Profile + + Here is a very minimal profile file, such as might be found in + .unison/default.prf: + # Roots of the synchronization + root = /home/bcpierce + root = ssh://saul//home/bcpierce + + # Paths to synchronize + path = current + path = common + path = .netscape/bookmarks.html + +A Basic Profile + + Here is a more sophisticated profile, illustrating some other useful + features. + # Roots of the synchronization + root = /home/bcpierce + root = ssh://saul//home/bcpierce + + # Paths to synchronize + path = current + path = common + path = .netscape/bookmarks.html + + # Some regexps specifying names and paths to ignore + ignore = Name temp.* + ignore = Name *~ + ignore = Name .*~ + ignore = Path */pilot/backup/Archive_* + ignore = Name *.o + ignore = Name *.tmp + + # Window height + height = 37 + + # Keep a backup copy of every file in a central location + backuplocation = central + backupdir = /home/bcpierce/backups + backup = Name * + backupprefix = $VERSION. + backupsuffix = + + # Use this command for displaying diffs + diff = diff -y -W 79 --suppress-common-lines + + # Log actions to the terminal + log = true + +A Power-User Profile + + When Unison is used with large replicas, it is often convenient to be + able to synchronize just a part of the replicas on a given run (this + saves the time of detecting updates in the other parts). This can be + accomplished by splitting up the profile into several parts — a common + part containing most of the preference settings, plus one “top-level” + file for each set of paths that need to be synchronized. (The include + mechanism can also be used to allow the same set of preference settings + to be used with different roots.) + + The collection of profiles implementing this scheme might look as + follows. The file default.prf is empty except for an include directive: + # Include the contents of the file common + include common + + Note that the name of the common file is common, not common.prf; this + prevents Unison from offering common as one of the list of profiles in + the opening dialog (in the graphical UI). + + The file common contains the real preferences: + # Roots of the synchronization + root = /home/bcpierce + root = ssh://saul//home/bcpierce + + # (... other preferences ...) + + # If any new preferences are added by Unison (e.g. 'ignore' + # preferences added via the graphical UI), then store them in the + # file 'common' rather than in the top-level preference file + addprefsto = common + + # Names and paths to ignore: + ignore = Name temp.* + ignore = Name *~ + ignore = Name .*~ + ignore = Path */pilot/backup/Archive_* + ignore = Name *.o + ignore = Name *.tmp + + Note that there are no path preferences in common. This means that, + when we invoke Unison with the default profile (e.g., by typing ’unison + default’ or just ’unison’ on the command line), the whole replicas will + be synchronized. (If we never want to synchronize the whole replicas, + then default.prf would instead include settings for all the paths that + are usually synchronized.) + + To synchronize just part of the replicas, Unison is invoked with an + alternate preference file—e.g., doing ’unison workingset’, where the + preference file workingset.prf contains + path = current/papers + path = Mail/inbox + path = Mail/drafts + include common + + causes Unison to synchronize just the listed subdirectories. + + The key preference can be used in combination with the graphical UI to + quickly switch between different sets of paths. For example, if the + file mail.prf contains + path = Mail + batch = true + key = 2 + include common + + then pressing 2 will cause Unison to look for updates in the Mail + subdirectory and (because the batch flag is set) immediately propagate + any that it finds. + +Keeping Backups + + When Unison overwrites (or deletes) a file or directory while + propagating changes from the other replica, it can keep the old version + around as a backup. There are several preferences that control + precisely where these backups are stored and how they are named. + + To enable backups, you must give one or more backup preferences. Each + of these has the form + backup = <pathspec> + + where <pathspec> has the same form as for the ignore preference. For + example, + backup = Name * + + causes Unison to create backups of all files and directories. The + backupnot preference can be used to give a few exceptions: it specifies + which files and directories should not be backed up, even if they match + the backup pathspec. + + It is important to note that the pathspec is matched against the path + that is being updated by Unison, not its descendants. For example, if + you set backup = Name *.txt and then delete a whole directory named foo + containing some text files, these files will not be backed up because + Unison will just check that foo does not match *.txt. Similarly, if the + directory itself happened to be called foo.txt, then the whole + directory and all the files in it will be backed up, regardless of + their names. + + Backup files can be stored either centrally or locally. This behavior + is controlled by the preference backuplocation, whose value must be + either central or local. (The default is central.) Note that central + storage of backups can lead to backup files being stored in a different + filesystem than the original files, which could have different security + properties and different amounts of available storage. + + When backups are stored locally, they are kept in the same directory as + the original. + + When backups are stored centrally, the directory used to hold them is + controlled by the preference backupdir and the environment variable + UNISONBACKUPDIR. (The environment variable is checked first.) If + neither of these are set, then the directory .unison/backup in the + user’s home directory is used. + + The preference maxbackups (default 2) controls how many previous + versions of each file are kept (including the current version), + following the usual plan of deleting the oldest when creating a new + one. + + By default, backup files are named .bak.VERSION.FILENAME, where + FILENAME is the original filename and VERSION is the backup number (1 + for the most recent, 2 for the next most recent, etc.). This can be + changed by setting the preferences backupprefix and/or backupsuffix. If + desired, backupprefix may include a directory prefix; this can be used + with backuplocation = local to put all backup files for each directory + into a single subdirectory. For example, setting + backuplocation = local + backupprefix = .unison/$VERSION. + backupsuffix = + + will put all backups in a local subdirectory named .unison. Also, note + that the string $VERSION in either backupprefix or backupsuffix (it + must appear in one or the other) is replaced by the version number. + This can be used, for example, to ensure that backup files retain the + same extension as the originals. + + Other than maxbackups (which will never delete the last backup), there + are no other mechanisms for deleting backups. + + For backward compatibility, the backups preference is also supported. + It simply means backup = Name * and backuplocation = local. + +Merging Conflicting Versions + + Unison can invoke external programs to merge conflicting versions of a + file. The preference merge controls this process. + + The merge preference may be given once or several times in a preference + file (it can also be given on the command line, of course, but this + tends to be awkward because of the spaces and special characters + involved). Each instance of the preference looks like this: + merge = <PATHSPEC> -> <MERGECMD> + + The <PATHSPEC> here has exactly the same format as for the ignore + preference (see the section “Path Specification” ). For example, using + “Name *.txt” as the <PATHSPEC> tells Unison that this command should be + used whenever a file with extension .txt needs to be merged. + + Many external merging programs require as inputs not just the two files + that need to be merged, but also a file containing the last + synchronized version. You can ask Unison to keep a copy of the last + synchronized version for some files using the backupcurrent preference. + This preference is used in exactly the same way as backup and its + meaning is similar, except that it causes backups to be created of the + current contents of each file after it has been synchronized by Unison, + rather than the previous contents that Unison overwrote. These backups + are stored in both replicas in the same place as ordinary backup + files—i.e. according to the backuplocation and backupdir preferences. + They are named like the original files if backupslocation is set to + ’central’ and otherwise, Unison uses the backupprefix and backupsuffix + preferences and assumes a version number 000 for these backups. Note + that there are no mechanisms (beyond the limit on the number of backups + for each file) to remove backup files. + + The <MERGECMD> part of the preference specifies what external command + should be invoked to merge files at paths matching the <PATHSPEC>. + Within this string, several special substrings are recognized; these + will be substituted with appropriate values before invoking a sub-shell + to execute the command. + * CURRENT1 is replaced by the name of (a temporary copy of) the local + variant of the file. + * CURRENT2 is replaced by the name of a temporary file, into which + the contents of the remote variant of the file have been + transferred by Unison prior to performing the merge. + * CURRENTARCH is replaced by the name of the backed up copy of the + original version of the file (i.e., the file saved by Unison if the + current filename matches the path specifications for the + backupcurrent preference, as explained above), if one exists. If no + archive exists and CURRENTARCH appears in the merge command, then + an error is signalled. + * CURRENTARCHOPT is replaced by the name of the backed up copy of the + original version of the file (i.e., its state at the end of the + last successful run of Unison), if one exists, or the empty string + if no archive exists. + * NEW is replaced by the name of a temporary file that Unison expects + to be written by the merge program when it finishes, giving the + desired new contents of the file. + * PATH is replaced by the path (relative to the roots of the + replicas) of the file being merged. + * NEW1 and NEW2 are replaced by the names of temporary files that + Unison expects to be written by the merge program when it is only + able to partially merge the originals; in this case, NEW1 will be + written back to the local replica and NEW2 to the remote replica; + NEWARCH, if present, will be used as the “last common state” of the + replicas. (These three options are provided for later compatibility + with the Harmony data synchronizer.) + * BATCHMODE is replaced according to the batch mode of Unison; if it + is in batch mode, then a non empty string (“batch”) is substituted, + otherwise the empty string is substituted. + + To accommodate the wide variety of programs that users might want to + use for merging, Unison checks for several possible situations when the + merge program exits: + * If the merge program exits with a non-zero status, then merge is + considered to have failed and the replicas are not changed. + * If the file NEW has been created, it is written back to both + replicas (and stored in the backup directory). Similarly, if just + the file NEW1 has been created, it is written back to both + replicas. + * If neither NEW nor NEW1 have been created, then Unison examines the + temporary files CURRENT1 and CURRENT2 that were given as inputs to + the merge program. If either has been changed (or both have been + changed in identical ways), then its new contents are written back + to both replicas. If either CURRENT1 or CURRENT2 has been deleted, + then the contents of the other are written back to both replicas. + * If the files NEW1, NEW2, and NEWARCH have all been created, they + are written back to the local replica, remote replica, and backup + directory, respectively. If the files NEW1, NEW2 have been created, + but NEWARCH has not, then these files are written back to the local + replica and remote replica, respectively. Also, if NEW1 and NEW2 + have identical contents, then the same contents are stored as a + backup (if the backupcurrent preference is set for this path) to + reflect the fact that the path is currently in sync. + * If NEW1 and NEW2 (resp. CURRENT1 and CURRENT2) are created (resp. + overwritten) with different contents but the merge command did not + fail (i.e., it exited with status code 0), then we copy NEW1 (resp. + CURRENT1) to the other replica and to the archive. + This behavior is a design choice made to handle the case where a + merge command only synchronizes some specific contents between two + files, skipping some irrelevant information (order between entries, + for instance). We assume that, if the merge command exits normally, + then the two resulting files are “as good as equal.” (The reason we + copy one on top of the other is to avoid Unison detecting that the + files are unequal the next time it is run and trying again to merge + them when, in fact, the merge program has already made them as + similar as it is able to.) + + You can disable a merge by setting a <MERGECMD> that does nothing. For + example you can override the merging of text files specified in a + profile by typing on the command line: + unison profile -merge 'Name *.txt -> echo SKIP' + + If the confirmmerge preference is set and Unison is not run in batch + mode, then Unison will always ask for confirmation before actually + committing the results of the merge to the replicas. + + You can detect batch mode by testing BATCHMODE; for example to avoid a + merge completely do nothing: + merge = Name *.txt -> [ -z "BATCHMODE" ] && mergecmd CURRENT1 CURRENT2 + + A large number of external merging programs are available. For example, + on Unix systems setting the merge preference to + merge = Name *.txt -> diff3 -m CURRENT1 CURRENTARCH CURRENT2 + > NEW || echo "differences detected" + + will tell Unison to use the external diff3 program for merging. + Alternatively, users of emacs may find the following settings + convenient: + merge = Name *.txt -> emacs -q --eval '(ediff-merge-files-with-ancestor + "CURRENT1" "CURRENT2" "CURRENTARCH" nil "NEW")' + + (These commands are displayed here on two lines to avoid running off + the edge of the page. In your preference file, each command should be + written on a single line.) + + Users running emacs under windows may find something like this useful: + merge = Name * -> C:\Progra~1\Emacs\emacs\bin\emacs.exe -q --eval + "(ediff-files """CURRENT1""" """CURRENT2""")" + + Users running Mac OS X (you may need the Developer Tools installed to + get the opendiff utility) may prefer + merge = Name *.txt -> opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCH -merg +e NEW + + Here is a slightly more involved hack. The opendiff program can operate + either with or without an archive file. A merge command of this form + merge = Name *.txt -> + if [ CURRENTARCHOPTx = x ]; + then opendiff CURRENT1 CURRENT2 -merge NEW; + else opendiff CURRENT1 CURRENT2 -ancestor CURRENTARCHOPT -merge NE +W; + fi + + (still all on one line in the preference file!) will test whether an + archive file exists and use the appropriate variant of the arguments to + opendiff. + + Linux users may enjoy this variant: + merge = Name * -> kdiff3 -o NEW CURRENTARCHOPT CURRENT1 CURRENT2 + + Ordinarily, external merge programs are only invoked when Unison is not + running in batch mode. To specify an external merge program that should + be used no matter the setting of the batch flag, use the mergebatch + preference instead of merge. + + Please post suggestions for other useful values of the merge + preference to the unison-users mailing list—we’d like to give + several examples here. + +The User Interface + + Both the textual and the graphical user interfaces are intended to be + mostly self-explanatory. Here are just a few tricks: + * By default, when running on Unix the textual user interface will + try to put the terminal into the “raw mode” so that it reads the + input a character at a time rather than a line at a time. (This + means you can type just the single keystroke “>” to tell Unison to + propagate a file from left to right, rather than “> Enter.”) + There are some situations, though, where this will not work — for + example, when Unison is running in a shell window inside Emacs. + Setting the dumbtty preference will force Unison to leave the + terminal alone and process input a line at a time. + +Interrupting a Synchronization + + It is possible to interrupt an ongoing synchronization process before + it completes. Different user interfaces offer different ways of doing + it. + + Graphical Interface: + * In the graphical user interface the synchronization process can be + interrupted before it is finished by pressing the “Stop” button or + by closing the window. The “Stop” button causes the onging + propagation to be stopped as quickly as possible while still doing + proper cleanup. The application keeps running and a rescan can be + performed or a different profile selected. Closing the window in + the middle of update propagation process will exit the application + immediately without doing proper cleanup; it is therefore not + recommended unless the “Stop” button does not react quickly enough. + + Textual Interface: + * When not synchronizing continuously, the text interface terminates + when synchronization is finished normally or due to a fatal error + occurring. + In the text interface, to interrupt synchronization before it is + finished, press “Ctrl-C” (or send signal SIGINT or SIGTERM). This + will interrupt update propagation as quickly as possible but still + complete proper cleanup. If the process does not stop even after + pressing “Ctrl-C” then keep doing it repeatedly. This will bypass + cleanup procedures and terminates the process forcibly (similar to + SIGKILL). Doing so may leave the archives or replicas in an + inconsistent state or locked. + When synchronizing continuously (time interval repeat or with + filesystem monitoring), interrupting with “Ctrl-C” or with signal + SIGINT or SIGTERM works the same way as described above and will + additionally stop the continuous process. To stop only the + continuous process and let the last synchronization complete + normally, send signal SIGUSR2 instead. + +Exit Code + + When running in the textual mode, Unison returns an exit status, which + describes whether, and at which level, the synchronization was + successful. The exit status could be useful when Unison is invoked from + a script. Currently, there are four possible values for the exit + status: + * 0: successful synchronization; everything is up-to-date now. + * 1: some files were skipped, but all file transfers were successful. + * 2: non-fatal failures occurred during file transfer. + * 3: a fatal error occurred, or the execution was interrupted. + + The graphical interface does not return any useful information through + the exit status. + +Path Specification + + Several Unison preferences (e.g., ignore/ignorenot, follow, + sortfirst/sortlast, backup, merge, etc.) specify individual paths or + sets of paths. These preferences share a common syntax based on + regular-expressions. Each preference is associated with a list of path + patterns; the paths specified are those that match any one of the path + pattern. + * Pattern preferences can be given on the command line, or, more + often, stored in profiles, using the same syntax as other + preferences. For example, a profile line of the form + ignore = pattern + + adds pattern to the list of patterns to be ignored. + * Each pattern can have one of three forms. The most general form is + a Posix extended regular expression introduced by the keyword + Regex. (The collating sequences and character classes of full Posix + regexps are not currently supported). + Regex regexp + + For convenience, three other styles of pattern are also recognized: + Name name + + matches any path in which the last component matches name, + Path path + + matches exactly the path path, and + BelowPath path + + matches the path path and any path below. The name and path + arguments of the latter forms of patterns are not regular + expressions. Instead, standard “globbing” conventions can be used + in name and path: + + a * matches any sequence of characters not including / (and + not beginning with ., when used at the beginning of a name) + + a ? matches any single character except / (and leading .) + + [xyz] matches any character from the set {x, y, z } + + {a,bb,ccc} matches any one of a, bb, or ccc. (Be careful not + to put extra spaces after the commas: these will be + interpreted literally as part of the strings to be matched!) + * The path separator in path patterns is always the forward-slash + character “/” — even when the client or server is running under + Windows, where the normal separator character is a backslash. This + makes it possible to use the same set of path patterns for both + Unix and Windows file systems. + * A path specification may be followed by the separator “ -> ” itself + followed by a string which will be associated to the matching + paths: + Path path -> associated string + + Not all pathspec preferences use these associated strings but all + pathspec preferences are parsed identically and the strings may be + ignored. Only the last match of the separator string on the line is + used as a delimiter. Thus to allow a path specification to contain + the separator string, append an associated string to it, even if it + is not used. The associated string cannot contain the separator + string. + + Some examples of path patterns appear in the section “Ignoring Paths” . + Associated strings are used by the preference merge. + +Ignoring Paths + + Most users of Unison will find that their replicas contain lots of + files that they don’t ever want to synchronize — temporary files, very + large files, old stuff, architecture-specific binaries, etc. They can + instruct Unison to ignore these paths using patterns introduced in the + section “Path Specification” . + + For example, the following pattern will make Unison ignore any path + containing the name CVS or a name ending in .cmo: + ignore = Name {CVS,*.cmo} + + The next pattern makes Unison ignore the path a/b: + ignore = Path a/b + + Path patterns do not skip filenames beginning with . (as Name patterns + do). For example, + ignore = Path */tmp + + will include .foo/tmp in the set of ignore directories, as it is a + path, not a name, that is ignored. + + The following pattern makes Unison ignore any path beginning with a/b + and ending with a name ending by .ml. + ignore = Regex a/b/.*\.ml + + Note that regular expression patterns are “anchored”: they must match + the whole path, not just a substring of the path. + + Here are a few extra points regarding the ignore preference. + * If a directory is ignored, all its descendants will be too. + * The user interface provides some convenient commands for adding new + patterns to be ignored. To ignore a particular file, select it and + press “i”. To ignore all files with the same extension, select it + and press “E” (with the shift key). To ignore all files with the + same name, no matter what directory they appear in, select it and + press “N”. These new patterns become permanent: they are + immediately added to the current profile on disk. + * If you use the include directive to include a common collection of + preferences in several top-level preference files, you will + probably also want to set the addprefsto preference to the name of + this file. This will cause any new ignore patterns that you add + from inside Unison to be appended to this file, instead of + whichever top-level preference file you started Unison with. + * Ignore patterns can also be specified on the command line, if you + like (this is probably not very useful), using an option like + -ignore 'Name temp.txt'. + * Be careful about renaming directories containing ignored files. + Because Unison understands the rename as a delete plus a create, + any ignored files in the directory will be lost (since they are + invisible to Unison and therefore they do not get recreated in the + new version of the directory). + * There is also an ignorenot preference, which specifies a set of + patterns for paths that should not be ignored, even if they match + an ignore pattern. However, the interaction of these two sets of + patterns can be a little tricky. Here is exactly how it works: + + Unison starts detecting updates from the root of the + replicas—i.e., from the empty path. If the empty path matches + an ignore pattern and does not match an ignorenot pattern, + then the whole replica will be ignored. (For this reason, it + is not a good idea to include Name * as an ignore pattern. If + you want to ignore everything except a certain set of files, + use Name ?*.) + + If the root is a directory, Unison continues looking for + updates in all the immediate children of the root. Again, if + the name of some child matches an ignore pattern and does not + match an ignorenot pattern, then this whole path including + everything below it will be ignored. + + If any of the non-ignored children are directories, then the + process continues recursively. + +Symbolic Links + + Ordinarily, Unison treats symbolic links in Unix replicas as “opaque”: + it considers the contents of the link to be just the string specifying + where the link points, and it will propagate changes in this string to + the other replica. + + It is sometimes useful to treat a symbolic link “transparently,” acting + as though whatever it points to were physically in the replica at the + point where the symbolic link appears. To tell Unison to treat a link + in this manner, add a line of the form + follow = pathspec + + to the profile, where pathspec is a path pattern as described in the + section “Path Specification” . + + Not all Windows versions and file systems support symbolic links; + Unison will refuse to propagate an opaque symbolic link from Unix to + Windows and flag the path as erroneous if the support or privileges are + lacking on the Windows side. When a Unix replica is to be synchronized + with such Windows system, all symbolic links should match either an + ignore pattern or a follow pattern. + + You may need to acquire extra privileges to create symbolic links under + Windows. By default, this is only allowed for administrators. Unison + may not be able to automatically detect support for symbolic links + under Windows. In that case, set the preference links to true + explicitly. + +Permissions + + Synchronizing the permission bits of files is slightly tricky when two + different filesystems are involved (e.g., when synchronizing a Windows + client and a Unix server). In detail, here’s how it works: + * When the permission bits of an existing file or directory are + changed, the values of those bits that make sense on both operating + systems will be propagated to the other replica. The other bits + will not be changed. + * When a newly created file is propagated to a remote replica, the + permission bits that make sense in both operating systems are also + propagated. The values of the other bits are set to default values + (they are taken from the current umask, if the receiving host is a + Unix system). + * For security reasons, the Unix setuid and setgid bits are not + propagated. + * The Unix owner and group ids can be propagated (see owner and group + preferences) by mapping names or by numeric ids (see numericids + preference). + +Access Control Lists - ACLs + + Unison allows synchronizing access control lists (ACLs) on platforms + and filesystems that support them. In general, synchronization makes + sense only in case both replicas support the same type of ACLs and + recognize same users and groups. In some cases you may be able to go + beyond that and synchronize ACLs to a replica that couldn’t fully use + them—this may be be useful for the purpose of preserving ACLs. + + If one of the replicas does not support any type of ACLs then Unison + will not attempt ACL synchronization. If the other replica does support + ACLs then those will remain intact. + + If both replicas support ACLs of any supported type then you can + request Unison to try ACL synchronization (acl preference). Success of + synchronization depends on permissions of the owner and group of Unison + process (Unison must have permissions to set ACL) and the compatibility + of ACL types on both replicas. + + An ACL is propagated as a single unit, with all ACEs. There is no + merging of ACEs from the replicas. + + Caveat: ACE inheritance may in certain scenarios cause synchronization + inconsistencies. In Windows, only explicit ACEs are synchronized; + inherited ACEs are not actively synchronized, but Windows will + propagate ACEs from parent directories (unless inheritance is + explicitly prevented on a file or a directory—this prevention is also + synchronized). Due to inheritance, the ultimately effective ACL may be + different, or provide different access, even after synchronization. + + Unison currently supports the following platforms and ACL types: + * Windows (Windows XP SP2 and later) + + NTFS ACL (discrete ACL (DACL) only) + * Solaris, OpenSolaris and illumos-based OS (OpenIndiana, SmartOS, + OmniOS, etc.) + + NFSv4 ACL (ZFS ACL) + + POSIX-draft ACL + + Some NFSv4 ACL (ZFS ACL) cross-synchronization with + POSIX-draft ACL + + Full cross-synchronization with other platforms that support + NFSv4 ACLs; limited cross-synchronization with POSIX-draft + ACLs + * FreeBSD, NetBSD + + NFSv4 ACL (ZFS ACL) + + Limited POSIX-draft ACL (access ACL only; not default ACL) + + Full cross-synchronization with other platforms that support + NFSv4 ACLs + * Darwin (macOS) + + Extended ACL + + Not all filesystems on the listed platforms support all ACL types (or + any ACLs at all). + + Synchronizing POSIX ACLs on Linux is not supported directly. However, + it is possible to synchronize these ACLs with another Linux system by + synchronizing extended attributes (xattrs) instead, because POSIX ACLs + are stored as xattrs by Linux. This is disabled by default (see the + section “Extended Attributes - xattrs” ). A simple way to enable + syncing POSIX ACLs on Linux is to enable the preference xattrs and add + a preference xattrignorenot with a value Path !system.posix_acl_*. The + * will be expanded to include both posix_acl_access and + posix_acl_default attributes – if you only want to sync either one, + just remove the * and type out the attribute name in full. If you want + to prevent other xattrs from being synced then add an xattrignore with + a value Path * (value Regex .* will also work). + +Extended Attributes - xattrs + + Unison allows synchronizing extended attributes on platforms and + filesystems that support them. System attributes are not synchronized. + What exactly is considered a system attribute is platform-dependent. + Synchronization is possible cross-platform, but see caveats below. + + If one of the replicas does not support extended attributes then Unison + will not attempt attribute synchronization. If the other replica does + support extended attributes then those will remain intact. + + If both replicas support extended attributes then you can request + Unison to try attribute synchronization (xattrs preference). Extended + attributes from both replicas will not be merged, all extended + attributes are propagated as a set from one replica to another. + + Unison currently supports extended attributes on the following + platforms: + * Linux Attributes in user, trusted and security namespaces. + Synchronization of the latter two namespaces depends on unison + process privileges and is disabled by default. To sync one or more + attributes in the security namespace, for example, you can set the + preference xattrignorenot to Path !security.* (for all) or to Path + !security.selinux (for one specific attribute). Attributes in + system namespace are not synchronized, with the exception of + system.posix_acl_default and system.posix_acl_access (also disabled + by default). + * Solaris, OpenSolaris and illumos-based OS (OpenIndiana, SmartOS, + OmniOS, etc.) + * FreeBSD, NetBSD Attributes in user namespace. + * Darwin (macOS) + + Not all filesystems on the listed platforms may support extended + attributes. + + Caveats: + * Some platforms and file systems support very large extended + attribute values. Unison synchronizes only up to 16 MB of each + attribute value. + * Attributes are synchronized as simple name-value pairs. More + complex extended attribute concepts supported by some platforms are + not synchronized. + * On Linux, attribute names always have a fully qualified form + (namespace.attribute). Other platforms do not have the same + constraint. The consequence of this is that Unison will sync the + attribute names on Linux as follows: an ! is prepended to the + namespace name, except for the user namespace; the user. prefix is + stripped from attribute names instead. This allows syncing extended + attributes from Linux to other platforms. These transformations are + reversed when syncing to Linux, resulting in correct fully + qualified attribute names. The xattrignore and xattrignorenot + preferences work on the transformed attribute names. This means + that any patterns for the user namespace must be specified without + the user. prefix and any patterns intended for other namespaces + must begin with an !. + + The xattrignore preference can be used to filter the names of extended + attributes that will be synchronized. The most useful ignore patterns + can be constructed with the Path form (where shell wildcards * and ? + are supported) and with the Regex form. The xattrignorenot preference + can be used to override xattrignore. + + Disabling the security and trusted namespaces on Linux is achieved by + setting a default xattrignore pattern of Regex + !(security|trusted)[.].*. Disabling the syncing of attributes used to + store POSIX ACL on Linux is achieved by setting a default xattrignore + pattern of Path !system.posix_acl_*. + +Cross-Platform Synchronization + + If you use Unison to synchronize files between Windows and Unix + systems, there are a few special issues to be aware of. + + Case conflicts. In Unix, filenames are case sensitive: foo and FOO can + refer to different files. In Windows, on the other hand, filenames are + not case sensitive: foo and FOO can only refer to the same file. This + means that a Unix foo and FOO cannot be synchronized onto a Windows + system — Windows won’t allow two different files to have the “same” + name. Unison detects this situation for you, and reports that it cannot + synchronize the files. + + You can deal with a case conflict in a couple of ways. If you need to + have both files on the Windows system, your only choice is to rename + one of the Unix files to avoid the case conflict, and re-synchronize. + If you don’t need the files on the Windows system, you can simply + disregard Unison’s warning message, and go ahead with the + synchronization; Unison won’t touch those files. If you don’t want to + see the warning on each synchronization, you can tell Unison to ignore + the files (see the section “Ignoring Paths” ). + + Illegal filenames. Unix allows some filenames that are illegal in + Windows. For example, colons (‘:’) are not allowed in Windows + filenames, but they are legal in Unix filenames. This means that a Unix + file foo:bar can’t be synchronized to a Windows system. As with case + conflicts, Unison detects this situation for you, and you have the same + options: you can either rename the Unix file and re-synchronize, or you + can ignore it. + +Slow Links + + Unison is built to run well even over relatively slow links such as + modems and DSL connections. + + Unison uses the “rsync protocol” designed by Andrew Tridgell and Paul + Mackerras to greatly speed up transfers of large files in which only + small changes have been made. More information about the rsync protocol + can be found at the rsync web site (http://samba.anu.edu.au/rsync/). + + If you are using Unison with ssh, you may get some speed improvement by + enabling ssh’s compression feature. Do this by adding the option + “-sshargs -C” to the command line or “sshargs = -C” to your profile. + +Making Unison Faster on Large Files + + Unison’s built-in implementation of the rsync algorithm makes + transferring updates to existing files pretty fast. However, for + whole-file copies of newly created files, the built-in transfer method + is not highly optimized. Also, if Unison is interrupted in the middle + of transferring a large file, it will attempt to retransfer the whole + thing on the next run. + + These shortcomings can be addressed with a little extra work by telling + Unison to use an external file copying utility for whole-file + transfers. The recommended one is the standalone rsync tool, which is + available by default on most Unix systems and can easily be installed + on Windows systems using Cygwin. + + If you have rsync installed on both hosts, you can make Unison use it + simply by setting the copythreshold flag to something non-negative. If + you set it to 0, Unison will use the external copy utility for all + whole-file transfers. (This is probably slower than letting Unison copy + small files by itself, but can be useful for testing.) If you set it to + a larger value, Unison will use the external utility for all files + larger than this size (which is given in kilobytes, so setting it to + 1000 will cause the external tool to be used for all transfers larger + than a megabyte). + + If you want to use a different external copy utility, set both the + copyprog and copyprogrest preferences—the former is used for the first + transfer of a file, while the latter is used when Unison sees a + partially transferred temp file on the receiving host. Be careful here: + Your external tool needs to be instructed to copy files in place + (otherwise if the transfer is interrupted Unison will not notice that + some of the data has already been transferred, the next time it tries). + The default values are: + copyprog = rsync --inplace --compress + copyprogrest = rsync --partial --inplace --compress + + If a directory transfer is interrupted, the next run of Unison will + automatically skip any files that were completely transferred before + the interruption. (This behavior is always on: it does not depend on + the setting of the copythreshold preference.) Note, though, that the + new directory will not appear in the destination filesystem until + everything has been transferred—partially transferred directories are + kept in a temporary location (with names like .unison.DIRNAME....) + until the transfer is complete. + +Fast Update Detection + + If your replicas are large and at least one of them is on a Windows + system, you may find that Unison’s default method for detecting changes + (which involves scanning the full contents of every file on every + sync—the only completely safe way to do it under Windows) is too slow. + Unison provides a preference fastcheck that, when set to true, causes + it to use file creation times as ’pseudo inode numbers’ when scanning + replicas for updates, instead of reading the full contents of every + file. + + When fastcheck is set to no, Unison will perform slow + checking—re-scanning the contents of each file on each + synchronization—on all replicas. When fastcheck is set to default + (which, naturally, is the default), Unison will use fast checks on Unix + replicas and slow checks on Windows replicas. + + This strategy may cause Unison to miss propagating an update if the + modification time and length of the file are both unchanged by the + update. However, Unison will never overwrite such an update with a + change from the other replica, since it always does a safe check for + updates just before propagating a change. Thus, it is reasonable to use + this switch most of the time and occasionally run Unison once with + fastcheck set to no, if you are worried that Unison may have overlooked + an update. + + Fastcheck is (always) automatically disabled for files with extension + .xls or .mpp, to prevent Unison from being confused by the habits of + certain programs (Excel, in particular) of updating files without + changing their modification times. + +Mount Points and Removable Media + + Using Unison removable media such as USB drives can be dangerous unless + you are careful. If you synchronize a directory that is stored on + removable media when the media is not present, it will look to Unison + as though the whole directory has been deleted, and it will proceed to + delete the directory from the other replica—probably not what you want! + + To prevent accidents, Unison provides a preference called mountpoint. + Including a line like + mountpoint = foo + + in your preference file will cause Unison to check, after it finishes + detecting updates, that something actually exists at the path foo on + both replicas; if it does not, the Unison run will abort. diff --git a/unison-profile.prf b/unison-profile.prf new file mode 100644 index 0000000..bc9e34d --- /dev/null +++ b/unison-profile.prf @@ -0,0 +1,52 @@ +# Unison profile template for path synchronization +# Copy to ~/.unison/paths.prf and adjust paths as needed + +# Root directories (will be replaced by just setup) +root = TEMPLATE_SOURCE/usync +root = TEMPLATE_TARGET/usync + +# Auto-accept non-conflicting changes +auto = true + +# Prefer newer files when conflicts occur +prefer = newer + +# Batch mode (no interactive prompts) +batch = true + +# Ignore patterns +ignore = Name *.tmp +ignore = Name .DS_Store +ignore = Name Thumbs.db +ignore = Name *.swp +ignore = Name *.swo +ignore = Name .git* +ignore = Path temp/ +ignore = Path cache/ +ignore = Path .cache/ + +# Performance settings +maxthreads = 20 + +# Don't sync permissions (can cause issues between filesystems) +perms = 0 + +# Sync modification times (important for prefer = newer) +times = true + +# Log sync actions +log = true +logfile = TEMPLATE_HOME_DIR/.unison/unison.log + +# Performance options +# Terse output - less verbose +terse = true + +# Use rsync for faster transfers of large files +rsync = true + +# Optimize transfers using local copies when possible +xferbycopying = true + +# Sort files by size (small files first) for faster initial sync +sortbysize = true
\ No newline at end of file |
