Сохранение истории копий 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.