git(ls-remote)-按创建日期列出“远程”分支

4
我知道使用下面的git命令可以列出我所有的"远程"分支...
[someone@someone-pc somerepo]$ git ls-remote
Username for 'https://somegit.com': someone
Password for 'https://someone@somegit.com': 
From https://somegit.com/somepath/somerepo.git
32b73a94a2ef1be27298a7bbf6670670c9ad4892        HEAD
99cfe797ee2f4cd3fc12ea1aef8dc4ea0f3538c7        refs/heads/a_branch
687332d5e82436d806fea2c22ac5e8772e73b33a        refs/heads/b_branch
b1d82987dd87b99c505282cbcdf1d4c4d36be2d2        refs/heads/c_branch
32d4a73e686524e50a92880ddbd744d1363834bb        refs/heads/d_branch
097ad2a9a69399996f7e1864436d483b2a85e3c1        refs/heads/e_branch
1e92bb0aa448a840e04928272759a3941774575b        refs/heads/f_branch
32b73a94a2ef1be27298a7bbf6670670c9ad4892        refs/heads/master

问题:有没有一种方法可以按创建日期顺序列出这些分支?

谢谢!=D


更新:

为了说明,我想要像GitLab分支列表那样排序...

gitlab branches list


3
分支没有创建日期。(提交有两个时间戳,分支名称标识一个提交,但显然这不是您要找的内容。) - torek
1
啊,也许那就是你要找的东西。我没有使用过GitLab,但那看起来像是在告诉你分支名称所指向的提交的两个时间戳中的一个的年龄。因此,如果有人现在创建了一个新的提交并将其推送到服务器,新提交的年龄将会是几秒钟,并且该分支将移动到顶部。 - torek
@torek,您描述的操作我该如何实现?也许可以使用一些git命令或者甚至是bash“函数”?谢谢!=D - Eduardo Lucio
1个回答

1
git ls-remote的作用是调用其他Git(上面看到的URL)并询问其引用信息:HEAD、分支名称、标签名称等等。但它发送的唯一信息是这些名称和哈希ID。如我在上面的注释中所述,每个提交(由哈希ID表示,这是提交的真实名称)都有两个时间戳。1要获取任一或两个时间戳,您必须拥有该提交。因此,这意味着通常使用git ls-remote是不够的:您可能没有从其他Git得到哈希ID的提交。
你需要先运行 git fetch,它的功能是从其它 Git 上获取分支、标签等信息,以及每个名称所代表的哈希 ID。对于他们的分支,你的 Git 将会创建或更新远程跟踪名称:例如,他们的 master 变成了你的 origin/master,他们的 develop 变成了你的 origin/develop。无论他们有什么名称(完整形式为 refs/heads/*),你的 Git 都会创建或更新相应的 refs/remotes/origin/* 名称。但在此之前,你的 Git 必须先获得这些提交本身,因此对于你没有的任何提交,你的 Git 都要进行获取。
你可以添加 --prune(简写为 git fetch -p)来指示你自己的 Git 删除不再对应他们 Git 中分支的远程跟踪名称。如果不这样做,你将永远保留过时的远程跟踪名称(除非你明确地删除它们)。这并不会真正造成危害,只是会使代码库变得混乱。

现在你拥有了他们所有的提交,还有你自己的未发送的提交。你还拥有他们所有的名称,已转换为你的远程跟踪名称。

你可以使用git branch -r命令查看这些分支。对于git branch命令,默认的排序顺序是字母顺序(同一组内)。2但你可以使用--sort=key选项:3

git branch -r --sort=authordate

或者:

git branch -r --sort=committerdate

这将基于每个远程跟踪名称指向的提交中存储的相应时间戳进行排序。
因此:
git fetch -p
git branch -r --sort=committerdate

这应该可以满足您的需求(除非您需要作者日期;请参见脚注1)。

(另外:我喜欢在我的每个用户配置中将fetch.prune配置为true,这样所有获取操作都像git fetch --prune一样。)


1这两个时间戳是作者时间戳和提交者时间戳。在许多情况下,两者都持有相同的日期和时间。一般来说,新提交的内容会同时获取这两个时间戳,如果你通过git commit --amendgit rebase或其他任何可以实现此操作的方式将提交复制到一个新的改进版本,则新的改进提交将具有旧提交的作者信息,并且你是提交者信息。

2从技术上讲,它更像是按ASCII或UTF-8排序,而不是按字母顺序排序:数字排在大写字母之前,大写字母排在小写字母之前。

3你的git branch需要足够新才能使用--sort选项,该选项在Git 2.7中引入到git branch中。如果你的Git版本较旧,请考虑使用git for-each-ref


我已经阅读了你写的所有内容,但我需要更加冷静地阅读才能更好地理解。很快我会给你反馈。谢谢!=D - Eduardo Lucio
1
好的,你可能想要的两个命令在代码块末尾附近。如果你想要实际的提交年龄,你需要在git branch中添加--format,这需要一个更新版本的Git,或者使用git for-each-ref,但它比git branch更加笨重。 - torek
也许我解释一下我真正想做什么会有所帮助。我创建了一个bash脚本,使用Meld工具(https://meldmerge.org/)合并多个分支。我相信,如果我们可以按更改或创建日期排序获得所提到的输出(无论我们能做什么),我们可以使该工具更有效(更容易和更安全地使用)。要解决我所说的问题,请注意代码https://github.com/eduardolucioac/visual_git_merge/blob/master/vgm.bash#L259。顺便说一句...“vgm”是一个免费且开源的代码(BSD 3-Clause“New”或“Revised”许可证)。谢谢!= D - Eduardo Lucio
1
啊,我自己不使用任何合并工具。然而,请注意,分支的最新提交的年龄与您可能在分支上遇到的任何合并问题不会很好地相关。一般来说,合并问题是由于随着时间的推移从合并基础提交中出现了显著的漂移,因此理想情况下,您应该查看两个分支的对称差异,并检查它们内部提交的数量和大小,或者仅比较合并基础和两个分支的最新提交。 - torek
1
请记住,Git 还可以执行“章鱼合并”,虽然它并没有实现任何你无法通过成对合并完成的功能,但在某些多主题分支的情况下很有用,以表示这确实是一个全合并到一个的合并。 - torek

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