Перенос существующего Git-репозитория в SVN - PullRequest
381 голосов
/ 19 марта 2009

Я делал всю свою работу в Git и отправлял на GitHub. Я был очень доволен как программным обеспечением, так и сайтом, и я не хочу менять свои рабочие методы на этом этапе.

Мой доктор наук советует всем студентам хранить свою работу в хранилище SVN, которое находится в университете. Я нашел тонны документации и учебных пособий о том, как перенести существующий репозиторий SVN в Git, но ничего о переносе репозитория Git в свежий репозиторий SVN. Я ожидаю, что должен быть какой-то способ сделать это с помощью сочетания git-svn и свежей ветки, перебазирования и всех этих замечательных терминов, но я новичок в Git и не чувствую уверенности ни в одном из них.

Затем я хочу просто запустить пару команд для отправки коммитов в этот SVN-репозиторий, когда я выберу. Я хочу продолжать использовать Git и просто иметь зеркало репозитория SVN, что есть в Git.

Я буду единственным человеком, который когда-либо принимал участие в SVN, если это что-то изменит.

Ответы [ 17 ]

0 голосов
/ 07 мая 2017

Мне недавно пришлось перенести несколько репозиториев Git в SVN, и после попытки найти все решения, которые я смог найти, в конечном итоге мне помогло Mercurial (да, с использованием третьего VCS) , Используя это руководство , я придумал следующий процесс (в Linux, но основная идея должна работать и в Windows).

  1. Необходимые пакеты:

    $ sudo apt-get install git subversion mercurial python-subversion
    
  2. Mercurial необходимо настроить, добавив в ~/.hgrc следующее:

    [extensions]
    hgext.convert=
    
  3. Создайте несколько временных рабочих каталогов (у меня было несколько репозиториев для переноса, поэтому я создал каталоги для версий SVN и Git, чтобы разделить их):

    $ mkdir svn
    $ mkdir git
    
  4. Создать пустой локальный репозиторий SVN:

    $ svnadmin create svn/project
    
  5. Клонировать существующее хранилище Git:

    $ git clone server/path/project.git git/project
    
  6. Пусть Mercurial сделает свое дело:

    $ hg convert --dest-type svn git/project svn/project
    
  7. Теперь SVN-репозиторий должен содержать полную историю коммитов, но не с оригинальными временными метками. Если это не проблема, пропустите следующую часть до шага 11.

  8. После небольшой работы можно изменить дату и время каждого коммита . Поскольку мои репозитории довольно малы, для меня было возможно сделать это вручную. Сначала создайте хук pre-revprop-change в репозитории SVN со следующим содержимым, чтобы можно было изменить необходимое свойство:

    #!/bin/bash
    exit 0;
    

    Этот скрипт должен быть выполнен исполняемым:

    $ chmod +x svn/project/hooks/pre-revprop-change
    
  9. Mercurial создал рабочую копию SVN-репозитория с именем project -wc, поэтому переключитесь на нее и измените время фиксации:

    $ cd project-wc
    $ svn propedit svn:date --revprop -r 1
    

    Введите правильную дату и время (обратите внимание на часовые пояса!) И сохраните. Вы должны получить сообщение «Установите новое значение для свойства svn: date в ревизии 1».
    Теперь промойте и повторите для каждой другой ревизии.

  10. При желании проверьте историю фиксации, чтобы убедиться, что все выглядит хорошо:

    $ svn log -r 1:HEAD
    

    Затем вернитесь на один уровень вверх:

    $ cd ..
    
  11. Дамп репозитория:

    $ svnadmin dump svn/project > project.dump
    
  12. И загрузите дамп на ваш сервер Subversion. Готово!

Этот процесс, вероятно, также будет работать напрямую между удаленными репозиториями, но мне было проще работать с локальными. Исправление времени коммита было большой работой, но в целом процесс был намного проще, чем любой другой метод, который я нашел.

0 голосов
/ 02 декабря 2015

В моем случае мне пришлось инициировать чистый проект из SVN

$ Project> git svn init protocol://path/to/repo -s
$ Project> git svn fetch

добавьте все источники вашего проекта ...

$ Project> git add .
$ Project> git commit -m "Importing project sources"
$ Project> git svn dcommit
0 голосов
/ 01 декабря 2015

Я просто хочу поделиться своим опытом с принятым ответом. Я сделал все шаги, и все было хорошо, прежде чем я выполнил последний шаг:

git svn dcommit

$ git svn dcommit

Использование неинициализированного значения $ u при подстановке (s ///) в /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm строка 101.

Использование неинициализированного значения $ u в конкатенации (.) Или в строке /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm, строка 101. refs / remotes / origin / HEAD: 'https://192.168.2.101/svn/PROJECT_NAME' не найден в' '

Я нашел поток https://github.com/nirvdrum/svn2git/issues/50 и, наконец, решение, которое я применил в следующем файле в строке 101 / USR / Lib / perl5 / vendor_perl / 5,22 / Git / SVN.pm

Я заменил

$u =~ s!^\Q$url\E(/|$)!! or die

с

if (!$u) {
    $u = $pathname;
} 
else {
       $u =~ s!^\Q$url\E(/|$)!! or die
      "$refname: '$url' not found in '$u'\n";
}

Это исправило мою проблему.

0 голосов
/ 09 июня 2014

Что если вы не хотите фиксировать каждый коммит, который вы делаете в Git, в репозиторий SVN? Что если вы просто хотите выборочно отправлять коммиты по каналу? Ну, у меня есть лучшее решение.

Я держу один локальный репозиторий Git, где все, что я когда-либо делаю, это выборка и слияние из SVN. Таким образом, я могу убедиться, что я включаю все те же изменения, что и в SVN, но я полностью храню свою историю коммитов из SVN.

Тогда я храню отдельную локальную рабочую копию SVN, которая находится в отдельной папке. Это тот, из которого я делаю коммиты обратно в SVN, и для этого я просто использую утилиту командной строки SVN.

Когда я готов передать состояние моего локального Git-репозитория в SVN, я просто копирую весь беспорядок файлов в локальную рабочую копию SVN и фиксирую его оттуда, используя SVN, а не Git.

Таким образом, мне никогда не придется делать какие-либо перебазировки, потому что перебазирование похоже на freebasing.

0 голосов
/ 25 июня 2018

Еще одна сработавшая последовательность (с некоторыми комментариями на каждом шаге):

  1. Установка git-svn и subversion наборов инструментов:

    sudo apt-get install git-svn subversion
    
  2. Переключатель внутри PROJECT_FOLDER

    cd PROJECT_FOLDER
    
  3. Создайте путь проекта на сервере Subversion (к сожалению, текущий плагин git-svn имеет дефект по сравнению с TortoiseSVN). Невозможно сохранить исходный код непосредственно в PROJECT_FOLDER. Вместо этого по умолчанию он загрузит весь код в PROJECT_FOLDER/trunk.

    svn mkdir - родительский протокол: /// path / to / repo / PROJECT_FOLDER / trunk -m "создание заполнителя git repo"

Это место, где trunk в конце пути обязательно

  1. Инициализировать контекст плагина git-svn в папке .git

    git svn init -s protocol:///path/to/repo/PROJECT_FOLDER
    

    Это место, где trunk в конце пути ненужно

  2. Получить пустую Subversion информацию о хранилище

    git svn fetch
    

    Этот шаг помогает синхронизировать сервер Subversion с плагином git-svn. Это момент, когда плагин git-svn устанавливает путь remotes/origin и связывает его с подпапкой trunk на стороне сервера.

  3. Перебазирование старых коммитов Git произошло до того, как плагин git-svn подключился к процессу (этот шаг необязательный )

    git rebase origin/trunk
    
  4. Добавление новых / измененных файлов для фиксации (этот шаг является обычным для действий Git и является необязательным )

    git add .
    
  5. Зафиксируйте только что добавленные файлы в локальный репозиторий Git (этот шаг необязательный и применим только в том случае, если был использован шаг 7):

    git commit -m "Importing Git repository"
    
  6. Передача всей истории изменений проекта на сервер Subversion:

    git svn dcommit
    
0 голосов
/ 06 марта 2019

есть три метода:

  1. rebase : как и другие ответы

  2. идентификатор фиксации: найти svn, идентификатор первой фиксации и git, идентификатор первой фиксации, отобразить их в .git / info / grafts: echo "git_id svn_id}" > .git/info/grafts затем git svn dcommit

  3. извлечение каждого коммита git, копирование файлов в svn_repo, коммит svn

bash demo : github demo

v1.x : используйте rebase и передайте идентификатор

v2.x: использовать файлы копирования, а затем svn commit

0 голосов
/ 19 марта 2009

Вы можете создать новый SVN-репозиторий. Экспортируйте свой проект Git (выделив файлы .git). Добавьте его в репозиторий SVN (инициализируя репозиторий тем, что у вас было в Git). Затем используйте инструкции для импорта SVN-репозиториев в новый проект Git.

Но это потеряет вашу предыдущую историю Git.

...