按分支拆分提交历史

Split commit history by branch

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

为此,我使用命令:

 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

将此代码写入文件-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/ 下的任何引用)可到达的任何内容;一旦指定 [=16=,这是多余的], remotes-*.)

要获取分支信息,您可以使用不同的格式设置选项,例如

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

这仍然不完全您所要求的;分支名称不会有自己的行。相反,它出现在分支 ref 指向的提交行的开头的 () 中。两大注意事项:

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

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

这与您仅使用 git log 命令所能获得的结果差不多。您可以编写一个脚本来遍历分支并为每个分支生成一个日志。这类似于 jaspreet 的回答建议,但是

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

2) 脚本最终会做出假设,因此您必须决定哪种假设适合您的存储库并相应地调整脚本。


[1] "commits from a branch" 说的很笼统,或者至少做了一些隐含的假设。在 git 中,提交不像在其他一些工具中那样 "part of a branch";一个分支只指向一个提交,其他提交可能可以通过父指针从该提交到达。通过 first 父指针访问大致类似于 "part of a branch",但并非所有此类提交在创建时都必须 "part of the branch" - 特别是这个定义包括在 "parent branch"[2].

上创建分支之前的提交

[2] "parent branch" 说话更松散;根据您的分支约定,它可能是也可能不是有意义的短语。