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 85

6 ответов:

это обрабатывает мою ситуацию довольно хорошо:

https://git.wiki.kernel.org/index.php/GitSvnSwitch

я клонировал с помощью file:// протокол, и хотел переключиться на http:// протокол.

это наталкивает на редактирование url настройка в на .git/config, но само по себе это не работает. В общем случае вам необходимо выполнить следующую процедуру:

  1. переключите svn-remote url установка на новое имя.
  2. выполнить git svn fetch. Это должно принести по крайней мере одну новую редакцию из svn!
  3. изменить svn-remote url возврат к исходному URL-адресу.
  4. выполнить git svn rebase -l чтобы сделать локальную перебазировку (с изменениями, которые пришли с последней операцией выборки).
  5. изменить svn-remote url возврат к новому URL-адресу.
  6. теперь git svn rebase должны работать снова.

авантюрные души могут захотеть попробуй --rewrite-root.

вы можете увидеть, если следующее работает нормально:

  1. если svn-remote.svn.rewriteRoot не существует в файле config (.git/config):

    git config svn-remote.svn.rewriteRoot <currentRepositoryURL>
    
  2. если svn-remote.svn.rewriteUUID не существует в конфигурационный файл:

    git config svn-remote.svn.rewriteUUID <currentRepositoryUUID>
    

    The currentRepositoryUUID можно получить из .git/svn/.metadata.

  3. 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 / path

  • At этот момент 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.

  1. клон git_fast_filter от Gitorious РЕПО.
  2. создайте скрипт Python в том же каталоге, где вы клонировали git_fast_filter на основе в этом суть, установите исполняемый бит с помощью chmod +x. Адаптируйте старые и новые пути репозитория. (Содержимое скрипта также вставлено ниже.)
  3. инициализировать новый целевой репозиторий с помощью git init, измените рабочий каталог на это новое РЕПО.
  4. выполните следующий канал:

    (cd path/to/old/repo && git-fast-export --branches --tags --progress=100) | \
        path/to/git_fast_filter/commit_filter.py | git-fast-import
    
  5. скопировать .git/config, и, возможно, другие соответствующие файлы в .git/info от старого РЕПО к новому РЕПО.

  6. удалить .git/svn.
  7. сделать git-svn известно о новом отображении номера редакции

    1. выполнить git branch refs/remotes/git-svn master

      • ваши пульты git-svn могут называться иначе, чем refs/remotes/git-svn, проконсультируйтесь с .git/config,svn-remote разделы
    2. выполнить git svn info. Если эта команда зависает, что-то не так. Оно должен ре