查找分支合并的时间

3

互联网上有许多脚本可用于删除已经合并的分支 例如

$ git branch --merged master | grep -v master | xargs -n 1 git branch -d

但我希望在清理之前保留我的分支一段时间。因此:

如何查找特定分支合并的时间?我想能够获取合并提交的哈希和日期。如果能够同时处理多个分支,那就更好了。最终目标是:

$ git branch --merged master | [find dates for each]
    | [compare dates to arbitrary date] | [delete old merged branches]

我知道标准做法是标记/删除你想要保留一段时间的分支,但如果我这样做了,我仍然会问关于合并提交哈希和时间的问题。
编辑:
我一直在查看这些线程(12),因为我觉得我正在寻找分支引用的子提交。不幸的是,正如这个评论中提到的那样,--children只是将子提交添加到由logrev-list返回的提交中,而不是仅返回子提交。

我应该检查Git 2.11的rev id更改,看看它们是否能更好地回答这个问题。 - Michael
2个回答

3

更新于2015-05-15

直接引用一个分支的父提交更好的答案是:

$ git rev-list -1 --format=%p <branch_name> | grep -v commit |
  xargs -I {} sh -c 'git rev-list -1 --format="%h %ct" {}' | grep -v commit

你仍然可以将所有合并到master的分支传递给它:

$ git branch -a --merged master | grep -v master | 
  xargs -I {} sh -c 'git rev-list -1 --format=%p {}' | grep -v commit |
  xargs -I {} sh -c 'git rev-list -1 --format="%h %ct" {}' | grep -v commit

这可能适用于通过快速前进成为树的一部分的分支。
如果有一个参数可以传递给rev-list,使您不必每次都执行grep -v commit,我会很感兴趣知道它是什么。
注意:我寻找与issue匹配的分支名称而不是grep -v master。 如果您正在寻找包含或排除特定分支,则应执行相同操作。
原始内容:要获取哈希值,似乎可以执行以下操作:
$ git log --ancestry-path --merges --format=%H <branch_name>..master | tail -1

你可以用任何你想要的格式替换这个格式。 --merges 只是在我们选择最后一行之前减少返回的行数。

你可以使用以下命令将合并的分支列表导出:

$ git branch -a --merged master | grep -v master |
  xargs -I {} sh -c 'git log --ancestry-path --format=%H --merges {}..master | tail -1'

但我实际上还没有进行剪枝。 =)

我发现如果<branch_name>没有直接合并到master中,这种方法就不起作用了(尽管对于我的工作流程来说它很好用)。如果有人有评论、改进、更好(更通用)的解决方案等,请发表! - Michael

1

可能有些琐碎,但从您的合并历史开始如何呢?

git log --merges --name-status --date=iso --pretty=format:"%C(auto)%h%d%Creset %C(cyan)(%cd)%Creset %C(green)%cn <%ce>%Creset %s" 

你不能从输出中提取信息吗?


分支名称本身不一定出现在提交消息中,我通常不会将分支FF到将合并提交到master(或main)上。 - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接