Git 按分支拆分提交历史记录

Git 按分支拆分提交历史记录,git,git-log,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-1

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

为此,我使用以下命令:

 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

在文档中找不到任何可以像这样列出提交的内容,如果有人找到此do注释。 您可以编写一个bash脚本,在其中签出所有分支并在每个分支上登录git

样本(可以改进)

在file-name.sh中编写此代码
并使用
sh file name运行它。sh
git log
通常不会按分支分割输出。您可以使用
--topoorder
对输出进行排序,以使来自分支的提交保持在一起[1]。但是,这仍然不会显示分支名称

git log --topo-order --oneline --before 2018-07-20 --after 2018-07-18 --all
(注意:
branchs=*
参数仅意味着在输出中包含任何可以从任何分支(在
refs/heads/
下的任何ref)访问的内容;一旦指定了
--all
,这是多余的,就像
remotes-*
一样)

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

git log --topo-order --format="%d %h %s" --before 2018-07-20 --after 2018-07-18 --all
这仍然不是你想要的;分支名称将不会获得自己的行。相反,它出现在分支引用指向的commit行的开头的
()
。两大警告:

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

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

只需一个
git log
命令,就可以实现这一目标。您可以组合一个脚本来迭代分支,并为每个分支生成一个日志。这与jaspreet的回答类似,但是

1) 我不建议在脚本中使用
git checkout
,因为如果您有未提交的本地更改,签出可能会导致问题。相反,您可以为每个ref/heads使用类似于
git的东西驱动脚本,并使用
git log

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


[1] “来自分支的提交”说得相当松散,或者至少是做了一些隐含的假设。在git中,提交不像在其他一些工具中那样是“分支的一部分”;一个分支只指向一个提交,其他提交可以通过父指针从该提交访问。可由第一个父指针访问大致类似于“分支的一部分”,但并非所有此类提交在创建时都必须是“分支的一部分”——特别是,此定义包括在其“父分支”上创建分支之前的提交[2]


[2] “母支”说得更松散;根据您的分支惯例,它可能是一个有意义的短语,也可能不是一个有意义的短语。

为什么不在开头保存当前分支,然后在结尾检查它?此外,您不需要签出分支来列出其提交-只需将分支的名称传递给
git log
;示例:
git log master
@phd感谢您的输入,我是git新手,所以每天都在学习新东西,更新答案
git log --topo-order --format="%d %h %s" --before 2018-07-20 --after 2018-07-18 --all