Dear diary, on Fri, Jul 28, 2006 at 07:44:21AM CEST, I got a letter where Petr Baudis <pasky@xxxxxxx> said that... > So, you need some kind of porcelain for this. The idea is that instead of > telling git-fetch-pack a single repository, you pass multiple --repo= > parameters and refs always "belong" to the latest mentioned repository; > when outputting the new ref values, the appropriate repo is mentioned near > each ref. In order for this to be useful, on your local side you should > share the objects database in some way - either using alternates (then > you must fetch to an object database reachable from everywhere) or symlinked > object databases. > > You still need to pass git-fetch-pack some URL in addition to the > repositories - it is used only for git_connect(), the purpose is that > repositories must be local directories so if you want to talk remote, you > need to do something like > > git-fetch-pack git://kernel.org/pub/scm/git/git.git --repo=/pub/scm/git/git.git master next --repo=/pub/scm/cogito/cogito.git master This is a simple "porcelain" for it: -->8-- #!/usr/bin/perl use warnings; use strict; # Remember that you must ensure the obj database is shared - either symlink it # or setup alternates! #my $remoteurl = 'git://git.kernel.org/pub/scm/git/git.git'; #my %config = ( # '/pub/scm/git/git.git' => { # 'next' => { # '/home/xpasky/q/gg' => 'origin' # }, # 'master' => { # '/home/xpasky/q/gg' => 'origin2', # '/home/xpasky/q/gg2' => 'origin' # } # }, # '/pub/scm/cogito/cogito-doc.git' => { # master => { # '/home/xpasky/q/gg2' => 'origin2' # } # } #); my $remoteurl = 'puturlofremotehosthere'; my %config = ( 'remoterepo1' => { branch1 => { 'localrepo1' => 'origin' }, branch2 => { 'localrepo1' => 'origin2', 'localrepo2' => 'origin' } }, 'remoterepo2' => { master => { 'localrepo2' => 'origin2' } } ); my @args = ($remoteurl); foreach my $repo (keys %config) { push (@args, '--repo='.$repo); foreach my $branch (keys %{$config{$repo}}) { push (@args, $branch); } } open (F, '-|', 'git-fetch-pack', @args) or die "$!"; while (<F>) { chomp; split / /, $_; my ($sha, $ref, $repo) = @_; $ref =~ s#^refs/heads/##; foreach my $lrepo (keys %{$config{$repo}->{$ref}}) { system("GIT_DIR=$lrepo git-update-ref $config{$repo}->{$ref}->{$lrepo} $sha"); } } close (F); -- Petr "Pasky" Baudis Stuff: http://pasky.or.cz/ Snow falling on Perl. White noise covering line noise. Hides all the bugs too. -- J. Putnam - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html