按分支划分提交历史

时间:2018-07-20 11:58:02

标签: git git-log

我有一个脚本,可以在一段时间内从选定的存储库中获取所有提交。

为此,我使用命令:

 git --no-pager log --oneline --before 2018-07-20 --after 2018-07-18 --all --branches=* --remotes=*

但是它提供输出,而不是按分支拆分。我该如何重写此命令,以接收类似以下内容的信息:

Branch development
MQP-1896 hdveyhbkehbkke
MQP-1895 fdghdfjfgj
Branch qa
MQP-1836 loejemgdsgsnlee
Branch feature
MQP-1833 fghdfghfghfh

2 个答案:

答案 0 :(得分:1)

在文档中找不到任何东西,如果有人发现此注释,我们可以像这样列出提交。 您可以编写一个bash脚本,在其中签出所有分支,并在每个分支上进行git登录

示例(可以改进)

array=(`git branch`)
for i in "${array[@]}"
do :
echo $i
git --no-pager log $i --oneline --before 2018-07-20 --after 2018-07-18
done

将此代码写入file-name.sh 并使用sh file-name.sh

运行它

答案 1 :(得分:0)

git log通常不按分支拆分输出。您可以使用--topo-order来排序输出,以使分支中的提交保持在一起[1]。但是,它仍然不显示分支名称。

git log --topo-order --oneline --before 2018-07-20 --after 2018-07-18 --all

(注意:branches=*参数仅意味着在输出中包括可从任何分支(refs/heads/下的任何引用)访问的任何内容;一旦指定了--all,这就是多余的,就像remotes-*。)

要获取分支信息,可以使用其他格式选项,例如

git log --topo-order --format="%d %h %s" --before 2018-07-20 --after 2018-07-18 --all

这仍然不是您所要求的。分支名称将不会获得其自己的行。而是在分支引用指向的提交行的()中显示。两个大警告:

1)如果忽略了分支提示(例如,因为它在--before日期之后),则不会输出分支名称

2)()中包含所有直接指向该提交的引用(分支或其他引用)的列表

git log命令差不多。您可以组合一个脚本来遍历分支,并为每个分支生成一个日志。这类似于jaspreet的答案提出的,但是

1)我不建议在脚本中使用git checkout,因为如果您有本地未提交的更改,那么结帐可能会导致问题。相反,您可以使用git for-each-ref refs/heads之类的脚本来驱动脚本并使用git log <branch-name>

2)该脚本最终会做出假设,因此您必须决定哪种类型的假设适合您的回购协议,并相应地调整脚本。


[1]“从分支提交”的说法很宽松,或者至少做了一些隐含的假设。在git中,提交不像在其他一些工具中那样是“分支的一部分”。分支仅指向一个提交,并且其他提交可能可以通过父指针到达该提交。 first 父指针可访问的对象与“分支的一部分”大致相似,但并不是所有此类提交在创建时就一定是“分支的一部分”-特别是此定义包括在其“父分支” [2]上创建分支之前的提交。

[2]“父级分支”的发言更加宽松;根据您的分支约定,这可能是一个有意义的短语。