Русский ▾ Topics ▾ Latest version ▾ git-fast-export last updated in 2.51.0

НАЗВАНИЕ

git-fast-export — экспортёр данных Git

ОБЗОР

git fast-export [<параметры>] | git fast-import

ОПИСАНИЕ

Эта программа выгружает указанные редакции в форме, пригодной для передачи в git fast-import.

Вы можете использовать его как замену пакета, удобочитаемую для человека (см. git-bundle[1]), или как формат, который можно редактировать перед передачей в git fast-import для переписывания истории (возможность, на которую полагаются такие инструменты, как git filter-repo).

ПАРАМЕТРЫ

--progress=<n>

Вставлять операторы progress каждые <число> объектов, чтобы они показывались git fast-import во время импорта.

--signed-tags=(verbatim|warn-verbatim|warn-strip|strip|abort)

Указывает, как обрабатывать подписанные метки. Поскольку любое преобразование после экспорта (или во время экспорта, например, исключение редакций) может изменить хеши, которые подписываются, подписи могут стать недействительными.

Если указано abort (что является значением по умолчанию), эта программа завершится критической ошибкой при обнаружении подписанной метки. С strip метки будут молча сделаны неподписанными, с warn-strip они будут сделаны неподписанными, но будет показано предупреждение, с verbatim они будут молча экспортированы, а с warn-verbatim (или warn, устаревший синоним) они будут экспортированы, но вы увидите предупреждение. verbatim и warn-verbatim следует использовать только если вы знаете, что никакие преобразования, затрагивающие метки или любые коммиты в их истории, не будут выполнены вами, fast-export или fast-import, или если вам всё равно, что результирующая метка будет иметь недействительную подпись.

--signed-commits=(verbatim|warn-verbatim|warn-strip|strip|abort)

Указывает, как обрабатывать подписанные коммиты. Работает точно так же, как --signed-tags, но для коммитов. По умолчанию используется strip, что соответствует поведению более ранних версий этой команды без этого параметра.

При экспорте подпись начинается с:

gpgsig <алгоритм-хеша-git> <формат-подписи>

где <алгоритм-хеша-git> — это хеш объекта Git, то есть либо "sha1", либо "sha256", а <формат-подписи> — это тип подписи, то есть "openpgp", "x509", "ssh" или "unknown".

Например, подпись OpenPGP для коммита SHA-1 начинается с gpgsig sha1 openpgp, а подпись SSH для коммита SHA-256 начинается с gpgsig sha256 ssh.

Хотя все подписи коммита экспортируются, импортёр может решить принимать только некоторые из них. Например, git-fast-import[1] в настоящее время хранит не более одной подписи на алгоритм хеша Git в каждом коммите.

Note
Это очень экспериментально, и формат потока данных может измениться в будущем без гарантий совместимости.
--tag-of-filtered-object=(abort|drop|rewrite)

Указывает, как обрабатывать метки, чей помеченный объект отфильтрован. Поскольку экспортируемые редакции и файлы могут быть ограничены путём, помеченные объекты могут быть полностью отфильтрованы.

Если указано abort (что является значением по умолчанию), эта программа завершится критической ошибкой при обнаружении такой метки. С drop она будет опускать такие метки из вывода. С rewrite, если помеченный объект является коммитом, она перезапишет метку, чтобы она помечала родительский коммит (через переписывание родителей; см. git-rev-list[1]).

-M
-C

Выполнять обнаружение перемещения и/или копирования, как описано на странице руководства git-diff[1], и использовать его для создания команд переименования и копирования в выходном дампе.

Обратите внимание, что более ранние версии этой команды не выдавали предупреждений и давали неверные результаты, если вы указывали эти параметры.

--export-marks=<file>

Выгружает внутреннюю таблицу меток в <файл> по завершении. Метки записываются по одной на строку как :id-метки SHA-1. Выгружаются только метки для редакций; метки для blob-объектов игнорируются. Внутренние механизмы могут использовать этот файл для проверки импорта после его завершения или для сохранения таблицы меток при инкрементальных запусках. Поскольку <файл> открывается и усекается только по завершении, тот же путь также можно безопасно передавать в --import-marks. Файл не будет записан, если не был помечен/экспортирован ни один новый объект.

--import-marks=<file>

Перед обработкой любых входных данных загрузить метки, указанные в <файле>. Входной файл должен существовать, быть доступным для чтения и использовать тот же формат, который создаётся --export-marks.

--mark-tags

В дополнение к маркировке blob-объектов и коммитов идентификаторами меток, также маркировать метки. Это полезно в сочетании с --export-marks и --import-marks, а также полезно (и необходимо) для экспорта вложенных меток. Это не вредит другим случаям и могло бы быть поведением по умолчанию, но многие интерфейсы fast-import не готовы принимать метки с идентификаторами меток.

Любые коммиты (или метки), которые уже были помечены, не будут экспортированы снова. Если внутренний механизм использует аналогичный файл --import-marks, это позволяет выполнять инкрементальный двунаправленный экспорт репозитория путём сохранения меток одинаковыми при разных запусках.

--fake-missing-tagger

В некоторых старых репозиториях есть метки без создателя метки. Протокол fast-import был довольно строг в этом отношении и не допускал этого. Поэтому создайте поддельного создателя метки, чтобы иметь возможность fast-import вывода.

--use-done-feature

Начинать поток со строфы feature done и завершать его командой done.

--no-data

Пропускать вывод blob-объектов и вместо этого ссылаться на blob-объекты через их исходный хеш SHA-1. Это полезно при переписывании структуры каталогов или истории репозитория без изменения содержимого отдельных файлов. Обратите внимание, что результирующий поток может использоваться только репозиторием, который уже содержит необходимые объекты.

--full-tree

Этот параметр заставит fast-export выдавать директиву "deleteall" для каждого коммита, за которой следует полный список всех файлов в коммите (в отличие от простого перечисления файлов, которые отличаются от первого родителя коммита).

--anonymize

Анонимизировать содержимое репозитория, сохраняя при этом форму истории и сохранённого дерева. См. раздел АНОНИМИЗАЦИЯ ниже.

--anonymize-map=<от>[:<к>]

Преобразовать лексему <от> в <к> в анонимизированном выводе. Если <к> опущено, сопоставить <от> самому себе (т.е. не анонимизировать его). См. раздел АНОНИМИЗАЦИЯ ниже.

--reference-excluded-parents

По умолчанию выполнение такой команды, как git fast-export master~5..master, не будет включать коммит master~5 и приведёт к тому, что у master~4 больше не будет master~5 в качестве родителя (хотя и у старого master~4, и у нового master~4 будут все те же файлы). Используйте --reference-excluded-parents, чтобы поток вместо этого ссылался на коммиты в исключённом диапазоне истории по их sha1sum. Обратите внимание, что результирующий поток может использоваться только репозиторием, который уже содержит необходимые родительские коммиты.

--show-original-ids

Добавляет в вывод для коммитов и blob-объектов дополнительную директиву, original-oid <SHA1SUM>. Хотя такие директивы, скорее всего, будут игнорироваться импортёрами, такими как git-fast-import, они могут быть полезны для промежуточных фильтров (например, для переписывания сообщений коммитов, которые ссылаются на более старые коммиты, или для удаления blob-объектов по id).

--reencode=(yes|no|abort)

Указывает, как обрабатывать заголовок encoding в объектах коммитов. Если указано abort (что является значением по умолчанию), эта программа завершится критической ошибкой при обнаружении такого объекта коммита. С yes сообщение коммита будет перекодировано в UTF-8. С no исходная кодировка будет сохранена.

--refspec

Применять указанный спецификатор ссылки к каждой экспортируемой ссылке. Можно указать несколько.

[<git-rev-list-args>…​]

Список аргументов, приемлемых для git rev-parse и git rev-list, который указывает конкретные объекты и ссылки для экспорта. Например, master~10..master приводит к экспорту текущей ссылки master вместе со всеми объектами, добавленными начиная с её 10-го родительского коммита, и (если не указан параметр --reference-excluded-parents) всеми файлами, общими для master~9 и master~10.

ПРИМЕРЫ

$ git fast-export --all | (cd /пустой/репозиторий && git fast-import)

Это экспортирует весь репозиторий и импортирует его в существующий пустой репозиторий. За исключением перекодировки коммитов, которые не в UTF-8, это будет зеркалом один-к-одному.

$ git fast-export master~5..master |
	sed "s|refs/heads/master|refs/heads/other|" |
	git fast-import

Это создаёт новую ветку с именем other из master~5..master (т.е. если master имеет линейную историю, будут взяты последние 5 коммитов).

Обратите внимание, что это предполагает, что ни один из blob-объектов и сообщений коммитов, на которые ссылается этот диапазон редакций, не содержит строку refs/heads/master.

АНОНИМИЗАЦИЯ

Если указан параметр --anonymize, git попытается удалить всю идентифицирующую информацию из репозитория, сохраняя при этом достаточно исходных шаблонов дерева и истории для воспроизведения некоторых ошибок. Цель состоит в том, чтобы ошибка git, обнаруженная в частном репозитории, сохранялась в анонимизированном репозитории, и последний можно было передать разработчикам git для помощи в решении ошибки.

С этим параметром git заменит все имена ссылок, пути, содержимое blob-объектов, сообщения коммитов и меток, имена и адреса электронной почты в выводе на анонимизированные данные. Два экземпляра одной и той же строки будут заменены эквивалентно (например, два коммита с одним и тем же автором будут иметь одинакового анонимизированного автора в выводе, но не будут иметь ничего общего с исходной строкой автора). Связи между коммитами, ветками и метками сохраняются, как и метки времени коммитов (но сообщения коммитов и имена ссылок не имеют ничего общего с оригиналами). Относительный состав дерева сохраняется (например, если у вас есть корневое дерево с 10 файлами и 3 деревьями, таким же будет и вывод), но их имена и содержимое файлов будут заменены.

Если вы думаете, что нашли ошибку в git, вы можете начать с экспорта анонимизированного потока всего репозитория:

$ git fast-export --anonymize --all >anon-поток

Затем подтвердите, что ошибка сохраняется в репозитории, созданном из этого потока (многие ошибки не сохранятся, так как они действительно зависят от точного содержимого репозитория):

$ git init anon-репо
$ cd anon-репо
$ git fast-import <../anon-поток
$ ... проверьте вашу ошибку ...

Если анонимизированный репозиторий показывает ошибку, возможно, стоит поделиться anon-потоком вместе с обычным отчётом об ошибке. Обратите внимание, что анонимизированный поток очень хорошо сжимается, поэтому его рекомендуется сжимать gzip. Если вы хотите проверить поток, чтобы убедиться, что он не содержит никаких частных данных, вы можете просмотреть его непосредственно перед отправкой. Вы также можете попробовать:

$ perl -pe 's/\d+/X/g' <anon-поток | sort -u | less

который показывает все уникальные строки (с числами, преобразованными в "X", чтобы свернуть "Пользователь 0", "Пользователь 1" и т.д. в "Пользователь X"). Это даёт гораздо меньший вывод, и обычно легко быстро подтвердить, что в потоке нет частных данных.

Воспроизведение некоторых ошибок может потребовать ссылок на определённые коммиты или пути, что становится сложным после анонимизации имён ссылок и путей. Вы можете попросить, чтобы определённая лексема осталась как есть или была сопоставлена с новым значением. Например, если у вас есть ошибка, которая воспроизводится с помощью git rev-list sensitive -- secret.c, вы можете выполнить:

$ git fast-export --anonymize --all \
      --anonymize-map=sensitive:foo \
      --anonymize-map=secret.c:bar.c \
      >поток

После импорта потока вы можете выполнить git rev-list foo -- bar.c в анонимизированном репозитории.

Обратите внимание, что пути и имена ссылок разбиваются на лексемы по границам слешей. Приведённая выше команда анонимизирует subdir/secret.c как что-то вроде path123/bar.c; затем вы можете найти bar.c в анонимизированном репозитории, чтобы определить окончательное имя пути.

Чтобы упростить ссылку на окончательное имя пути, вы можете сопоставить каждый компонент пути; поэтому если вы также анонимизируете subdir в publicdir, то окончательным именем пути будет publicdir/bar.c.

ОГРАНИЧЕНИЯ

Поскольку git fast-import не может помечать деревья, вы не сможете полностью экспортировать репозиторий linux.git, так как он содержит метку, ссылающуюся на дерево вместо коммита.

СМ. ТАКЖЕ

GIT

Является частью пакета git[1]