按分支拆分提交历史记录



我有一个脚本,它在一段时间内从选定的repo中获取所有提交。

为此,我使用命令:

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

在文档中找不到任何可以像这样列出提交的东西,如果有人找到了,请发表评论。您可以编写一个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运行

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

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

(注意:branches=*参数仅意味着在输出中包括从任何分支(refs/heads/下的任何ref(可到达的任何内容;一旦指定了--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中,提交并不像在其他一些工具中那样是"分支的一部分";分支只指向一个提交,其他提交可能可以通过父指针从该提交访问。第一个父指针可访问大致类似于"分支的一部分",但并非所有此类提交在创建时都一定是"分支的部分",尤其是此定义包括在分支"父分支"上创建之前的提交[2]。

[2] "父分支"的说法更为松散;根据你的分支惯例,它可能是一个有意义的短语,也可能不是。

最新更新