Перенос существующего Git-репозитория в SVN

380
задан Peter Mortensen 25 October 2018 в 20:37
поделиться

5 ответов

Мне это тоже нужно было, и с помощью ответа Бомбе + немного повозиться, я заставил его работать. Вот рецепт:

Import Git -> Subversion

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

После # 3 вы получите загадочное сообщение, подобное этому:

Использование более высокого уровня URL: протокол : /// path / to / repo / PROJECT => protocol: /// path / to / repo

Просто игнорируйте это.

Когда вы запустите # 5, вы могли бы получить конфликты. Решите их, добавив файлы с состоянием «unmerged» и возобновив их перебазирование. В конце концов, вы закончите; затем выполните синхронизацию с репозиторием SVN, используя dcommit . Вот и все.

Поддержание синхронизации репозиториев

Теперь вы можете синхронизироваться из SVN в Git, используя следующие команды:

git svn fetch
git rebase trunk

А для синхронизации из Git в SVN используйте:

git svn dcommit

Заключительное примечание

Вы можете хочу попробовать это на локальной копии, перед применением в живом хранилище. Вы можете сделать копию своего репозитория Git во временное место; просто используйте cp -r , так как все данные находятся в самом хранилище. Затем вы можете настроить файловый репозиторий для тестирования, используя:

svnadmin create /home/name/tmp/test-repo

И проверить рабочую копию, используя:

svn co file:///home/name/tmp/test-repo svn-working-copy

Это позволит вам поиграться с вещами, прежде чем вносить какие-либо длительные изменения.

Приложение: Если вы запутались git svn init

Если вы случайно запустили git svn init с неверным URL, и вы не были достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду снова. Однако вы можете отменить изменения, выполнив:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем можно запустить git svn init заново.

Вы можете сделать копию своего репозитория Git во временное место; просто используйте cp -r , так как все данные находятся в самом хранилище. Затем вы можете настроить файловый репозиторий для тестирования, используя:

svnadmin create /home/name/tmp/test-repo

И проверить рабочую копию, используя:

svn co file:///home/name/tmp/test-repo svn-working-copy

Это позволит вам поиграться с вещами, прежде чем вносить какие-либо длительные изменения.

Приложение: Если вы запутались git svn init

Если вы случайно запустили git svn init с неверным URL, и вы не были достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду снова. Однако вы можете отменить изменения, выполнив:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем можно запустить git svn init заново.

Вы можете сделать копию своего репозитория Git во временное место; просто используйте cp -r , так как все данные находятся в самом хранилище. Затем вы можете настроить файловый репозиторий для тестирования, используя:

svnadmin create /home/name/tmp/test-repo

И проверить рабочую копию, используя:

svn co file:///home/name/tmp/test-repo svn-working-copy

Это позволит вам поиграться с вещами, прежде чем вносить какие-либо длительные изменения.

Приложение: Если вы испортили git svn init

Если вы случайно запустили git svn init с неверным URL, и вы не были достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду снова. Однако вы можете отменить изменения, введя:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем вы можете запустить git svn init заново.

просто используйте cp -r , так как все данные находятся в самом хранилище. Затем вы можете настроить файловый репозиторий для тестирования, используя:

svnadmin create /home/name/tmp/test-repo

И проверить рабочую копию, используя:

svn co file:///home/name/tmp/test-repo svn-working-copy

Это позволит вам поиграться с вещами, прежде чем вносить какие-либо длительные изменения.

Приложение: Если вы запутались git svn init

Если вы случайно запустили git svn init с неверным URL, и вы не были достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду снова. Однако вы можете отменить изменения, введя:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем вы можете запустить git svn init заново.

просто используйте cp -r , так как все данные находятся в самом хранилище. Затем вы можете настроить файловый репозиторий для тестирования, используя:

svnadmin create /home/name/tmp/test-repo

И проверить рабочую копию, используя:

svn co file:///home/name/tmp/test-repo svn-working-copy

Это позволит вам поиграться с вещами, прежде чем вносить какие-либо длительные изменения.

Приложение: Если вы испортили git svn init

Если вы случайно запустили git svn init с неверным URL, и вы не были достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду снова. Однако вы можете отменить изменения, введя:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем вы можете запустить git svn init заново.

svnadmin create /home/name/tmp/test-repo

И проверьте рабочую копию, используя:

svn co file:///home/name/tmp/test-repo svn-working-copy

Это позволит вам поиграться с вещами, прежде чем вносить какие-либо длительные изменения.

Приложение: Если вы запутались git svn init

Если вы случайно запустили git svn init с неправильным URL, и вы не были достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду очередной раз. Однако вы можете отменить изменения, введя:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем вы можете запустить git svn init заново.

svnadmin create /home/name/tmp/test-repo

И проверьте рабочую копию, используя:

svn co file:///home/name/tmp/test-repo svn-working-copy

Это позволит вам поиграться с вещами, прежде чем вносить какие-либо длительные изменения.

Приложение: Если вы запутались git svn init

Если вы случайно запустили git svn init с неправильным URL, и вы не были достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду очередной раз. Однако вы можете отменить изменения, выполнив:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем можно запустить git svn init заново.

Если вы достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду снова. Однако вы можете отменить изменения, выполнив:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем можно запустить git svn init заново.

Если вы достаточно умны, чтобы сделать резервную копию вашей работы (не спрашивайте ...), вы не можете просто запустить ту же команду снова. Однако вы можете отменить изменения, выполнив:

rm -rf .git/svn
edit .git/config

И удалите раздел section [svn-remote "svn"] .

Затем можно запустить git svn init заново.

400
ответ дан 22 November 2019 в 23:55
поделиться

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

, Но это потеряет Вашу предыдущую историю Мерзавца.

0
ответ дан Peter Mortensen 26 October 2018 в 06:37
поделиться
  • 1
    Я думаю, что Ваш код работает правильно теперь. Примечание о производительности: тестирование, если элемент находится в списке, является O (m), где m является длиной списка. С длинной строкой unicode с большим количеством различных повторных символов, эти character in repeated станет медленным, поскольку repeated содержит все больше элементов. – Mark Byers 18 February 2010 в 01:05

Если Вы хотите продолжить работать с Мерзавцем как Ваш основной репозиторий и просто должны "экспортировать" изменения SVN время от времени, Вы могли использовать Адаптация для хранения репозитория SVN в синхронизации. Это может скопировать изменения между системами управления другого источника и обновило бы SVN с изменениями, которые Вы вносите в Мерзавце.

я не попробовал преобразование Git-to-SVN, но для SVN->, пример SVN видит этот ответ .

2
ответ дан Peter Mortensen 26 October 2018 в 06:37
поделиться
  • 1
    @PlatinumAzure, повышения ValueError. Я предполагаю that' s довольно корректный способ обработать пустую последовательность, как он doesn' t имеют смысл просить первое не у повторенного символа в "" – John La Rooy 1 October 2012 в 23:14

Создайте новый каталог в репозитории Подрывной деятельности для Вашего проекта.

# svn mkdir --parents svn://ip/path/project/trunk

Изменение в Вашем управляемом Мерзавцами проекте и инициализируют мерзавца-svn.

# git svn init svn://ip/path/project -s
# git svn fetch

Это создаст единственную фиксацию, потому что Ваш каталог проекта SVN все еще пуст. Теперь повторно основывайте все на той фиксации, git svn dcommit, и Вы должны быть сделаны. Это серьезно испортит Ваши даты фиксации, все же.

8
ответ дан Peter Mortensen 26 October 2018 в 06:37
поделиться
  • 1
    @MichaelJ.Barber: Что-либо как массив или хэш-таблица будет O (1), но некоторые ответы здесь используют деревья и линейные списки, которые имеют типичные времена доступа O (зарегистрируйте n) к O (n). Таким образом, заключительные алгоритмы являются O (n, регистрируют n), или даже O (n^2). – Adrian McCarthy 12 July 2013 в 20:50

Использование git rebase напрямую приведет к потере первый коммит Git рассматривает его по-разному и не может перебазировать его.

Существует процедура, которая сохранит полную историю: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034

I здесь мы расшифруем решение, но кредиты предназначены для Бьёрна.

Инициализируйте git-svn:

git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2

--prefix дает вам ветки удаленного отслеживания, такие как «svn / trunk», что хорошо, потому что вы не получите двусмысленных имен, если будете называть вашу локальную ветку просто «trunk». А -s является ярлыком для стандартного макета ствола / тегов / ветвей.

Извлеките исходный материал из SVN:

git svn fetch

Теперь посмотрите хэш вашего корневого коммита (должен отображаться один коммит ):

git rev-list --parents master | grep '^.\{40\}$'

Затем получите хеш пустого коммита ствола:

git rev-parse svn/trunk

Создайте трансплантат:

echo <root-commit-hash> <svn-trunk-commit-hash> >> .git/info/grafts

Теперь «gitk» должен показать svn / trunk как первый коммит, на котором ваша ветвь master

Сделайте трансплантат перманентным:

git filter-branch -- ^svn/trunk --all

Бросьте трансплантат:

rm .git/info/grafts

Гитк должен по-прежнему показывать svn / trunk в происхождении мастера.

Линеаризовать вашу историю на вершине ствола :

git svn rebase

А теперь "git svn dcommit -n" должен сказать вам, что он собирается фиксировать транк.

git svn dcommit
27
ответ дан 22 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: