git-svn: что эквивалентно `SVN switch --relocate`?
репозиторий svn, который я зеркально отображаю через git-svn, изменил URL.
в vanilla svn вы бы просто сделали svn switch --relocate old_url_base new_url_base
.
Как я могу сделать это с помощью git-svn, так?
просто изменить url svn в файле конфигурации не удается.
6 ответов:
это обрабатывает мою ситуацию довольно хорошо:
https://git.wiki.kernel.org/index.php/GitSvnSwitch
я клонировал с помощью
file://
протокол, и хотел переключиться наhttp://
протокол.это наталкивает на редактирование
url
настройка в на.git/config
, но само по себе это не работает. В общем случае вам необходимо выполнить следующую процедуру:
- переключите svn-remote
url
установка на новое имя.- выполнить
git svn fetch
. Это должно принести по крайней мере одну новую редакцию из svn!- изменить svn-remote
url
возврат к исходному URL-адресу.- выполнить
git svn rebase -l
чтобы сделать локальную перебазировку (с изменениями, которые пришли с последней операцией выборки).- изменить svn-remote
url
возврат к новому URL-адресу.- теперь
git svn rebase
должны работать снова.авантюрные души могут захотеть попробуй
--rewrite-root
.
вы можете увидеть, если следующее работает нормально:
если
svn-remote.svn.rewriteRoot
не существует в файле config (.git/config
):git config svn-remote.svn.rewriteRoot <currentRepositoryURL>
если
svn-remote.svn.rewriteUUID
не существует в конфигурационный файл:git config svn-remote.svn.rewriteUUID <currentRepositoryUUID>
The
currentRepositoryUUID
можно получить из.git/svn/.metadata
.
git config svn-remote.svn.url <newRepositoryURL>
к сожалению, большинство ссылок в этих ответах не работают, поэтому я собираюсь дублировать немного информации из git wiki для дальнейшего использования.
это решение сработало для меня:
редактировать
svn-remote
url
(илиfetch
путь) в.git/config
на новый домен/url/путьRun git
git svn fetch
. это должно принести по крайней мере одну новую редакцию из СВН!если вы попытаетесь
git svn rebase
теперь, вы получите сообщение об ошибке вроде этого:Unable to determine upstream SVN information from working tree history
я думаю, это потому, что
git svn
смущает тот факт, что ваш последний коммит перед выборкой будет иметьgit-svn-id
указывая на старый путь, который не соответствует тому, который найден в.git/config
.в качестве обходного пути, изменить
svn-remote
url
(илиfetch
путь) назад к оригиналу домен/url/путьтеперь бегите
git svn rebase -l
снова сделать локальную перебазировку с изменениями, которые пришли с последней операцией выборки. На этот раз это будет работает, видимо, потому чтоgit svn
не будет смущать тот факт, чтоgit-svn-id
новая голова не совпадает с тем, что найдено в.git/config
.наконец, изменить
svn-remote
url
(илиfetch
путь) назад к новому домену / url / pathAt этот момент
git svn rebase
должны снова работать!первоначальная информация была найдена здесь.
git svn сильно зависит от URL-адреса svn. Каждая фиксация, импортированная из svn, имеет
git-svn-id
Это включает в себя URL svn.допустимая стратегия перемещения заключается в вызове
git-svn clone
в новом репозитории и объединить изменения на этот новый закрыть. Более подробную процедуру см. В этой статье:http://www.sanityinc.com/articles/relocating-git-svn-repositories
git filter-branch
этот скрипт, принятым от запись в блог, работал для меня. Поставьте старый и новый URL РЕПО как параметр, как раз как для
svn switch --relocate
.сценарий вызывает
git filter-branch
для замены URL-адресов Subversion вgit-svn-id
в сообщении, обновления.git/config
, а также обновленияgit-svn
метаданные, воссоздавая его с помощьюgit svn rebase
. В то время какgit svn clone
может быть более надежным решением,filter-branch
подход работает гораздо быстрее для огромных хранилищ (часов и дней).#!/bin/sh # Must be called with two command-line args. # Example: git-svn-relocate.sh http://old.server https://new.server if [ $# -ne 2 ] then echo "Please invoke this script with two command-line arguments (old and new SVN URLs)." exit $E_NO_ARGS fi # Prepare URLs for regex search and replace. oldUrl=`echo | awk '{gsub("[\\.]", "\\\\&");print}'` newUrl=`echo | awk '{gsub("[\\&]", "\\\\&");print}'` filter="sed \"s|^git-svn-id: $oldUrl|git-svn-id: $newUrl|g\"" git filter-branch --msg-filter "$filter" -- --all sed -i.backup -e "s|$oldUrl|$newUrl|g" .git/config rm -rf .git/svn git svn rebase
git_fast_filter
еще быстрее, чем
git-filter-branch
(т. е. минуты вместо часов), но похожий по духу, использоватьgit_fast_filter
. Однако для этого требуется немного больше кодирования, и никакого аккуратного готового решения не существует. В отличие отgit-filter-branch
, это создаст новая РЕПО с старый один. Предполагается, чтоmaster
указывает на последнюю фиксацию SVN.
- клон
git_fast_filter
от Gitorious РЕПО.- создайте скрипт Python в том же каталоге, где вы клонировали
git_fast_filter
на основе в этом суть, установите исполняемый бит с помощьюchmod +x
. Адаптируйте старые и новые пути репозитория. (Содержимое скрипта также вставлено ниже.)- инициализировать новый целевой репозиторий с помощью
git init
, измените рабочий каталог на это новое РЕПО.выполните следующий канал:
(cd path/to/old/repo && git-fast-export --branches --tags --progress=100) | \ path/to/git_fast_filter/commit_filter.py | git-fast-import
скопировать
.git/config
, и, возможно, другие соответствующие файлы в.git/info
от старого РЕПО к новому РЕПО.- удалить
.git/svn
.сделать
git-svn
известно о новом отображении номера редакции
выполнить
git branch refs/remotes/git-svn master
- ваши пульты git-svn могут называться иначе, чем
refs/remotes/git-svn
, проконсультируйтесь с.git/config
,svn-remote
разделывыполнить
git svn info
. Если эта команда зависает, что-то не так. Оно должен ре