From ed21e30fef3609602481ba3630ccec636d459a21 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Wed, 25 Jan 2017 17:58:57 +0100 Subject: relink: retire the command Back in the olden days, when all objects were loose and rubber boots were made out of wood, it made sense to try to share (immutable) objects between repositories. Ever since the arrival of pack files, it is but an anachronism. Let's move the script to the contrib/examples/ directory and no longer offer it. Signed-off-by: Johannes Schindelin Signed-off-by: Junio C Hamano --- .gitignore | 1 - Documentation/git-relink.txt | 30 ------- Makefile | 1 - command-list.txt | 1 - contrib/examples/git-relink.perl | 173 +++++++++++++++++++++++++++++++++++++++ contrib/examples/git-relink.txt | 30 +++++++ git-relink.perl | 173 --------------------------------------- 7 files changed, 203 insertions(+), 206 deletions(-) delete mode 100644 Documentation/git-relink.txt create mode 100755 contrib/examples/git-relink.perl create mode 100644 contrib/examples/git-relink.txt delete mode 100755 git-relink.perl diff --git a/.gitignore b/.gitignore index 6722f78f9a..b1020b875f 100644 --- a/.gitignore +++ b/.gitignore @@ -118,7 +118,6 @@ /git-rebase--merge /git-receive-pack /git-reflog -/git-relink /git-remote /git-remote-http /git-remote-https diff --git a/Documentation/git-relink.txt b/Documentation/git-relink.txt deleted file mode 100644 index 3b33c99510..0000000000 --- a/Documentation/git-relink.txt +++ /dev/null @@ -1,30 +0,0 @@ -git-relink(1) -============= - -NAME ----- -git-relink - Hardlink common objects in local repositories - -SYNOPSIS --------- -[verse] -'git relink' [--safe] ... - -DESCRIPTION ------------ -This will scan 1 or more object repositories and look for objects in common -with a master repository. Objects not already hardlinked to the master -repository will be replaced with a hardlink to the master repository. - -OPTIONS -------- ---safe:: - Stops if two objects with the same hash exist but have different sizes. - Default is to warn and continue. - -:: - Directories containing a .git/objects/ subdirectory. - -GIT ---- -Part of the linkgit:git[1] suite diff --git a/Makefile b/Makefile index f53fcc90d7..3abfc61d1e 100644 --- a/Makefile +++ b/Makefile @@ -532,7 +532,6 @@ SCRIPT_PERL += git-archimport.perl SCRIPT_PERL += git-cvsexportcommit.perl SCRIPT_PERL += git-cvsimport.perl SCRIPT_PERL += git-cvsserver.perl -SCRIPT_PERL += git-relink.perl SCRIPT_PERL += git-send-email.perl SCRIPT_PERL += git-svn.perl diff --git a/command-list.txt b/command-list.txt index 2a94137bbb..a1fad28fd8 100644 --- a/command-list.txt +++ b/command-list.txt @@ -107,7 +107,6 @@ git-read-tree plumbingmanipulators git-rebase mainporcelain history git-receive-pack synchelpers git-reflog ancillarymanipulators -git-relink ancillarymanipulators git-remote ancillarymanipulators git-repack ancillarymanipulators git-replace ancillarymanipulators diff --git a/contrib/examples/git-relink.perl b/contrib/examples/git-relink.perl new file mode 100755 index 0000000000..236a3521a1 --- /dev/null +++ b/contrib/examples/git-relink.perl @@ -0,0 +1,173 @@ +#!/usr/bin/perl +# Copyright 2005, Ryan Anderson +# Distribution permitted under the GPL v2, as distributed +# by the Free Software Foundation. +# Later versions of the GPL at the discretion of Linus Torvalds +# +# Scan two git object-trees, and hardlink any common objects between them. + +use 5.008; +use strict; +use warnings; +use Getopt::Long; + +sub get_canonical_form($); +sub do_scan_directory($$$); +sub compare_two_files($$); +sub usage(); +sub link_two_files($$); + +# stats +my $total_linked = 0; +my $total_already = 0; +my ($linked,$already); + +my $fail_on_different_sizes = 0; +my $help = 0; +GetOptions("safe" => \$fail_on_different_sizes, + "help" => \$help); + +usage() if $help; + +my (@dirs) = @ARGV; + +usage() if (!defined $dirs[0] || !defined $dirs[1]); + +$_ = get_canonical_form($_) foreach (@dirs); + +my $master_dir = pop @dirs; + +opendir(D,$master_dir . "objects/") + or die "Failed to open $master_dir/objects/ : $!"; + +my @hashdirs = grep { ($_ eq 'pack') || /^[0-9a-f]{2}$/ } readdir(D); + +foreach my $repo (@dirs) { + $linked = 0; + $already = 0; + printf("Searching '%s' and '%s' for common objects and hardlinking them...\n", + $master_dir,$repo); + + foreach my $hashdir (@hashdirs) { + do_scan_directory($master_dir, $hashdir, $repo); + } + + printf("Linked %d files, %d were already linked.\n",$linked, $already); + + $total_linked += $linked; + $total_already += $already; +} + +printf("Totals: Linked %d files, %d were already linked.\n", + $total_linked, $total_already); + + +sub do_scan_directory($$$) { + my ($srcdir, $subdir, $dstdir) = @_; + + my $sfulldir = sprintf("%sobjects/%s/",$srcdir,$subdir); + my $dfulldir = sprintf("%sobjects/%s/",$dstdir,$subdir); + + opendir(S,$sfulldir) + or die "Failed to opendir $sfulldir: $!"; + + foreach my $file (grep(!/\.{1,2}$/, readdir(S))) { + my $sfilename = $sfulldir . $file; + my $dfilename = $dfulldir . $file; + + compare_two_files($sfilename,$dfilename); + + } + closedir(S); +} + +sub compare_two_files($$) { + my ($sfilename, $dfilename) = @_; + + # Perl's stat returns relevant information as follows: + # 0 = dev number + # 1 = inode number + # 7 = size + my @sstatinfo = stat($sfilename); + my @dstatinfo = stat($dfilename); + + if (@sstatinfo == 0 && @dstatinfo == 0) { + die sprintf("Stat of both %s and %s failed: %s\n",$sfilename, $dfilename, $!); + + } elsif (@dstatinfo == 0) { + return; + } + + if ( ($sstatinfo[0] == $dstatinfo[0]) && + ($sstatinfo[1] != $dstatinfo[1])) { + if ($sstatinfo[7] == $dstatinfo[7]) { + link_two_files($sfilename, $dfilename); + + } else { + my $err = sprintf("ERROR: File sizes are not the same, cannot relink %s to %s.\n", + $sfilename, $dfilename); + if ($fail_on_different_sizes) { + die $err; + } else { + warn $err; + } + } + + } elsif ( ($sstatinfo[0] == $dstatinfo[0]) && + ($sstatinfo[1] == $dstatinfo[1])) { + $already++; + } +} + +sub get_canonical_form($) { + my $dir = shift; + my $original = $dir; + + die "$dir is not a directory." unless -d $dir; + + $dir .= "/" unless $dir =~ m#/$#; + $dir .= ".git/" unless $dir =~ m#\.git/$#; + + die "$original does not have a .git/ subdirectory.\n" unless -d $dir; + + return $dir; +} + +sub link_two_files($$) { + my ($sfilename, $dfilename) = @_; + my $tmpdname = sprintf("%s.old",$dfilename); + rename($dfilename,$tmpdname) + or die sprintf("Failure renaming %s to %s: %s", + $dfilename, $tmpdname, $!); + + if (! link($sfilename,$dfilename)) { + my $failtxt = ""; + unless (rename($tmpdname,$dfilename)) { + $failtxt = sprintf( + "Git Repository containing %s is probably corrupted, " . + "please copy '%s' to '%s' to fix.\n", + $tmpdname, $dfilename); + } + + die sprintf("Failed to link %s to %s: %s\n%s" . + $sfilename, $dfilename, + $!, $dfilename, $failtxt); + } + + unlink($tmpdname) + or die sprintf("Unlink of %s failed: %s\n", + $dfilename, $!); + + $linked++; +} + + +sub usage() { + print("usage: git relink [--safe] ... \n"); + print("All directories should contain a .git/objects/ subdirectory.\n"); + print("Options\n"); + print("\t--safe\t" . + "Stops if two objects with the same hash exist but " . + "have different sizes. Default is to warn and continue.\n"); + exit(1); +} diff --git a/contrib/examples/git-relink.txt b/contrib/examples/git-relink.txt new file mode 100644 index 0000000000..3b33c99510 --- /dev/null +++ b/contrib/examples/git-relink.txt @@ -0,0 +1,30 @@ +git-relink(1) +============= + +NAME +---- +git-relink - Hardlink common objects in local repositories + +SYNOPSIS +-------- +[verse] +'git relink' [--safe] ... + +DESCRIPTION +----------- +This will scan 1 or more object repositories and look for objects in common +with a master repository. Objects not already hardlinked to the master +repository will be replaced with a hardlink to the master repository. + +OPTIONS +------- +--safe:: + Stops if two objects with the same hash exist but have different sizes. + Default is to warn and continue. + +:: + Directories containing a .git/objects/ subdirectory. + +GIT +--- +Part of the linkgit:git[1] suite diff --git a/git-relink.perl b/git-relink.perl deleted file mode 100755 index 236a3521a1..0000000000 --- a/git-relink.perl +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/perl -# Copyright 2005, Ryan Anderson -# Distribution permitted under the GPL v2, as distributed -# by the Free Software Foundation. -# Later versions of the GPL at the discretion of Linus Torvalds -# -# Scan two git object-trees, and hardlink any common objects between them. - -use 5.008; -use strict; -use warnings; -use Getopt::Long; - -sub get_canonical_form($); -sub do_scan_directory($$$); -sub compare_two_files($$); -sub usage(); -sub link_two_files($$); - -# stats -my $total_linked = 0; -my $total_already = 0; -my ($linked,$already); - -my $fail_on_different_sizes = 0; -my $help = 0; -GetOptions("safe" => \$fail_on_different_sizes, - "help" => \$help); - -usage() if $help; - -my (@dirs) = @ARGV; - -usage() if (!defined $dirs[0] || !defined $dirs[1]); - -$_ = get_canonical_form($_) foreach (@dirs); - -my $master_dir = pop @dirs; - -opendir(D,$master_dir . "objects/") - or die "Failed to open $master_dir/objects/ : $!"; - -my @hashdirs = grep { ($_ eq 'pack') || /^[0-9a-f]{2}$/ } readdir(D); - -foreach my $repo (@dirs) { - $linked = 0; - $already = 0; - printf("Searching '%s' and '%s' for common objects and hardlinking them...\n", - $master_dir,$repo); - - foreach my $hashdir (@hashdirs) { - do_scan_directory($master_dir, $hashdir, $repo); - } - - printf("Linked %d files, %d were already linked.\n",$linked, $already); - - $total_linked += $linked; - $total_already += $already; -} - -printf("Totals: Linked %d files, %d were already linked.\n", - $total_linked, $total_already); - - -sub do_scan_directory($$$) { - my ($srcdir, $subdir, $dstdir) = @_; - - my $sfulldir = sprintf("%sobjects/%s/",$srcdir,$subdir); - my $dfulldir = sprintf("%sobjects/%s/",$dstdir,$subdir); - - opendir(S,$sfulldir) - or die "Failed to opendir $sfulldir: $!"; - - foreach my $file (grep(!/\.{1,2}$/, readdir(S))) { - my $sfilename = $sfulldir . $file; - my $dfilename = $dfulldir . $file; - - compare_two_files($sfilename,$dfilename); - - } - closedir(S); -} - -sub compare_two_files($$) { - my ($sfilename, $dfilename) = @_; - - # Perl's stat returns relevant information as follows: - # 0 = dev number - # 1 = inode number - # 7 = size - my @sstatinfo = stat($sfilename); - my @dstatinfo = stat($dfilename); - - if (@sstatinfo == 0 && @dstatinfo == 0) { - die sprintf("Stat of both %s and %s failed: %s\n",$sfilename, $dfilename, $!); - - } elsif (@dstatinfo == 0) { - return; - } - - if ( ($sstatinfo[0] == $dstatinfo[0]) && - ($sstatinfo[1] != $dstatinfo[1])) { - if ($sstatinfo[7] == $dstatinfo[7]) { - link_two_files($sfilename, $dfilename); - - } else { - my $err = sprintf("ERROR: File sizes are not the same, cannot relink %s to %s.\n", - $sfilename, $dfilename); - if ($fail_on_different_sizes) { - die $err; - } else { - warn $err; - } - } - - } elsif ( ($sstatinfo[0] == $dstatinfo[0]) && - ($sstatinfo[1] == $dstatinfo[1])) { - $already++; - } -} - -sub get_canonical_form($) { - my $dir = shift; - my $original = $dir; - - die "$dir is not a directory." unless -d $dir; - - $dir .= "/" unless $dir =~ m#/$#; - $dir .= ".git/" unless $dir =~ m#\.git/$#; - - die "$original does not have a .git/ subdirectory.\n" unless -d $dir; - - return $dir; -} - -sub link_two_files($$) { - my ($sfilename, $dfilename) = @_; - my $tmpdname = sprintf("%s.old",$dfilename); - rename($dfilename,$tmpdname) - or die sprintf("Failure renaming %s to %s: %s", - $dfilename, $tmpdname, $!); - - if (! link($sfilename,$dfilename)) { - my $failtxt = ""; - unless (rename($tmpdname,$dfilename)) { - $failtxt = sprintf( - "Git Repository containing %s is probably corrupted, " . - "please copy '%s' to '%s' to fix.\n", - $tmpdname, $dfilename); - } - - die sprintf("Failed to link %s to %s: %s\n%s" . - $sfilename, $dfilename, - $!, $dfilename, $failtxt); - } - - unlink($tmpdname) - or die sprintf("Unlink of %s failed: %s\n", - $dfilename, $!); - - $linked++; -} - - -sub usage() { - print("usage: git relink [--safe] ... \n"); - print("All directories should contain a .git/objects/ subdirectory.\n"); - print("Options\n"); - print("\t--safe\t" . - "Stops if two objects with the same hash exist but " . - "have different sizes. Default is to warn and continue.\n"); - exit(1); -} -- cgit v1.2.3 From e0ae5b67a804463277ab7398f8d7557133e2c3db Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 25 Jan 2017 14:43:23 -0800 Subject: relink: really remove the command The files in contrib/examples are meant to illustrate "you could combine plumbing commands to implement something like these"; this is an opposite and is an example of what not to do, e.g. accessing the object store directly bypassing Git. Remove it. Suggested-by: Jeff King Signed-off-by: Junio C Hamano --- contrib/examples/git-relink.perl | 173 --------------------------------------- contrib/examples/git-relink.txt | 30 ------- 2 files changed, 203 deletions(-) delete mode 100755 contrib/examples/git-relink.perl delete mode 100644 contrib/examples/git-relink.txt diff --git a/contrib/examples/git-relink.perl b/contrib/examples/git-relink.perl deleted file mode 100755 index 236a3521a1..0000000000 --- a/contrib/examples/git-relink.perl +++ /dev/null @@ -1,173 +0,0 @@ -#!/usr/bin/perl -# Copyright 2005, Ryan Anderson -# Distribution permitted under the GPL v2, as distributed -# by the Free Software Foundation. -# Later versions of the GPL at the discretion of Linus Torvalds -# -# Scan two git object-trees, and hardlink any common objects between them. - -use 5.008; -use strict; -use warnings; -use Getopt::Long; - -sub get_canonical_form($); -sub do_scan_directory($$$); -sub compare_two_files($$); -sub usage(); -sub link_two_files($$); - -# stats -my $total_linked = 0; -my $total_already = 0; -my ($linked,$already); - -my $fail_on_different_sizes = 0; -my $help = 0; -GetOptions("safe" => \$fail_on_different_sizes, - "help" => \$help); - -usage() if $help; - -my (@dirs) = @ARGV; - -usage() if (!defined $dirs[0] || !defined $dirs[1]); - -$_ = get_canonical_form($_) foreach (@dirs); - -my $master_dir = pop @dirs; - -opendir(D,$master_dir . "objects/") - or die "Failed to open $master_dir/objects/ : $!"; - -my @hashdirs = grep { ($_ eq 'pack') || /^[0-9a-f]{2}$/ } readdir(D); - -foreach my $repo (@dirs) { - $linked = 0; - $already = 0; - printf("Searching '%s' and '%s' for common objects and hardlinking them...\n", - $master_dir,$repo); - - foreach my $hashdir (@hashdirs) { - do_scan_directory($master_dir, $hashdir, $repo); - } - - printf("Linked %d files, %d were already linked.\n",$linked, $already); - - $total_linked += $linked; - $total_already += $already; -} - -printf("Totals: Linked %d files, %d were already linked.\n", - $total_linked, $total_already); - - -sub do_scan_directory($$$) { - my ($srcdir, $subdir, $dstdir) = @_; - - my $sfulldir = sprintf("%sobjects/%s/",$srcdir,$subdir); - my $dfulldir = sprintf("%sobjects/%s/",$dstdir,$subdir); - - opendir(S,$sfulldir) - or die "Failed to opendir $sfulldir: $!"; - - foreach my $file (grep(!/\.{1,2}$/, readdir(S))) { - my $sfilename = $sfulldir . $file; - my $dfilename = $dfulldir . $file; - - compare_two_files($sfilename,$dfilename); - - } - closedir(S); -} - -sub compare_two_files($$) { - my ($sfilename, $dfilename) = @_; - - # Perl's stat returns relevant information as follows: - # 0 = dev number - # 1 = inode number - # 7 = size - my @sstatinfo = stat($sfilename); - my @dstatinfo = stat($dfilename); - - if (@sstatinfo == 0 && @dstatinfo == 0) { - die sprintf("Stat of both %s and %s failed: %s\n",$sfilename, $dfilename, $!); - - } elsif (@dstatinfo == 0) { - return; - } - - if ( ($sstatinfo[0] == $dstatinfo[0]) && - ($sstatinfo[1] != $dstatinfo[1])) { - if ($sstatinfo[7] == $dstatinfo[7]) { - link_two_files($sfilename, $dfilename); - - } else { - my $err = sprintf("ERROR: File sizes are not the same, cannot relink %s to %s.\n", - $sfilename, $dfilename); - if ($fail_on_different_sizes) { - die $err; - } else { - warn $err; - } - } - - } elsif ( ($sstatinfo[0] == $dstatinfo[0]) && - ($sstatinfo[1] == $dstatinfo[1])) { - $already++; - } -} - -sub get_canonical_form($) { - my $dir = shift; - my $original = $dir; - - die "$dir is not a directory." unless -d $dir; - - $dir .= "/" unless $dir =~ m#/$#; - $dir .= ".git/" unless $dir =~ m#\.git/$#; - - die "$original does not have a .git/ subdirectory.\n" unless -d $dir; - - return $dir; -} - -sub link_two_files($$) { - my ($sfilename, $dfilename) = @_; - my $tmpdname = sprintf("%s.old",$dfilename); - rename($dfilename,$tmpdname) - or die sprintf("Failure renaming %s to %s: %s", - $dfilename, $tmpdname, $!); - - if (! link($sfilename,$dfilename)) { - my $failtxt = ""; - unless (rename($tmpdname,$dfilename)) { - $failtxt = sprintf( - "Git Repository containing %s is probably corrupted, " . - "please copy '%s' to '%s' to fix.\n", - $tmpdname, $dfilename); - } - - die sprintf("Failed to link %s to %s: %s\n%s" . - $sfilename, $dfilename, - $!, $dfilename, $failtxt); - } - - unlink($tmpdname) - or die sprintf("Unlink of %s failed: %s\n", - $dfilename, $!); - - $linked++; -} - - -sub usage() { - print("usage: git relink [--safe] ... \n"); - print("All directories should contain a .git/objects/ subdirectory.\n"); - print("Options\n"); - print("\t--safe\t" . - "Stops if two objects with the same hash exist but " . - "have different sizes. Default is to warn and continue.\n"); - exit(1); -} diff --git a/contrib/examples/git-relink.txt b/contrib/examples/git-relink.txt deleted file mode 100644 index 3b33c99510..0000000000 --- a/contrib/examples/git-relink.txt +++ /dev/null @@ -1,30 +0,0 @@ -git-relink(1) -============= - -NAME ----- -git-relink - Hardlink common objects in local repositories - -SYNOPSIS --------- -[verse] -'git relink' [--safe] ... - -DESCRIPTION ------------ -This will scan 1 or more object repositories and look for objects in common -with a master repository. Objects not already hardlinked to the master -repository will be replaced with a hardlink to the master repository. - -OPTIONS -------- ---safe:: - Stops if two objects with the same hash exist but have different sizes. - Default is to warn and continue. - -:: - Directories containing a .git/objects/ subdirectory. - -GIT ---- -Part of the linkgit:git[1] suite -- cgit v1.2.3