Muestra todas las twigs de descendientes de primer nivel usando Git

¿Cómo puedo get una list de sucursales que son descendientes de primer nivel del HEAD actual?

Puedo get una list de todo el tree con:

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

lo que da

 * 2eff4a7... (refs/heads/issue-8351) Added a factory factory factory. * 2e387aa... Refactonetworking 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 

pero me gustaría get una list simple de los hijos de primer nivel de la twig actual, como este ejemplo para el master :

 dev issue-7559 issue-8354 issue-8351 

y si estuviera en el issue-7559 sucursal issue-7559 solo vería:

 experimental 

¿Cómo puedo ir sobre esto?

Podrías hacerlo de la siguiente manera.

Primero el preámbulo habitual:

 #! /usr/bin/perl use warnings; use strict; 

Use git for-each-ref para reunir el SHA-1 y el nombre de cada ref .:

 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; } 

Si un commit es un hijo de HEAD , el set de commits alcanzable desde HEAD excluyendo todo lo accesible desde el commit en cuestión es el set vacío. Podemos verificar esta relación con git rev-list .

 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/; } 

Para cada reference que es un descendiente de HEAD pero no es equivalente a HEAD , examinamos la ruta desde HEAD a esa reference usando git log . Si la ruta contiene la punta de otra twig, la reference no puede ser un hijo de primer nivel.

Todos los sobrevivientes de este guante son niños de primer nivel.

 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.\n@log" if $?; for (@log) { chomp; next if $_ eq $refsha; next REF if exists $headsha{$_}; } print $ref, "\n"; }