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ş:
Android uygulaması Araç.setTitle yönte...
İsimsiz nesne JavaScript kontrol yönte...
Bu iki satır aynı, 'vardır? ... :...
Javascript bir Rails uygulamasında Eti...
6 gitignore dosyası böyle büyük mükafa...