以特殊格式[Git]收集存储库中所有分支的列表

时间:2018-07-16 12:36:50

标签: git version-control git-branch git-log

有没有一种方法可以收集存储库中分支的列表以及最后的提交日期?

换句话说,我想在标准输出上打印如下内容:

branch_name_1 date1
branch_name_2 date2
branch_name_3 date3

有可能吗?

编辑:我尝试使用以下步骤:

  1. git log --pretty=format:"%ad:%an:%d:%B" --date=short --branches

  2. git branch -a

  3. git ls-remote –heads

其中每个都给了我当前所在存储库的分支。 但是现在我想检查是否可以从每个目录(到特定的仓库)运行命令。也以特殊格式打印。仍在尝试了解如何获取上次提交的日期。

另一个编辑:我考虑过,最好使用git ls-remote –heads,因为我想检查非本地存储库。如何查看git ls-remote –heads输出中每个分支的日期?

5 个答案:

答案 0 :(得分:1)

如果您的Git版本> = 2.13,则可以使用相同的git branch命令来执行此操作。

它有一个--format参数,您可以根据需要使用它来格式化输出。像这样运行即可获得所需的输出。

git branch --format='%(refname:short)%09%(committerdate)' --sort=-committerdate

您可以添加一些颜色使其清晰。

git branch --format='%(color:bold green) %(refname:short) %(color:white) %(committerdate)' --sort=-committerdate

输出:

Development  Fri Jun 29 10:32:43 2018 +0530  
feat-2180  Fri Jun 8 18:01:36 2018 +0530  
master  Wed May 16 17:19:21 2018 +0530

以下是它支持的字段名称列表-https://github.com/git/git/blob/v2.17.0/ref-filter.c#L328

================================================ =====================

编辑:

正如您在评论中提到的那样;我认为您不能仅使用ls-remote命令来获得提交详细信息。只是在这里查看了命令的源代码,除了ref和commit哈希值,它似乎没有返回任何其他值。因此,我认为无法使用此功能(如果我输入错了,请纠正我)。

https://github.com/git/git/blob/maint/builtin/ls-remote.c

如果您适合进行临时克隆,建议您创建一个shell脚本或某种脚本来进行克隆并获取摘要。

这是一个例子:

#!/usr/bin/env bash

REMOTE_URL=$1

git clone -q --depth 1 --bare --no-single-branch $REMOTE_URL /tmp/temp-git-clone
cd /tmp/temp-git-clone
git branch --format='%(color:bold green) %(refname:short) %(color:white) %(committerdate)' --sort=-committerdate
rm -rf /tmp/temp-git-clone

我在clone命令中使用了以下参数,使其变得更快一些。

  

--depth 1 =将仅获得最后一次提交

     

--bare =创建一个裸仓库,这意味着将没有任何仓库   工作目录,它不会复制文件。

     

--no-single-branch =需要此命令来告诉clone命令获取所有内容   分支机构

如果您运行脚本:./summary.sh <your repo url>

它将按您期望的显示摘要!

希望它会有所帮助:)

答案 1 :(得分:0)

如果需要处理引用列表,最好的起点是git for-each-ref。如果您只想处理某些引用,则可以提供描述所需内容的模式。例如:

git for-each-ref refs/heads

将仅列出本地分支机构

git for-each-ref refs/heads refs/remotes

将列出本地分支机构和远程跟踪参考。要列出所有内容(分支,标签,远程引用以及可能存在的其他更奇特的东西),只需

git for-each-ref

您还可以提供format选项。例如

git for-each-ref --format='%(refname)%09%(committerdate)` refs/heads

将显示每个本地分支以及相应提交的提交日期。 (您还可以使用%(authordate),例如,在重写历史记录后,提交日期通常会发生变化,但作者的日期则留在原处。)

稍等一下,但是上面的内容看起来有点过头,因为您询问了“最后提交日期”。奇怪的是,对于git,分支只是指向一个提交的指针-提交的日期通常是该分支的最后提交日期,从直觉上来说,它“应该”是它,并且它是git中最接近“真实”的东西分支的最后提交日期-尽管如果已通过多种方式操纵了分支,则可能有所不同。

答案 2 :(得分:0)

只需将--no-walk添加到您的日志命令中即可。

git log --no-walk --branches --date=short --format="%ad:%d"

答案 3 :(得分:0)

您可以在任何目录中显示远程分支名称和相关日期(但必须在git repo内,因为git命令需要在git repo内执行)。

详细步骤如下:

1。检查您要在git repo中执行git命令的目录

使用以下命令检查git repo中的权限是否存在:

git rev-parse --show-toplevel

2。如果目录不在git repo中,则创建一个git repo

在步骤1中检查后,如果目录不在git repo中,请通过git init创建一个git repo。

否则,请跳过此步骤。

3。检查远程分支机构和日期是否为您需要的格式

使用以下命令获取远程分支和日期:

git remote add myremote <remote repo URL> -f
for branch in `git branch -r | grep myremote | grep -v HEAD`;do echo -e $branch \\t\\t`git show --format="%ci" $branch | head -n 1`; done | sort -r

答案 4 :(得分:-1)

您可以使用以下代码获取分支名称和上次提交日期

  

for git branch -r | grep -v HEAD中的分支;执行echo -e git show --format="%ci %cr" $branch | head -n 1 \ t $ branch;完成|排序-r

结果如下图 enter image description here