When re-writing the content of a file during a merge, the file is first unlinked and then re-created. Since it is a new file at the time of the open call, O_EXCL should be passed to clarify that the file is expected to be new. Signed-off-by: Ephrim Khong <dr.khong@xxxxxxxxx> --- This is actually a fix for an issue we ran into on an nfs4 mount. Files created with O_TRUNC instead of O_EXCL sometimes had their permissions wrong. However, it appears to be a safe thing to change this, especially since other parts of the git codebase also prefer the O_EXCL flag. merge-recursive.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/merge-recursive.c b/merge-recursive.c index f736a0f632..f72a376c5b 100644 --- a/merge-recursive.c +++ b/merge-recursive.c @@ -974,7 +974,7 @@ static int update_file_flags(struct merge_options *opt, int fd; int mode = (contents->mode & 0100 ? 0777 : 0666); - fd = open(path, O_WRONLY | O_TRUNC | O_CREAT, mode); + fd = open(path, O_WRONLY | O_EXCL | O_CREAT, mode); if (fd < 0) { ret = err(opt, _("failed to open '%s': %s"), path, strerror(errno)); -- 2.30.1.1.g07d5ea6f42.dirty