git describe 失败并显示“fatal: No names found, cannot describe anything.”。

144

我在Ubuntu 10.10 amd64上使用git 1.7.1,尝试提取我的存储库HEAD的哈希值以将其编译到我的项目中作为自动化版本信息。

过去,我通常通过使用

git describe --tags

然而,现在 git 抛出以下错误

fatal: No names found, cannot describe anything.

有人在我这里@了我。 有人知道这是什么意思吗?

在Google上搜索只出现了几个结果,没有解决方案。


你是只需要哈希值,还是git describe生成的信息对你有用?最近的标签和中间提交的数量比SHA1更易读。@nes:你可能想恢复你的答案,因为它可能正是OP所需要的 - 很难说。 - Cascabel
2
个人提醒:请检查远程代码库 实际上是否有标签,例如使用 git ls-remote --tags 命令。在我的情况下,该代码库最近已迁移到新服务器,但是标签尚未转移! - Gabriel Devillers
感谢 @GabrielDevillers 的明显提示。我在 Visual Studio 中创建了标签,但不知道在“正常”推送时标签不会被包括进去。这里有一个链接,教你如何从 Visual Studio 内部推送标签:https://dev59.com/TlEG5IYBdhLWcg3wLFwk#71733250 - devbf
11个回答

101

在CI构建环境中,我遇到了这个问题,因为CI工具正在执行对存储库的浅克隆。这很令人沮丧,因为在我的开发环境中,该命令

git describe --tags

会给我输出类似以下的结果

2.2.12-7-g8ec9d6c9

但是在构建环境中,我会遇到“致命错误:未找到名称”的错误。如果我尝试使用--always标签

git describe --tags --always

那么我只需获取最新提交的哈希值,而不是该提交之前最近的标签

8ec9d6c9

在构建环境中执行git pull操作是无效的,因为一旦仓库被浅克隆,未来的pull操作将不会更新标签。

解决方法是确保在构建环境中对仓库进行初始克隆时不是浅克隆(即没有使用--depth--shallow-since--shallow-exclude参数执行git clone命令)。


我遇到了完全相同的问题,感谢您的见解! - Terenoth
13
在Travis-CI中,对我来说使用git fetch --depth = 500起作用了。 - matt wilkie
2
是的 - 将这个代码添加到 .travis.yml 对我来说解决了问题: git: depth: false - shacker
10
您还可以在浅克隆中执行git fetch --tags,以获取缺失的标签。 - Luke H
11
在 GitHub Action 中,将“fetch-depth: 0”添加到checkout action中将获取所有的标签和分支。 - aashitvyas
显示剩余2条评论

93
如果你想要获取HEAD的id,那么就不需要使用describe,而应该直接使用rev-parse
git rev-parse HEAD
如果你想要一个缩略的哈希值,你可以使用--short
git rev-parse --short HEAD
如果您想让“describe”在找不到合适的标记时回退到缩写哈希值,您可以使用--always
git describe --always

1
是的,那返回了哈希值,但实际上我想要的是通常由git-describe返回的缩写哈希值,大约有8个字符左右。 - Philipp
1
@Philipp:git describe通常返回一个基于标签对象的字符串,该字符串由标签名称、提交数量和基于哈希的后缀组成。它通常不会返回一个缩写的哈希值,所以我不太确定你在问什么。 - CB Bailey
在我的 macOS 上,git 2.39.1 中运行 git describe --tags 命令会返回类似于 0.16.0-22-g4ce71cd 的结果,其格式为 [最近的标签]-[标签和当前版本之间的提交数]-[sha1_short]。这很可能是大多数读者想要的内容。 - Cyril Duchon-Doris

46

如果您的代码库中没有标签,则会出现此情况。如果代码库有标签,则表示您在进行浅克隆(这是CI系统(如TravisCI或GitHub Actions)的默认设置)。

要从浅克隆中获取完整历史记录(包括标签),请运行

git fetch --prune --unshallow
例如,在 GitHub actions 的情况下:
- uses: actions/checkout@v2
- run: git fetch --prune --unshallow

之后,git describe 应该可以正常工作。


6
对于 GitHub Actions 来说,在我这种情况下需要使用 --tags,因此要运行 git fetch --prune --unshallow --tags。请参考 这个问题 - u-phoria
1
虽然这样做可以解决 Github Workflows 上浅层仓库的问题,但是 --unshallowing 不会实际获取整个仓库的历史记录吗?一个有很多历史记录的大型仓库将通过向 CI 流水线添加瓶颈来引起问题。 - Norman Pellet
1
是的,这将获取整个历史记录。由于标签是指向修订版本的指针,因此该修订版本必须存在才能使标签正常工作。 - Danilo Bargen

41
似乎您希望git-describe包含最新标签和自该标签以来的提交数。然而,fatal: No names found错误意味着您的存储库中没有任何标签。您需要在提交历史记录中至少有一个标签,以便 git describe 命令告诉您最新的标签。
只是猜测,也许您在其他地方为提交打了标签,但从未将标签推送到上游(也许您将提交向上游推送后,稍后才打了标签,并且没有重新推送?)。如果是这种情况,您可以尝试从具有所需标签的存储库(git describe 命令按预期工作的地方)使用命令 git push --tags 推送标签,然后在不具有标签的存储库上运行 git pull 命令。

17

如果您正在使用GitHub Actions和actions/checkout,则应将fetch-depth设置为0

# ...
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

将 fetch-depth 设置为 0,以获取所有分支和标签的完整历史记录。正如其他评论所指出的那样,这种方法效率极低。 - Cyril Duchon-Doris
我在一个有1500多个提交的仓库上,实际上,在GH Action工作流中,“fetch-depth”为0和50之间的差异可以忽略不计(大约1-3秒)。我宁愿效率稍微低一些,也不愿错过获取标签。 - undefined

11

在进行CI作业时,我遇到了类似的问题,问题出在git clone或checkout scm使用时没有在克隆repo时获取标签。

在不获取标签的情况下,从https://github.**********获取上游更改。

您可以通过选择“高级克隆行为”,然后单击“获取标签”来启用获取标签..

启用git获取截图


5
这个命令对我很有帮助: git fetch -t 它会从git仓库中获取最新的标签,因此能够描述这些标签。

13
请编辑并提供更多信息。仅包含代码或“尝试这个”类型的答案是被不鼓励的,因为它们没有可搜索的内容,并且没有解释为什么有人应该“尝试这个”。 - Rick Smith
虽然简短,但这是唯一提到 fetch 的答案。 - Bjoern Dahlgren
OP的问题是他的本地仓库没有任何标签。如果远程有标签,但本地没有,您可以使用git fetch -t或git fetch --tags获取标签。 - Wolfgang
这个命令确实解决了我的问题,而其他回答都没有。 - Marcos Fernandez Ramos
它也帮助了我! - NPULSENET

2

如果你因为Travis CI的错误信息而来到这里,你可以使用以下设置来避免浅层克隆:

将原始答案翻译成“最初的回答”。

git:
  depth: false

我测试了git fetch --tags,但没有起作用。最初的回答。

2

如果您正在使用Github Actions和checkout@v3

您会遇到这个问题,因为默认情况下该操作仅获取最后一次提交,并且如其他帖子所述,如果此提交未标记,则git describe --tags将崩溃(当它找不到标记时会崩溃)

有一个被Github工作人员忽略的开放PR旨在解决此问题。

同时,您有几个选项

  • 获取所有提交(请参见答案
  • 黑客攻击上述答案并从其他答案/评论中获得灵感:获取X个提交(希望您在头部和最后一个标记提交之间没有超过X个未标记的提交),例如(X = 50)
# ...
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 50

1

这个问题发生在克隆一个派生分支之后,但在从上游进行变基后消失。

变基之前:

#  git describe --tags
fatal: No names found, cannot describe anything.

重新定位后:
# git describe --tags
v0.1.xxxx

重新定位的命令:

git remote add upstream xxxxx
git checkout main
git remote prune origin
git fetch -p upstream 
git rebase upstream/main

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