Як перенести репозиторій SVN з історією в новий репозиторій Git
Я читав Git керівництво, FAQ, Git - курс збою SVN і т.д. і всі вони пояснюють це і це, але ніде ви не можете знайти просту інструкцію типу:
Репозиторій SVN у: svn://myserver/path/to/svn/repos
Git репозиторій у: git://myserver/path/to/git/repos
Я не очікую, що це буде так просто, і я не чекаю, що це буде одна команда. Але я очікую, що він не спробує нічого пояснити, просто скажу, які кроки слід зробити в цьому прикладі.
Git та SVN працюють по-різному. Вам потрібно дізнатися Git, і якщо ви хочете відстежувати зміни з SVN вгору, вам потрібно дізнатися git-svn. На сторінці посібника git-svn є гарний приклад:
Створіть файл користувача (тобто users.txt ) для порівняння користувачів SVN з Git:
Ви можете використовувати цей однорядковий шрифт для створення шаблону з існуючого репозиторію SVN:
SVN зупиниться, якщо виявить відсутнього користувача SVN у файлі. Але після цього ви можете оновити файл та пікап, де ви зупинилися.
Тепер витягніть дані SVN з репозиторію:
Ця команда створить новий репозиторій Git у dest_dir-tmp та почне витягувати репозиторій SVN. Зауважте, що прапор "--stdlayout" означає, що у вас є спільний макет SVN/, гілки /, теги/SVN. Якщо ваш макет відрізняється, ознайомтеся з параметрами --tags , --branches , --trunk (загалом git svn help ).
Зверніть увагу: після виконання цієї команди дуже часто виглядає, що операція "зависає/заморожується", і цілком нормально, що вона може застрягти протягом тривалого часу після ініціалізації нового репозиторію. Зрештою, ви побачите повідомлення журналу, які вказують, що він мігрує.
Такожзверніть увагу, що якщо ви опустите прапор --no-metadata , Git буде додавати інформацію про відповідну версію SVN у повідомлення фіксації (тобто git-svn-id: svn://svn.mycompany.com/myrepo/ @ )
Якщо ім'я користувача не знайдено, оновіть файл users.txt , а потім:
Можливо, вам доведеться повторювати цю останню команду кілька разів, якщо у вас великий проект, доки не будуть отримані всі транзакції Subversion:
Якщо ви хочете зберегти інші віддалені гілки у своєму репозиторії, ви хочете створити локальну гілку для кожного з них вручну. (Пропустити магістраль/майстер.) Якщо ви цього не зробите, гілки не будуть клоновані на останньому етапі.
Теги імпортуються як гілки. Ви повинні створити локальну гілку, створити тег і видалити гілку, щоб мати їх як теги в Git. Зробити це за допомогою тега "v1":
Скопіюйте репозиторій GIT-SVN у чистий репозиторій Git:
Локальні гілки, створені раніше з віддалених гілок, будуть скопійовані лише як віддалені гілки до нового клонованого репозиторію. (Пропустити магістраль/майстер). Для кожної гілки, яку ви хочете зберегти:
Нарешті, видаліть віддалений з вашого чистого репозиторію Git, який вказує на тепер віддалений тимчасовий репозиторій:
Потім ви можете завантажити дані Subversion у репозиторій Git:
Якщо ви на Mac, ви можете отримати git-svn з MacPorts, встановивши git-core +svn.
Якщо ваш репозиторій subversion знаходиться на тому ж комп'ютері, що і ваш бажаний репозиторій Git, то ви можете використовувати цей синтаксис для кроку init, інакше все одно:
Я використав svn2git script і працює як шарм! https://github.com/nirvdrum/svn2git
Я пропоную вам комфортно працювати з Git, перш ніж намагатись використовувати git-svn постійно, тобто.зберігати SVN як централізоване репо і локально використовувати Git.
Однак для простої міграції з усією історією ось кілька простих кроків:
Ініціалізувати локальне репо:
Позначте, як далеко назад ви хочете розпочати імпорт версій:
(або просто "git svn fetch" для всіх обертів)
Власне забрати все з того часу:
Ви можете перевірити результат імпорту за допомогою Gitk. Я не впевнений, що це працює у Windows, воно працює на OSX та Linux:
Якщо у вас клонований локально репозиторій SVN, ви можете натиснути його на централізоване репо Git для спрощення спільної роботи.
Спочатку створіть порожню віддалену репо (можливо, на GitHub?):
Потім, за бажанням, синхронізуйте свою основну гілку, щоб операція pull автоматично з'єднувала віддалений майстер з вашим локальним майстром, коли обидва містять новий матеріал:
Після цього вам може бути цікаво спробувати власний інструмент git_remote_branch, який допомагає працювати з віддаленими гілками:
Перше пояснювальне повідомлення: Git видалені гілки
З'явилося нове рішення для плавної міграції з Subversion до Git (або одночасного використання): SubGit (http://subgit.com/).
Я сам працюю над цим проектом. Ми використовуємо SubGit у наших репозиторіях - деякі з моїх товаришів за командою використовують Git та деякі Subversion, і поки що це працює дуже добре.
Щоб перейти від Subversion до Git за допомогою SubGit, потрібно запустити:
Після цього ви отримаєте репозиторій Git svn_repos/.git і можете клонувати його або просто продовжувати використовувати Subversion і цей новий репозиторій Git разом: SubGit буде стежити за тим, щоб обидва вони завжди синхронізувалися.
Якщо вашрепозиторій Subversion містить кілька проектів, то в каталозі svn_repos/git буде створено кілька репозиторіїв Git. Щоб налаштувати трансляцію перед запуском, виконайте такі дії:
З SubGit ви можете перейти на чистий Git (не git -svn) і почати використовувати його, зберігаючи при цьому Subversion стільки, скільки вам потрібно (для ваших вже налаштованих інструментів складання, наприклад).
Надіюсь це допоможе!
Див офіційну git-svn manpage. Зокрема, перегляньте розділ "Основні приклади":
Відстеження та внесення вкладу у весь проект, керований Subversion (повний з багажником, тегами та гілками):
SubGit (проти синього екрану смерті)
+ Для оновлення з SVN, репозиторію Git, створеного першою командою.
Я використав спосіб миттєво перейти на Git для величезного репозиторію. Звичайно, вам потрібна підготовка. Але ви можете взагалі не зупиняти процес розробки.
Моє рішення виглядає так:
- Перенесення SVN в репозиторій Git
- Оновіть репозиторій Git перед переходом команди на.
Міграція займає багато часу для великого SVN репозиторію. Але оновлення завершеної міграції лише секунд.
Звісно, я використовую SubGit, мамо. git-svn робить мене Синій екран смерті. Просто постійно. І git -svn нудно мене з Git "filename надто довго" фатальна помилка.
КРОКІВ
2. Підготуйте команди переносу та оновлення.
Скажімо, ми робимо це для Windows (це очевидно для порту Linux). У каталозі SubGitbin (subgit-2.X.X\bin) створіть два .bat файли.
Вміст файлу/команди для перенесення:
Команда "start" тут необов'язкова (Windows). Це дозволить побачити помилки при запуску та залишитиоболонка відкрита після завершення SubGit.
(Якщо ви хочете перенести теги, наприклад гілки, або ваш SVN мати кілька папок гілок/тегів, ви можете використовувати більш детальний підхід Subgit )
Рада 2. Міграція може бути перервана ( Ctrl + C ) і відновлена шляхом запуску наступної команди/файлу оновлення. Я не раджу робити це для великих репозиторіїв. Я отримав "Вичерпний виняток Java + Windows".
Рада 3. Найкраще створити копію свого репозиторію без результатів.
Вміст файлу/команди для оновлення:
Ви можете запускати його будь-яку кількість разів, коли хочете, щоб остання команда зафіксувала ваш репозиторій Git.
Попередження! Не чіпайте свій голий репозиторій (наприклад, створення гілок). Ви отримаєте таку фатальну помилку:
Невідновна помилка: не синхронізовані та не можуть бути синхронізовані. Переклад версій Subversion до Git робить.
3. Запустіть першу команду/файл. Для великого сховища знадобиться час очікування. 30 годин для мого скромного сховища.
Всі. Ви можете оновити репозиторій Git із SVN у будь-який час, скільки разів, запустивши другий файл/команду. І перед перемиканням вашої команди розробників на Git. Це триватиме кілька секунд.
Є ще одне корисне завдання.
Натисніть локальний репозиторій Git на віддалений репозиторій Git
Це ваш випадок? Продовжимо.
- Підготуйте початкову відправку свого величезного локального репозиторію Git у віддалений репозиторій
За замовчуванням ваш Git не може надсилати великі шматки. фатальний: віддалений кінець несподівано повісив трубку
Запустіть для цього:
524288000 – 500 МБ 1073741824 – 1 ГБ і т.д.
Виправте локальні проблеми із сертифікатами. Якщо ваш git-сервер використовує зламаний сертифікат.
Я відключив сертифікати.
Крім того, ваш сервер Git може мати обмеження на кількість запитів, які необхідно виправити.
Запустіть з локальним Git:
(git push origin '*: *' для старих версій Git)
Якщо ви отримаєте таке:помилка: не може з'явитися Git: немає файлу або каталогу. Для мене повне відновлення мого сховища вирішує цю помилку (30 годин). Ви можете спробувати наступні команди
Або спробуйте перевстановити Git (марно для мене ). Або ви можете створювати гілки з усіх ваших тегів та натискати їх. Або, або, або.
reposurgeon
Для складних випадків репозиторій Ерік С. Раймонд є інструментом вибору. На додаток до SVN він підтримує багато інших систем управління версіями через формат fast-export, а також CVS. Автор повідомляє про успішні конверсії древніх репозиторіїв, таких як Emacs та FreeBSD.
Інструмент, мабуть, орієнтований на майже ідеальне перетворення (наприклад, перетворення SVN svn:ignore властивостей у файли .gitignore ) навіть для складних макетів репозиторію з довгою історією. Для багатьох випадків інші інструменти можуть бути простішими у використанні.
Перш ніж вникати в документацію командного рядка reposurgeon, обов'язково прочитайте відмінне Посібник з міграції DVCS, яке перейде на процес перетворення крок за кроком.
Цей посібник на сайті atlassian є одним з кращих, які я знайшов:
Цей інструмент – https://bitbucket.org/atlassian/svn-migration-scripts – також дуже корисний для створення вашого author.txt між іншим.
Дещо розширена відповідь, використовуючи тільки git, SVN і bash. Він включаєв собі кроки для репозиторіїв SVN, які не використовують звичайне компонування з макетом макета магістралі/гілок/тегів (SVN абсолютно нічого не робить для забезпечення такого макету).
Спочатку використовуйте цей bash script для сканування вашого SVN-репо для різних людей, які зробили внесок і для створення шаблону для файлу зіставлення:
Використовуйте це, щоб створити файл authors , в якому ви зіставляєте імена користувачів svn з іменами користувачів та електронною поштою, заданими вашими розробниками, використовуючи git config властивості user.name та user.email (зверніть увагу, що для такої служби, як GitHub, достатньо наявності відповідного листа).
Потім git svn клонувати репозиторій svn репозиторій git, повідомляючи йому про зіставлення:
git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot
Це може зайняти дуже багато часу, оскільки git svn індивідуально перевірятиме кожну ревізію для кожного існуючого тега або гілки. (Зверніть увагу, що теги в SVN є дійсно гілками, тому вони закінчуються як такі у Git). Ви можете прискорити це, видаляючи старі теги та гілки у SVN, які вам не потрібні.
Виконання цього на сервері в тій самій мережі або на тому ж сервері може дійсно прискорити це. Крім того, якщо з якоїсь причини цей процес припиняється, ви можете відновити його за допомогою
git svn rebase --continue
У багатьох випадках ви тут. Але якщо ваше SVN-репо має нетрадиційне компонування, де у вас просто є каталог в SVN, який ви хочете помістити в гілку git, ви можете зробити кілька додаткових кроків.
Ви також можете зробити це за допомогою git. Для git svn clone просто використовуйте каталог, який ви бажаєтепомістити у гілку git.
Зауважте, що для цього потрібно git 1.7 або вище.
Вам потрібно встановити
1. Отримати список всіх комітерів Subversion
З кореня вашої локальної перевірки Subversion виконайте таку команду:
Це дозволить захопити всі повідомлення журналу, вирвати імена користувачів, усунути будь-які імена користувачів, що повторюються, відсортувати імена користувачів і помістити їх у файл "authors-transform.txt". Відредагуйте кожний рядок у файлі. Наприклад, convert:
2. Clone the Subversion repository за допомогою git-svn
Це буде стандартне перетворення git -svn (з використанням файлу authors-transform.txt, створеного на кроці 1) і помістіть репозиторій Git у папку "
/temp" всередині вашого домашнього каталогу.
3. Перетворення svn: ігнорувати властивості до .gitignore
Якщо ваше svn repo використовувало властивості svn:ignore, ви можете легко перетворити його на файл .gitignore, використовуючи:
4. Push-репозиторій у голий репозиторій Git
По-перше, створіть голий репозиторій і зробіть його розгалуження у відповідь за умовчанням svns "trunk" .
Потім перемістіть репозиторій temp новий відкритий репозиторій.
Тепер ви можете безпечно видалити репозиторій
5. Перейменуйте гілку "trunk" на "master"
Ваша основна гілка розвитку буде називатися "trunk", яка відповідає імені, яке було в Subversion. Ви хочете перейменувати його на стандартну гілку Git s за допомогою:
6. Очищення гілок та тегів
git -svn робить всі теги Subversions в дуже короткі гілки в Git форми "tags/name". Youll хоче перетворити всі ці гілки на фактичні теги Git, використовуючи:
Цей крок займе трохивведення.:-) Але, не хвилюйся; ваша оболонка unix надасть > вторинне запрошення для команди extra-long, яка починається з Git for-each-ref.