On Thu, Jun 22, 2017 at 2:40 AM, Jonathan Tan <jonathantanmy@xxxxxxxxxx> wrote: > diff --git a/sha1_file.c b/sha1_file.c > index bf6b64ec8..778f01d92 100644 > --- a/sha1_file.c > +++ b/sha1_file.c > @@ -3494,18 +3494,10 @@ int has_sha1_pack(const unsigned char *sha1) > > int has_sha1_file_with_flags(const unsigned char *sha1, int flags) > { > - struct pack_entry e; > - > if (!startup_info->have_repository) > return 0; > - if (find_pack_entry(sha1, &e)) > - return 1; > - if (has_loose_object(sha1)) > - return 1; > - if (flags & HAS_SHA1_QUICK) > - return 0; > - reprepare_packed_git(); > - return find_pack_entry(sha1, &e); > + return sha1_object_info_extended(sha1, NULL, > + flags | OBJECT_INFO_SKIP_CACHED) >= 0; > } I am not sure if it could affect performance (in one way or another) a lot or not but I just wanted to note that has_loose_object() calls check_and_freshen() which calls access() on loose object files, while sha1_object_info_extended() calls sha1_loose_object_info() which calls stat_sha1_file() which calls lstat() on loose object files. So depending on the relative performance of access() and lstat() there could be a performance impact on repos that have a lot of loose object files.