【问题标题】:git (ls-remote) - List "remote" branches ordered by creation dategit (ls-remote) - 列出按创建日期排序的“远程”分支
【发布时间】:2020-02-25 01:25:36
【问题描述】:

我知道使用下面的 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,但它看起来像是在告诉你分支名称指向的提交的两个时间戳之一的年龄。所以如果现在有人做了一个新的提交并推送到服务器上,新提交的时间将是几秒钟,分支会移动到顶部。
  • @torek 我该怎么做你所描述的?也许使用一些 git 命令甚至是 bash“函数”?谢谢! =D

标签: git github gitlab ls-remote git-ls-remote


【解决方案1】:

git ls-remote 所做的是调用另一个 Git(您在上面看到的 URL 中的那个)并询问它的引用:HEAD、分支名称、标签名称等。但它发送的唯一信息是那些名称和哈希 ID。

正如我在上面的 cmets 中所指出的,每个 commit(由哈希 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 也必须自己获取提交,因此对于他们拥有的任何您没有的提交,但您的 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-betic 或 UTF-8-betic:数字在大写之前,大写在小写之前。

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

【讨论】:

  • 你写的一切我都看了,但我需要更冷静地阅读才能更好地理解。很快我会给你反馈。谢谢! =D
  • 好吧,你可能想要的两个命令都在靠近末尾的一个块中。如果您想要提交的实际年龄,则需要将--format 添加到git branch,这需要更新的Git 版本,或者使用git for-each-ref,这对使用比git branch.
  • 如果我向您解释我真正想做的事情可能会有所帮助。我创建了一个 bash 脚本,借助 Meld 工具 (meldmerge.org) 合并多个分支。我相信,如果我们能够获得按更改或创建日期排序的输出(无论我们能做什么),我们就可以使工具更高效(使用起来更容易、更安全)。为了解决我在说什么,请注意代码 github.com/eduardolucioac/visual_git_merge/blob/master/… 。顺便说一句……“vgm”是一个免费的开源代码(BSD 3-Clause“New”或“Revised”许可证)。谢谢! =D
  • 啊,我自己不使用任何这些合并工具。但是,请注意,一般来说,分支的提示提交时间与您可能遇到的分支合并问题没有很好的相关性。合并问题是由于随着时间的推移与 merge base 提交的显着漂移而发生的,因此理想情况下,您应该查看两个分支的对称差异并检查它们内部提交的数量和大小,和/或简单地将合并基础与两个分支提示进行比较。
  • 还请记住,Git 可以进行 octopus 合并,这并不能真正实现成对合并无法做到的任何事情,但在某些多主题分支中很有用案例表明这确实是一个多合一的合并。
猜你喜欢
  • 2019-12-11
  • 1970-01-01
  • 2021-04-20
  • 2020-04-12
  • 2015-10-04
  • 2019-08-14
  • 2017-04-25
  • 2015-10-31
  • 1970-01-01
相关资源
最近更新 更多