Get rsync to generate a patch file instead of copying across files?

I'm copying lots of files that have changed from one server to another using rsync. I know I can use the -n option to do a dry run, so I can see what files have been changed. However is it possible to get rsync to print a diff of the file contents that's changed? I'd like to see what's happening before doing a copy? Something I can save to a file and the apply with diff(1) later?


Solution 1:

There might be a better way, but this might work, albeit not that efficiently:

 rsync -vrn / dest:/ > ~/file_list

Then edit test to remove the stats, then:

while read file; do
    diff $file <(ssh dest "cat $file")
done < ~/edited_file_list

Another Option:
You might also consider mounting the file system with something like sshfs/fuse, and then just using diff.

Solution 2:

For create patch:

rsync -arv --only-write-batch=patch old/ new/

For apply it:

rsync -arv --read-batch=patch dir/

or use auto-generated script:

./patch.sh

Sources:

  • https://russt.me/2018/07/creating-and-applying-diffs-with-rsync/
  • https://www.comentum.com/rsync.html

Solution 3:

rsync can't do this natively, but if there's a possibility of using unison you can produce diff style format from that.