Ответ 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
).
.
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