Thread (11 messages) flat view 11 messages, 6 authors, 2016-06-15

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

From: Jakub Narebski <hidden>
Date: 2016-06-15 22:47:17

On Wed, 19 August 2009, Jeff King [off-list ref] wrote:
On Wed, Aug 19, 2009 at 02:18:07PM +0200, Jakub Narebski wrote:
quoted
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.
To be more exact it is simplified solution used by git; in this case 
_oversimplified_, as gitweb doesn't have problems with 'HEAD' in 
remote-tracking branches.

On the other hand gitweb currently does not detect submodules or 
submodule-like repositories, i.e. repositories inside working directory
of other repository.  So this could be improved...
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
Or "git --git-dir=$dir rev-parse 2> /dev/null"
        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.
If one follow preferred git conventions for naming non-bare repositories,
and one doesn't have anything funny,

  $ find . -name "*.git" -type d

should be sufficient.
-- 
Jakub Narebski
Poland
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help