Что означает: / (двоеточие, косая черта) в версии 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 'соответствует буквальному'!- характер, за которым следует "фу".
  • любая другая последовательность, начинающаяся с символа ':/! ' пока зарезервировано.