Here is another one. By the way, Peff, do we have MAYBE_UNUSED that can be used in a case like this one? Platforms without symbolic links supported may well define NO_SYMLINK_HEAD, which makes the incoming parameters unused. static int create_ref_symlink(struct ref_lock *lock, const char *target) { int ret = -1; #ifndef NO_SYMLINK_HEAD char *ref_path = get_locked_file_path(&lock->lk); unlink(ref_path); ret = symlink(target, ref_path); free(ref_path); if (ret) fprintf(stderr, "no symlink - falling back to symbolic ref\n"); #endif return ret; } We can of course do the attached, which I'll let shejialuo to squash into an appropriate patch in the series. Thanks. refs/files-backend.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git c/refs/files-backend.c w/refs/files-backend.c index 69dd283c9d..110af32788 100644 --- c/refs/files-backend.c +++ w/refs/files-backend.c @@ -1951,10 +1951,13 @@ static int commit_ref_update(struct files_ref_store *refs, return 0; } +#ifdef NO_SYMLINK_HEAD +#define create_ref_symlink(lock, referent) (-1) +#else static int create_ref_symlink(struct ref_lock *lock, const char *target) { int ret = -1; -#ifndef NO_SYMLINK_HEAD + char *ref_path = get_locked_file_path(&lock->lk); unlink(ref_path); ret = symlink(target, ref_path); @@ -1962,9 +1965,9 @@ static int create_ref_symlink(struct ref_lock *lock, const char *target) if (ret) fprintf(stderr, "no symlink - falling back to symbolic ref\n"); -#endif return ret; } +#endif static int create_symref_lock(struct ref_lock *lock, const char *target, struct strbuf *err)