SORU
21 EKİM 2008, Salı


Bu blob vardır işliyorsun?

Bir leke, bir karma verilen ağaç bu blob olan işleyen bir listesini almak için bir yol var mı?

CEVAP
21 EKİM 2008, Salı


Aşağıdaki komut iki damla SHA1, isteğe bağlı olarak sonraki ilk argüman olarak, ve, git log anlayacaktır herhangi bir argüman. E. g. --all sadece mevcut veya -g reflog aramak yerine tüm dalları içinde aramak için, ya da başka nasıl arzu edersen.

Burada bir kabuk – kısa ve tatlı, ama yavaş olarak

#!/bin/sh
obj_name="$1"
shift
git log "$@" --pretty=format:'%T %h %s' \
| while read tree commit subject ; do
    if git ls-tree -r $tree | grep -q "$obj_name" ; then
        echo $commit "$subject"
    fi
done

Ve Perl ile optimize edilmiş bir versiyonu, ama çok daha hızlı hala oldukça kısa

#!/usr/bin/perl
use 5.008;
use strict;
use Memoize;

my $obj_name;

sub check_tree {
    my ( $tree ) = @_;
    my @subtree;

    {
        open my $ls_tree, '-|', git => 'ls-tree' => $tree
            or die "Couldn't open pipe to git-ls-tree: $!\n";

        while ( <$ls_tree> ) {
            /\A[0-7]{6} (\S ) (\S )/
                or die "unexpected git-ls-tree output";
            return 1 if $2 eq $obj_name;
            push @subtree, $2 if $1 eq 'tree';
        }
    }

    check_tree( $_ ) && return 1 for @subtree;

    return;
}

memoize 'check_tree';

die "usage: git-find-blob <blob> [<git-log arguments ...>]\n"
    if not @ARGV;

my $obj_short = shift @ARGV;
$obj_name = do {
    local $ENV{'OBJ_NAME'} = $obj_short;
     `git rev-parse --verify \$OBJ_NAME`;
} or die "Couldn't parse $obj_short: $!\n";
chomp $obj_name;

open my $log, '-|', git => log => @ARGV, '--pretty=format:%T %h %s'
    or die "Couldn't open pipe to git-log: $!\n";

while ( <$log> ) {
    chomp;
    my ( $tree, $commit, $subject ) = split " ", $_, 3;
    print "$commit $subject\n" if check_tree( $tree );
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Malwarebytes

    Malwarebytes

    22 Temmuz 2007
  • PlayStation

    PlayStation

    16 Aralık 2005
  • pucksz

    pucksz

    24 Mart 2006