git описує помилку "fatal: Імена не знайдені, нічого не можна описати"


82

Я використовую git 1.7.1 на Ubuntu 10.10 amd64, і я намагаюся витягти хеш мого репозиторію HEAD, щоб використовувати його в автоматизованій інформації про версію, яку я компілюю в свій проект.

Раніше це завжди працювало за допомогою

git describe --tags

однак git зараз кидає

fatal: No names found, cannot describe anything.

на мене. Хтось знає, що це означає?

Google показав лише кілька звернень і жодного рішення.


Ви насправді хочете лише хеш, або інформація, зібрана за допомогою git, вам корисна? Останній тег та кількість проміжних комітів набагато зручніше для читання, ніж SHA1. @nes: Можливо, ви захочете відновити свою відповідь, оскільки це може бути саме те, що потрібно OP - важко сказати.
Cascabel

Особисте нагадування: перевірте, чи на пульті дійсно є теги, наприклад, використовуючи git ls-remote --tags. У моєму випадку репо нещодавно було перенесено на новий сервер, і теги ще не передані!
Габріель

Відповіді:


71

Якщо ви хочете ідентифікатор свого, HEADтоді вам не потрібно describe, вам слід просто використовувати rev-parse.

git rev-parse HEAD

Якщо ви хочете скорочений хеш, ви можете використовувати --short.

git rev-parse --short HEAD

Якщо ви хочете, щоб "опис" повернувся до скороченого хешу, якщо він не може знайти відповідних тегів, ви можете використовувати --always.

git describe --always

Так, це повертає хеш, але що я гостро хочу, це скорочений хеш, який зазвичай повертається git-descri, який має
Філіпп

1
@Philipp: git describeзазвичай повертає рядок на основі об'єкта тегу, що складається з імені тегу, кількості комітів та суфікса на основі хешу. Зазвичай він не повертає скорочений хеш, тому я не зовсім впевнений, що ви просите.
CB Bailey

37

Схоже, ви очікуєте git-describeвключити найновіший тег і кількість комітів з цього тегу. Однак fatal: No names foundповідомлення означає, що у вас немає тегів у вашому сховищі. Вам потрібно мати принаймні один тег в історії комітів, git describeщоб повідомити вам останній тег.

Просто здогадуючись, але, можливо, ви позначили коміт десь в іншому місці, але ніколи не штовхали тег вгору за течією (можливо, ви штовхали коміт вгору, тегували його пізніше і не відштовхували?). Тепер новий клон вашого вищого струму видає вам цю помилку (оскільки вона не має жодного тегу). Якщо це так, ви можете спробувати git push --tagsзі сховища, яке має потрібний тег (де git describeробиться те, що ви очікуєте). Потім виконайте git pullна сховищі, яке не має тегу.


37

У мене була ця проблема в середовищі побудови CI, де інструмент CI виконував неглибокий клон сховища. Це засмучувало, бо в моєму середовищі розробки команда

git describe --tags

дав би мені вихід, як

2.2.12-7-g8ec9d6c9

тоді як у середовищі збірки я отримав би помилку "фатально не знайдено імен". Якби я спробував використовувати тег --always

git describe --tags --always

тоді я просто отримав би хеш останнього коміту, але не найновіший тег до цього коміту

8ec9d6c9

Виконання a git pullу середовищі збірки не допомогло б, оскільки як тільки репо буде клоновано неглибоко, майбутні витяжки не оновлять теги.

Рішення було забезпечити , щоб початковий клон сховища в середовищі збірки не було дрібної клон (тобто git cloneкоманда не була використана з --depth, --shallow-sinceабо --shallow-excludeпараметри).


У мене була така сама проблема, дякую за розуміння!
Теренот

5
Додавання git fetch --depth=500працювало у мене з Travis-CI.
matt wilkie

це відповідь, яку я теж хотів!
serkef

Так - додавши це, .travis.ymlмені це виправили:git: depth: false
shacker

1
Ви також можете просто зробити git fetch --tagsв неглибокому клоні, щоб забрати відсутні теги
Лука Ч

17

Це трапляється, якщо у вас немає тегів у вашому сховищі. Якщо сховище дійсно є теги, то ви в неглибокому клон (це за замовчуванням в CI системах , таких як TravisCI або GitHub дію).

Щоб отримати історію (включаючи теги) із неглибокого клону, запустіть

git fetch --prune --unshallow

Наприклад, у разі дій GitHub:

- uses: actions/checkout@v2
- run: git fetch --prune --unshallow

Потім, git describeслід знову працювати.


2
Для GitHub дій, --tagsнеобхідних у моєму випадку - так git fetch --prune --unshallow --tags. Дивіться це питання
u-phoria

1
Хоча це буде працювати і вирішує проблему для неглибоких репо на робочих процесах Github, чи не --unshallowing збирається фактично отримати всю історію сховища? Велике репо з великою кількістю історії спричинить проблеми, додавши вузьке місце до трубопроводу ІР.
Норман Пелле

1
Так, це призведе до всієї історії. Оскільки тег - це вказівник на редакцію, ця редакція повинна бути присутнім, щоб тег працював належним чином.
Данило Барген,

5

У мене була подібна проблема під час роботи над завданням CI, проблема полягала в git clone або checkout scm, який не використовував теги під час клонування репо.

Отримання без тегів Отримання змін, що виходять за течією, з https: // github . **********

Ви можете активувати теги отримання, вибравши "Розширена поведінка клонування", а потім клацнувши на теги завантаження.

Знімок екрана_enabling_git_fetch


1

Якщо ви потрапили сюди через це повідомлення про помилку в Travis CI, ви можете скористатися таким налаштуванням, щоб уникнути неглибоких клонів:

git:
  depth: false

Я тестував, git fetch --tagsале це не спрацювало.


0

Ця команда мені допомогла: git fetch -t


11
Будь ласка, відредагуйте з додатковою інформацією. Відповіді лише для коду та "спробувати це" не рекомендується , оскільки вони не містять вмісту для пошуку, і не пояснюйте, чому хтось повинен "спробувати це".
Rick Smith

Як би це не було лаконічно, це єдина відповідь, про яку згадується fetch.
Bjoern Dahlgren

Проблема OP полягала в тому, що в його локальному сховищі не було тегів. Якщо пульт має, а локальний ні, ви можете отримати теги за допомогою git fetch -t або git fetch --tags
Wolfgang

Ця команда насправді також вирішила мою проблему і жодна з інших відповідей.
Маркос Фернандес Рамос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.