git-fetch
Название
git-fetch — загрузка объектов и ссылок из другого репозитория
Краткое описание
git fetch [<options>] [<repository> [<refspec>…]] git fetch [<options>] <group> git fetch --multiple [<options>] [(<repository>|<group>)…] git fetch --all [<options>]
Описание
Получает ветви и/или теги (в совокупности — «ссылки») из одного или нескольких других репозиториев вместе с объектами, необходимыми для полной истории изменений. Обновляются удалённые отслеживаемые ветви (см. описание <refspec> ниже, где описаны способы управления этим поведением).
По умолчанию также загружается любой тег, указывающий на историю изменений, которая загружается; в результате загружаются теги, указывающие на интересующие вас ветви. Это поведение по умолчанию можно изменить с помощью параметров --tags или --no-tags либо настроив remote.<name>.tagOpt. Используя спецификацию ссылки, которая явно загружает теги, можно также загрузить теги, не указывающие на интересующие вас ветви.
git fetch может получать данные как из одного именованного репозитория или по одному URL, так и одновременно из нескольких репозиториев, если задано <group> и в файле конфигурации имеется запись remotes.<group>. (См. git-config[1]).
Если удалённый репозиторий не указан, по умолчанию используется удалённый репозиторий origin, если только для текущей ветви не настроена вышестоящая ветвь.
Имена загружаемых ссылок вместе с именами объектов, на которые они указывают, записываются в .git/FETCH_HEAD. Эти сведения могут использоваться сценариями или другими командами git, например git-pull[1].
Параметры
-
--all -
--no-all -
Получить данные со всех удалённых репозиториев, кроме тех, для которых задана переменная конфигурации
remote.<name>.skipFetchAll. Переопределяет переменную конфигурацииfetch.all. -
-a -
--append -
Добавить имена ссылок и имена объектов полученных ссылок к существующему содержимому
.git/FETCH_HEAD. Без этого параметра старые данные в.git/FETCH_HEADбудут перезаписаны. -
--atomic -
Использовать атомарную транзакцию для обновления локальных ссылок. Либо обновляются все ссылки, либо при ошибке не обновляется ни одна.
-
--depth=<depth> -
Ограничить получение указанным числом коммитов от вершины истории каждой удалённой ветки. При получении в репозиторий
shallow, созданный командойgitcloneс параметром--depth=<depth> (см. git-clone[1]), углубить или сократить историю до указанного числа коммитов. Теги для углублённых коммитов не загружаются. -
--deepen=<depth> -
Аналогично
--depth, за исключением того, что задаётся число коммитов от текущей границы неглубокой истории, а не от вершины истории каждой удалённой ветки. -
--shallow-since=<date> -
Углубить или сократить историю неглубокого репозитория, включив все достижимые коммиты после
<date>. -
--shallow-exclude=<ref> -
Углубить или сократить историю неглубокого репозитория, исключив коммиты, достижимые из указанной удалённой ветки или тега. Этот параметр можно указать несколько раз.
-
--unshallow -
Если исходный репозиторий полный, преобразовать неглубокий репозиторий в полный, сняв все ограничения, налагаемые неглубокими репозиториями.
Если исходный репозиторий неглубокий, получить максимально возможное количество данных, чтобы история текущего репозитория совпадала с историей исходного репозитория.
-
--update-shallow -
По умолчанию при получении данных из неглубокого репозитория
gitfetchотклоняет ссылки, для обновления которых требуется изменить.git/shallow. Этот параметр обновляет.git/shallowи принимает такие ссылки. -
--negotiation-restrict=(<commit>|<glob>) -
--negotiation-tip=(<commit>|<glob>) -
По умолчанию Git сообщает серверу о коммитах, достижимых из всех локальных ссылок, чтобы найти общие коммиты и попытаться уменьшить размер получаемого pack-файла. Если этот параметр указан, Git сообщает только о коммитах, достижимых из заданных вершин. Это позволяет ускорить получение данных, если пользователь знает, какая локальная ссылка, вероятнее всего, содержит коммиты, общие с получаемой вышестоящей ссылкой.
--negotiation-restrict— предпочтительное имя этого параметра;--negotiation-tipпринимается как синоним.Этот параметр можно указать несколько раз; в этом случае Git сообщит о коммитах, достижимых из любого из заданных коммитов.
Аргументом этого параметра может быть шаблон glob для имён ссылок, ссылка или (возможно, сокращённый) SHA-1 коммита. Указание шаблона glob эквивалентно многократному указанию этого параметра — по одному разу для каждого подходящего имени ссылки.
См. также переменные конфигурации
fetch.negotiationAlgorithmиpush.negotiate, описанные в git-config[1], а также параметр--negotiate-onlyниже. -
--negotiation-include=(<commit>|<glob>) -
Гарантировать, что коммиты в заданных вершинах всегда передаются в виде строк «have» во время согласования при получении данных, независимо от выбранного алгоритмом согласования. Это полезно, чтобы гарантировать учёт общей истории, достижимой из определённых ссылок, даже если
--negotiation-restrictограничивает набор вершин или алгоритм согласования иначе пропустил бы их.Этот параметр можно указать несколько раз; в этом случае каждый коммит передаётся безусловно.
Аргументом может быть точное имя ссылки (например,
refs/heads/release), хеш объекта или шаблон glob (например,refs/heads/release/{asterisk}). Синтаксис шаблонов совпадает с синтаксисом для--negotiation-restrict.Если используется
--negotiation-restrict, набор have сначала ограничивается этим параметром, а затем расширяется за счёт вершин, указанных с помощью--negotiation-include.Если этот параметр не указан в командной строке, вместо него используются значения конфигурации
remote.<name>.negotiationIncludeдля текущего удалённого репозитория. -
--negotiate-only -
Не получать с сервера никаких данных, а вместо этого вывести предков заданных аргументов
--negotiation-restrict=, общих с сервером.Несовместим с
--recurse-submodules=(yes|on-demand). Внутри Git этот параметр используется для реализации параметраpush.negotiate; см. git-config[1]. -
--dry-run -
Показать, что было бы сделано, не внося никаких изменений.
-
--porcelain -
Выводить результаты в стандартный поток вывода в удобном для обработки скриптами формате. Подробности см. в разделе OUTPUT в git-fetch[1].
Несовместим с
--recurse-submodules=(yes|on-demand) и имеет приоритет над параметром конфигурацииfetch.output. -
--filter=<filter-spec> -
Использовать возможность частичного клонирования и запросить у сервера подмножество достижимых объектов согласно заданному фильтру объектов. При использовании
--filterпредоставленное значение<filter-spec>используется для частичного получения данных.Если используется
--filter=auto, спецификация фильтра определяется автоматически путём объединения спецификаций фильтров, объявленных сервером для принимаемых клиентом удалённых promisor-репозиториев (см. gitprotocol-v2[5] и параметр конфигурацииpromisor.acceptFromServerв git-config[1]).Подробное описание всех остальных доступных спецификаций фильтров см. в параметре
--filter=<filter-spec> команды git-rev-list[1].Например,
--filter=blob:noneотфильтрует все blob-объекты (содержимое файлов), пока они не понадобятся Git. Кроме того,--filter=blob:limit=<size> отфильтрует все blob-объекты размером не менее<size>. -
--write-fetch-head -
--no-write-fetch-head -
Записать список полученных удалённых ссылок в файл
FETCH_HEADнепосредственно в каталоге$GIT_DIR. Это поведение по умолчанию. Передача--no-write-fetch-headв командной строке указывает Git не записывать файл. При параметре--dry-runфайл никогда не записывается. -
-f -
--force -
При использовании
gitfetchсо спецификацией ссылки <src>:<dst> команда может отказаться обновлять локальную ветку, как описано ниже в разделе<refspec>. Этот параметр отменяет эту проверку. -
-k -
--keep -
Сохранить загруженный pack-файл.
-
--multiple -
Разрешить указывать несколько аргументов
<repository>и<group>. Аргументы<refspec>указывать нельзя. -
--auto-maintenance -
--no-auto-maintenance -
--auto-gc -
--no-auto-gc -
Выполнить
gitmaintenancerun--autoв конце, чтобы при необходимости выполнить автоматическое обслуживание репозитория. По умолчанию этот параметр включён. -
--write-commit-graph -
--no-write-commit-graph -
Записать граф коммитов после получения данных. Переопределяет настройку конфигурации
fetch.writeCommitGraph. -
--prefetch -
Изменить настроенную спецификацию ссылок так, чтобы все ссылки помещались в пространство имён
refs/prefetch/. См. задачуprefetchв git-maintenance[1]. -
-p -
--prune -
Перед получением данных удалить все ссылки удалённого отслеживания, которых больше нет в удалённом репозитории. Теги не удаляются, если они получены только в результате автоматического следования тегам по умолчанию или из-за параметра
--tags. Однако если теги получены по явной спецификации ссылок (в командной строке или в конфигурации удалённого репозитория, например, если удалённый репозиторий был клонирован с параметром--mirror), они также подлежат удалению. Указание--prune-tags— это сокращённая форма задания спецификации ссылки для тегов.Подробности см. в разделе PRUNING ниже.
-
-P -
--prune-tags -
Перед получением данных удалить все локальные теги, которых больше нет в удалённом репозитории, если включён параметр
--prune. Этот параметр следует использовать с осторожностью: в отличие от--prune, он удалит все созданные локальные ссылки (локальные теги). Этот параметр является сокращённой формой явного указания спецификации ссылки для тегов вместе с--prune; см. обсуждение этого параметра в его документации.Подробности см. в разделе PRUNING ниже.
-
-n -
--no-tags -
По умолчанию теги, указывающие на объекты, загружаемые из удалённого репозитория, также загружаются и сохраняются локально. Этот параметр отключает автоматическое следование тегам. Поведение удалённого репозитория по умолчанию можно задать с помощью настройки
remote.<name>.tagOpt. См. git-config[1]. -
--refetch -
Вместо согласования с сервером, позволяющего избежать передачи уже имеющихся локально коммитов и связанных с ними объектов, этот параметр загружает все объекты, как при свежем клонировании. Используйте его, чтобы повторно применить фильтр частичного клонирования из конфигурации или заданный с помощью
--filter=, если определение фильтра изменилось. Автоматическое обслуживание после получения данных выполнит консолидацию pack-файлов базы объектов, чтобы удалить дубликаты объектов. -
--refmap=<refspec> -
При получении ссылок, перечисленных в командной строке, использовать указанную спецификацию ссылок (её можно задать несколько раз) для сопоставления ссылок с ветками удалённого отслеживания вместо значений переменных конфигурации
remote.<name>.fetchдля удалённого репозитория. Передача пустого значения<refspec>параметру--refmapзаставляет Git игнорировать настроенные спецификации ссылок и полностью полагаться на спецификации, переданные аргументами командной строки. Подробности см. в разделе «Настроенные ветки удалённого отслеживания». -
-t -
--tags -
Получить все теги из удалённого репозитория (то есть получить удалённые теги
refs/tags/*в локальные теги с теми же именами) в дополнение ко всему, что было бы получено в противном случае. Использование этого параметра само по себе не делает теги подлежащими удалению, даже если указан--prune(хотя теги всё равно могут быть удалены, если они также являются назначением явной спецификации ссылок; см.--prune). -
--recurse-submodules[=(yes|on-demand|no)] -
Управлять тем, следует ли получать новые коммиты подмодулей и при каких условиях. При рекурсивном обходе подмодулей
gitfetchвсегда пытается получить «изменённые» подмодули, то есть подмодули, содержащие коммиты, на которые ссылается вновь полученный коммит суперпроекта, но которых нет в локальном клоне подмодуля. Изменённый подмодуль можно получить, если он присутствует локально, например, в$GIT_DIR/modules/(см. gitsubmodules[7]); если вышестоящий репозиторий добавляет новый подмодуль, его нельзя получить, пока он не будет клонирован, например, с помощьюgitsubmoduleupdate.При значении
on-demandполучаются только изменённые подмодули. При значенииyesполучаются все заполненные подмодули, а также незаполненные изменённые подмодули. При значенииnoподмодули никогда не загружаются.Если параметр не указан, используется значение
fetch.recurseSubmodules, если оно задано (см. git-config[1]); если нет, используется значениеon-demand. Если этот параметр указан без значения, по умолчанию используетсяyes. -
-j<n> -
--jobs=<n> -
Выполнять все виды получения данных параллельно, запуская не более
<n>задач одновременно.Значение 0 означает использование подходящего значения по умолчанию.
Если указан параметр
--multiple, разные удалённые репозитории будут опрашиваться параллельно. Если загружается несколько подмодулей, они также будут загружаться параллельно. Чтобы управлять ими независимо, используйте настройки конфигурацииfetch.parallelиsubmodule.fetchJobs(см. git-config[1]).Как правило, рекурсивное получение данных и получение из нескольких удалённых репозиториев выполняются быстрее при параллельной обработке. По умолчанию получение данных выполняется последовательно, а не параллельно.
-
--no-recurse-submodules -
Отключить рекурсивное получение данных подмодулей (это равносильно использованию параметра
--recurse-submodules=no). -
--set-upstream -
Если получение данных из удалённого репозитория прошло успешно, добавить вышестоящую (отслеживаемую) ссылку, используемую командами git-pull[1] без аргументов и другими командами. Дополнительные сведения см. в описании
branch.<name>.mergeиbranch.<name>.remoteв git-config[1]. -
--submodule-prefix=<path> -
Добавить
<path>в начало путей, выводимых в информационных сообщениях, например «Получение данных подмодуля foo». Этот параметр используется внутри Git при рекурсивном обходе подмодулей. -
--recurse-submodules-default=(yes|on-demand) -
Этот параметр используется внутри Git для временного задания неотрицательного значения по умолчанию для параметра
--recurse-submodules. Все остальные способы настройки рекурсивного получения данных подмодулей (например, настройки в gitmodules[5] и git-config[1]) имеют приоритет над этим параметром, как и прямое указание--[no-]recurse-submodules. -
-u -
--update-head-ok -
По умолчанию
gitfetchотказывается обновлять ссылку HEAD, соответствующую текущей ветке. Этот флаг отключает проверку. Он предназначен исключительно для внутреннего использования, чтобыgitpullмогла взаимодействовать сgitfetch; если вы не реализуете собственный Porcelain, использовать его не следует. -
--upload-pack<upload-pack> -
Если этот параметр задан и обработкой репозитория, из которого получают данные, занимается
gitfetch-pack, значение--exec=<upload-pack> передаётся команде, чтобы указать нестандартный путь к команде, запускаемой на другой стороне. -
-q -
--quiet -
Передать
--quietкомандеgit-fetch-packи отключить вывод всех остальных внутренних команд git. Сведения о ходе выполнения не выводятся в стандартный поток ошибок. -
-v -
--verbose -
Включить подробный вывод.
-
--progress -
По умолчанию сведения о ходе выполнения выводятся в стандартный поток ошибок, если он подключён к терминалу, если только не указан параметр
-q. Этот флаг принудительно включает вывод сведений о ходе выполнения, даже если стандартный поток ошибок не направлен в терминал. -
-o<option> -
--server-option=<option> -
Передать указанную строку серверу при взаимодействии с использованием версии 2 протокола. Указанная строка не должна содержать символ
NULилиLF. Обработка сервером параметров, в том числе неизвестных, зависит от конкретного сервера. Если указано несколько параметров--server-option=<option>, все они передаются другой стороне в порядке, заданном в командной строке. Если в командной строке не указан ни один параметр--server-option=<option>, вместо них используются значения переменной конфигурацииremote.<name>.serverOption. -
--show-forced-updates -
По умолчанию Git проверяет, была ли ветка принудительно обновлена при получении данных. Эту проверку можно отключить с помощью
fetch.showForcedUpdates, но параметр--show-forced-updatesгарантирует её выполнение. См. git-config[1]. -
--no-show-forced-updates -
По умолчанию Git проверяет, была ли ветка принудительно обновлена при получении данных. Чтобы пропустить эту проверку ради повышения производительности, передайте
--no-show-forced-updatesили задайте дляfetch.showForcedUpdatesзначение false. При использовании во времяgit-pullпараметр--ff-onlyвсё равно проверит наличие принудительных обновлений перед попыткой выполнить перемотку вперёд. См. git-config[1]. -
-4 -
--ipv4 -
Использовать только адреса IPv4, игнорируя адреса IPv6.
-
-6 -
--ipv6 -
Использовать только адреса IPv6, игнорируя адреса IPv4.
- <repository>
-
«Удалённый» репозиторий, являющийся источником операции получения данных или извлечения изменений. Этот параметр может быть URL-адресом (см. раздел АДРЕСА GIT ниже) или именем удалённого репозитория (см. раздел УДАЛЁННЫЕ РЕПОЗИТОРИИ ниже).
- <group>
-
Имя, указывающее на список репозиториев, заданный значением
remotes.<group> в файле конфигурации. (См. git-config[1].)
- <refspec>
-
Указывает, какие ссылки получать и какие локальные ссылки обновлять. Если в командной строке не указано ни одного
<refspec>, ссылки для получения считываются вместо этого из переменныхremote.<repository>.fetch(см. раздел НАСТРОЕННЫЕ ВЕТКИ ОТСЛЕЖИВАНИЯ УДАЛЕННЫХ РЕПОЗИТОРИЕВ ниже).Формат параметра
<refspec>— необязательный знак плюс+, за которым следует исходная<src>, двоеточие:, а затем целевая<dst>. Двоеточие можно опустить, если<dst>— пустое. Обычно<src>— это ссылка или шаблон glob с одним символом*, который используется для сопоставления набора ссылок, но это также может быть полностью записанное шестнадцатеричное имя объекта.<refspec>может содержать*в своей<src>для указания простого сопоставления с шаблоном. Такая спецификация ссылки работает как шаблон glob, соответствующий любой ссылке с этим шаблоном. Шаблон<refspec>должен содержать ровно один символ*как в<src>, так и в<dst>. Ссылки будут сопоставлены с назначением путём замены*содержимым, соответствующим источнику.Если перед спецификацией ссылки стоит
^, она интерпретируется как отрицательная спецификация ссылки. Вместо указания ссылок для получения или локальных ссылок для обновления такая спецификация указывает ссылки, которые следует исключить. Ссылка считается соответствующей, если она соответствует хотя бы одной положительной спецификации ссылки и не соответствует ни одной отрицательной. Отрицательные спецификации ссылок могут быть полезны для ограничения области действия шаблона, чтобы в неё не попадали определённые ссылки. Отрицательные спецификации ссылок сами могут быть шаблонами. Однако они могут содержать только<src>и не указывают<dst>. Полностью записанные шестнадцатеричные имена объектов также не поддерживаются.tag<tag> означает то же, что иrefs/tags/<tag>:refs/tags/<tag>; эта команда запрашивает получение всех объектов вплоть до указанной метки.Удалённая ссылка, соответствующая
<src>, будет получена; если<dst>не является пустой строкой, будет предпринята попытка обновить соответствующую ей локальную ссылку.Возможность выполнить это обновление без
--forceзависит от пространства имён ссылок, в которое выполняется получение, типа получаемого объекта и того, считается ли обновление перемоткой вперёд. В целом для получения действуют те же правила, что и для отправки; см. раздел <refspec>... в git-push[1], где они описаны. Ниже перечислены исключения из этих правил, относящиеся именно кgitfetch.До версии Git 2.20, в отличие от отправки с помощью git-push[1], любые обновления
refs/tags/*принимались без+в спецификации ссылки (или--force). При получении все обновления меток с удалённого репозитория без разбора считались принудительными. Начиная с Git версии 2.20 получение для обновленияrefs/tags/*работает так же, как отправка. То есть любые обновления будут отклонены без+в спецификации ссылки (или--force).В отличие от отправки с помощью git-push[1], любые обновления за пределами
refs/{tags,heads}/*принимаются без+в спецификации ссылки (или--force), будь то замена, например, объекта дерева на объект blob или одного коммита другим коммитом, у которого предыдущий коммит не является предком, и т. д.В отличие от отправки с помощью git-push[1], не существует настройки, которая изменяла бы эти правила, и нет аналога хука
pre-fetch, подобного хукуpre-receive.Как и при отправке с помощью git-push[1], все описанные выше правила о недопустимых обновлениях можно переопределить, добавив необязательный начальный символ
+к спецификации ссылки (или используя параметр командной строки--force). Единственное исключение: никакая принудительная операция не заставит пространство имёнrefs/heads/*принять объект, не являющийся коммитом.ПримечаниеЕсли известно, что удалённая ветка, которую нужно получить, регулярно перематывается и перебазируется, предполагается, что её новая вершина не будет потомком предыдущей вершины (сохранённой в вашей ветке отслеживания удалённого репозитория при последнем получении). Для таких веток следует использовать знак +, указывающий на необходимость обновлений без перемотки вперёд. Невозможно определить или объявить, что ветка будет доступна в репозитории с таким поведением; пользователь, выполняющий получение, должен сам знать, что именно так предполагается использовать эту ветку. -
--stdin -
Считывать спецификации ссылок, по одной на строку, из стандартного ввода в дополнение к указанным в аргументах. Формат «tag
<name>» не поддерживается.
URL-адреса Git
Как правило, URL-адреса содержат сведения о транспортном протоколе, адресе удалённого сервера и пути к репозиторию. В зависимости от транспортного протокола некоторые из этих сведений могут отсутствовать.
Git поддерживает протоколы ssh, git, http и https (кроме того, для получения можно использовать ftp и ftps, но это неэффективно и считается устаревшим; не используйте их).
Встроенный транспорт (то есть URL git://) не выполняет аутентификацию, поэтому его следует с осторожностью использовать в незащищённых сетях.
Можно использовать следующие синтаксические формы:
-
ssh://[<user>@]<host>[:<port>]/<path-to-git-repo> -
git://<host>[:<port>]/<path-to-git-repo> -
http[s]://<host>[:<port>]/<path-to-git-repo> -
ftp[s]://<host>[:<port>]/<path-to-git-repo>
С протоколом ssh также можно использовать альтернативный синтаксис в стиле scp:
-
[<user>
@]<host>:/<path-to-git-repo>
Этот синтаксис распознаётся, только если перед первым двоеточием нет косых черт. Это позволяет отличить локальный путь, содержащий двоеточие. Например, локальный путь foo:bar можно указать как абсолютный путь или как ./foo:bar, чтобы избежать ошибочной интерпретации в качестве URL ssh.
Протоколы ssh и git также поддерживают подстановку ~<username>:
-
ssh://[<user>@]<host>[:<port>]/~<user>/<path-to-git-repo> -
git://<host>[:<port>]/~<user>/<path-to-git-repo> -
[<user>
@]<host>:~<user>/<path-to-git-repo>
Для локальных репозиториев, которые Git также поддерживает нативно, можно использовать следующие синтаксические формы:
-
/path/to/repo.git/ -
file:///path/to/repo.git/
Эти две формы в основном эквивалентны, за исключением клонирования: первая подразумевает параметр --local. Подробнее см. git-clone[1].
git clone, git fetch и git pull, но не git push, также принимают подходящий файл bundle. См. git-bundle[1].
Если Git не знает, как обрабатывать определённый транспортный протокол, он пытается использовать удалённый вспомогательный инструмент remote-<transport>, если такой существует. Чтобы явно запросить удалённый вспомогательный инструмент, можно использовать следующий синтаксис:
-
<transport>
::<address>
где <address> может быть путём, сервером и путём либо произвольной строкой, похожей на URL, распознаваемой вызываемым удалённым вспомогательным инструментом. Подробнее см. gitremote-helpers[7].
Если имеется большое количество удалённых репозиториев с похожими именами и вы хотите использовать для них другой формат (чтобы используемые вами URL-адреса преобразовывались в рабочие URL-адреса), можно создать раздел конфигурации следующего вида:
[url "<actual-url-base>"]
insteadOf = <other-url-base> Например, с такой конфигурацией:
[url "git://git.host.xz/"]
insteadOf = host.xz:/path/to/
insteadOf = work: URL-адрес вида «work:repo.git» или «host.xz:/path/to/repo.git» в любом контексте, где ожидается URL-адрес, будет преобразован в «git://git.host.xz/repo.git».
Если вы хотите преобразовывать URL-адреса только для отправки, можно создать раздел конфигурации следующего вида:
[url "<actual-url-base>"]
pushInsteadOf = <other-url-base> Например, с такой конфигурацией:
[url "ssh://example.org/"]
pushInsteadOf = git://example.org/ URL-адрес вида «git://example.org/path/to/repo.git» будет преобразован в «ssh://example.org/path/to/repo.git» при отправке, но при получении будет использоваться исходный URL-адрес.
Удалённые репозитории
В качестве аргумента <repository> вместо URL-адреса можно использовать имя одного из следующих объектов:
-
удалённого репозитория в файле конфигурации Git:
$GIT_DIR/config; -
файла в каталоге
$GIT_DIR/remotesили -
файла в каталоге
$GIT_DIR/branches.
Во всех этих случаях спецификацию ссылки можно опустить в командной строке, поскольку каждый из вариантов содержит спецификацию ссылки, которую git будет использовать по умолчанию.
Именованный удалённый репозиторий в файле конфигурации
Можно указать имя удалённого репозитория, который ранее был настроен с помощью git-remote[1], git-config[1] или даже вручную добавлен в файл $GIT_DIR/config. Для доступа к репозиторию будет использоваться URL-адрес этого удалённого репозитория. Если спецификация ссылки не указана в командной строке, по умолчанию будет использоваться спецификация этого удалённого репозитория. Запись в файле конфигурации будет выглядеть так:
[remote "<name>"]
url = <URL>
pushurl = <pushurl>
push = <refspec>
fetch = <refspec> Параметр <pushurl> используется только для отправки. Он необязателен и по умолчанию равен <URL>. При отправке в удалённый репозиторий используются все заданные pushurl или все заданные url, если pushurl не заданы. При получении, однако, если задано несколько url, данные будут получены только с первого из них.
Именованный файл в $GIT_DIR/remotes
Можно указать имя файла в $GIT_DIR/remotes. Для доступа к репозиторию будет использоваться URL-адрес из этого файла. Если спецификация ссылки не указана в командной строке, по умолчанию будет использоваться спецификация из этого файла. Файл должен иметь следующий формат:
URL: one of the above URL formats
Push: <refspec>
Pull: <refspec> Строки Push: используются командой git push, а строки Pull: — командами git pull и git fetch. Для дополнительных сопоставлений веток можно указать несколько строк Push: и Pull:.
Именованный файл в $GIT_DIR/branches
Можно указать имя файла в $GIT_DIR/branches. Для доступа к репозиторию будет использоваться URL-адрес из этого файла. Файл должен иметь следующий формат:
<URL>#<head>
Параметр <URL> обязателен; #<head> необязателен.
В зависимости от операции git использует одну из следующих спецификаций ссылок, если она не указана в командной строке. <branch> — это имя этого файла в $GIT_DIR/branches, а <head> по умолчанию равно master.
git fetch использует:
refs/heads/<head>:refs/heads/<branch>
git push использует:
HEAD:refs/heads/<head>
Вышестоящие ветки
Для веток в Git можно указать вышестоящую ветку удалённого репозитория. По умолчанию Git использует вышестоящую ветку для операций с удалённым репозиторием, например:
-
Она используется по умолчанию командами
gitpullилиgitfetch, запущенными без аргументов. -
Она используется по умолчанию командой
gitpush, запущенной без аргументов, за некоторыми исключениями. Например, с помощью параметраbranch.<name>.pushRemoteможно отправить изменения в удалённый репозиторий, отличный от того, из которого вы получаете изменения; кроме того, по умолчанию при использованииpush.default=simpleнастроенная вышестоящая ветка должна иметь то же имя. -
Различные команды, включая
gitcheckoutиgitstatus, показывают, сколько коммитов было добавлено в текущую ветку и вышестоящую ветку с момента их ответвления; например: «Ваша ветка иorigin/mainразошлись, и в каждой есть по 2 и 3 разных коммита соответственно».
Сведения о вышестоящей ветке хранятся в .git/config, в полях «remote» и «merge». Например, если вышестоящая ветка для main — origin/main:
[branch "main"] remote = origin merge = refs/heads/main
Вышестоящую ветку можно задать явно с помощью git push --set-upstream <remote> <branch>, но часто Git назначает её автоматически, например:
-
При клонировании репозитория Git автоматически назначает вышестоящую ветку для ветки по умолчанию.
-
Если задан параметр конфигурации
push.autoSetupRemote, командаgitpushавтоматически назначает вышестоящую ветку при первой отправке ветки. -
При переключении на ветку отслеживания удалённого репозитория с помощью
gitcheckout<branch> автоматически создаётся локальная ветка с таким же именем, а удалённая ветка назначается её вышестоящей.
| Примечание | Вышестоящие ветки иногда называют «сведениями об отслеживании», например: «задать сведения об отслеживании ветки». |
Настроенные ветки отслеживания удалённых репозиториев
Часто вы взаимодействуете с одним и тем же удалённым репозиторием, регулярно и многократно получая из него изменения. Чтобы отслеживать состояние такого удалённого репозитория, команда git fetch позволяет настроить переменные конфигурации remote.<repository>.fetch.
Обычно такая переменная может выглядеть следующим образом:
[remote "origin"]
fetch = +refs/heads/*:refs/remotes/origin/* Эта настройка используется двумя способами:
-
Когда команда
gitfetchвыполняется без указания в командной строке веток и/или меток для получения, напримерgitfetchoriginилиgitfetch, значенияremote.<repository>.fetchиспользуются в качестве спецификаций ссылок: они определяют, какие ссылки получать и какие локальные ссылки обновлять. Приведённый выше пример получает все ветки, существующие вorigin(то есть все ссылки, соответствующие левой части значения,refs/heads/*), и обновляет соответствующие ветки отслеживания удалённого репозитория в иерархииrefs/remotes/origin/*. -
Когда команда
gitfetchвыполняется с явно указанными в командной строке ветками и/или метками для получения, напримерgitfetchoriginmaster, аргументы<refspec>s, заданные в командной строке, определяют, что следует получить (например,masterв этом примере — сокращённая форма записиmaster:, которая, в свою очередь, означает «получить веткуmaster, но не указывать явно в командной строке, какую ветку отслеживания удалённого репозитория следует обновить»), и приведённая команда получитonlyветкуmaster. Значенияremote.<repository>.fetchопределяют, какая ветка отслеживания удалённого репозитория, если таковая есть, будет обновлена. При таком использовании значенияremote.<repository>.fetchникак не влияют на определение того,whatбудет получено (то есть эти значения не используются в качестве спецификаций ссылок, когда спецификации ссылок перечислены в командной строке); они используются только для определения того,whereбудут сохранены полученные ссылки, выступая в роли сопоставления.
Второе использование значений remote.<repository>.fetch можно переопределить, указав параметр(ы) --refmap=<refspec> в командной строке.
Очистка устаревших ссылок
По умолчанию Git сохраняет данные, пока их явно не удалят; это относится и к локальным ссылкам на ветки удалённых репозиториев, даже если сами эти ветки уже удалены.
Если такие устаревшие ссылки накапливаются, они могут снижать производительность больших и активно используемых репозиториев с частыми изменениями веток. Например, вывод таких команд, как git branch -a --contains <commit>, может стать излишне многословным; кроме того, это влияет на любые другие операции с полным набором известных ссылок.
Эти ссылки отслеживания удалённых репозиториев можно удалить однократно одной из следующих команд:
# While fetching $ git fetch --prune <name> # Only prune, don't fetch $ git remote prune <name>
Чтобы очищать ссылки в рамках обычного рабочего процесса без необходимости помнить о запуске этой команды, задайте глобально fetch.prune или настройте remote.<name>.prune для каждого удалённого репозитория отдельно. См. git-config[1].
Далее начинаются тонкости и детали. Функция очистки работает не непосредственно с ветками: она очищает локальные ссылки ↔ ссылки удалённого репозитория на основе спецификации ссылок удалённого репозитория (см. <refspec> и раздел НАСТРОЕННЫЕ ВЕТКИ ОТСЛЕЖИВАНИЯ УДАЛЁННЫХ РЕПОЗИТОРИЕВ выше).
Поэтому, если спецификация ссылок удалённого репозитория включает, например, refs/tags/*:refs/tags/*, или если вручную запустить, например, git fetch --prune <name> "refs/tags/*:refs/tags/*", будут удалены не устаревшие ветки отслеживания удалённого репозитория, а любые локальные метки, которых нет в удалённом репозитории.
Результат может оказаться неожиданным: вы хотите очистить удалённый <name>, но также явно получаете из него метки; в результате при получении удаляются все ваши локальные метки, большинство из которых, возможно, изначально не были получены из удалённого репозитория <name>.
Поэтому будьте осторожны при использовании спецификации ссылок вида refs/tags/*:refs/tags/* или любой другой спецификации, которая может сопоставлять ссылки из нескольких удалённых репозиториев с одним и тем же локальным пространством имён.
Поскольку поддержание актуальности и веток, и меток в удалённом репозитории — распространённый сценарий использования, параметр --prune-tags можно указать вместе с --prune, чтобы удалять локальные метки, отсутствующие в удалённом репозитории, и принудительно обновлять отличающиеся метки. Очистку меток также можно включить с помощью fetch.pruneTags или remote.<name>.pruneTags в конфигурации. См. git-config[1].
Параметр --prune-tags равнозначен добавлению refs/tags/*:refs/tags/* в спецификации ссылок удалённого репозитория. Это может приводить к некоторым неожиданным взаимодействиям:
# These both fetch tags $ git fetch --no-tags origin 'refs/tags/*:refs/tags/*' $ git fetch --no-tags --prune-tags origin
Команда не выдаёт ошибку, если этот параметр указан без --prune или его вариантов конфигурации, чтобы обеспечить гибкость при настройке вариантов конфигурации и сохранить соответствие один к одному между действием параметров командной строки и действием вариантов конфигурации.
Например, вполне разумно настроить fetch.pruneTags=true в ~/.gitconfig, чтобы метки очищались при каждом запуске git fetch --prune, не превращая каждый вызов git fetch без --prune в ошибку.
Очистка меток с помощью --prune-tags работает и при получении по URL-адресу, а не из именованного удалённого репозитория. Все эти команды очистят метки, отсутствующие в origin:
$ git fetch origin --prune --prune-tags $ git fetch origin --prune 'refs/tags/*:refs/tags/*' $ git fetch <url-of-origin> --prune --prune-tags $ git fetch <url-of-origin> --prune 'refs/tags/*:refs/tags/*'
Вывод
Вывод команды "git fetch" зависит от используемого транспортного метода; в этом разделе описан вывод при получении данных по протоколу Git (локально или через ssh) и по протоколу Smart HTTP.
Состояние получения данных выводится в табличной форме, где каждая строка соответствует состоянию одной ссылки. Каждая строка имеет следующий формат:
<flag> <summary> <from> -> <to> [<reason>]
При использовании --porcelain формат вывода предназначен для машинного разбора. В отличие от форматов вывода, предназначенных для чтения человеком, он выводится в стандартный поток вывода, а не в стандартный поток ошибок. Каждая строка имеет следующий формат:
<flag> <old-object-id> <new-object-id> <local-reference>
Состояние актуальных ссылок показывается только при использовании параметра --verbose.
В компактном режиме вывода, задаваемом переменной конфигурации fetch.output, если одна строка целиком содержит <from> или <to> из другой строки, она будет заменена на * в другой строке. Например, master -> origin/master станет master -> origin/*.
- flag
-
Один символ, указывающий состояние ссылки:
- (space)
-
успешно получена ссылка с перемоткой вперёд;
-
+ -
успешно выполнено принудительное обновление;
-
- -
успешно удалена ссылка;
-
t -
успешно обновлён тег;
-
* -
успешно получена новая ссылка;
-
! -
ссылка отклонена или не удалось её обновить; и
-
= -
ссылка актуальна, и получать её не требовалось.
- summary
-
Для успешно полученной ссылки в сводке отображаются её старое и новое значения в формате, подходящем для использования в качестве аргумента команды
gitlog(в большинстве случаев это <old>..<new>, а при принудительных обновлениях без перемотки вперёд — <old>...<new>). - from
-
Имя получаемой удалённой ссылки без префикса
refs/<type>/. При удалении имя удалённой ссылки — "(none)". - to
-
Имя обновляемой локальной ссылки без префикса
refs/<type>/. - reason
-
Пояснение, предназначенное для чтения человеком. Для успешно полученных ссылок пояснение не требуется. Для ссылок, обработка которых завершилась ошибкой, указывается её причина.
Примеры
-
Обновление веток удалённого отслеживания:
$ git fetch origin
Приведённая выше команда копирует все ветки из пространства имён удалённого
refs/heads/и сохраняет их в локальном пространстве имёнrefs/remotes/origin/, если только параметрremote.<repository>.fetchне используется для указания нестандартной спецификации ссылки. -
Явное использование спецификаций ссылок:
$ git fetch origin +seen:seen maint:tmp
Эта команда обновляет (или при необходимости создаёт) ветки
seenиtmpв локальном репозитории, получая данные соответственно из ветокseenиmaintудалённого репозитория.Ветка
seenбудет обновлена, даже если обновление не выполняется перемоткой вперёд, поскольку перед её именем стоит знак плюса; веткаtmpобновлена не будет. -
Просмотр ветки удалённого репозитория без настройки этого удалённого репозитория в локальном репозитории:
$ git fetch git://git.kernel.org/pub/scm/git/git.git maint $ git log FETCH_HEAD
Первая команда получает ветку
maintиз репозитория по адресуgit://git.kernel.org/pub/scm/git/git.git, а вторая команда используетFETCH_HEAD, чтобы изучить ветку с помощью git-log[1]. Полученные объекты со временем будут удалены встроенными средствами обслуживания Git (см. git-gc[1]).
Безопасность
Протоколы получения и отправки данных не предназначены для защиты от кражи одной стороной данных из другого репозитория, которыми владелец не намеревался делиться. Если у вас есть личные данные, которые необходимо защитить от злоумышленника, лучше всего хранить их в другом репозитории. Это относится как к клиентам, так и к серверам. В частности, пространства имён на сервере не обеспечивают надёжного контроля доступа на чтение; предоставляйте доступ на чтение к пространству имён только тем клиентам, которым вы доверили бы доступ на чтение ко всему репозиторию.
Известны следующие способы атаки:
-
Жертва отправляет строки "have", сообщая идентификаторы имеющихся у неё объектов, которыми она не намерена делиться, но которые можно использовать для оптимизации передачи, если они есть и у другой стороны. Злоумышленник выбирает идентификатор объекта X, который хочет украсть, и отправляет ссылку на X, но ему не нужно отправлять содержимое X, поскольку оно уже есть у жертвы. Теперь жертва считает, что у злоумышленника есть X, и позднее отправляет ему содержимое X. (Проще всего клиенту провести такую атаку на сервер: создать ссылку на X в пространстве имён, к которому у клиента есть доступ, а затем получить её. Наиболее вероятный способ для сервера провести такую атаку на клиент — «слить» X в общедоступную ветку и надеяться, что пользователь выполнит в этой ветке дополнительную работу и отправит её обратно на сервер, не заметив слияния.)
-
Как и в случае #1, злоумышленник выбирает идентификатор объекта X, который хочет украсть. Жертва отправляет объект Y, уже имеющийся у злоумышленника, а злоумышленник ложно утверждает, что у него есть X, но нет Y, поэтому жертва отправляет Y в виде дельты относительно X. Эта дельта раскрывает злоумышленнику области X, похожие на Y.
Настройка
Всё содержимое этого раздела ниже данной строки выборочно включено из документации git-config[1]. Оно совпадает с содержимым соответствующего раздела:
-
fetch.recurseSubmodules -
Этот параметр определяет, будут ли команды
gitfetch(и выполняемая ими команда получения данныхgitpull) рекурсивно получать данные во вложенные модули, содержимое которых уже получено. Для этого параметра можно задать логическое значение или значениеon-demand. Логическое значение меняет поведение команд fetch и pull: при значении true рекурсивный обход вложенных модулей выполняется безусловно, а при значении false не выполняется вовсе. При значенииon-demandкоманды fetch и pull выполняют рекурсивный обход только тех вложенных модулей, содержимое которых уже получено, если суперпроект получает коммит, обновляющий ссылку вложенного модуля. По умолчанию используется значениеon-demandили значениеsubmodule.recurse, если оно задано. -
fetch.fsckObjects -
Если задано значение true, git-fetch-pack проверит все полученные объекты. Описание проверок см. в
transfer.fsckObjects. По умолчанию используется значениеfalse. Если параметр не задан, вместо него используется значениеtransfer.fsckObjects. -
fetch.fsck.<msg-id> -
Работает как
fsck.<msg-id>, но используется командой git-fetch-pack[1], а не командой git-fsck[1]. Подробности см. в документацииfsck.<msg-id>. -
fetch.fsck.skipList -
Работает как
fsck.skipList, но используется командой git-fetch-pack[1], а не командой git-fsck[1]. Подробности см. в документацииfsck.skipList. -
fetch.unpackLimit -
Если число объектов, полученных посредством нативного протокола передачи Git, меньше этого предела, они будут распакованы в отдельные файлы объектов. Если же число полученных объектов равно этому пределу или превышает его, полученный пакет будет сохранён как пакет после добавления всех недостающих баз дельт. Сохранение пакета при отправке данных может ускорить завершение операции отправки, особенно на медленных файловых системах. Если параметр не задан, используется значение
transfer.unpackLimit. -
fetch.prune -
Если задано значение true, команда fetch будет автоматически вести себя так, как если бы в командной строке был указан параметр
--prune. См. такжеremote.<name>.pruneи раздел PRUNING справочной страницы git-fetch[1]. -
fetch.pruneTags -
Если задано значение true, при удалении ссылок команда fetch будет автоматически вести себя так, как если бы была указана спецификация ссылки
refs/tags/*:refs/tags/*, если она ещё не задана. Это позволяет использовать одновременно данный параметр иfetch.prune, чтобы поддерживать соответствие ссылок вышестоящего репозитория по схеме 1=1. См. такжеremote.<name>.pruneTagsи раздел PRUNING справочной страницы git-fetch[1]. -
fetch.all -
Если задано значение true, команда fetch попытается обновить все доступные удалённые репозитории. Это поведение можно переопределить, указав
--no-allили явно задав один или несколько удалённых репозиториев, из которых нужно получить данные. По умолчанию используется значениеfalse. -
fetch.output -
Управляет выводом состояния обновления ссылок. Допустимые значения:
fullиcompact. Значение по умолчанию —full. Подробности см. в разделе OUTPUT справочной страницы git-fetch[1]. -
fetch.negotiationAlgorithm -
Управляет тем, как при согласовании содержимого отправляемого сервером файла пакета передаются сведения о коммитах в локальном репозитории. Укажите
consecutive, чтобы использовать алгоритм, который проходит по последовательным коммитам и проверяет каждый из них. Укажитеskipping, чтобы использовать алгоритм, пропускающий коммиты для ускорения согласования, но способный привести к созданию избыточно большого файла пакета; либо укажитеnoop, чтобы не отправлять сведения вовсе. Последний вариант почти наверняка приведёт к созданию избыточно большого файла пакета, но позволит пропустить этап согласования. Укажитеdefault, чтобы отменить ранее заданные параметры и использовать поведение по умолчанию. Обычно по умолчанию используется значениеconsecutive, но еслиfeature.experimentalимеет значениеtrue, по умолчанию используется значениеskipping. Неизвестное значение приведёт к ошибке командыgitfetch.См. также параметры
--negotiate-onlyи--negotiation-restrictкоманды git-fetch[1]. -
fetch.showForcedUpdates -
Задайте значение
false, чтобы включить--no-show-forced-updatesв командах git-fetch[1] и git-pull[1]. По умолчанию используется значениеtrue. -
fetch.parallel -
Задаёт максимальное количество операций получения данных, выполняемых одновременно (для вложенных модулей или удалённых репозиториев, если действует параметр
--multipleкоманды git-fetch[1]).Значение 0 задаёт разумный предел по умолчанию. Если параметр не задан, используется значение 1.
Для вложенных модулей это значение можно переопределить с помощью параметра конфигурации
submodule.fetchJobs. -
fetch.writeCommitGraph -
Задайте значение true, чтобы создавать граф коммитов после каждой команды
gitfetch, загружающей файл пакета из удалённого репозитория. При использовании параметра--splitбольшинство запусков создаёт очень небольшой файл графа коммитов поверх существующих файлов графа коммитов. Иногда эти файлы объединяются, и запись может занять больше времени. Обновлённый файл графа коммитов ускоряет работу многих команд Git, включаяgitmerge-base,gitpush-fиgitlog--graph. По умолчанию используется значениеfalse. -
fetch.bundleURI -
В этом параметре хранится URI для загрузки данных объектов Git из bundle URI перед инкрементальным получением данных с исходного сервера Git. Это работает аналогично параметру
--bundle-uriкоманды git-clone[1]. Командаgitclone--bundle-uriзадаст значениеfetch.bundleURI, если указанный bundle URI содержит список пакетов, организованный для инкрементального получения данных.Если изменить это значение, а в вашем репозитории задано значение
fetch.bundleCreationToken, удалите это значениеfetch.bundleCreationTokenперед получением данных из нового bundle URI. -
fetch.bundleCreationToken -
При использовании
fetch.bundleURIдля инкрементального получения данных из списка пакетов, использующего эвристику «creationToken», в этом параметре конфигурации хранится максимальное значениеcreationTokenсреди загруженных пакетов. Это значение предотвращает загрузку пакетов в будущем, если объявленное значениеcreationTokenне превышает его.Значения токенов создания выбирает поставщик, обслуживающий соответствующий bundle URI. Если изменить URI в параметре
fetch.bundleURI, перед получением данных обязательно удалите значение параметраfetch.bundleCreationToken.
Ошибки
С помощью --recurse-submodules можно получать новые коммиты только для вложенных модулей, уже присутствующих локально, например в $GIT_DIR/modules/. Если вышестоящий репозиторий добавит новый вложенный модуль, получить его данные не удастся, пока он не будет клонирован, например с помощью команды git submodule update. Ожидается, что эта проблема будет исправлена в будущей версии Git.
См. также
fetch
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-fetch