Обратите внимание, что вам это не понадобится, так как Git 2.5 (2 квартал 2015 г.) стоит ' --
', если ваш аргумент включает подстановочный знак ( *
)
Эвристика, помогающая git <cmd> <revs> <pathspec>
соглашению " " в командной строке отлавливать неправильно набранные пути, состоит в том, чтобы убедиться, что все не-rev параметры в более поздней части командной строки являются именами файлов в рабочем дереве, но это означает, что " git grep $str -- \*.c
" всегда должно быть с неоднозначностью " --
", потому что никто в здравом уме не создаст файл, имя которого буквально - звездочка-точка-см.
Git 2.5 теряет эвристику, чтобы объявить, что с помощью подстановочной строки пользователь, вероятно, намеревался дать нам указание пути .
git checkout 'a*'
# same as
git checkout -- 'a*'
Смотрите коммит 28fcc0b (02 мая 2015 г.) от Duy Nguyen ( nguyenlocduy
) .
(Слито Junio C Hamano - gitster
- в фиксации 949d167 , 19 мая 2015 года)
pathspec
: избегайте необходимости " --
" при использовании подстановочного знака
Когда --
в командной строке отсутствует "" и команда может принимать как обороты, так и пути, идея состоит в том, что если аргумент можно рассматривать как расширенный SHA-1 и путь, тогда --
требуется "" или git отказывается продолжать.
В настоящее время это реализовано как:
- (1) если аргумент является rev, то он не должен существовать в рабочем дереве
- (2) иначе, он должен существовать в рабочем дереве
- (3) иначе "
--
" требуется.
Эти правила работают для литеральных путей, но когда задействована не буквальная спецификация пути, почти всегда требуется, чтобы пользователь добавил « --
», потому что он терпит неудачу (2) и (1) действительно редко встречаются ( *.c
например, «взять» ), (1) встречается, если есть ссылка с именем " *.c
").
Этот патч немного изменяет правила, рассматривая любой допустимый *
шаблон пути valid ( ) «существует в рабочем дереве».
Правила становятся:
- (1) если arg является rev, то он должен либо существовать в рабочем дереве, либо не быть допустимым подстановочным символом.
- (2) в противном случае он либо существует в рабочем дереве, либо является шаблоном пути
- (3) иначе "
--
" требуется.
С новыми правилами " --
" не требуется большую часть времени, когда задействован подстановочный путь.
В Git 2.26 (Q1 2020) логика устранения неоднозначности для разделения ревизий и спецификаций пути была изменена таким образом, чтобы специальные символы глобуса с обратной косой чертой не учитывались в правиле «подстановочные знаки являются спецификацией пути».
См. Коммит 39e21c6 (25 января 2020 г.) Джеффа Кинга ( peff
) .
(Слиты Junio C Hamano - gitster
- в фиксации 341f8a6 , 12 Feb 2020)
verify_filename()
: обрабатывать обратную косую черту в правиле "подстановочные знаки являются путями"
Автор сообщения: Дэвид Берстрем
Подписано: Джефф Кинг
Фиксировать 28fcc0b71a ( pathspec
: избегать необходимости " --
" при использовании подстановочного знака, 2015-05-02) разрешено:
git rev-parse '*.c'
без двойной черты.
Но правило, которое оно использует для проверки подстановочных знаков, на самом деле ищет какой-то специальный глобус.
Это слишком либерально, поскольку это означает, что шаблон, который на самом деле не выполняет подстановочных знаков, например " a\b
", будет считаться спецификацией пути.
Если у вас есть такой файл на диске, это, вероятно, то, что вы хотели.
Но если вы этого не сделаете, результаты сбивают с толку: вместо того, чтобы сказать « there's no such path a\b
», мы спокойно примем это как спецификацию пути, которая, скорее всего, не соответствует ничему (или, по крайней мере, не соответствует тому, что вы намеревались).
Аналогично, поиск пути " a\*b
" вообще не расширяет поиск; он найдет только одну запись " a*b
".
Эта фиксация переключает правило на срабатывание только тогда, когда метасимволы glob расширяют поиск, что означает, что оба этих случая теперь сообщат об ошибке (вы --
, конечно, можете устранить неоднозначность, используя « »; мы просто ужесточаем эвристику DWIM).
( DWIM: делай, что я имею в виду )
Обратите внимание, что мы не тестировали оригинальную функцию в 28fcc0b71a .
Так что этот патч не только проверяет эти угловые случаи, но также добавляет регрессионный тест для существующего поведения.