При чтении справочных страниц для команд 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.txtgit 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