Bisync does not copy the winner file to the loser site

What is the problem you are having with rclone?

Quick summary:

When using bisync with --conflict-resolve newer and --conflict-loser pathname and the files in both source and destination site are changed, rclone does not copy the winner file to the loser site.

Steps to replicate the problem:

  • Set up the local site rclone config create remote local
  • Create folders mkdir -p /content/src /content/dst
  • Create file.txt in /content/src
echo "hello" > ./src/file.txt
  • Resync rclone bisync /content/src remote:/content/dst --resync
  • Change /content/src/file.txt and then change /content/dst/file.txt
echo "src updated" > /content/src/file.txt
echo "dst updated" > /content/dst/file.txt
  • Bisync
rclone bisync /content/src remote:/content/dst --conflict-resolve newer --conflict-loser pathname --force

Expected behavior:
Both site should have file.txt and file.txt.conflict1

Actual behavior:
Could not find /content/src/file.txt. Found only /content/src/file.txt.conflict1

Google Colab notebook for reproducing the problem:
https://colab.research.google.com/drive/1sd2fI-x3TkoBlHswsK3V1ptr84Zpf5CO?usp=sharing

Notes:

  • Tested on both Windows and Linux
  • Only happened with --conflict-resolve newer --conflict-loser pathname. The problem solved when using --conflict-resolve newer --conflict-loser num

Run the command 'rclone version' and share the full output of the command.

rclone v1.74.0

  • os/version: ubuntu 22.04 (64 bit)
  • os/kernel: 6.6.113+ (x86_64)
  • os/type: linux
  • os/arch: amd64
  • go/version: go1.26.2
  • go/linking: static
  • go/tags: none

Which cloud storage system are you using? (eg Google Drive)

local

The command you were trying to run (eg rclone copy /tmp remote:tmp)

!rclone bisync /content/src remote:/content/dst --conflict-resolve newer --conflict-loser pathname

The rclone config contents with secrets removed.

[remote]
type = local

A log from the command with the -vv flag

2026/05/08 15:09:29 DEBUG : rclone: Version "v1.74.0" starting with parameters ["rclone" "bisync" "/content/src" "remote:/content/dst" "--conflict-resolve" "newer" "--conflict-loser" "pathname" "--force" "-vv"]
2026/05/08 15:09:29 DEBUG : Creating backend with remote "/content/src"
2026/05/08 15:09:29 DEBUG : Using config file from "/root/.config/rclone/rclone.conf"
2026/05/08 15:09:29 DEBUG : Creating backend with remote "remote:/content/dst"
2026/05/08 15:09:29 INFO  : Setting --ignore-listing-checksum as neither --checksum nor --compare checksum are set.
2026/05/08 15:09:29 INFO  : Bisyncing with Comparison Settings: 
{
	"Modtime": true,
	"Size": true,
	"Checksum": false,
	"HashType1": 0,
	"HashType2": 0,
	"NoSlowHash": false,
	"SlowHashSyncOnly": false,
	"SlowHashDetected": true,
	"DownloadHash": false
}
2026/05/08 15:09:29 DEBUG : Lock file created: /root/.cache/rclone/bisync/content_src..remote__content_dst.lck
2026/05/08 15:09:29 INFO  : Synching Path1 "/content/src/" with Path2 "remote:/content/dst/"
2026/05/08 15:09:29 DEBUG : updated backup-dir for Path1
2026/05/08 15:09:29 DEBUG : updated backup-dir for Path2
2026/05/08 15:09:29 INFO  : Building Path1 and Path2 listings
2026/05/08 15:09:29 DEBUG : &{fs1:0x1101a6766c0 fs2:0x1101a676840 abort:false critical:false retryable:false basePath:/root/.cache/rclone/bisync/content_src..remote__content_dst workDir:/root/.cache/rclone/bisync listing1:/root/.cache/rclone/bisync/content_src..remote__content_dst.path1.lst listing2:/root/.cache/rclone/bisync/content_src..remote__content_dst.path2.lst newListing1:/root/.cache/rclone/bisync/content_src..remote__content_dst.path1.lst-new newListing2:/root/.cache/rclone/bisync/content_src..remote__content_dst.path2.lst-new aliases:map[] opt:0x1101a1f6240 octx:{emptyCtx:{}} fctx:{emptyCtx:{}} InGracefulShutdown:false CleanupCompleted:false SyncCI:<nil> CancelSync:<nil> DebugName: lockFile:/root/.cache/rclone/bisync/content_src..remote__content_dst.lck renames:map[] resyncIs1to2:false march:{ls1:0x1101a8f2180 ls2:0x1101a8f21e0 err:<nil> firstErr:<nil> marchAliasLock:{_:{} mu:{state:0 sema:0}} marchLsLock:{_:{} mu:{state:0 sema:0}} marchErrLock:{_:{} mu:{state:0 sema:0}} marchCtx:{emptyCtx:{}}} check:{hashType:0 fsrc:<nil> fdst:<nil> fcrypt:<nil>} queueOpt:{logger:{LoggerFn:<nil> Combined:0x1101a8d2d20 MissingOnSrc:0x1101a8d2d50 MissingOnDst:0x1101a8d2d80 Match:0x1101a8d2db0 Differ:0x1101a8d2de0 Error:0x1101a8d2e10 DestAfter:0x1101a8d2e40 JSON:0x1101a8d2e70 DeleteModeOff:false ListFormat:{separator: dirSlash:false absolute:false output:[] csv:<nil> buf:{buf:[] off:0 lastRead:0}} JSONOpt:{Recurse:false NoModTime:false NoMimeType:false ShowEncrypted:false ShowOrigIDs:false ShowHash:false DirsOnly:false FilesOnly:false Metadata:false HashTypes:[]} LJ:<nil> Format: TimeFormat: Separator: DirSlash:false HashType:0 FilesOnly:false DirsOnly:false Csv:false Absolute:false} lock:{_:{} mu:{state:0 sema:0}} once:{_:{} done:{_:{} v:0} m:{_:{} mu:{state:0 sema:0}}} ignoreListingChecksum:false ignoreListingModtime:false hashTypes:map[] queueCI:<nil>} downloadHashOpt:{downloadHash:false downloadHashWarn:{_:{} done:{_:{} v:0} m:{_:{} mu:{state:0 sema:0}}} firstDownloadHash:{_:{} done:{_:{} v:0} m:{_:{} mu:{state:0 sema:0}}}} lockFileOpt:{stopRenewal:0x2326380 data:{Session:/root/.cache/rclone/bisync/content_src..remote__content_dst PID:14255 TimeRenewed:{wall:14012841433683904771 ext:105897278 loc:0x4f18180} TimeExpires:{wall:748341651 ext:70221049769 loc:0x4f18180}}}}: starting to march!
2026/05/08 15:09:29 DEBUG : file.txt: both path1 and path2
2026/05/08 15:09:29 DEBUG : file.txt: is Object
2026/05/08 15:09:29 DEBUG : &{fs1:0x1101a6766c0 fs2:0x1101a676840 abort:false critical:false retryable:false basePath:/root/.cache/rclone/bisync/content_src..remote__content_dst workDir:/root/.cache/rclone/bisync listing1:/root/.cache/rclone/bisync/content_src..remote__content_dst.path1.lst listing2:/root/.cache/rclone/bisync/content_src..remote__content_dst.path2.lst newListing1:/root/.cache/rclone/bisync/content_src..remote__content_dst.path1.lst-new newListing2:/root/.cache/rclone/bisync/content_src..remote__content_dst.path2.lst-new aliases:map[] opt:0x1101a1f6240 octx:{emptyCtx:{}} fctx:{emptyCtx:{}} InGracefulShutdown:false CleanupCompleted:false SyncCI:<nil> CancelSync:<nil> DebugName: lockFile:/root/.cache/rclone/bisync/content_src..remote__content_dst.lck renames:map[] resyncIs1to2:false march:{ls1:0x1101a8f2180 ls2:0x1101a8f21e0 err:<nil> firstErr:<nil> marchAliasLock:{_:{} mu:{state:0 sema:0}} marchLsLock:{_:{} mu:{state:0 sema:0}} marchErrLock:{_:{} mu:{state:0 sema:0}} marchCtx:{emptyCtx:{}}} check:{hashType:0 fsrc:<nil> fdst:<nil> fcrypt:<nil>} queueOpt:{logger:{LoggerFn:<nil> Combined:0x1101a8d2d20 MissingOnSrc:0x1101a8d2d50 MissingOnDst:0x1101a8d2d80 Match:0x1101a8d2db0 Differ:0x1101a8d2de0 Error:0x1101a8d2e10 DestAfter:0x1101a8d2e40 JSON:0x1101a8d2e70 DeleteModeOff:false ListFormat:{separator: dirSlash:false absolute:false output:[] csv:<nil> buf:{buf:[] off:0 lastRead:0}} JSONOpt:{Recurse:false NoModTime:false NoMimeType:false ShowEncrypted:false ShowOrigIDs:false ShowHash:false DirsOnly:false FilesOnly:false Metadata:false HashTypes:[]} LJ:<nil> Format: TimeFormat: Separator: DirSlash:false HashType:0 FilesOnly:false DirsOnly:false Csv:false Absolute:false} lock:{_:{} mu:{state:0 sema:0}} once:{_:{} done:{_:{} v:0} m:{_:{} mu:{state:0 sema:0}}} ignoreListingChecksum:false ignoreListingModtime:false hashTypes:map[] queueCI:<nil>} downloadHashOpt:{downloadHash:false downloadHashWarn:{_:{} done:{_:{} v:0} m:{_:{} mu:{state:0 sema:0}}} firstDownloadHash:{_:{} done:{_:{} v:0} m:{_:{} mu:{state:0 sema:0}}}} lockFileOpt:{stopRenewal:0x2326380 data:{Session:/root/.cache/rclone/bisync/content_src..remote__content_dst PID:14255 TimeRenewed:{wall:14012841433683904771 ext:105897278 loc:0x4f18180} TimeExpires:{wall:748341651 ext:70221049769 loc:0x4f18180}}}}: march completed. err: <nil>
2026/05/08 15:09:29 INFO  : Path1 checking for diffs
2026/05/08 15:09:29 DEBUG : file.txt: (old: 6 current: 12)
2026/05/08 15:09:29 DEBUG : 2026-05-08 15:09:28.210054609 +0000 UTC: Modification times differ by 1.212010923s: 2026-05-08 15:09:28.210054609 +0000 UTC, 2026-05-08 15:09:29.422065532 +0000 UTC
2026/05/08 15:09:29 DEBUG : file.txt: (old: 2026-05-08 15:09:28.210054609 +0000 UTC current: 2026-05-08 15:09:29.422065532 +0000 UTC)
2026/05/08 15:09:29 INFO  : - Path1    File changed: size (larger), time (newer) - file.txt
2026/05/08 15:09:29 INFO  : Path1:    1 changes:    0 new,    1 modified,    0 deleted
2026/05/08 15:09:29 INFO  : (Modified:    1 newer,    0 older,    1 larger,    0 smaller)
2026/05/08 15:09:29 INFO  : Path2 checking for diffs
2026/05/08 15:09:29 DEBUG : file.txt: (old: 6 current: 12)
2026/05/08 15:09:29 DEBUG : 2026-05-08 15:09:28.210054609 +0000 UTC: Modification times differ by 1.319011887s: 2026-05-08 15:09:28.210054609 +0000 UTC, 2026-05-08 15:09:29.529066496 +0000 UTC
2026/05/08 15:09:29 DEBUG : file.txt: (old: 2026-05-08 15:09:28.210054609 +0000 UTC current: 2026-05-08 15:09:29.529066496 +0000 UTC)
2026/05/08 15:09:29 INFO  : - Path2    File changed: size (larger), time (newer) - file.txt
2026/05/08 15:09:29 INFO  : Path2:    1 changes:    0 new,    1 modified,    0 deleted
2026/05/08 15:09:29 INFO  : (Modified:    1 newer,    0 older,    1 larger,    0 smaller)
2026/05/08 15:09:29 INFO  : Applying changes
2026/05/08 15:09:29 DEBUG : Added file to list of potential conflicts to check: file.txt
2026/05/08 15:09:29 DEBUG : There are potential conflicts to check.
2026/05/08 15:09:29 INFO  : Checking potential conflicts...
2026/05/08 15:09:29 DEBUG : Local file system at /content/dst: Waiting for checks to finish
2026/05/08 15:09:29 DEBUG : file.txt: size = 12 OK
2026/05/08 15:09:29 DEBUG : file.txt: md5 = 49568d3b721eefe499641ae067dcaf5a (Local file system at /content/src)
2026/05/08 15:09:29 DEBUG : file.txt: md5 = b561e8fbaf96a46dcb0b146ff02d2d87 (Local file system at /content/dst)
2026/05/08 15:09:29 ERROR : file.txt: md5 differ
2026/05/08 15:09:29 NOTICE: Local file system at /content/dst: 1 differences found
2026/05/08 15:09:29 NOTICE: Local file system at /content/dst: 1 errors while checking
2026/05/08 15:09:29 INFO  : Finished checking the potential conflicts. 1 differences found
2026/05/08 15:09:29 DEBUG : None of the conflicts were determined to be identical.
2026/05/08 15:09:29 NOTICE: - WARNING  New or changed in both paths       - file.txt
2026/05/08 15:09:29 DEBUG : Files are NOT equal: file.txt
2026/05/08 15:09:29 INFO  : file.txt: Path2 is newer. Path1: 2026-05-08 15:09:29.422065532 +0000 UTC, Path2: 2026-05-08 15:09:29.529066496 +0000 UTC, Difference: 107.000964ms
2026/05/08 15:09:29 INFO  : file.txt: The winner is: Path2
2026/05/08 15:09:29 NOTICE: - Path1    Renaming Path1 copy                - /content/src/file.txt.conflict1
2026/05/08 15:09:29 DEBUG : updated backup-dir for Path1
2026/05/08 15:09:29 DEBUG : file.txt: Need to transfer - File not found at Destination
2026/05/08 15:09:29 INFO  : file.txt: Moved (server-side) to: file.txt.conflict1
2026/05/08 15:09:29 NOTICE: - Path1    Queue copy to Path2       - remote:/content/dst/file.txt.conflict1
2026/05/08 15:09:29 NOTICE: - Path2    Not renaming Path2 copy, as it was determined the winner - remote:/content/dst/file.txt.conflict2
2026/05/08 15:09:29 NOTICE: - Path2    Queue copy to Path1       - /content/src/file.txt.conflict2
2026/05/08 15:09:29 INFO  : - Path2    Do queued copies to                - Path1
2026/05/08 15:09:29 DEBUG : updated backup-dir for Path1
2026/05/08 15:09:29 DEBUG : Local file system at /content/src: Waiting for checks to finish
2026/05/08 15:09:29 DEBUG : Local file system at /content/src: Waiting for transfers to finish
2026/05/08 15:09:29 DEBUG : Waiting for deletions to finish
2026/05/08 15:09:29 DEBUG : failed to marshal input: json: unsupported type: operations.LoggerFn
2026/05/08 15:09:29 DEBUG : b.queueOpt.logger: 

2026/05/08 15:09:29 DEBUG : Got 0 results for copy2to1
2026/05/08 15:09:29 DEBUG : syncing empty dirs
2026/05/08 15:09:29 INFO  : - Path1    Do queued copies to                - Path2
2026/05/08 15:09:29 DEBUG : updated backup-dir for Path2
2026/05/08 15:09:29 DEBUG : writing result: 
{
	"Src": "/content/src/",
	"Dst": "",
	"Name": "file.txt.conflict1",
	"AltName": "",
	"Size": 12,
	"Modtime": "2026-05-08T15:09:29.422065532Z",
	"Hash": "",
	"Flags": "-",
	"Sigil": 43,
	"Err": null,
	"Winner": {
		"Obj": {},
		"Side": "src",
		"Err": null
	},
	"IsWinner": true,
	"IsSrc": true,
	"IsDst": false,
	"Origin": "sync"
}
2026/05/08 15:09:29 DEBUG : writing result: 
{
	"Src": "/content/src/",
	"Dst": "",
	"Name": "file.txt.conflict1",
	"AltName": "",
	"Size": 12,
	"Modtime": "2026-05-08T15:09:29.422065532Z",
	"Hash": "",
	"Flags": "-",
	"Sigil": 43,
	"Err": null,
	"Winner": {
		"Obj": {},
		"Side": "src",
		"Err": null
	},
	"IsWinner": false,
	"IsSrc": false,
	"IsDst": true,
	"Origin": "sync"
}
2026/05/08 15:09:29 DEBUG : file.txt.conflict1: Need to transfer - File not found at Destination
2026/05/08 15:09:29 DEBUG : Local file system at /content/dst: Waiting for checks to finish
2026/05/08 15:09:29 DEBUG : Local file system at /content/dst: Waiting for transfers to finish
2026/05/08 15:09:29 DEBUG : file.txt.conflict1.c161d9ea.partial: size = 12 OK
2026/05/08 15:09:29 DEBUG : file.txt.conflict1: md5 = 49568d3b721eefe499641ae067dcaf5a OK
2026/05/08 15:09:29 DEBUG : file.txt.conflict1.c161d9ea.partial: renamed to: file.txt.conflict1
2026/05/08 15:09:29 INFO  : file.txt.conflict1: Copied (new)
2026/05/08 15:09:29 DEBUG : Waiting for deletions to finish
2026/05/08 15:09:29 DEBUG : failed to marshal input: json: unsupported type: operations.LoggerFn
2026/05/08 15:09:29 DEBUG : b.queueOpt.logger: 

2026/05/08 15:09:29 DEBUG : result: 
{
	"Src": "/content/src/",
	"Dst": "",
	"Name": "file.txt.conflict1",
	"AltName": "",
	"Size": 12,
	"Modtime": "2026-05-08T15:09:29.422065532Z",
	"Hash": "",
	"Flags": "-",
	"Sigil": 43,
	"Err": null,
	"Winner": {
		"Obj": null,
		"Side": "src",
		"Err": null
	},
	"IsWinner": true,
	"IsSrc": true,
	"IsDst": false,
	"Origin": "sync"
}
2026/05/08 15:09:29 DEBUG : result: 
{
	"Src": "/content/src/",
	"Dst": "",
	"Name": "file.txt.conflict1",
	"AltName": "",
	"Size": 12,
	"Modtime": "2026-05-08T15:09:29.422065532Z",
	"Hash": "",
	"Flags": "-",
	"Sigil": 43,
	"Err": null,
	"Winner": {
		"Obj": null,
		"Side": "src",
		"Err": null
	},
	"IsWinner": false,
	"IsSrc": false,
	"IsDst": true,
	"Origin": "sync"
}
2026/05/08 15:09:29 DEBUG : Got 2 results for copy1to2
2026/05/08 15:09:29 DEBUG : -       12   2026-05-08 15:09:29.422065532 +0000 UTC "file.txt.conflict1"
2026/05/08 15:09:29 DEBUG : -       12   2026-05-08 15:09:29.422065532 +0000 UTC "file.txt.conflict1"
2026/05/08 15:09:29 DEBUG : syncing empty dirs
2026/05/08 15:09:29 INFO  : Updating listings
2026/05/08 15:09:29 DEBUG : updating 2to1
2026/05/08 15:09:29 DEBUG : results: 
null
2026/05/08 15:09:29 DEBUG : queue: 
{
	"file.txt.conflict2": null
}
2026/05/08 15:09:29 DEBUG : file.txt.conflict2: file in queue but missing from src transfers
2026/05/08 15:09:29 DEBUG : file.txt.conflict2: file in queue but missing from dst transfers
2026/05/08 15:09:29 DEBUG : 2to1: srcOldName: file.txt srcNewName: file.txt.conflict2 dstOldName: file.txt dstNewName: file.txt.conflict1
2026/05/08 15:09:29 DEBUG : updating 1to2
2026/05/08 15:09:29 DEBUG : results: 
[
	{
		"Src": "/content/src/",
		"Dst": "",
		"Name": "file.txt.conflict1",
		"AltName": "",
		"Size": 12,
		"Modtime": "2026-05-08T15:09:29.422065532Z",
		"Hash": "",
		"Flags": "-",
		"Sigil": 43,
		"Err": null,
		"Winner": {
			"Obj": null,
			"Side": "src",
			"Err": null
		},
		"IsWinner": true,
		"IsSrc": true,
		"IsDst": false,
		"Origin": "sync"
	},
	{
		"Src": "/content/src/",
		"Dst": "",
		"Name": "file.txt.conflict1",
		"AltName": "",
		"Size": 12,
		"Modtime": "2026-05-08T15:09:29.422065532Z",
		"Hash": "",
		"Flags": "-",
		"Sigil": 43,
		"Err": null,
		"Winner": {
			"Obj": null,
			"Side": "src",
			"Err": null
		},
		"IsWinner": false,
		"IsSrc": false,
		"IsDst": true,
		"Origin": "sync"
	}
]
2026/05/08 15:09:29 DEBUG : queue: 
{
	"file.txt.conflict1": null
}
2026/05/08 15:09:29 DEBUG : winner: copy to src: 
{
	"Src": "/content/src/",
	"Dst": "",
	"Name": "file.txt.conflict1",
	"AltName": "",
	"Size": 12,
	"Modtime": "2026-05-08T15:09:29.422065532Z",
	"Hash": "",
	"Flags": "-",
	"Sigil": 43,
	"Err": null,
	"Winner": {
		"Obj": null,
		"Side": "src",
		"Err": null
	},
	"IsWinner": true,
	"IsSrc": true,
	"IsDst": false,
	"Origin": "sync"
}
2026/05/08 15:09:29 DEBUG : winner: copy to dst: 
{
	"Src": "/content/src/",
	"Dst": "",
	"Name": "file.txt.conflict1",
	"AltName": "",
	"Size": 12,
	"Modtime": "2026-05-08T15:09:29.422065532Z",
	"Hash": "",
	"Flags": "-",
	"Sigil": 43,
	"Err": null,
	"Winner": {
		"Obj": null,
		"Side": "src",
		"Err": null
	},
	"IsWinner": true,
	"IsSrc": true,
	"IsDst": false,
	"Origin": "sync"
}
2026/05/08 15:09:29 DEBUG : decision: copied to src: file.txt.conflict1
2026/05/08 15:09:29 DEBUG : decision: copied to dst: file.txt.conflict1
2026/05/08 15:09:29 DEBUG : 1to2: srcOldName: file.txt srcNewName: file.txt.conflict1 dstOldName: file.txt dstNewName: file.txt.conflict2
2026/05/08 15:09:29 INFO  : Validating listings for Path1 "/content/src/" vs Path2 "remote:/content/dst/"
2026/05/08 15:09:29 DEBUG : 2026-05-08 15:09:29.422065532 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2026/05/08 15:09:29 DEBUG : 2026-05-08 15:09:28.210054609 +0000 UTC: modification time the same (differ by 0s, within tolerance 1ns)
2026/05/08 15:09:29 DEBUG : Lock file removed: /root/.cache/rclone/bisync/content_src..remote__content_dst.lck
2026/05/08 15:09:29 INFO  : Bisync successful
2026/05/08 15:09:29 INFO  : 
Transferred:   	         24 B / 24 B, 100%, 0 B/s, ETA -
Checks:                 3 / 3, 100%, Listed 5
Renamed:                1
Transferred:            2 / 2, 100%
Server Side Moves:      1 @ 12 B
Elapsed time:         0.0s

2026/05/08 15:09:29 DEBUG : 6 go routines active

You are right, this is a bug! Thank you for the thorough test script, that was very helpful!

Would you like to test the fix? I can post a beta shortly.

beta with fix available here:

based on branch GitHub - rclone/rclone at fix-bisync-conflict-loser-pathname · GitHub

Hello Niel,

Sure, I've tested it and the bug was gone. Much appreciated for your prompt response and incredible speed for the patch. Looking forward to seeing the next release.

Thanks very much for reporting it and confirming the fix :slightly_smiling_face:

PR has been opened here: