Что означает: / (двоеточие, косая черта) в версии 2.0 синтаксиса git add --update?
я обновил Git пару месяцев назад, и с тех пор я получаю следующее уведомление об осуждении при попытке git add --update
:
предупреждение: поведение "git add --update (или-u)" без пути аргумент из подкаталога дерева изменится в Git 2.0 и не следует использовать больше. Чтобы добавить содержимое для всего дерева, выполните:
git add --update : /(или git add-u:/)
чтобы ограничить команду текущим каталог, выполните:
git add --update . (или git add-u .)
С текущей версией Git команда ограничена текущей версией справочник.
само предупреждение имеет смысл, и это спасло меня от некоторого сброса. Я привык печатать .
или :/
, но все же нахожу последнее довольно странным, потому что оно отличается от любого другого синтаксиса командной строки, с которым я столкнулся. The .
довольно токен: это просто означает "текущий каталог", как в find .
, а :/
... никогда не видел этого, кроме как в этом контексте. Что это значит?
Я продолжаю думать об этом как о смайлике, и, конечно, это не так?
4 ответов
на самом деле это расширение существующего синтаксиса: такое имя было действительным gitrevisions синтаксис в течение длительного времени.
имя с двоеточием и префиксом вообще1 относится к путям в индексе (промежуточной области), так же, как имя ревизии, за которым следует двоеточие и путь, относится к путям в данной ревизии: master~3:foo
версия файла foo
в филиал master
три изменения назад. Так что :foo
версия foo поставлена для в следующий коммит.
обратите внимание, однако, что двоеточие, за которым следует косая черта, обычно используется для поиска коммитов по их сообщениям журнала фиксации, как в :/fix
пример в gitrevisions.
эти имена путей обычно коренятся в верхней части дерева (а не там, где вы находитесь в своем рабочем дереве). Например, если в вашем репозитории есть только два файла, но они называются README
и dir/sub.txt
и в dir
, ты еще напиши master~3:dir/sub.txt
и master~3:README
. Вы можете получить git, чтобы посмотреть в dir/
автоматически, заставляя относительный путь:git show master~3:./sub.txt
и git show master~3:../README
. С :/fix
значение для поиска сообщений фиксации, ведущая косая черта не может использоваться здесь для обозначения вершины дерева, но поскольку имена путей всегда начинаются с вершины, это не нужно.
в случае git add
, однако, вы не можете на самом деле ссылаться на то, что сейчас поставлено-вы пытаетесь добавить материал, чтобы поставить его, зачем бы то, что поставлено теперь дело?-так :path
означает добавление файла в текущее дерево. По какой-то дурацкой причине,2 в отличие от остальных команд Git, git add
работает на основе вашего текущего рабочего каталога даже с синтаксисом двоеточия, поэтому, если вы находитесь в dir/
и писать git add :sub.txt
добавляет ./sub.txt
. Ты не можешь!--20--> отсюда. Но ты! .. --37-->можете (с Git 1.8 по крайней мере-я не уверен, как долго это было на месте) git add :/README
, где символ " / " означает "побег текущего подкаталог и вместо этого перейдите в верхнюю часть дерева репозитория".
если вы отбросите остальную часть пути, вы получите :/
- который действительно выглядит как смайлик! Но это относится к каталогу в верхней части репозитория. Но только для git add
; для других команд git это означает строку поиска сообщения фиксации.
1что означает "не всегда". Исключения Git из его многих правил обычно разумны, но затрудняют объясняющий. :-)
2что означает "Я не знаю, почему". Конечно, это имеет смысл для non-двоеточие-префиксные пути, но для двоеточия-префиксные, почему? (Вероятно, это было проще реализовать, учитывая кучу существующего кода.)
на :/
не только новый синтаксис, у вас также есть
:!
:(exclude)
создание "git log" игнорировать изменения для определенных путей
так :
означает, что pathspec немедленно следует. Тогда у вас есть /
, также известный как
корневого каталога, или, возможно, в этом случае представляющий корень репозитория.
на первый ответ не совсем правильный. В контексте git-add
, the :/
не может быть пересмотра. Это pathspec. См.мой ответ: на вопрос "что такое "ГИТ" добавить " - а :/" делать?".
pathspec определена в gitglossary(7).
на :/
нотация развивается в git 2.8 (март 2016) с "': :/!-foo
посмотреть совершить 0769854 (31 янв 2016), и совершить 06b6b68 (10 янв 2016) by Уилл Палмер (wpalmer
).
(слитый Junio C Hamano -- gitster
-- на совершить fb79532, 10 февраля 2016)
чтобы назвать фиксацию, теперь вы можете использовать
:/!-<negative pattern>
регулярное выражение стиль, и, следовательно, скажите
$ git rev-parse HEAD^{/!-foo}
и он вернет хэш первого коммита, доступного из HEAD, чье сообщение не содержит "
foo
".
Это противоположность существующего<rev>^{/<pattern>}
синтаксис.конкретный вариант использования, который предназначен для выполнения операции, исключая самые последние коммиты, содержащие определенный маркер.
Например, если вы склонны делать коммиты "работа в процессе", с сообщения, начинающиеся с "WIP
", вы работаете, тогда было бы полезно различать " самый последний коммит, который не былWIP
commit".
Такого рода вещи теперь возможны, с помощью таких команд, как:
$ git diff @^{/!-^WIP}
лидер '
/!-
', а не просто '/!
', чтобы обозначить отрицательное совпадение, выбирается так, чтобы оставить место для дополнительных модификаторов в будущем.
на new git/revisions
doc государства:
чтобы сопоставить сообщения, начинающиеся со строки, можно использовать, например,'
:/^foo
'.
Специальная последовательность ':/!
' зарезервировано для модификаторов для того, что соответствует:
- '
:/!-foo
' выполняет отрицательный матч,- while'
:/!!foo
'соответствует буквальному'!- характер, за которым следует "фу".- любая другая последовательность, начинающаяся с символа '
:/!
' пока зарезервировано.