【问题标题】:confusion about git rev-list关于 git rev-list 的困惑
【发布时间】:2017-07-06 13:50:19
【问题描述】:

我想知道分支dev 中的 100 提交的相关提交 ID。 (例如:git rev-list --reverse --branches=dev --date-order --count <commit-id> == 100):

得到 100 次提交的是 1f345e80fba518c72dec7f2e02da5da12be5810f:

$ git rev-list --reverse --branches=dev --date-order HEAD | head -100 | tail -1
1f345e80fba518c72dec7f2e02da5da12be5810f

$ git rev-list --reverse --branches=dev --date-order HEAD | nl | grep 100
   100  1f345e80fba518c72dec7f2e02da5da12be5810f

$ git rev-list --reverse --branches=dev --date-order HEAD | awk '{print NR"\t"$0}' | grep -E ^100
100     1f345e80fba518c72dec7f2e02da5da12be5810f

但是,当我尝试验证有关此 commit-id (1f345e80fba518c72dec7f2e02da5da12be5810f) 的 rev-number 时,结果显示:rev number is 98!!!

$ git rev-list --reverse --branches=dev --date-order --count 1f345e80fba518c72dec7f2e02da5da12be5810f
98

$ git rev-list --reverse --branches=dev --date-order 1f345e80fba518c72dec7f2e02da5da12be5810f | nl | tail -1
    98  1f345e80fba518c72dec7f2e02da5da12be5810f

所以我尝试找出缺少哪 2 个提交:

$ git rev-list --reverse --branches=dev --date-order HEAD | head -100 | nl > commit-100.log
$ git rev-list --reverse --branches=dev --date-order 1f345e80fba518c72dec7f2e02da5da12be5810f | head -100 | nl > commit-98.log
$ diff -y commit-100.log commit-98.log
 90  63546ce0207cdd6ade353ea05c466d0210af1d29              |     90  75a8fd85043908049e11595aaa2c988282fa1a0c
 91  75a8fd85043908049e11595aaa2c988282fa1a0c              |     91  c1bbb33cd0241c16dde2579696c08ed2eb146cdf
 92  c1bbb33cd0241c16dde2579696c08ed2eb146cdf              |     92  28e9bbc06cb3036bce4cce71f5acf4b27835e9a0
 93  28e9bbc06cb3036bce4cce71f5acf4b27835e9a0              |     93  7b1d0caddc6218eb982d27c1df27c885bc84204c
 94  7b1d0caddc6218eb982d27c1df27c885bc84204c              |     94  945fd63a256391e72e55e8ac98c449c1473c1e5e
 95  945fd63a256391e72e55e8ac98c449c1473c1e5e              |     95  0ff3f47eb8dc40815ac7effdb2172e5d69dd0e10
 96  0ff3f47eb8dc40815ac7effdb2172e5d69dd0e10              |     96  ac90a7b2a371ff7a0fad0475d94691663aceaa1b
 97  ac90a7b2a371ff7a0fad0475d94691663aceaa1b              |     97  1a0e26b517f88870fed0cf5f346495b67c29463a
 98  937807239dd706f3bf124dd4d3266c71fd8071f4              |     98  1f345e80fba518c72dec7f2e02da5da12be5810f
 99  1a0e26b517f88870fed0cf5f346495b67c29463a              <
100  1f345e80fba518c72dec7f2e02da5da12be5810f              <

显然,2 缺少的 commit-id 是:

90  63546ce0207cdd6ade353ea05c466d0210af1d29
98  937807239dd706f3bf124dd4d3266c71fd8071f4

根据git show &lt;commit-id&gt;,并没有什么奇怪的。这两个提交是由同一个人提交的。但是这个人在前 100 次提交中提交了 10 次。

这是git rev-list 的问题吗?

【问题讨论】:

    标签: git git-rev-list


    【解决方案1】:

    我不太清楚你想做什么,但git rev-list 不会那样做,不管它是什么。

    git rev-list 所做的是列出可达 提交,方法是遍历提交图,从特定的起点集开始,同时应用一些约束。 walk 本身可以按照特定的顺序完成,一些提交可以选择简化,您可以使用--max-count 提前停止 walk 或使用--skip 跳过一些初始提交,找到提交集后可以反转和/或计数。

    您没有对图本身设置任何约束(没有路径参数),也没有启用任何简化模式或跳过或最大计数,但您最终确实要求反转设置。

    你的起点是--branches=dev(意思是--branches=dev/*HEAD在一种情况下,--branches=dev在另一种情况下提交1f345e80fba518c72dec7f2e02da5da12be5810f .

    您要求在--date-order 中完成遍历,这意味着只要 Git 有两个提交它现在可以遍历,它应该选择具有较晚提交时间戳的那个,只要它没有选择尚未选择的子提交的父级。

    可从HEAD 访问的提交集可能包括无法从refs/heads/dev/* 选择的提交集(所有开发分支)中访问的提交。如果1f345e80fba518c72dec7f2e02da5da12be5810f 本身不能从dev 分支之一访问,则可从1f345e80fba518c72dec7f2e02da5da12be5810f 访问的提交集也可能不同。第 100 个这样的提交(在反转列表之后)不同也就不足为奇了。

    【讨论】:

    • 嗯,我正在做的是......实际上,设置包构建版本。例如产品版本为1.0.0;我还想在版本中添加代码信息;这意味着:1.0.0 -> 1.0.0.&lt;code_info&gt;。所以如果某个包有问题,我可以追溯到相关的源代码。我将 rev-number 用于&lt;code_info&gt;,因为 rev-number 是连续的且易于理解。比如,1.0.0.100 表示包是从第 100 次提交构建的......
    • 不要那样做。使用git tag -a为版本制作注释标签,然后使用git describe根据标签制作人类可读的名称。
    猜你喜欢
    • 2021-01-31
    • 2019-05-17
    • 2020-03-06
    • 2016-03-16
    • 2013-07-27
    • 1970-01-01
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多