Я делал всю свою работу в Git и подталкивал к GitHub. Я был очень доволен как программным обеспечением, так и сайтом, и у меня нет желания менять свою рабочую практику на этом этапе.
Мой доктор PhD советует всем студентам хранить свою работу в хранилище SVN, которое находится в университете. Я нашел тонны документации и учебных пособий о том, как перенести существующий репозиторий SVN в Git, но ничего о переносе репозитория Git в новый репозиторий SVN. Я ожидаю, что должен быть какой-то способ сделать это с помощью сочетания git-svn и свежей ветки, перебазирования и всех этих замечательных терминов, но я новичок в Git и не чувствую уверенности ни в одном из них.
Затем я хочу просто запустить пару команд для отправки коммитов в этот SVN-репозиторий, когда я выберу. Я хочу продолжать использовать Git и просто иметь зеркало репозитория SVN, что есть в Git.
Я буду единственным человеком, когда-либо совершившим SVN, если это что-то изменит.
Ответы:
Мне это тоже нужно было, и с помощью ответа Бомбе + немного повозиться, я заработал. Вот рецепт:
Импорт Git -> Subversion
После # 3 вы получите загадочное сообщение, подобное этому:
Просто игнорируй это.
Когда вы запустите # 5, вы можете получить конфликты. Решите их, добавив файлы с состоянием «unmerged» и возобновив их перебазирование. В конце концов, вы закончите; затем выполните синхронизацию с репозиторием SVN, используя
dcommit
. Это все.Синхронизация репозиториев
Теперь вы можете синхронизироваться из SVN в Git, используя следующие команды:
И для синхронизации из Git в SVN используйте:
Конечная нота
Возможно, вы захотите попробовать это на локальной копии, прежде чем применять к живому репозиторию. Вы можете сделать копию своего репозитория Git во временное место; просто используйте
cp -r
, так как все данные находятся в самом хранилище. Затем вы можете настроить файловый репозиторий тестирования, используя:И проверьте рабочую копию, используя:
Это позволит вам поиграть с вещами, прежде чем вносить какие-либо длительные изменения.
Приложение: Если вы испортили
git svn init
Если вы случайно запустили
git svn init
неправильный URL-адрес и не были достаточно умны, чтобы сделать резервную копию своей работы (не спрашивайте ...), вы не можете просто выполнить эту же команду еще раз. Однако вы можете отменить изменения, выполнив:И удалить раздел
[svn-remote "svn"]
раздела.Вы можете запустить
git svn init
заново.источник
Вот как мы это сделали:
Клонируйте свой репозиторий Git где-нибудь на своей машине.
Откройте .git / config и добавьте следующее (из раздела «Поддержка зеркала SVN только для чтения» в репозитории Git ):
Теперь из окна консоли введите:
Теперь, если по какой-то причине это не работает, введите эти три строки:
И, наконец, вы можете передать в SVN:
Примечание. После этого я всегда удаляю эту папку.
источник
Unable to determine upstream SVN information from HEAD history.
git merge -s recursive -Xtheirs --allow-unrelated-histories master
.Использование
git rebase
напрямую приведет к потере первого коммита. Git относится к этому по-другому и не может перебазировать это.Существует процедура, которая сохранит полную историю: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034
Я напишу решение здесь, но кредиты для Бьёрна.
Инициализировать git-svn:
--Prefix дает вам удаленные ветви отслеживания, такие как «svn / trunk», что хорошо, потому что вы не получите двусмысленных имен, если вы будете называть вашу локальную ветку просто «trunk». И
-s
это ярлык для стандартного макета ствола / теги / ветви.Получить исходный материал из SVN:
Теперь посмотрите хэш вашего корневого коммита (должен отображаться один коммит):
Затем получите хэш пустого коммита транка:
Создайте прививку:
Теперь «gitk» должен отображаться
svn/trunk
как первый коммит, на котором основана ваша основная ветка.Сделайте прививку постоянной:
Бросьте трансплантат:
Гитк все равно должен показываться
svn/trunk
в родословной мастера.Линеаризуйте свою историю поверх ствола:
А теперь "git svn dcommit -n" должен сообщить вам, что он собирается фиксировать транк.
источник
Создайте новый каталог в хранилище Subversion для своего проекта.
Перейдите к проекту, управляемому Git, и инициализируйте git-svn.
Это создаст один коммит, потому что ваш каталог проекта SVN по-прежнему пуст. Теперь перебазируйте все на этом коммите,
git svn dcommit
и все готово. Это серьезно испортит ваши даты коммитов.источник
Git -> SVN с полной историей коммитов
У меня был проект Git и мне пришлось перенести его в SVN. Вот как я это сделал, сохранив всю историю коммитов. Единственное, что теряется - это оригинальное время коммита, так как libSVN установит местное время, когда мы это сделаем
git svn dcommit
.Как:
Есть SVN-репозиторий, куда мы хотим импортировать наш материал и клонировать его с помощью git-svn:
Иди туда:
Добавьте удаленный репозиторий Git (в этом примере я использую C: /Projects/repo.git ). Вы хотите нажать на SVN и дать ему имя old-git:
Извлеките информацию из основной ветки из старого Git-репозитория в текущий репозиторий:
Извлеките основную ветку удаленного old-git в новую ветвь с именем old в текущем хранилище:
Перебазируйте, чтобы положить ГОЛОВУ поверх старого git / master. Это сохранит все ваши коммиты. В основном это сводится к тому, чтобы взять всю вашу работу, выполненную в Git, и поставить ее поверх работы, к которой вы обращаетесь из SVN.
Теперь вернитесь к вашей основной ветке:
И вы можете видеть, что у вас есть чистая история коммитов. Это то, что вы хотите подтолкнуть к SVN.
Разместите свою работу в SVN:
Это все. Это очень чисто, без взлома, и все отлично работает из коробки. Наслаждаться.
источник
git svn
репозитория SVN, а ее импортирует в подпапку, поэтому необходимо несколько предварительных операций.Я бы предложил очень короткую инструкцию по 4 командам с использованием SubGit . Смотрите этот пост для деталей.
источник
Мне нужно было зафиксировать свой существующий Git-репозиторий в пустом SVN-репозитории.
Вот как мне удалось сделать это:
Работало без проблем. Я надеюсь, что это помогает кому-то.
Поскольку мне пришлось авторизоваться под другим именем пользователя в SVN-хранилище (я
origin
использую аутентификацию с использованием открытого / открытого ключа), мне пришлось использовать это--username
свойство.источник
git-svn
прежде чем это станет возможным, см. stackoverflow.com/questions/527037/git-svn-not-a-git-commandЕсли вы хотите продолжать работать с Git в качестве основного репозитория и вам просто нужно время от времени «экспортировать» ревизии в SVN, вы можете использовать Tailor для синхронизации SVN-репозитория. Он может копировать ревизии между различными системами контроля версий и обновлять SVN с изменениями, которые вы делаете в Git.
Я не пробовал преобразование Git в SVN, но для примера SVN -> SVN посмотрите этот ответ .
источник
Еще одна последовательность, которая работала (с некоторыми комментариями на каждом шаге):
Установить
git-svn
иsubversion
инструментарий:Переключить внутри
PROJECT_FOLDER
Создайте путь к проекту на сервере Subversion (к сожалению, текущий
git-svn
плагин имеет дефект по сравнению с TortoiseSVN). Невозможно сохранить исходный код непосредственно вPROJECT_FOLDER
. Вместо этого по умолчанию он загрузит весь код вPROJECT_FOLDER/trunk
.svn mkdir - родительский протокол: /// путь / к / repo / PROJECT_FOLDER / trunk -m "создание заполнителя git repo"
Это место, где
trunk
в конце пути обязательноИнициализировать
git-svn
контекст плагина внутри.git
папкиЭто место, где
trunk
в конце пути нет необходимостиПолучить информацию о пустом
Subversion
хранилищеЭтот шаг помогает синхронизировать сервер Subversion с
git-svn
плагином. Это момент, когдаgit-svn
плагин устанавливаетremotes/origin
путь и связывает его сtrunk
подпапкой на стороне сервера.Перебазирование старых коммитов Git произошло до того, как
git-svn
плагин включился в процесс (этот шаг не является обязательным )Добавьте новые / измененные файлы для фиксации (этот шаг является обычным для действий Git и является необязательным )
Зафиксируйте только что добавленные файлы в локальный репозиторий Git (этот шаг не является обязательным и применим только в том случае, если был использован шаг 7):
Передача всей истории изменений проекта на сервер Subversion:
источник
Вы можете сделать новый SVN-репозиторий. Экспортируйте свой проект Git (выделив файлы .git). Добавьте его в репозиторий SVN (инициализируя репозиторий тем, что у вас было в Git). Затем используйте инструкции по импорту SVN-репозиториев в свежий проект Git.
Но это потеряет вашу предыдущую историю Git.
источник
Если вам не нужно использовать какой-либо конкретный SVN, и вы используете GitHub, вы можете использовать их разъем SVN.
Более подробная информация здесь: Сотрудничество на GitHub с Subversion
источник
Я хотел бы поделиться отличным инструментом, используемым в сообществе WordPress, под названием Scatter
Git WordPress плагины и немного рассудка
Это позволяет пользователям автоматически отправлять свои репозитории Git на wordpress.org SVN. Теоретически этот код может быть применен к любому репозиторию SVN.
источник
Недавно мне пришлось перенести несколько репозиториев Git в SVN, и после того, как я попробовал все решения, которые смог найти, для меня наконец-то работал Mercurial (да, с использованием третьей VCS). Используя это руководство , я придумал следующий процесс (в Linux, но основная идея должна работать и в Windows).
Необходимые пакеты:
Mercurial необходимо настроить, добавив следующее в
~/.hgrc
:Создайте несколько временных рабочих каталогов (у меня было несколько репозиториев для миграции, поэтому я создал каталоги для версий SVN и Git, чтобы разделить их):
Создайте пустой локальный репозиторий SVN:
Клонировать существующий репозиторий Git:
Пусть Mercurial сделает свое дело:
Теперь SVN-репозиторий должен содержать полную историю коммитов, но не с оригинальными временными метками. Если это не проблема, пропустите следующую часть до шага 11.
С небольшой работой, можно изменить дату и время каждого коммита . Поскольку мои репозитории довольно малы, для меня было возможно сделать это вручную. Сначала создайте
pre-revprop-change
ловушку в репозитории SVN со следующим содержимым, чтобы можно было изменить необходимое свойство:Этот скрипт должен быть выполнен исполняемым:
Mercurial создал рабочую копию репозитория SVN с именем project -wc, поэтому переключитесь на нее и измените время фиксации:
Введите правильную дату и время (обратите внимание на часовые пояса!) И сохраните. Вы должны получить сообщение «Установите новое значение для свойства svn: date в ревизии 1».
Теперь промойте и повторите для каждой другой ревизии.
При желании проверьте историю фиксации, чтобы убедиться, что все выглядит хорошо:
Затем вернитесь на один уровень вверх:
Дамп репозитория:
И загрузите дамп на ваш сервер Subversion. Выполнено!
Этот процесс, вероятно, также будет работать напрямую между удаленными репозиториями, но мне было проще работать с локальными. Исправление времени коммита было большой работой, но в целом процесс был намного проще, чем любой другой метод, который я нашел.
источник
Есть три метода:
rebase : как и другие ответы
id фиксации: найдите svn id первого коммита и git id первого коммита, выведите их в .git / info / grafts:
echo "git_id svn_id}" > .git/info/grafts
затемgit svn dcommit
проверять каждый git коммит, копировать файлы в svn_repo, svn commit
демо bash: github demo
v1.x : используйте rebase и передайте id
v2.x: используйте копировать файлы, затем SVN-коммит
источник
В моем случае мне пришлось инициировать чистый проект из SVN
добавить все источники вашего проекта ...
источник
Я просто хочу поделиться своим опытом с принятым ответом. Я сделал все шаги, и все было хорошо, прежде чем я выполнил последний шаг:
Я нашел ветку https://github.com/nirvdrum/svn2git/issues/50 и, наконец, решение, которое я применил в следующем файле в строке 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm.
Я заменил
с
Это исправило мою проблему.
источник
Что делать, если вы не хотите совершать каждый коммит, который вы делаете в Git, в репозиторий SVN? Что если вы просто хотите выборочно отправлять коммиты по каналу? Ну, у меня есть лучшее решение.
Я держу один локальный репозиторий Git, где все, что я когда-либо делаю, это выборка и слияние из SVN. Таким образом, я могу убедиться, что я включаю все те же изменения, что и в SVN, но я полностью храню свою историю коммитов и SVN.
Затем я храню отдельную локальную рабочую копию SVN, которая находится в отдельной папке. Это тот, из которого я делаю коммиты обратно в SVN, и я просто использую утилиту командной строки SVN для этого.
Когда я готов зафиксировать состояние моего локального Git-репозитория в SVN, я просто копирую весь беспорядок файлов в локальную рабочую копию SVN и фиксирую его оттуда, используя SVN, а не Git.
Таким образом, мне никогда не придется делать перебазирование, потому что перебазирование похоже на freebasing.
источник