19 Stimmen

Git: Doppelte Blobs (Dateien) in diesem Baum finden

Dies ist eine Art Fortsetzung von この質問 .

Wenn es mehrere Blobs mit demselben Inhalt gibt, werden sie nur einmal im Git-Repository gespeichert, da ihre SHA-1-Werte identisch sind. Wie könnte man alle doppelten Dateien für einen bestimmten Baum finden?

Müssten Sie den Baum durchgehen und nach doppelten Hashes suchen, oder bietet Git Backlinks von jedem Blob zu allen Dateien in einem Baum, die darauf verweisen?

27voto

bsb Punkte 1797
[alias]
    # find duplicate files from root
    alldupes = !"git ls-tree -r HEAD | cut -c 13- | sort | uniq -D -w 40"

    # find duplicate files from the current folder (can also be root)
    dupes = !"cd `pwd`/$GIT_PREFIX && git ls-tree -r HEAD | cut -c 13- | sort | uniq -D -w 40"

9voto

lmop Punkte 921

Die Überprüfung der Codebasis, an der ich arbeite, hat mir die Augen geöffnet, das kann ich Ihnen sagen!

#!/usr/bin/perl

# usage: git ls-tree -r HEAD | $PROGRAM_NAME

use strict;
use warnings;

my $sha1_path = {};

while (my $line = <STDIN>) {
    chomp $line;

    if ($line =~ m{ \A \d+ \s+ \w+ \s+ (\w+) \s+ (\S+) \z }xms) {
        my $sha1 = $1;
        my $path = $2;

        push @{$sha1_path->{$sha1}}, $path;
    }
}

foreach my $sha1 (keys %$sha1_path) {
    if (scalar @{$sha1_path->{$sha1}} > 1) {
        foreach my $path (@{$sha1_path->{$sha1}}) {
            print "$sha1  $path\n";
        }

        print '-' x 40, "\n";
    }
}

7voto

Romuald Brunet Punkte 5041

Ich habe gerade einen Einzeiler erstellt, der die von git gerenderten Duplikate hervorhebt ls-tree .
Könnte nützlich sein

git ls-tree -r HEAD |
    sort -t ' ' -k 3 |
    perl -ne '$1 && / $1\t/ && print "\e[0;31m" ; / ([0-9a-f]{40})\t/; print "$_\e[0m"'

4voto

CB Bailey Punkte 693084

Die Skripting-Antworten aus der von Ihnen verlinkten Frage gelten auch hier.

Versuchen Sie den folgenden Git-Befehl vom Stammverzeichnis Ihres Git-Repositorys aus.

git ls-tree -r HEAD

Dies erzeugt eine rekursive Liste aller "Blobs" im aktuellen HEAD, einschließlich ihres Pfades und ihrer sha1-ID.

Git pflegt keine Rückverweise von einem Blob zu einem Baum, so dass es eine Skriptaufgabe (Perl, Python?) wäre, einen Parse git ls-tree -r Ausgabe und erstellen Sie einen zusammenfassenden Bericht über alle sha1s, die mehr als einmal in der Liste erscheinen.

0voto

druud62 Punkte 1

Allgemeiner:

( for f in `find .`; do test -f $f && echo $(wc -c <$f) $(md5 -q $f)   ; done ) |sort |uniq -c |grep -vE '^\s*1\b' |sed 's/.* //' > ~/dup.md5 ; \
( for f in `find .`; do test -f $f && echo $(wc -c <$f) $(md5 -q $f) $f; done ) |fgrep -f ~/dup.md5 |sort

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X