Подтвердить что ты не робот

В Git, что означает "-" (тире)?

При чтении справочных страниц для команд Git вы часто увидите необязательный -- (тире). По моему опыту, -- не требуется и не имеет значения. Когда вам это нужно? Что это значит вообще, учитывая, что оно появляется во множестве команд?

4b9b3361

Ответ 1

Двойная черта -- в git означает разные вещи для разных команд, но в целом она отделяет параметры от параметров.

В частности, в git значение -- зависит от того, с какой подкомандой вы его используете. Обычно он отделяет аргументы подкоманд (например, имя ветки в git checkout) от ревизий или имен файлов. Иногда это совершенно необязательно и используется только для предотвращения интерпретации необычного имени файла как параметров программы.

Например,

  • git checkout. Чтобы использовать "commit" (в руководстве это называется "tree-ish", поскольку вы можете указать диапазон типов объектов), вы используете

    git checkout <commit>

    Чтобы уточнить оформление заказа до одного или двух файлов, используйте --, чтобы отделить параметры "tree-ish" от "имен файлов", которые вы хотите проверить.

  • git commit. Чтобы зафиксировать все, что находится в "индексе" (т.е. то, что вы создали с помощью git add, просто введите команду git commit.

    git commit [-m сообщение]

    Чтобы игнорировать все, что вы добавили через git add и зафиксировать изменения в определенном файле, используйте git commit -- <filename>

  • git add. Чтобы зафиксировать файл, имя которого начинается с - или --, вы должны указать git add прекратить чтение параметров и начать чтение имен файлов; -- делает это.

    git add -- -sample.txt

  • git log. Чтобы увидеть историю коммитов, ограниченную только коммитами, влияющими на использование файла

    git log -- filename

Вам нужно проверить страницы man для любой команды git, которую вы используете, если вам нужно понять ее конкретное значение.

Ответ 2

  Этот вопрос требует концептуального понимания двойной черты во всех командах git.

Двойная черта, которая сигнализирует об окончании опций, была признана "недостаточной" для Git.

В Git 2.24 (Q3 2019) синтаксический анализатор командной строки получил нотацию "--end-of-options":

Стандартное соглашение для сценариев: сначала указывать жестко закодированный набор параметров в командной строке и заставлять команду обрабатывать ввод данных конечного пользователя как неопцию. следует использовать "--" в качестве разделителя, но это не будет работать для команд, которые используют "--" в качестве разделителя между revs и pathspec.

См. коммит 67feca3, коммит 51b4594, коммит 19e8789 (06 августа 2019 г.) от Джеффа Кинга (peff).
.

(Merged by Junio C Hamano -- [TG44] -- in commit 4a12f89, 09 Sep 2019)

revision: разрешить --end-of-options завершить анализ параметров
В настоящее время нет надежного способа сообщить Git, что определенная опция должна быть ревизией, а не опцией.

Так что если у вас есть ветка "refs/heads/--foo", вы не можете просто сказать:

git rev-list --foo

Вы можете сказать:

git rev-list refs/heads/--foo

Но это не работает, если вы не знаете имя ссылки, в частности, если вы сценарий, передающий значение из другого места.

В большинстве программ вы можете использовать "--", чтобы завершить анализ параметров, например:

some-prog -- "$revision"

Но это не работает для анализатора ревизий, потому что "--" там уже имеет значение: он отделяет ревизии от спецификаций пути.

Поэтому нам нужен какой-то другой маркер, чтобы отделить опции от ревизий.

Этот патч представляет "--end-of-options", который служит для этой цели:

git rev-list --oneline --end-of-options "$revision"

будет работать независимо от того, что в "$ revision" (ну, если вы скажете "--", он может потерпеть неудачу, но не будет делать что-то опасное, например, вызвать неожиданный параметр). Имя многословно, но это, вероятно, хорошая вещь; это предназначено для использования в сценариях, где удобочитаемость важнее краткости.

В качестве альтернативы можно ввести явную опцию для пометки ревизии, например:

git rev-list --oneline --revision="$revision"

Это немного более информативно, чем этот коммит (потому что он делает даже что-то глупое вроде "-" однозначным). Но шаблон использования разделителя, такого как "--", хорошо известен в git и других командах, и это делает некоторые задачи сценариев проще, например:

git rev-list --end-of-options "[email protected]"

параметры разбора: разрешить --end-of-options в качестве синонима "-"

Парсер варианта ревизии недавно узнал о --end-of-options, но этого недостаточно для всех абонентов.
Некоторые из них, например git-log, выбирают некоторые параметры с помощью parse_options(), а затем подают остаток в setup_revisions().
В этих случаях нам нужно остановить parse_options() от поиска дополнительных опций, когда он видит --end-of-options, и сохранить эту опцию в argv, чтобы setup_revisions() мог ее видеть.

Давайте разберемся с этим так же, как мы делаем "--". Мы можем даже прилепиться к обработка PARSE_OPT_KEEP_DASHDASH, потому что любой абонент, который хочет сохранить один захочет сохранить другой.

Пример:

git update-ref refs/heads/--source HEAD &&\
git log --end-of-options --source