Отобразите все порожденные ответвления первого уровня с помощью Мерзавца

Как я могу получить список ответвлений, которые являются потомками первого уровня текущей ГОЛОВЫ?

Я могу получить список целого дерева с:

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

который дает

* 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

но я хотел бы просто получить простой список детей первого уровня текущего ответвления, как этот пример для master:

dev
issue-7559
issue-8354
issue-8351

и если я был на ответвлении issue-7559 Я только видел бы:

experimental

Как я мог бы пойти об этом?

8
задан Greg Bacon 9 February 2010 в 14:27
поделиться

1 ответ

Вы можете сделать это следующим образом.

Сначала обычная преамбула:

#! /usr/bin/perl

use warnings;
use strict;

Используйте git for-each-ref , чтобы собрать SHA-1 и имя для каждой ссылки:

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 , набор коммитов, доступных из HEAD , за исключением всего достижимого из рассматриваемого коммита, является пустым набором. Мы можем проверить это соотношение с помощью 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/;
}

Для каждой ссылки, которая является потомком HEAD , но не эквивалентна HEAD , мы исследуем путь от HEAD к этой ссылке, используя git log . Если путь содержит вершину другой ветви, ссылка не может быть дочерним элементом первого уровня.

Все выжившие в этой перчатке - дети первого уровня.

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";
}
3
ответ дан 6 December 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: