Spec-Zone.ru › Git

git-svn

Имя

git-svn — Взаимодействие между хранилищем Subversion и Git

Синтаксис

git svn <command> [<options>] [<arguments>]

Описание

git svn — это простой инструмент для передачи изменений между Subversion и Git. Он обеспечивает двусторонний поток изменений между хранилищем Subversion и хранилищем Git.

git svn может отслеживать стандартное хранилище Subversion, следуя общему расположению «trunk/branches/tags», с помощью опции --stdlayout. Он также может отслеживать ветви и теги в любом расположении с помощью опций -T/-t/-b (см. опции для init ниже, а также команду clone).

После отслеживания хранилища Subversion (любым из перечисленных выше способов) хранилище Git может быть обновлено из Subversion с помощью команды fetch, а Subversion — из Git с помощью команды dcommit.

Команды

init

Инициализирует пустой репозиторий Git с дополнительными каталогами метаданных для git svn. URL Subversion может быть указан в качестве аргумента командной строки или в качестве полных URL-аргументов для -T/-t/-b. По желанию, целевой каталог для работы может быть указан в качестве второго аргумента. Обычно эта команда инициализирует текущий каталог.

-T<trunk-subdir>
--trunk=<trunk-subdir>
-t<tags-subdir>
--tags=<tags-subdir>
-b<branches-subdir>
--branches=<branches-subdir>
-s
--stdlayout

Это необязательные параметры командной строки для init. Каждый из этих флагов может указывать на относительный путь репозитория (--tags=project/tags) или полный URL (--tags=https://foo.org/project/tags). Вы можете указать более одного параметра --tags и/или --branches, если ваш репозиторий Subversion помещает теги или ветки под несколькими путями. Параметр --stdlayout — это сокращенный способ установки trunk,tags,branches в качестве относительных путей, что является значением по умолчанию для Subversion. Если также заданы другие параметры, они имеют приоритет.

--no-metadata

Устанавливает параметр noMetadata в конфигурации [svn-remote]. Этот параметр не рекомендуется, пожалуйста, прочтите раздел svn.noMetadata этой страницы справки перед использованием этого параметра.

--use-svm-props

Устанавливает параметр useSvmProps в конфигурации [svn-remote].

--use-svnsync-props

Устанавливает параметр useSvnsyncProps в конфигурации [svn-remote].

--rewrite-root=<URL>

Устанавливает параметр rewriteRoot в конфигурации [svn-remote].

--rewrite-uuid=<UUID>

Устанавливает параметр rewriteUUID в конфигурации [svn-remote].

--username=<user>

Для транспортов, для которых SVN обрабатывает аутентификацию (http, https и обычный svn), укажите имя пользователя. Для других транспортов (например, svn+ssh://) вы должны включить имя пользователя в URL, например svn+ssh://foo@svn.bar.com/project

--prefix=<prefix>

Это позволяет указать префикс, который добавляется к именам удаленных серверов, если указаны trunk/branches/tags. Префикс не автоматически включает конечную косую черту, поэтому убедитесь, что вы включили ее в аргумент, если это необходимо. Если указан --branches/-b, префикс должен включать конечную косую черту. В любом случае установка префикса (с конечной косой чертой) настоятельно рекомендуется, так как ваши refs отслеживания SVN тогда будут расположены в "refs/remotes/$prefix/", что совместимо с собственной структурой refs отслеживания удаленных серверов Git (refs/remotes/$remote/). Установка префикса также полезна, если вы хотите отслеживать несколько проектов, которые используют один общий репозиторий. По умолчанию префикс установлен на origin/.

Примечание
До Git v2.0 префикс по умолчанию был "" (без префикса). Это означало, что refs отслеживания SVN были помещены в "refs/remotes/*", что несовместимо со способом организации собственных refs отслеживания удаленных серверов Git. Если вы по-прежнему хотите использовать старое значение по умолчанию, вы можете получить его, передав --prefix "" в командной строке (--prefix="" может не работать, если ваш Perl’s Getopt::Long < v2.37).
--ignore-refs=<regex>

При передаче в init или clone этот регулярный выражение будет сохранён как ключ конфигурации. См. fetch для описания --ignore-refs.

--ignore-paths=<regex>

При передаче в init или clone это регулярное выражение будет сохранён как ключ конфигурации. См. fetch для описания --ignore-paths.

--include-paths=<regex>

При передаче в init или clone это регулярное выражение будет сохранён как ключ конфигурации. См. fetch для описания --include-paths.

--no-minimize-url

При отслеживании нескольких каталогов (используя параметры --stdlayout, --branches или --tags), git svn попытается подключиться к корню (или самому высокому разрешенному уровню) репозитория Subversion. Это значение по умолчанию позволяет лучше отслеживать историю, если целые проекты перемещаются внутри репозитория, но может вызвать проблемы в репозиториях, где действуют ограничения на чтение. Передача --no-minimize-url позволит git svn принимать URL как есть, не пытаясь подключиться к каталогу более высокого уровня. Этот параметр выключен по умолчанию, когда отслеживается только один URL/ветвь (он мало чем поможет).

fetch

Загрузить не загруженные изменения из удаленного репозитория Subversion, который мы отслеживаем. Имя раздела [svn-remote "…​"] в файле конфигурации $GIT_DIR может быть указано в качестве необязательного аргумента командной строки.

Это автоматически обновляет rev_map при необходимости (см. $GIT_DIR/svn/**/.rev_map.* в разделе ФАЙЛЫ ниже для получения подробной информации).

--localtime

Сохранять время коммита Git в часовом поясе, а не в UTC. Это позволяет git log (даже без --date=local) отображать то же время, которое svn log отображал бы в местном часовом поясе.

Это не мешает взаимодействию с репозиторием Subversion, из которого вы клонировали, но если вы хотите, чтобы ваш локальный репозиторий Git мог взаимодействовать с локальным репозиторием Git другого человека, либо не используйте этот параметр, либо оба используйте его в одном часовом поясе.

--parent

Загрузить только из родительского SVN текущего HEAD.

--ignore-refs=<regex>

Игнорировать refs для ветвей или тегов, соответствующих регулярному выражению Perl. Можно использовать «отрицательное утверждение о поиске вперёд», например ^refs/remotes/origin/(?!tags/wanted-tag|wanted-branch).*$, чтобы разрешить только определённые refs.

config key: svn-remote.<name>.ignore-refs

Если ключ конфигурации ignore-refs установлен, и опция командной строки также задана, будут использоваться оба регулярных выражения.

--ignore-paths=<regex>

Это позволяет указать регулярное выражение Perl, которое вызовет пропуск всех соответствующих путей при выгрузке из SVN. Параметр --ignore-paths должен соответствовать для каждого fetch (включая автоматические загрузки из-за clone, dcommit, rebase, и т. д.) в заданном репозитории.

config key: svn-remote.<name>.ignore-paths

Если ключ конфигурации ignore-paths установлен, и опция командной строки также задана, будут использоваться оба регулярных выражения.

Примеры:

Пропуск каталога "doc*" при каждой загрузке
--ignore-paths="^doc"
Пропуск "branches" и "tags" в каталогах первого уровня
--ignore-paths="^[^/]+/(?:branches|tags)"
--include-paths=<regex>

Это позволяет указать регулярное выражение Perl, которое вызовет включение только соответствующих путей при выгрузке из SVN. Параметр --include-paths должен соответствовать для каждого fetch (включая автоматические загрузки из-за clone, dcommit, rebase, и т. д.) в заданном репозитории. --ignore-paths имеет приоритет перед --include-paths.

config key: svn-remote.<name>.include-paths
--log-window-size=<n>

Загрузить <n> записей журнала за раз при сканировании истории Subversion. Значение по умолчанию равно 100. Для очень больших репозиториев Subversion могут потребоваться большие значения для clone/fetch, чтобы завершить работу за разумное время. Но слишком большие значения могут привести к более высокому использованию памяти и тайм-аутам запросов.

clone

Выполняет init и fetch. Он автоматически создаст каталог, основанный на основе имени URL, переданного ему; или если передается второй аргумент; он создаст каталог и будет работать в нём. Он принимает все аргументы, которые принимают команды init и fetch, за исключением --fetch-all и --parent. После клонирования репозитория команда fetch сможет обновлять изменения без влияния на рабочую область; а команда rebase сможет обновить рабочую область с последними изменениями.

--preserve-empty-dirs

Создать файл-заполнитель в локальном репозитории Git для каждого пустого каталога, загруженного из Subversion. Включает каталоги, которые становятся пустыми путём удаления всех записей в репозитории Subversion (но не сам каталог). Файлы-заполнители также отслеживаются и удаляются, когда больше не нужны.

--placeholder-filename=<filename>

Устанавливает имя файлов-заполнителей, созданных с помощью --preserve-empty-dirs. По умолчанию: ".gitignore"

ребазирование

Получает изменения из SVN-родителя текущего HEAD и перебазирует текущую (незафиксированную в SVN) работу относительно него.

Это работает аналогично svn update или git pull за исключением того, что сохраняет линейную историю с git rebase вместо git merge для удобства dcommit'а с git svn.

Принимает все опции, которые принимают git svn fetch и git rebase. Однако, --fetch-all получает данные только из текущего [svn-remote], а не из всех определений [svn-remote].

Как и git rebase, требует, чтобы рабочая область была чистой и не содержала незафиксированных изменений.

Автоматически обновляет rev_map при необходимости (подробности см. в $GIT_DIR/svn/**/.rev_map.* в разделе ФАЙЛЫ ниже).

-l
--local

Не получать данные удалённо; выполнить только git rebase относительно последнего полученного коммита из родительского SVN.

dcommit

Зафиксировать каждый различие (diff) из текущей ветки непосредственно в репозиторий SVN, а затем перебазировать или сбросить (в зависимости от того, есть ли разница между SVN и head). Это создаст в SVN версию для каждого коммита в Git.

Когда в качестве аргумента указано имя необязательной ветки Git (или имя объекта коммита Git), подкоманда работает с указанной веткой, а не с текущей.

Использование dcommit предпочтительнее set-tree (ниже).

--no-rebase

После фиксации не перебазирует и не сбрасывает.

--commit-url <URL>

Зафиксировать в этот URL SVN (полный путь). Предназначено для возможности повторного использования существующих репозиториев git svn созданных с одним методом передачи (например, svn:// или http:// для анонимного чтения), если пользователю позже предоставлен альтернативный метод передачи (например, svn+ssh:// или https://) для фиксации.

config key: svn-remote.<name>.commiturl
config key: svn.commiturl (overwrites all svn-remote.<name>.commiturl options)

Обратите внимание, что URL SVN в ключе commiturl конфигурации включает ветку SVN. Если вы хотите установить URL фиксации для всего репозитория SVN, используйте svn-remote.<name>.pushurl вместо этого.

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

--mergeinfo=<mergeinfo>

Добавить заданную информацию о слиянии во время dcommit (например, --mergeinfo="/branches/foo:1-10"). Все версии серверов SVN могут хранить эту информацию (как свойство), а клиенты SVN, начиная с версии 1.5, могут её использовать. Для указания информации о слиянии из нескольких веток используйте один пробел между ветками (--mergeinfo="/branches/foo:1-10 /branches/bar:3,5-6,8")

config key: svn.pushmergeinfo

Эта опция заставит git-svn попытаться автоматически заполнить свойство svn:mergeinfo в репозитории SVN, когда это возможно. В настоящее время это можно сделать только при фиксации слияний не по принципу fast-forward, где все родители, кроме первого, уже были отправлены в SVN.

--interactive

Запрашивает у пользователя подтверждение, что набор изменений должен быть отправлен в SVN. Для каждого изменения можно ответить "да" (принять это изменение), "нет" (отклонить это изменение), "все" (принять все изменения) или "выйти".

git svn dcommit возвращается немедленно, если ответ "нет" или "выйти", ничего не фиксируя в SVN.

ветка

Создать ветку в репозитории SVN.

-m
--message

Позволяет указать сообщение коммита.

-t
--tag

Создать тег, используя tags_subdir вместо branches_subdir, указанного во время git svn init.

-d<path>
--destination=<path>

Если для команды init или clone было задано более одного параметра --branches (или --tags), необходимо указать расположение ветки (или тега), которую вы хотите создать в репозитории SVN. <path> определяет, какой путь использовать для создания ветки или тега и должен соответствовать шаблону в левой части одного из настроенных branches или tags refspecs. Эти refspecs можно увидеть с помощью команд

git config --get-all svn-remote.<name>.branches
git config --get-all svn-remote.<name>.tags

где <name> - имя репозитория SVN, указанное в параметре -R к init (или "svn" по умолчанию).

--username

Указать имя пользователя SVN для выполнения коммита. Эта опция переопределяет свойство конфигурации username.

--commit-url

Использовать указанный URL для подключения к репозиторию Subversion назначения. Это полезно в случаях, когда исходный репозиторий SVN только для чтения. Эта опция переопределяет свойство конфигурации commiturl.

git config --get-all svn-remote.<name>.commiturl
--parents

Создать родительские папки. Этот параметр эквивалентен параметру --parents в командах svn cp и полезен для нестандартных схем расположения репозитория.

тег

Создать тег в репозитории SVN. Это сокращение для branch -t.

лог

Это должно упростить поиск сообщений svn log, когда пользователи svn ссылаются на номера -r/--revision.

Поддерживаются следующие функции из ‘svn log’:

-r <n>[:<n>]
--revision=<n>[:<n>]

поддерживается, нечисловые аргументы не поддерживаются: HEAD, NEXT, BASE, PREV и т.д…​

-v
--verbose

не полностью совместимо с выводом --verbose в svn log, но достаточно близко.

--limit=<n>

НЕ то же самое, что --max-count, не учитывает слияния/исключенные коммиты

--incremental

поддерживается

Новые функции:

--show-commit

также отображает хэш Git коммита sha1

--oneline

наш вариант --pretty=oneline

Примечание
SVN сам хранит время только в UTC и ничего больше. Обычный клиент svn преобразует время UTC в местное время (или на основе TZ= переменной среды). Эта команда имеет такое же поведение.

Любые другие аргументы передаются непосредственно в git log

автор

Показать, какая ревизия и автор в последний раз изменили каждую строку файла. Вывод этого режима по умолчанию совместим с выводом ‘svn blame’. Как и команда SVN blame, локальные незафиксированные изменения в рабочей области игнорируются; версия файла в ревизии HEAD аннотируется. Неизвестные аргументы передаются непосредственно в git blame.

--git-format

Вывести вывод в том же формате, что и git blame, но с номерами ревизий SVN вместо хэшей коммитов Git. В этом режиме изменения, которые не были зафиксированы в SVN (включая локальные изменения в рабочей копии), отображаются как ревизия 0.

найти-ревизию

При получении номера ревизии SVN в формате rN, возвращает соответствующий хэш Git коммита (это может быть необязательно дополнено tree-ish, чтобы указать, какая ветка должна быть проверена). При получении tree-ish, возвращает соответствующий номер ревизии SVN.

-B
--before

Не требует точного совпадения, если задана ревизия SVN, а вместо этого находит коммит, соответствующий состоянию репозитория SVN (на текущей ветке) в указанной ревизии.

-A
--after

Не требует точного совпадения, если задана ревизия SVN; если точное совпадение не найдено, возвращает ближайшее совпадение, ища вперёд в истории.

установить-дерево

Рекомендуется использовать dcommit вместо этой команды. Зафиксировать указанный коммит или объекты дерева в SVN. Это зависит от того, чтобы ваши импортированные данные fetch были актуальными. Это не предпринимает никаких попыток исправления при фиксации в SVN, оно просто перезаписывает файлы теми, которые указаны в дереве или коммите. Все слияния предполагается, что произошли независимо от функций git svn.

создать-игнорировать

Рекурсивно находит свойства svn:ignore и svn:global-ignores в директориях и создаёт соответствующие файлы .gitignore. Результирующие файлы размещаются для фиксации, но не фиксируются. Используйте -r/--revision для ссылки на конкретную ревизию.

показать-игнорировать

Рекурсивно находит и перечисляет свойства svn:ignore и svn:global-ignores в директориях. Вывод подходит для добавления в файл $GIT_DIR/info/exclude.

mkdirs

Попытка воссоздать пустые каталоги, которые Git не может отслеживать на основе информации в файлах $GIT_DIR/svn//unhandled.log. Пустые каталоги автоматически воссоздаются при использовании «git svn clone» и «git svn rebase», поэтому «mkdirs» предназначен для использования после команд, таких как «git checkout» или «git reset». (Дополнительную информацию см. в файле конфигурации svn-remote.<имя>.automkdirs).

commit-diff

Создаёт коммит из различий между двумя объектами дерева (tree-ish) из командной строки. Эта команда не зависит от наличия git svn init репозитория. Эта команда принимает три аргумента: (а) исходное дерево для сравнения, (б) новое результирующее дерево, (в) URL целевого репозитория Subversion. Последний аргумент (URL) можно опустить, если вы работаете с репозиторием, поддерживающим git svn (который был init с помощью git svn). Для этой команды требуется опция -r<номер_ревизии>.

Текст коммита предоставляется либо напрямую с помощью опции -m или -F, либо косвенно из тега или коммита, когда второе дерево-объект обозначает такой объект, или он запрашивается путём вызова редактора (см. опцию --edit ниже).

-m
--message=

Использовать указанный msg в качестве сообщения коммита. Эта опция отключает опцию --edit.

-F <имя_файла>
--file=<имя_файла>

Получить сообщение коммита из указанного файла. Эта опция отключает опцию --edit.

info

Отображает информацию о файле или каталоге, аналогично команде ‘svn info’. В настоящее время не поддерживает аргумент -r/--revision. Используйте опцию --url, чтобы вывести только значение поля URL:.

proplist

Отображает свойства, сохраненные в репозитории Subversion для данного файла или каталога. Используйте -r/--revision для ссылки на конкретную ревизию Subversion.

propget

Получает свойство Subversion, указанное в качестве первого аргумента, для файла. Конкретную ревизию можно указать с помощью -r/--revision.

propset

Устанавливает свойство Subversion, заданное в качестве первого аргумента, со значением, указанным в качестве второго аргумента, для файла, указанного в качестве третьего аргумента.

Пример:

git svn propset svn:keywords "FreeBSD=%H" devel/py-tipper/Makefile

Это установит свойство svn:keywords со значением FreeBSD=%H для файла devel/py-tipper/Makefile.

show-externals

Отображает внешние зависимости Subversion. Используйте -r/--revision для указания конкретной ревизии.

gc

Сжимает файлы $GIT_DIR/svn//unhandled.log и удаляет файлы $GIT_DIR/svn//index.

reset

Отменяет изменения, внесенные fetch, до указанной ревизии. Это позволяет вам перепросмотреть ревизию SVN. Обычно содержимое ревизии SVN не должно изменяться, и reset не должно быть необходимо. Однако, если права доступа SVN изменятся или вы измените опцию --ignore-paths, fetch может завершиться ошибкой «не найдено в коммите» (файл ранее не был виден) или «несовпадение контрольной суммы» (пропущена модификация). Если проблемный файл нельзя игнорировать навсегда (с помощью --ignore-paths), единственный способ исправить репозиторий — использовать reset.

Изменяются только rev_map и refs/remotes/git-svn (см. $GIT_DIR/svn/**/.rev_map.* в разделе FILES ниже для получения подробной информации). После reset выполните fetch и затем git reset или git rebase для перемещения локальных ветвей на новое дерево.

-r
--revision=

Указывает самую последнюю ревизию для сохранения. Все последующие ревизии будут отброшены.

-p
--parent

Отбросить указанную ревизию, сохранив ближайшего предка вместо неё.

Пример:

Предположим, у вас есть локальные изменения в "master", но вам нужно переизвлечь "r2".

    r1---r2---r3 remotes/git-svn
                \
                 A---B master

Исправьте проблему с ignore-paths или правами доступа SVN, которая привела к неполному "r2" в первом случае. Затем:

git svn reset -r2 -p
git svn fetch
    r1---r2'--r3' remotes/git-svn
      \
       r2---r3---A---B master

Затем исправьте "master" с помощью git rebase. НЕ используйте git merge, или ваша история не будет совместима с будущим dcommit!

git rebase --onto remotes/git-svn A^ master
    r1---r2'--r3' remotes/git-svn
                \
                 A'--B' master

Параметры

--shared[=(false|true|umask|group|all|world|everybody)]
--template=<template-directory>

Используется только с командой init. Эти параметры передаются непосредственно команде git init.

-r <arg>
--revision <arg>

Используется с командой fetch.

Это позволяет поддерживать диапазоны ревизий для частичной/частично удаленной истории. Поддерживаются $NUMBER, $NUMBER1:$NUMBER2 (числовые диапазоны), $NUMBER:HEAD и BASE:$NUMBER.

Это может позволить вам создавать частичные зеркала при выполнении fetch, но, как правило, не рекомендуется, так как история будет пропущена и потеряна.

-
--stdin

Используется только с командой set-tree.

Считывает список коммитов из стандартного ввода и применяет их в обратном порядке. С каждой строки считывается только ведущий sha1, поэтому можно использовать вывод git rev-list --pretty=oneline.

--rmdir

Используется только с командами dcommit, set-tree и commit-diff.

Удаляет директории из дерева SVN, если в них не осталось файлов. SVN может хранить пустые директории, и они не удаляются по умолчанию, если в них не осталось файлов. Git не может хранить пустые директории. Включение этого флага заставит коммит в SVN действовать так же, как Git.

config key: svn.rmdir
-e
--edit

Используется только с командами dcommit, set-tree и commit-diff.

Редактирует сообщение коммита перед коммитом в SVN. По умолчанию выключено для объектов, которые являются коммитами, и включено при коммитировании объектов дерева.

config key: svn.edit
-l<num>
--find-copies-harder

Используется только с командами dcommit, set-tree и commit-diff.

Оба параметра передаются напрямую в git diff-tree; см. git-diff-tree[1] для получения дополнительной информации.

config key: svn.l
config key: svn.findcopiesharder
-A<filename>
--authors-file=<filename>

Синтаксис совместим с файлом, используемым git cvsimport , но с <> можно указать пустой адрес электронной почты:

        loginname = Joe User <user@example.com>

Если этот параметр указан и git svn обнаружит имя SVN-автора, отсутствующее в файле authors-file, git svn прервёт работу. Пользователь должен добавить соответствующую запись. После изменения файла authors-file повторное выполнение предыдущей команды git svn должно продолжить работу.

config key: svn.authorsfile
--authors-prog=<filename>

Если этот параметр указан, для каждого имени SVN-автора, отсутствующего в файле авторов, указанный файл выполняется с именем автора в качестве первого аргумента. От программы ожидается возврат одной строки в формате «Имя <email>» или «Имя <>», которая будет обрабатываться так, как будто она включена в файл авторов.

По историческим причинам сначала выполняется поиск относительно текущей директории для init и clone, а относительно корня рабочей области для fetch. Если filename не найден, он ищется как любая другая команда в $PATH.

config key: svn.authorsProg
-q
--quiet

Сделать git svn менее подробным. Укажите второй раз, чтобы сделать его ещё менее подробным.

-m
--merge
-s<strategy>
--strategy=<strategy>
-p
--rebase-merges

Эти параметры используются только с командами dcommit и rebase.

Передаются напрямую в git rebase при использовании dcommit если git reset нельзя использовать (см. dcommit).

-n
--dry-run

Этот параметр может использоваться с командами dcommit, rebase, branch и tag.

Для dcommit, выводит серию Git-аргументов, которые покажут, какие изменения будут переданы в SVN.

Для rebase, отображает локальную ветку, связанную с удалённым SVN-репозиторием, связанным с текущей веткой, и URL SVN-репозитория, который будет получен.

Для branch и tag, отображает URL, которые будут использоваться для копирования при создании ветки или тега.

--use-log-author

При получении SVN-коммитов в Git (как часть операций fetch, rebase, или dcommit), ищет первую строку From: или трейлер Signed-off-by в сообщении журнала и использует её как строку автора.

config key: svn.useLogAuthor
--add-author-from

При коммитировании в SVN из Git (как часть операций set-tree или dcommit), если в существующем сообщении журнала ещё нет трейлера From: или Signed-off-by, добавляет строку From: на основе строки автора Git-коммита. При использовании этого параметра, --use-log-author получит действительную строку автора для всех коммитов.

config key: svn.addAuthorFrom

Дополнительные параметры

-i<GIT_SVN_ID>
--id <GIT_SVN_ID>

Устанавливает GIT_SVN_ID (вместо использования среды). Это позволяет пользователю переопределить имя по умолчанию для получения из хранилища при отслеживании одного URL. Команды log и dcommit больше не требуют этого параметра в качестве аргумента.

-R<remote-name>
--svn-remote <remote-name>

Указывает раздел [svn-remote "<remote-name>"] для использования, это позволяет отслеживать несколько SVN-репозиториев. По умолчанию: "svn"

--follow-parent

Этот параметр актуален только при отслеживании ветвей (используя один из вариантов расположения репозитория --trunk, --tags, --branches, --stdlayout). Для каждой отслеживаемой ветки пытается определить, откуда была скопирована её ревизия, и установить соответствующего родителя в первом Git-коммите для ветки. Это особенно полезно, когда отслеживается директория, которая была перемещена в репозитории. Если эта функция отключена, ветки, созданные git svn , будут линейными и не будут разделять историю, что означает отсутствие информации о том, где ветки были объединены или объединены. Однако отслеживание длинных/сложных историй может занять много времени, поэтому отключение этой функции может ускорить процесс клонирования. Эта функция включена по умолчанию, используйте --no-follow-parent для её отключения.

config key: svn.followparent

Параметры, используемые только в конфигурационном файле

svn.noMetadata
svn-remote.<name>.noMetadata

Это удаляет строки git-svn-id: в конце каждого коммита.

Этот параметр можно использовать только для одноразовых импортов, так как git svn не сможет повторно получить данные без метаданных. Кроме того, если вы потеряете файлы $GIT_DIR/svn/**/.rev_map.*, git svn не сможет восстановить их.

Команда git svn log также не будет работать с репозиториями, использующими этот параметр. Использование этого параметра конфликтует с параметром useSvmProps по очевидным причинам.

Этот параметр НЕ рекомендуется, так как затрудняет отслеживание старых ссылок на номера ревизий SVN в существующей документации, отчетах об ошибках и архивах. Если вы планируете в конечном итоге перейти с SVN на Git и уверены, что хотите удалить историю SVN, рассмотрите git-filter-repo вместо этого. filter-repo также позволяет форматировать метаданные для удобства чтения и переписывать информацию об авторах для пользователей, не использующих «svn.authorsFile».

svn.useSvmProps
svn-remote.<name>.useSvmProps

Это позволяет git svn переназначать URL и UUID репозитория из зеркал, созданных с помощью SVN::Mirror (или svk), для метаданных.

Если ревизия SVN имеет свойство «svm:headrev», скорее всего, она была создана с помощью SVN::Mirror (также используется SVK). Свойство содержит UUID репозитория и ревизию. Мы хотим, чтобы это выглядело так, как будто мы зеркалим исходный URL, поэтому добавим вспомогательную функцию, возвращающую исходный идентификационный URL и UUID, и будем использовать её при генерации метаданных в сообщениях коммитов.

svn.useSvnsyncProps
svn-remote.<name>.useSvnsyncprops

Аналогично параметру useSvmProps; этот параметр предназначен для пользователей команды svnsync(1), которая распространяется с SVN 1.4.x и более поздними версиями.

svn-remote.<name>.rewriteRoot

Это позволяет пользователям создавать репозитории из альтернативных URL. Например, администратор мог запустить git svn на сервере локально (доступ через file://), но хотел распространить репозиторий с общедоступным http:// или svn:// URL в метаданных, чтобы пользователи видели общедоступный URL.

svn-remote.<name>.rewriteUUID

Аналогично параметру useSvmProps; этот параметр предназначен для пользователей, которым необходимо вручную переназначить UUID. Это может быть полезно в ситуациях, когда исходный UUID недоступен ни с помощью useSvmProps, ни с помощью useSvnsyncProps.

svn-remote.<name>.pushurl

Аналогично параметру remote.<name>.pushurl в Git, этот ключ предназначен для использования в тех случаях, когда url указывает на репозиторий SVN через только для чтения транспорт, чтобы предоставить альтернативный транспорт для чтения/записи. Предполагается, что оба ключа указывают на один и тот же репозиторий. В отличие от commiturl, pushurl — это базовый путь. Если можно было использовать commiturl или pushurl, commiturl имеет приоритет.

svn.brokenSymlinkWorkaround

Этот параметр отключает потенциально дорогостоящие проверки для обхода поврежденных символических ссылок, добавленных в SVN сломанными клиентами. Установите этот параметр в «false», если вы отслеживаете репозиторий SVN со многими пустыми блоками, которые не являются символическими ссылками. Этот параметр можно изменить во время работы git svn и он применится в следующей полученной ревизии. Если не задано, git svn предполагает, что этот параметр равен «true».

svn.pathnameencoding

Этот параметр сообщает git svn о перекодировании имён путей в указанное кодирование. Его могут использовать пользователи Windows и те, кто работает в локалях, не использующих UTF-8, чтобы избежать повреждения имён файлов с символами, не входящими в ASCII.

svn-remote.<name>.automkdirs

Обычно команды «git svn clone» и «git svn rebase» пытаются воссоздать пустые каталоги, которые находятся в репозитории Subversion. Если этот параметр установлен в «false», пустые каталоги будут создаваться только при явном запуске команды «git svn mkdirs». Если не задано, git svn предполагает, что этот параметр равен «true».

Поскольку параметры noMetadata, rewriteRoot, rewriteUUID, useSvnsyncProps и useSvmProps влияют на генерируемые и используемые метаданные git svn, они должны быть установлены в файле конфигурации до импорта любой истории, а эти настройки никогда не должны меняться после их установки.

Кроме того, только один из этих параметров может быть использован в каждом разделе svn-remote, потому что они влияют на строку метаданных git-svn-id:, за исключением rewriteRoot и rewriteUUID, которые могут быть использованы вместе.

Основные примеры

Отслеживание и внесение изменений в ветку trunk проекта, управляемого Subversion (игнорирование тегов и ветвей):

# Clone a repo (like git clone):
        git svn clone http://svn.example.com/project/trunk
# Enter the newly cloned directory:
        cd trunk
# You should be on master branch, double-check with 'git branch'
        git branch
# Do some work and commit locally to Git:
        git commit ...
# Something is committed to SVN, rebase your local changes against the
# latest changes in SVN:
        git svn rebase
# Now commit your changes (that were committed previously using Git) to SVN,
# as well as automatically updating your working HEAD:
        git svn dcommit
# Append svn:ignore and svn:global-ignores settings to the default Git exclude file:
        git svn show-ignore >> .git/info/exclude

Отслеживание и внесение изменений в весь проект, управляемый Subversion (включая trunk, tags и branches):

# Clone a repo with standard SVN directory layout (like git clone):
        git svn clone http://svn.example.com/project --stdlayout --prefix svn/
# Or, if the repo uses a non-standard directory layout:
        git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/
# View all branches and tags you have cloned:
        git branch -r
# Create a new branch in SVN
        git svn branch waldo
# Reset your master to trunk (or any other branch, replacing 'trunk'
# with the appropriate name):
        git reset --hard svn/trunk
# You may only dcommit to one branch/tag/trunk at a time.  The usage
# of dcommit/rebase/show-ignore should be the same as above.

Первоначальное git svn clone может занять довольно много времени (особенно для больших репозиториев Subversion). Если несколько человек (или один человек с несколькими машинами) хотят использовать git svn для взаимодействия с одним и тем же репозиторием Subversion, вы можете выполнить первоначальное git svn clone в репозиторий на сервере, а каждый человек клонирует этот репозиторий с помощью git clone:

# Do the initial import on a server
        ssh server "cd /pub && git svn clone http://svn.example.com/project [options...]"
# Clone locally - make sure the refs/remotes/ space matches the server
        mkdir project
        cd project
        git init
        git remote add origin server:/pub/project
        git config --replace-all remote.origin.fetch '+refs/remotes/*:refs/remotes/*'
        git fetch
# Prevent fetch/pull from remote Git server in the future,
# we only want to use git svn for future updates
        git config --remove-section remote.origin
# Create a local branch from one of the branches just fetched
        git checkout -b master FETCH_HEAD
# Initialize 'git svn' locally (be sure to use the same URL and
# --stdlayout/-T/-b/-t/--prefix options as were used on server)
        git svn init http://svn.example.com/project [options...]
# Pull the latest changes from Subversion
        git svn rebase

Rebase против pull/merge

Предпочтительнее использовать git svn rebase или git rebase, а не git pull или git merge для синхронизации неинтегрированных коммитов с веткой git svn репозитория. Это сохранит историю неинтегрированных коммитов линейной относительно репозитория SVN и позволит использовать предпочтительную подкоманду git svn dcommit для отправки неинтегрированных коммитов обратно в SVN.

Изначально, git svn рекомендовал разработчикам выполнять pull или merge из ветки git svn. Это было связано с тем, что автор отдавал предпочтение git svn set-tree B для коммита единственного head вместо обозначения git svn set-tree A..B для коммита нескольких коммитов. Использование git pull или git merge с git svn set-tree A..B приведёт к сглаживанию нелинейной истории при коммите в SVN, и это может привести к тому, что коммиты слияния неожиданно отменят предыдущие коммиты в SVN.

Отслеживание слияний

Хотя git svn может отслеживать историю копирования (включая ветки и теги) для репозиториев, использующих стандартную структуру, он пока не может представлять историю слияний, произошедших внутри Git, для пользователей SVN. Поэтому рекомендуется, чтобы пользователи сохраняли историю как можно более линейной внутри Git, чтобы облегчить совместимость с SVN (см. раздел ПРЕДУПРЕЖДЕНИЯ ниже).

Обработка ветвей SVN

Если git svn настроен на извлечение ветвей (и --follow-branches активен), он иногда создаёт несколько ветвей Git для одной ветви SVN, где дополнительные ветви имеют имена вида branchname@nnn (где nnn - номер ревизии SVN). Эти дополнительные ветви создаются, если git svn не может найти родительский коммит для первого коммита в ветви SVN, чтобы связать ветвь с историей других ветвей.

Обычно первый коммит в ветви SVN представляет собой операцию копирования. git svn прочтёт этот коммит, чтобы получить номер ревизии SVN, из которой была создана ветвь. Затем он попытается найти коммит Git, соответствующий этой ревизии SVN, и использовать его в качестве родителя ветви. Однако возможно, что подходящего коммита Git в качестве родителя не будет. Это произойдёт, среди прочего, если ветвь SVN представляет собой копию ревизии, которая не была извлечена git svn (например, потому что это старая ревизия, которая была пропущена с --revision), или если в SVN был скопирован каталог, который не отслеживается git svn (например, ветвь, которая вообще не отслеживается, или подкаталог отслеживаемой ветви). В этих случаях git svn по-прежнему создаст ветвь Git, но вместо использования существующего коммита Git в качестве родителя ветви, он прочтёт историю SVN каталога, из которого была скопирована ветвь, и создаст соответствующие коммиты Git. Это обозначается сообщением «Инициализация родителя: <имя_ветви>».

Кроме того, он создаст специальную ветвь с именем <branchname>@<SVN-Revision>, где <номер_ревизии_SVN> - номер ревизии SVN, из которой была скопирована ветвь. Эта ветвь будет указывать на недавно созданный родительский коммит ветви. Если в SVN ветвь была удалена и затем повторно создана из другой версии, будет несколько таких ветвей с @.

Обратите внимание, что это может означать, что для одной ревизии SVN создаётся несколько коммитов Git.

Пример: в репозитории SVN со стандартной структурой trunk/tags/branches создаётся каталог trunk/sub в r.100. В r.200 trunk/sub разветвляется путём копирования в branches/. git svn clone -s затем создаст ветвь sub. Он также создаст новые коммиты Git для r.100 по r.199 и использует их в качестве истории ветви sub. Таким образом, для каждой ревизии с r.100 по r.199 будет два коммита Git (один для trunk/, один для trunk/sub/). Наконец, он создаст ветвь sub@200, указывающую на новый родительский коммит ветви sub (т.е. коммит для r.200 и trunk/sub/).

Ограничения

Для простоты и взаимодействия с Subversion рекомендуется, чтобы все пользователи git svn клонировали, извлекали и выполняли dcommit напрямую с сервера SVN и избегали всех операций git clone/pull/merge/push между репозиториями и ветвями Git. Рекомендуемый метод обмена кодом между ветвями Git и пользователями — git format-patch и git am, или просто выполнение 'dcommit' в репозиторий SVN.

Запуск git merge или git pull НЕ рекомендуется на ветви, из которой вы планируете dcommit , поскольку пользователи Subversion не могут увидеть какие-либо слияния, которые вы выполнили. Кроме того, если вы выполняете слияние или извлечение из ветки Git, которая является зеркалом ветки SVN, dcommit может выполнить коммит в неправильную ветку.

Если вы всё же выполняете слияние, обратите внимание на следующее правило: git svn dcommit будет пытаться выполнить коммит поверх SVN-коммита, указанного в

git log --grep=^git-svn-id: --first-parent -1

Вы must должны убедиться, что самый последний коммит ветви, в которую вы хотите выполнить dcommit, является first родительским коммитом слияния. В противном случае наступит хаос, особенно если первый родительский коммит — это более ранний коммит в той же ветке SVN.

git clone не клонирует ветви в иерархии refs/remotes или любые данные метаданных или конфигурации git svn. Таким образом, репозитории, созданные и управляемые с помощью git svn, должны использовать rsync для клонирования, если клонирование требуется.

Поскольку dcommit использует rebase внутри, любые ветви Git, которые вы git push до dcommit на, потребуют принудительной перезаписи существующей ссылки в удаленном репозитории. Это обычно считается плохой практикой, см. документацию git-push[1] для получения подробной информации.

Не используйте опцию --amend команды git-commit[1] для изменения, которое вы уже выполнили dcommit. Считается плохой практикой использовать --amend для коммитов, которые вы уже отправили в удаленный репозиторий другим пользователям, и dcommit с SVN аналогичен этому.

При клонировании репозитория SVN, если ни одна из опций для описания структуры репозитория не используется (--trunk, --tags, --branches, --stdlayout), git svn clone создаст репозиторий Git с полностью линейной историей, где ветви и теги отображаются как отдельные каталоги в рабочей копии. Хотя это самый простой способ получить копию всего репозитория, для проектов с множеством веток это приведёт к рабочей копии, значительно большей, чем просто trunk. Таким образом, для проектов, использующих стандартную структуру каталогов (trunk/branches/tags), рекомендуется клонировать с опцией --stdlayout. Если проект использует нестандартную структуру и/или ветки и теги не требуются, проще всего клонировать только один каталог (обычно trunk), не указывая никаких опций структуры репозитория. Если требуется полная история с ветками и тегами, необходимо использовать опции --trunk / --branches / --tags.

При использовании нескольких --branches или --tags, git svn не обрабатывает автоматически конфликты имён (например, если две ветки из разных путей имеют одинаковое имя или если ветка и тег имеют одинаковое имя). В этих случаях используйте init для настройки своего репозитория Git, а затем, перед первым fetch, отредактируйте файл $GIT_DIR/config таким образом, чтобы ветки и теги были связаны с различными именованными пространствами. Например:

branches = stable/*:refs/remotes/svn/stable/*
branches = debug/*:refs/remotes/svn/debug/*

Настройка

git svn сохраняет информацию о конфигурации [svn-remote] в файле конфигурации репозитория $GIT_DIR/config. Она похожа на разделы [remote] ядра Git, за исключением того, что ключи fetch не принимают аргументы glob; вместо этого они обрабатываются ключами branches и tags. Поскольку некоторые SVN-репозитории имеют необычную конфигурацию с несколькими проектами, разрешены расширения glob, такие как перечисленные ниже:

[svn-remote "project-a"]
        url = http://server.org/svn
        fetch = trunk/project-a:refs/remotes/project-a/trunk
        branches = branches/*/project-a:refs/remotes/project-a/branches/*
        branches = branches/release_*:refs/remotes/project-a/branches/release_*
        branches = branches/re*se:refs/remotes/project-a/branches/*
        tags = tags/*/project-a:refs/remotes/project-a/tags/*

Обратите внимание, что подстановка * (звездочка) для локальной ссылки (справа от :) должна быть самой правой частью пути; однако, подстановка в удалённой ссылке может быть в любом месте, пока это независимая часть пути (окружённая / или EOL). Такой тип конфигурации не создаётся автоматически init и должен вводиться вручную с помощью текстового редактора или с помощью git config.

Также обратите внимание, что звездочка (*) разрешена только один раз на слово. Например:

branches = branches/re*se:refs/remotes/project-a/branches/*

сопоставит ветки release, rese, re123se, однако

branches = branches/re*s*e:refs/remotes/project-a/branches/*

вызовет ошибку.

Также можно извлечь подмножество веток или тегов, используя список имён, разделённых запятыми, в фигурных скобках. Например:

[svn-remote "huge-project"]
        url = http://server.org/svn
        fetch = trunk/src:refs/remotes/trunk
        branches = branches/{red,green}/src:refs/remotes/project-a/branches/*
        tags = tags/{1.0,2.0}/src:refs/remotes/project-a/tags/*

Поддерживаются несколько ключей fetch, branches и tags:

[svn-remote "messy-repo"]
        url = http://server.org/svn
        fetch = trunk/project-a:refs/remotes/project-a/trunk
        fetch = branches/demos/june-project-a-demo:refs/remotes/project-a/demos/june-demo
        branches = branches/server/*:refs/remotes/project-a/branches/*
        branches = branches/demos/2011/*:refs/remotes/project-a/2011-demos/*
        tags = tags/server/*:refs/remotes/project-a/tags/*

Создание ветки в такой конфигурации требует разграничения места, которое следует использовать, используя флаги -d или --destination:

$ git svn branch -d branches/server release-2-3-0

Обратите внимание, что git-svn отслеживает максимальный номер ревизии, в котором появилась ветка или тег. Если подмножество веток или тегов изменяется после извлечения, то $GIT_DIR/svn/.metadata необходимо вручную отредактировать, чтобы удалить (или сбросить) branches-maxRev и/или tags-maxRev, как это необходимо.

Файлы

$GIT_DIR/svn/**/.rev_map.*

Сопоставление между номерами ревизий Subversion и именами коммитов Git. В репозитории, где опция noMetadata не установлена, это можно перестроить из строк git-svn-id, которые находятся в конце каждого коммита (см. раздел svn.noMetadata выше для получения подробной информации).

git svn fetch и git svn rebase автоматически обновляют rev_map, если он отсутствует или не является актуальным. git svn reset автоматически перематывает его.

Ошибки

Мы игнорируем все свойства SVN, кроме svn:executable. Любые необработанные свойства записываются в $GIT_DIR/svn/<refname>/unhandled.log

Переименованные и скопированные каталоги не распознаются Git и, следовательно, не отслеживаются при выполнении коммитов в SVN. Я не планирую добавлять поддержку этого, так как это довольно сложно и трудоёмко сделать работающим для всех возможных случаев (Git тоже этого не делает). Коммиты переименованных и скопированных файлов полностью поддерживаются, если они достаточно похожи, чтобы Git их распознал.

В SVN возможно (хотя и не рекомендуется) выполнить коммит изменений в тег (поскольку тег — это просто копия каталога, поэтому технически он такой же, как и ветка). При клонировании репозитория SVN, git svn не может знать, произойдёт ли такой коммит в тег в будущем. Таким образом, он действует консервативно и импортирует все теги SVN как ветки, добавляя префикс tags/ к имени тега.

См. также

git-rebase[1]

svn

© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-svn

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API