"git rev-list --all --count"会减少吗?

4

如果在同一代码库的任何分支上以后执行git rev-list --all --count,输出结果是否会下降?

(我想将其用作构建编号,该编号将在所有分支上单调递增。)

2个回答

6

根据某些条件,您可以避免简单的情况:

  • --all 找到refs/中的每个引用(也可以看看 git for-each-ref),以获得进入提交DAG的起始点
  • git rev-list 然后跟随每个提交对象到其所有父对象,一直回溯到根提交
  • --count 打印没有--count的提交数量。

这意味着问题等同于“如何减少在此树遍历中访问的提交数?”答案是从存储库中删除提交,甚至只是删除使其中一些提交可达的某些引用。

例如,我们可以开始创建一个"提高计数"参考; 让我们将其作为分支创建,以便稍后轻松提高计数:

$ git checkout -b raise-the-count

现在让我们添加一堆提交记录:
$ for i in $(jot 10); do git commit -m "dummy commit $i" --allow-empty; done

现在有了raise-the-count分支,我们得到的--count比以前高10。现在删除分支标签:

$ git checkout master; git branch -D raise-the-count

我们使用的--count会将那10个提交所代表的数量减掉。

移除提交非常困难(相当于替换删除提交之后的每一个提交;这与删除敏感文件是相同的问题;git filter-branch可以让您这么做,但是很麻烦),但是删除一个分支并不是很难,并且可以通过引用日志在一段时间内进行恢复。最终,只存在于该分支上的提交将被垃圾收集。

摘要

所有其他引用(主要是标签和“注释”)都适用相同的规则,因此如果您对自己实施“永远不删除任何内容”的规则,并坚持不懈地遵守它,那么您将获得一个非递减的--count


4
被接受的答案不完整;它没有考虑到grafts,替换对象或浅克隆。考虑以下示例,当使用--depth 3克隆时,一个包含10个提交历史记录的仓库只看起来像是一个包含3个提交历史记录的仓库:
$ git init temp
Initialized empty Git repository in /rnsdhpc/code/src/temp/.git/
$ cd temp
$ for i in $(jot 10); do git commit -m "dummy commit $i" --allow-empty; done
[master (root-commit) 32cc222] dummy commit 1
[master a9c1d91] dummy commit 2
[master 3ab734f] dummy commit 3
[master 1d7c4f8] dummy commit 4
[master 74c6116] dummy commit 5
[master 447d696] dummy commit 6
[master a9cf900] dummy commit 7
[master 7cc0a16] dummy commit 8
[master 6a43b81] dummy commit 9
[master 4dbcdc0] dummy commit 10
$ git rev-list --all --count
10
$ cd ..
$ git clone --depth 3 file://$PWD/temp temp2
Cloning into 'temp2'...
remote: Enumerating objects: 4, done.
remote: Counting objects: 100% (4/4), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (4/4), done.
Resolving deltas: 100% (2/2), done.
$ cd temp2
$ git rev-list --all --count
3
$ git log --oneline -3
4dbcdc0 (HEAD -> master, origin/master, origin/HEAD) dummy commit 10
6a43b81 dummy commit 9
7cc0a16 (grafted) dummy commit 8

我使用Spack软件包管理器安装我的软件时遇到了意外的行为,该软件使用git --no-replace-objects rev-list --count保存修订号。不幸的是,修订号总是显示为1,因为Spack使用浅克隆。

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