7

我无法理解git submodule status. 我想这是因为我不经常使用标签。

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

/ $ 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 describe 的输出。

所以输出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
  • v.2.3.1“2765”必须是“ ”之上的提交数
  • 并且“ e8a1df5”必须是最近提交的缩写对象名称(参见man gitrevisionsre:g前缀)

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

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

我怎样才能找出为什么git describe决定这v2.3.1是最近的可达标签?这里发生了什么?

4

1 回答 1

6

默认情况下(没有 --all 或 --tags) git describe 只显示带注释的标签。

所以 v3.0.0 作为轻量级标签会产生这种行为。

于 2013-09-05T19:37:30.560 回答