我在Ubuntu 10.10 amd64上使用git 1.7.1,我正在尝试提取我的存储库HEAD的哈希值,以便在我编译到项目中的自动化版本信息中使用它。
过去,这总是使用
git describe --tags
然而,git现在正在抛出
fatal: No names found, cannot describe anything.
对我说。有没有人知道这意味着什么?
谷歌只展示了一些点击率,没有解决方案。
答案 0 :(得分:52)
如果您想要HEAD
的ID,则不需要describe
,您应该只使用rev-parse
。
git rev-parse HEAD
如果您想要缩写哈希,可以使用--short
。
git rev-parse --short HEAD
如果您希望“描述”在找不到任何合适的标签时回退到缩写哈希,则可以使用--always
。
git describe --always
答案 1 :(得分:32)
听起来您希望git-describe
包含自该标记以来最新的标记和提交数量。但是,fatal: No names found
消息表示您在您的存储库中没有任何标记。您需要在提交历史记录中至少包含一个标记,以便git describe
告诉您最新的标记。
只是猜测,但也许你在其他地方标记了一个提交,但是从未将标记推送到上游(也许你将提交推送到上游,稍后标记它,并且没有重新注入?)。现在,您的上游的新克隆会给您这个错误(因为它没有任何标记)。如果是这种情况,您可以从具有所需标记的存储库中尝试git push --tags
(其中git describe
正在执行您期望的操作)。然后在没有标记的存储库上执行git pull
。
答案 2 :(得分:16)
我在CI构建环境中遇到此问题,其中CI工具正在执行存储库的浅层克隆。这令人沮丧,因为在我的开发环境中,命令
git describe --tags
会给我输出像
2.2.12-7-g8ec9d6c9
而在构建环境中,我会得到"致命的没有找到的名字"错误。如果我尝试使用--always标签
git describe --tags --always
然后我会简单地获取最新提交的哈希值,但不会获得该提交之前的最新标记
8ec9d6c9
在构建环境中执行git pull
将无济于事,因为一旦repo被浅层克隆,未来的pull将不会更新标记。
解决方案是确保构建环境中repo的初始克隆不是浅层克隆(即git clone
命令未与--depth
,--shallow-since
或{一起使用{1}}参数)。
答案 3 :(得分:16)
如果存储库中没有任何标签,则会发生这种情况。如果存储库有有标签,则您处于浅表克隆中(这是TravisCI或GitHub Actions等CI系统中的默认值)。
要从浅克隆中获取历史记录(包括标签),请运行
graph = {
"a": ["b", "d"],
"b": ["a", "c"],
"c": ["b", "d"],
"d": ["c", "a"]
}
例如,对于GitHub操作:
git fetch --prune --unshallow
然后,- uses: actions/checkout@v2
- run: git fetch --prune --unshallow
应该重新工作。
答案 4 :(得分:1)
如果由于Travis CI中的此错误消息而来到这里,则可以使用以下设置来避免浅层克隆:
git:
depth: false
我测试了git fetch --tags
,但这没用。
答案 5 :(得分:0)
在执行CI作业时,我遇到了类似的问题,问题是git clone或所用的checkout scm在克隆存储库时未获取标签。
无需标签即可获取 从https://github获取上游更改。**********
您可以通过选择“高级克隆行为”,然后单击“获取标记..”来启用获取标记。
答案 6 :(得分:0)
此问题发生在克隆分叉分支后,并在从上游 rebase 后消失。
变基前:
# 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
答案 7 :(得分:-1)
这个命令对我有帮助:git fetch -t