При чтении справочных страниц для команд Git вы часто увидите необязательный --
(тире). По моему опыту, --
не требуется и не имеет значения. Когда вам это нужно? Что это значит вообще, учитывая, что оно появляется во множестве команд?
В Git, что означает "-" (тире)?
Ответ 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