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-remoteurl(или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-remoteurl(илиfetchпуть) назад к оригиналу домен/url/путьтеперь бегите
git svn rebase -lснова сделать локальную перебазировку с изменениями, которые пришли с последней операцией выборки. На этот раз это будет работает, видимо, потому чтоgit svnне будет смущать тот факт, чтоgit-svn-idновая голова не совпадает с тем, что найдено в.git/config.наконец, изменить
svn-remoteurl(или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. Если эта команда зависает, что-то не так. Оно должен ре