如果在同一代码库的任何分支上以后执行git rev-list --all --count
,输出结果是否会下降?
(我想将其用作构建编号,该编号将在所有分支上单调递增。)
根据某些条件,您可以避免简单的情况:
--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
。
$ 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
git --no-replace-objects rev-list --count
保存修订号。不幸的是,修订号总是显示为1,因为Spack使用浅克隆。