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

  • Capcom Unity

    Capcom Unity

    5 NİSAN 2010
  • Gee Cee

    Gee Cee

    1 AĞUSTOS 2009
  • TotalSeminarsChannel

    TotalSeminar

    16 Mart 2010