[PATCH 0/2] refs/files: fix issues with git-fetch on case-insensitive FS
From: Karthik Nayak <hidden>
Date: 2025-09-02 08:34:43
Hello! With Git 2.51 we moved 'git-fetch(1)' and 'git-receive-pack(1)' to use batched updates while doing reference updates. This provided a nice perf boost since both commands will now use a single transaction for reference updates. This removes the overhead of using individual transaction per reference update and also avoids unnecessary auto-compaction between reference updates in the reftable backend. However, in the files-backend it does introduce two bugs when used on a case-insensitive filesystem [1]: 1. When fetching references such as: - refs/heads/foo - refs/heads/Foo Earlier we would simply overwrite the first reference with the second and continue. Since Git 2.51 we simply abort stating a conflict. This is resolved in the first commit by marking such conflicts as REF_TRANSACTION_ERROR_CREATE_EXISTS. This allows batched updates to reject the particular update, while applying the rest. 2. When fetching references such as: - refs/heads/foo - refs/heads/Foo/bar Earlier we would apply the first, while the second would fail due to conflict. Since Git 2.51, the lock files for both would be created, but the 'commit' phase would abruptly end leaving the lock files. The second commit fixes this by ensuring that on case-insensitive filesystems we lowercase the refnames for availability check to ensure F/D are caught and reported to the user. Sorry for the long wait on this, with the OSSE and Git mini summit last week, I didn't get as much computer time as I needed to test this. - Karthik [1]: https://lore.kernel.org/all/YQXPR01MB3046197EF39296549EE6DD669A33A@YQXPR01MB3046.CANPRD01.PROD.OUTLOOK.COM/ (local) Signed-off-by: Karthik Nayak <redacted> --- builtin/fetch.c | 21 ++++++++++++++++++--- refs/files-backend.c | 21 +++++++++++++++++++-- t/t1400-update-ref.sh | 24 ++++++++++++++++++++++++ t/t5510-fetch.sh | 42 +++++++++++++++++++++++++++++++++++++++++- 4 files changed, 102 insertions(+), 6 deletions(-) Karthik Nayak (2): refs/files: use correct error type when locking fails refs/files: handle F/D conflicts in case-insensitive FS base-commit: c44beea485f0f2feaf460e2ac87fdd5608d63cf0 change-id: 20250822-587-git-fetch-1-fails-fetches-on-case-insensitive-repositories-0a187c7ac41e Thanks - Karthik