Сохранение истории копий svn при конвертации в git

Я пытаюсь преобразовать репозиторий SVN в несколько репозиториев git. До сих пор я использовал git svn clone svn_repo_project_path для каждого проекта в SVN. Я заметил, что git, похоже, не выполняет операции копирования svn, поэтому итоговая история намного короче, чем я ожидал. Предположим, что мой репозиторий SVN выглядел так:

корень

  • б
  • с
  • Родитель-проектируемый
    • б
    • с

проектов b а также c были недавно скопированы под parent-proj как часть усилий по реструктуризации с намерением в конечном итоге удалить их из их старых расположений под root. Когда я делаю git svn clone http://svnhost/parent-proj в результирующем git репо отсутствует вся история, которая произошла от /b а также /c до переезда.

Это ограничение git-svn или есть какой-то способ показать эту историю в моем репо? Из моего ограниченного исследования кажется, что использование filter-branch Команда, описанная в разделе Получение полной истории репозитория SVN, переименованного с помощью git-svn, может работать, хотя в моем случае есть несколько родителей, что, вероятно, усложняет ситуацию. Может ли быть лучшим подходом клонирование всего репо, а затем выделение из него новых репо (с использованием ответвления фильтра?)?

1 ответ

Вы не получите историю pre-copy-to-parent-proj для b или же c если ты git svn clone http://svnhost/parent-proj, git svn интерпретирует предоставленный вами базовый путь как самую мелкую точку, которую вы хотите использовать для принятия SVN-коммитов, и Git-коммиты для того же. Как исторические коммиты под b а также c находятся за пределами этого пути, git svn не буду отражать их, поэтому у вас не будет этой истории.

Посмотрите на документацию для git svn init --no-minimize-url опция:

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

Так как ваш clone команда не задает несколько ветвей (возможно, из-за того, что у вас сложный, многопроектный или нестандартный макет), git svn просто клоны совершают по этому пути и вниз. Shadow Creeper в комментариях использовал -s или же --stdlayout вариант, который может объяснить, почему некоторая история была сохранена для них.

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

Последнее слово предостережения о поисках истории в клоне Git. Ищите историю в файле, используя git log -C --follow <file-path> и Git, как правило, хорошо справляется с поиском и предоставлением вам истории, включающей переименования и копии. Не ожидайте того же для каталогов, например parent-proj/b, Git отслеживает BLOB-объекты (файлы), деревья (BLOB-объектов), коммиты и родительские коммиты, но не обрабатывает каталоги или копии каталогов так же, как SVN.

Другие вопросы по тегам