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.
- -m
- 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
- -r
Параметры
- --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/ к имени тега.
См. также
svn
© 2005–2026 Linus Torvalds and others
Licensed under the GNU General Public License version 2.
https://git-scm.com/docs/git-svn