git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: New to Git / Questions about single user / multiple projects

From
Jeff King <peff@peff.net>
Date
Aug 19, 2009, 12:48 UTC
Message-ID
<20090819124820.GC20381@coredump.intra.peff.net>
In-Reply-To
<200908191418.08838.jnareb@gmail.com>
On Wed, Aug 19, 2009 at 02:18:07PM +0200, Jakub Narebski wrote:
Show 15 quoted lines
> More complicated solution, used by gitweb, requires Perl, not checked
> that it works correctly, doesn't work with ancient repositories with
> symlink HEAD.
> 
>  $ perl -e '
>  use File::Find qw(find);
>  my @list = ();
>  find({follow_fast => 1, follow_skip => 2, dangling_symlinks => 0,
>        wanted => sub {
>          return if (m!^[/.]$!);
>          return unless (-d $_);
>          push @list, $_ if -e "$_/HEAD" 
>        }});
>  print join("\n", @list)."\n";
>  '

That doesn't seem very accurate. It will find 'HEAD' in "logs/" of repositories with reflogs enabled, and "refs/remotes/*/" of cloned repositories, giving you a lot of false positives.

If you want accuracy, you can ask git rev-parse to verify whether a directory is a git repo; it actually uses a few different heuristics to check. For example:

  find . -type d |
    while read dir; do
      if GIT_DIR=$dir git rev-parse --git-dir >/dev/null 2>&1; then
        echo $dir
      fi
    done

but it is a bit slower, as you invoke rev-parse for every directory, and it actually does some verification of the contents of HEAD (so it is probably a bad idea for something like gitweb, which cares about performance).

If you want to do a cheap and fast check, searching for 'HEAD', 'refs', and 'objects' in the same directory is a reasonable heuristic.

-Peff
Previous: Jeff KingNext: Jakub Narebski
Message 10 of 11 in “New to Git / Questions about single user / multiple projects”
  1. Rob (gmail)Aug 19, 2009
  2. Changsheng JiangAug 19, 2009
  3. Chris PackhamAug 19, 2009
  4. Daniel BarkalowAug 19, 2009
  5. Jakub NarebskiAug 19, 2009
  6. Rob (gmail)Aug 19, 2009
  7. Jakub NarebskiAug 19, 2009
  8. Rob (gmail)Aug 19, 2009
  9. Jeff KingAug 19, 2009
  10. Jeff KingAug 19, 2009
  11. Jakub NarebskiAug 19, 2009

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.