Address the review comment on commit350425a8(RsyncProject/rsync#1144): "This will still abort when the hard-link group spans incremental file-list chunks. Re-root the group without retaining released file-list indices." When a group spans chunks, a member's F_HL_PREV can point into a file-list that is released before the member's finish_hard_link() walks the completion chain, and the fatal flist_for_ndx() call aborts the transfer. Two changes in finish_hard_link(): 1. The completion-chain lookup now uses the graceful (NULL) variant of flist_for_ndx() and stops the walk when an index is no longer in a live file-list. The chain only moves to earlier ndx values, so once one is released, everything further back is already finished and there is nothing left to re-link. No live file retains a released index: the finishing file's F_HL_PREV is reset on entry, and each walked member's F_HL_PREV is pointed at the finishing file. 2. A duplicate finish (the group already recorded as finished at some path) now re-roots the group at the newly finished file instead of keeping the recorded path. A duplicate finish only happens when the recorded root could not be hard-linked (e.g. EMLINK, EXDEV) and that member was written as a regular file, so that member's inode is the only one the group can still link to; later members then link to this live file instead of the stale root. The abort is reproducible locally with a small chunk-spanning fixture whose first file-list is under MIN_FILECNT_LOOKAHEAD/2, both on the series base8718cd28and with only commit350425a8applied: the hard-link lookahead at the top of generate_files() then matches the extra file-list before the group leader is itemized, so the members' F_HL_PREV pointers into the leader's file-list survive the match, and the fatal lookup aborts deterministically: "File-list index 3 not in 11 - 13 (finish_hard_link)" with "protocol incompatibility" (code 2). With this commit the same run completes with rc 23 and the group re-rooted on a fresh inode; a simulated WAN delay for the last member gives the identical abort/fix behavior (fixture and full evidence in the description of RsyncProject/rsync#1144). Also verified: a 1200-file chunk-spanning EMLINK fixture with the destination inode pinned at the ext4 65000-link cap completes in 0.2 s with rc 23 and the group re-rooted on a fresh inode; the single-flist EMLINK fixture takes 0.15 s, rc 23, all 101 members on one fresh inode; the hard-link regression tree is all rc 0 with no spurious output; the upstream hardlink/link-dest/keep-dirlinks suite (9 tests) passes. Co-authored-by: LIM Coding Assistant <298007100+statefullm@users.noreply.github.com>
WHAT IS RSYNC?
Rsync is a fast and extraordinarily versatile file copying tool for both remote and local files.
Rsync uses a delta-transfer algorithm which provides a very fast method for bringing remote files into sync. It does this by sending just the differences in the files across the link, without requiring that both sets of files are present at one of the ends of the link beforehand. At first glance this may seem impossible because the calculation of diffs between two files normally requires local access to both files.
A technical report describing the rsync algorithm is included with this package.
USAGE
Basically you use rsync just like scp, but rsync has many additional options. To get a complete list of supported options type:
rsync --help
See the manpage for more detailed information.
BUILDING AND INSTALLING
If you need to build rsync yourself, check out the INSTALL page for information on what libraries and packages you can use to get the maximum features in your build.
SETUP
Rsync normally uses ssh or rsh for communication with remote systems. It does not need to be setuid and requires no special privileges for installation. You must, however, have a working ssh or rsh system. Using ssh is recommended for its security features.
Alternatively, rsync can run in `daemon' mode, listening on a socket. This is generally used for public file distribution, although authentication and access control are available.
To install rsync, first run the "configure" script. This will create a Makefile and config.h appropriate for your system. Then type "make".
Note that on some systems you will have to force configure not to use gcc because gcc may not support some features (such as 64 bit file offsets) that your system may support. Set the environment variable CC to the name of your native compiler before running configure in this case.
Once built put a copy of rsync in your search path on the local and remote systems (or use "make install"). That's it!
RSYNC DAEMONS
Rsync can also talk to "rsync daemons" which can provide anonymous or authenticated rsync. See the rsyncd.conf(5) manpage for details on how to setup an rsync daemon. See the rsync(1) manpage for info on how to connect to an rsync daemon.
WEB SITE
For more information, visit the main rsync web site.
You'll find a FAQ list, downloads, resources, HTML versions of the manpages, etc.
MAILING LISTS
There is a mailing list for the discussion of rsync and its applications that is open to anyone to join. New releases are announced on this list, and there is also an announcement-only mailing list for those that want official announcements. See the mailing-list page for full details.
DISCORD
There is also an rsync Discord server for real-time chat about rsync and its development.
BUG REPORTS
The bug-tracking web page has full details on bug reporting.
That page contains links to the current bug list, and information on how to do a good job when reporting a bug. You might also like to try searching the Internet for the error message you've received, or looking in the mailing list archives.
To send a bug report, follow the instructions on the bug-tracking page of the web site.
Alternately, email your bug report to rsync@lists.samba.org.
For security issues please email details of the issue to rsync.project@gmail.com.
GIT REPOSITORY
If you want to get the very latest version of rsync direct from the source code repository, then you will need to use git. The git repo is hosted on GitHub and on Samba's site.
See the download page for full details on all the ways to grab the source.
COPYRIGHT
Rsync was originally written by Andrew Tridgell and Paul Mackerras. Many people from around the world have helped to maintain and improve it.
Special thanks go to Wayne Davison, who maintained rsync from 2004 to 2024.
Rsync may be used, modified and redistributed only under the terms of the GNU General Public License, found in the file COPYING in this distribution, or at the Free Software Foundation.