Git

2010-02-05 9 views
8

'u kullanarak tüm birinci basamaktan gelen dalların görüntülenmesi Mevcut HEAD'in birinci düzey torunları olan bir şube listesini nasıl alabilirim?Git

* 2eff4a7... (refs/heads/issue-8351) Added a factory factory factory. 
* 2e387aa... Refactored all of the factory factories. 
| * b3fad52... (refs/heads/issue-8354) Moved the baz out of the constructor. 
|/ 
| * f4cf3fe... (refs/heads/experimental) quuz looking good 
| * 1d276b9... Risky fix to replace the quux with the quuz. 
| * d6b0222... (refs/heads/issue-7559) Fixed the quux in the foo. 
|/ 
| * 3f4cfff... (refs/heads/dev) wip 
|/ 
* 76f493f... (refs/heads/master) SVN 30192 

verir ama sadece ilk düzey çocukların düz listesini almak istiyorum

git log --graph --abbrev-commit --pretty=decorate --branches 

:

ben ile tüm ağacın bir listesini alabilirsiniz master için bu örnekte olduğu gibi şimdiki şube:

dev 
issue-7559 
issue-8354 
issue-8351 

ve şubeüzerinde olsaydıSadece şunu görürsünüz:

experimental 

Bundan nasıl bahsedebilirim?

+0

Tam olarak birinci düzeydeki torunlardan ne demek istiyorsunuz? Verdiğiniz 4 dalın listesini hangi branş ve kriterler verecek? –

+0

Üzgünüm, bu örnek 'master' içindi. Aralarında ebeveyn ile başka hiçbir kafaya sahip olmayan dalların listesini almak istiyorum. – mskfisher

+0

Biraz zor geliyor. Başka bir dal için birleştirme tabanının ve test edilen şubenin mevcut daldan başka bir şey olup olmadığını test etmek için yuvalanmış 'git-for-each 'döngülerini kullanmayı deneyebilirsiniz. Gerçi istediğin keyfi bir şey gibi geliyor. Çözmeye çalıştığın daha büyük bir sorun mu var? –

cevap

3

Bunu aşağıdaki gibi yapabilirsiniz.

İlk olağan önsöz:

#! /usr/bin/perl 

use warnings; 
use strict; 

Kullanım git for-each-ref her ref SHA-1 ve adını toplamak için:

sub refs { 
    open my $fh, "-|", "git", "for-each-ref", 
          "--format=%(objectname)\t%(refname:short)" 
    or die "$0: failed to run git for-each-ref"; 

    my %ref2sha; 
    while (<$fh>) { 
    chomp; 
    my($sha,$ref) = split /\t/; 
    $ref2sha{$ref} = $sha; 
    } 

    \%ref2sha; 
} 

HEAD çocuğu olan bir işlersen, kaydedilmesini kümesini HEAD adresinden ulaşılabilen, söz konusu taahhütten alınabilecek her şey hariç, boş settir. Bu ilişkiyi git rev-list ile kontrol edebiliriz. HEAD ancak denk olmayan HEAD için soyundan her Referans

sub is_child { 
    my($ref) = @_; 

    # git rev-list ^dev master 
    my $refs = `git rev-list ^$ref HEAD -- 2>&1`; 
    die "$0: git rev-list-failed.\n$refs" if $?; 

    $refs !~ /\S/; 
} 

biz git log kullanarak bu referansa HEAD giden yolu inceledik. Yol başka bir dalın ipucunu içeriyorsa, ref birinci seviye bir çocuk olamaz.

Bu eldivenin tüm kurtulanları birinci seviye çocuklardır.

chomp(my $head = `git rev-parse HEAD 2>&1`); 
die "$0: git rev-parse failed.\n$head" if $?; 

my $ref2sha = refs; 
my %headsha = reverse %$ref2sha; 

REF: 
foreach my $ref (keys %$ref2sha) { 
    my $refsha = $ref2sha->{$ref}; 

    next if $refsha eq $head || !is_child $ref; 

    my @log = `git log --pretty=format:%H ..$ref 2>&1`; 
    die "$0: git log failed.\[email protected]" if $?; 
    for (@log) { 
    chomp; 
    next if $_ eq $refsha; 
    next REF if exists $headsha{$_}; 
    } 

    print $ref, "\n"; 
} 
+0

Bunu yapmak için kod yazmaktan kaçınmayı umuyordum ve bunu başarmama yardım ettiniz. :) – mskfisher

+0

@mskfisher Bunun yararlandığına sevindim. Keyfini çıkarın! –