Які імена є дійсними тегами git?


78

Я отримав повідомлення про помилку під час створення тегу, що містить [символ:

fatal: '[' не є дійсним ім'ям тегу.

Запитання: чи існують правила для тегів у git?

Відповіді:


109

Ви можете перевірити, чи справжнє ім'я за допомогою

git check-ref-format

Ця сторінка містить обмеження щодо дійсного імені. Цитата зі сторінки (можливо, застаріла в майбутньому):

  1. Вони можуть містити скісну риску /для ієрархічного (каталогового) групування, але жоден розділений косою рисою компонент не може починатися з крапки .або закінчуватися послідовністю .lock.

  2. Вони повинні містити принаймні один /. Це підсилює присутність категорії , як heads/, і tags/т.д. , але фактичні імена не обмежені. Якщо використовується --allow-onelevelопція, це правило скасовується.

  3. Вони не можуть мати ..ніде двох послідовних крапок .

  4. Вони не можуть мати контрольних символів ASCII (тобто байтів, значення яких нижчі за \ 040 або \ 177 DEL), пробілу, тильди ~, символу введення ^або двокрапки :.

  5. Вони не можуть ніде мати знак запитання ?, зірочку *або відкриту дужку [. Див. --refspec-patternВаріант нижче для винятку з цього правила.

  6. Вони не можуть починатися чи закінчуватися косою рисою /або містити кілька послідовних скісних рисок ( --normalizeвиняток із цього правила див. Нижче)

  7. Вони не можуть закінчуватися крапкою ..

  8. Вони не можуть містити послідовність @{.

  9. Вони не можуть бути єдиним персонажем @.

  10. Вони не можуть містити a \.

Як бачите, у вашому випадку ви порушили правило (5).

Ви можете використовувати --normalizeпрапор для нормалізації тегів щодо косих рисок (видалення провідних скісних рисок, а також послідовних):

git check-ref-format --normalize "tags/weird//tag"

У tags/вигляді частини , які ви перевірка достовірність tag.

Після обговорення з @NikosAlexandrisris, ви можете написати наступний лайнер, щоб перевірити тег <some-tag>із текстовими відгуками:

git check-ref-format "tags/<some-tag>" && echo "Valid tag" || echo "Invalid tag"

чому git вводить ці обмеження щодо імен тегів
user3245268

3
@ user3245268: тому що, наприклад, ви можете посилатися на remote/branch, або HEAD^1(щоб отримати один, але останній коміт голови) тощо. Зрештою, тег - це просто "спеціальне ім'я" для коміту. Отже, щоб зробити посилання однозначним між тегом, віддаленою гілкою, відносним шляхом тощо, імена обмежені. Наприклад, у Windows ви не можете називати файл .., оскільки тоді шлях ../fooматиме серйозні проблеми. Unix зазвичай вирішує це за допомогою екранування, але тут "простір тегів", "простір гілок", "відносний простір комітів" "об'єднано".
Віллем Ван Онсем,

Правило 2 помилкове. Наприклад v1.4, дійсний тег, прийнятий версією 2.21.0. Див. Основи Git - позначення .
Артур,

@Arthur: ні, оскільки, як ви можете прочитати у власній документації, якщо ви робите це так, ви визначаєте тег з іменем refs/tags/v1.4, зверніть увагу, що git додає його до refs/tags/.
Віллем Ван Онсем,

@WillemVanOnsem Для простоти більшості людей не потрібно дотримуватися правила 2, якщо вони просто вводять тег у GitHub або штовхають тег за допомогою git. Тож я повинен погодитися з Артуром з точки зору "неспеціалістів".
Гаррісон Сміт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.