理解git子模块状态输出

时间:2013-09-01 15:54:54

标签: git

我无法理解git submodule status的输出。我认为这是因为我不经常使用标签。

我在Git存储库中添加了一个子模块(您可以使用下面的3个git命令轻松地在本地复制它们):

/ $ git init
/ $ git submodule add https://github.com/twbs/bootstrap.git
Cloning into 'bootstrap'...
## Output abridged ##
/ $ git submodule status
93694898838b479d2806c53c827847f724312bcc bootstrap (v2.3.1-2965-g9369489)    
/ $ cd bootstrap/
bootstrap/ $ git rev-parse HEAD
93694898838b479d2806c53c827847f724312bcc

我检查了v3.0.0

bootstrap/ $ git checkout v3.0.0
Note: checking out 'v3.0.0'.
## Tells me about the detached HEAD ##
HEAD is now at e8a1df5... remove dumb validation reports
bootstrap/ $ cd ..
/ $ git commit -a -m 'Added submodule and changed its checked out commit'

git submodule status的输出:

/ $ git submodule status
e8a1df5f060bf7e6631554648e0abde150aedbe4 bootstrap (v2.3.1-2765-ge8a1df5)

引用的提交(e8a1df5)对我有意义,但标记令人困惑。 man git-submodule表示git submodule status输出的每一行都是:

  

每个子模块当前检出的提交的SHA-1,以及SHA-1的子模块路径和git描述的输出。

所以git describe e8a1df5f060bf7e6631554648e0abde150aedbe4的输出是(v2.3.1-2765-ge8a1df5)?但我刚刚检查了v3.0.0?!

无论如何,man git-describe说:

  

该命令查找可从提交访问的最新标记。如果标记指向提交,则仅显示标记。否则,它将标记名称后缀为标记对象顶部的附加提交数和最近提交的缩写对象名称。

所以,将此知识应用于我上面收到的(v2.3.1-2765-ge8a1df5)输出中的git submodule status

  • v2.3.1”必须是可从e8a1df5
  • 到达的最新代码
  • “2765”必须是“v.2.3.1
  • 之上的提交次数
  • 和“e8a1df5”必须是最近提交的缩写对象名称(请参阅man gitrevisions re:g前缀)

但这对我没有意义。为什么显示v2.3.1加上2765次提交而不是v3.0.0?毕竟,我确实检查了v3.0.0,并且:

bootstrap/ $ git tag --contains `git rev-parse HEAD`
v3.0.0

如何找出git describe确定v2.3.1是最新的可访问标记的原因?这是怎么回事?

1 个答案:

答案 0 :(得分:4)

  

By default (without --all or --tags) git describe only shows annotated tags.

因此v3.0.0是一个轻量级标签会产生这种行为。