gpt4 book ai didi

perl - 使用Git显示所有一级后代分支

转载 作者:太空狗 更新时间:2023-10-29 12:55:11 25 4
gpt4 key购买 nike

如何获取当前 HEAD 的一级后代的分支列表?

我可以获得整棵树的列表:

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

我该怎么做?

最佳答案

您可以按如下方式进行。

首先是通常的序言:

#! /usr/bin/perl

use warnings;
use strict;

使用git for-each-ref收集每个 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 .如果路径包含另一个分支的尖端,则 ref 不能是一级子节点。

这个挑战的所有幸存者都是一级 child 。

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

关于perl - 使用Git显示所有一级后代分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2208948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com