Русский ▾ Topics ▾ Latest version ▾ git-svn last updated in 2.52.0

НАЗВАНИЕ

git-svn — Двунаправленная работа между репозиторием Subversion и Git

ОБЗОР

git svn <команда> [<параметры>] [<аргументы>]

ОПИСАНИЕ

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=<подкаталог-основной-ветки>
-t<подкаталог-меток>
--tags=<подкаталог-меток>
-b<подкаталог-веток>
--branches=<подкаталог-веток>
-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>

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

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

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

--ignore-paths=<regex>

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

--include-paths=<regex>

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

--no-minimize-url

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

fetch

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

Это автоматически обновляет 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>

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

ключ конфигурации: svn-remote.<имя>.ignore-refs

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

--ignore-paths=<regex>

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

ключ конфигурации: svn-remote.<имя>.ignore-paths

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

Примеры:

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

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

ключ конфигурации: svn-remote.<имя>.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"

rebase

Это получает редакции из родительского каталога SVN текущего HEAD и перемещает (rebase) текущую (не зафиксированную в 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 относительно последнего полученного коммита из вышестоящего (upstream) SVN.

dcommit

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

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

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

--no-rebase

После фиксации не выполнять перемещение (rebase) и не сбрасывать (reset).

--commit-url <URL>

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

ключ конфигурации: svn-remote.<имя>.commiturl
ключ конфигурации: svn.commiturl (перезаписывает все опции svn-remote.<имя>.commiturl)

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

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

--mergeinfo=<mergeinfo>

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

ключ конфигурации: svn.pushmergeinfo

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

--interactive

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

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

branch

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

-m
--message

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

-t
--tag

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

-d<путь>
--destination=<path>

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

git config --get-all svn-remote.<имя>.branches git config --get-all svn-remote.<имя>.tags

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

--username

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

--commit-url

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

git config --get-all svn-remote.<имя>.commiturl
--parents

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

tag

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

log

Это должно упростить поиск сообщений 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

также показывает sha1 коммита Git

--oneline

наша версия --pretty=oneline

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

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

blame

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

--git-format

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

find-rev

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

-B
--before

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

-A
--after

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

set-tree

Вам следует рассмотреть возможность использования dcommit вместо этой команды. Фиксирует указанные объекты-коммиты или объекты-деревья в SVN. Это полагается на то, что ваши импортированные данные получения (fetch) актуальны. Это абсолютно не пытается выполнять наложение патчей при фиксации в SVN, оно просто перезаписывает файлы теми, которые указаны в дереве или коммите. Предполагается, что всё слияние произошло независимо от функций git svn.

create-ignore

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

show-ignore

Рекурсивно находит и выводит свойства 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

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

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

-m <сообщение>
--message=<сообщение>

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

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

Взять сообщение коммита из заданного файла. Эта опция отключает опцию --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 (externals). Используйте -r/--revision, чтобы указать конкретную редакцию.

gc

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

reset

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

Изменяются только rev_map и refs/remotes/git-svn (подробности см. в разделе ФАЙЛЫ ниже, $GIT_DIR/svn/**/.rev_map.*). После reset выполните fetch, а затем git reset или git rebase, чтобы переместить локальные ветки на новое дерево.

-r <n>
--revision=<n>

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

-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=<каталог-шаблонов>

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

-r <аргумент>
--revision <аргумент>

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

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

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

-
--stdin

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

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

--rmdir

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

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

ключ конфигурации: svn.rmdir
-e
--edit

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

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

ключ конфигурации: svn.edit
-l<число>
--find-copies-harder

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

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

ключ конфигурации: svn.l
ключ конфигурации: svn.findcopiesharder
-A<filename>
--authors-file=<filename>

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

	логин = Joe User <user@example.com>

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

ключ конфигурации: svn.authorsfile
--authors-prog=<filename>

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

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

ключ конфигурации: 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, которые показывают, какие различия (diffs) будут зафиксированы в SVN.

Для rebase отображает локальную ветку, связанную с вышестоящим (upstream) репозиторием svn, связанным с текущей веткой, и URL-адрес репозитория svn, из которого будет выполняться получение (fetch).

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

--use-log-author

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

ключ конфигурации: svn.useLogAuthor
--add-author-from

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

ключ конфигурации: svn.addAuthorFrom

РАСШИРЕННЫЕ ПАРАМЕТРЫ

-i<GIT_SVN_ID>
--id <GIT_SVN_ID>

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

-R<имя-внешнего-репозитория>
--svn-remote <имя-внешнего-репозитория>

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

--follow-parent

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

ключ конфигурации: svn.followparent

ПАРАМЕТРЫ ТОЛЬКО ДЛЯ ФАЙЛА КОНФИГУРАЦИИ

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

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

Этот параметр может использоваться только для одноразового импорта, так как git svn не сможет снова выполнить получение (fetch) без метаданных. Кроме того, если вы потеряете файлы $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.<имя>.pushurl в Git, этот ключ предназначен для использования в случаях, когда url указывает на репозиторий SVN через транспорт только для чтения, чтобы предоставить альтернативный транспорт для чтения/записи. Предполагается, что оба ключа указывают на один и тот же репозиторий. В отличие от commiturl, pushurl является базовым путём. Если может быть использован либо commiturl, либо pushurl, commiturl имеет приоритет.

svn.brokenSymlinkWorkaround

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

svn.pathnameencoding

Это указывает git svn перекодировать имена путей в заданную кодировку. Это может использоваться пользователями Windows и теми, кто работает в не-utf8 локальных настройках, чтобы избежать повреждённых имён файлов с не-ASCII символами. Допустимые кодировки — те, которые поддерживаются модулем Perl Encode.

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 (игнорируя метки и ветки):

# Клонировать репозиторий (как git clone):
	git svn clone http://svn.example.com/project/trunk
# Войти в только что клонированный каталог:
	cd trunk
# Вы должны быть в ветке master, дважды проверьте с помощью 'git branch'
	git branch
# Сделайте немного работы и зафиксируйте локально в Git:
	git commit ...
# Что-то зафиксировано в SVN, переместите (rebase) ваши локальные изменения относительно
# последних изменений в SVN:
	git svn rebase
# Теперь зафиксируйте ваши изменения (которые были ранее зафиксированы с помощью Git) в SVN,
# а также автоматически обновите ваш рабочий HEAD:
	git svn dcommit
# Добавьте настройки svn:ignore и svn:global-ignores в файл исключений Git по умолчанию:
	git svn show-ignore >> .git/info/exclude

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

# Клонировать репозиторий со стандартной структурой каталогов SVN (как git clone):
	git svn clone http://svn.example.com/project --stdlayout --prefix svn/
# Или, если репозиторий использует нестандартную структуру каталогов:
	git svn clone http://svn.example.com/project -T tr -b branch -t tag --prefix svn/
# Просмотреть все клонированные ветки и метки:
	git branch -r
# Создать новую ветку в SVN
	git svn branch waldo
# Сбросить вашу master до trunk (или любой другой ветки, заменив 'trunk'
# соответствующим именем):
	git reset --hard svn/trunk
# Вы можете выполнить dcommit только в одну ветку/метку/trunk за раз. Использование
# dcommit/rebase/show-ignore должно быть таким же, как указано выше.

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

# Выполнить начальный импорт на сервере
	ssh server "cd /pub && git svn clone http://svn.example.com/project [параметры...]"
# Клонировать локально - убедитесь, что пространство refs/remotes/ соответствует серверу
	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
# Предотвратить fetch/pull из внешнего Git-сервера в будущем,
# мы хотим использовать только git svn для будущих обновлений
	git config --remove-section remote.origin
# Создать локальную ветку из одной из только что полученных веток
	git checkout -b master FETCH_HEAD
# Инициализировать 'git svn' локально (обязательно используйте тот же URL-адрес и
# параметры --stdlayout/-T/-b/-t/--prefix, которые использовались на сервере)
	git svn init http://svn.example.com/project [параметры...]
# Получить последние изменения из Subversion
	git svn rebase

REBASE ПРОТИВ PULL/MERGE

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

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

ОТСЛЕЖИВАНИЕ СЛИЯНИЙ

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

ОБРАБОТКА ВЕТОК SVN

Если git svn настроен на получение веток (и действует --follow-branches), он иногда создаёт несколько веток Git для одной ветки SVN, причём дополнительные ветки имеют имена вида имя-ветки@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. На это указывает сообщение "Initializing parent: <имя-ветки>".

Кроме того, он создаст специальную ветку с именем <имя-ветки>@<SVN-Редакция>, где <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 клонировали, получали (fetch) и выполняли dcommit непосредственно с сервера SVN и избегали всех операций git clone/pull/merge/push между репозиториями и ветками Git. Рекомендуемый метод обмена кодом между ветками и пользователями Git — это git format-patch и git am, или просто выполнение dcommit в репозиторий SVN.

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

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

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

Поэтому вы должны убедиться, что самый последний коммит ветки, в которую вы хотите выполнить dcommit, является первым родителем слияния. В противном случае возникнет хаос, особенно если первый родитель является более старым коммитом в той же ветке 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/*

Имейте в виду, что wildcard-символ * (звёздочка) локальной ссылки (справа от :) должен быть самым правым компонентом пути; однако внешний wildcard может быть где угодно, если он является независимым компонентом пути (окружённым / или концом строки). Этот тип конфигурации не создаётся автоматически командой 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 отслеживает самую высокую редакцию, в которой появилась ветка или метка. Если подмножество веток или меток изменяется после получения (fetch), то файл $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/<имя-ссылки>/unhandled.log

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

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

СМ. ТАКЖЕ

GIT

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