-sub rewrite_tag ($) {
- my ($obj) = @_;
- $_ = getobj $obj, 'tag';
- m/^type (\w+)\n/m or die "$obj ?";
- if ($1 ne 'commit') {
- $count{"oddtags $1"}++;
- return $obj;
- }
- m/^object (\w+)\n/m or die "$obj ?";
- my $oldref = $1;
- my $newref = rewrite_commit $oldref;
- if ($oldref eq $newref) {
- return $obj;
- }
- s/^(object )\w+$/ $1.$newref /me or die "$obj ($_) ?";
- s/^-----BEGIN PGP SIGNATURE-----\n.*^-----END PGP SIGNATURE-----\n$//sm;
- return hashobj $_, 'tag';
-}
-
-$!=0; $?=0;
-my $refs=`git for-each-ref`;
-die "$? $!" if $?;
-
-chomp $refs;
-
-our @updates;
-
-foreach my $rline (split /\n/, $refs) {
- my ($obj, $type, $refname) =
- $rline =~ m/^(\w+)\s+(\w+)\s+(\S.*)/
- or die "$_ ?";
- my $rewrite;
- if ($type eq 'commit') {
- $rewrite = rewrite_commit($obj);
- } elsif ($type eq 'tag') {
- $rewrite = rewrite_tag($obj);
- } else {
- warn "ref $refname refers to $type\n";
- next;
- }
- next if $rewrite eq $obj;
- push @updates, [ $refname, $obj, $rewrite ];
-}
-
-$!=0; $?=0;
-my $bare = `git rev-parse --is-bare-repository`;
-die "$? $!" if $?;
-
-our $worktree;
-
-sub runcmd {
- system @_ and die "$! $?";
-}
-
-for my $up (@updates) {
- my ($ref, $veryold, $old) = @$up;
- next unless $ref =~ m{^refs/dgit/^[/]+$};