Що робити з великою історією svn при переході до git?


23

Редагувати: на відміну від деяких подібних питань, таких як переміщення репортажу SVN з декількома ГБ до Git або /programming/540535/managing-large-binary-files-with-git Мій сценарій не передбачає декількох підпроектів, які може бути легко перетворений у підмодулі git, а також кілька дуже великих двійкових файлів, які добре підходять для git-annex. Це єдине сховище, де двійкові файли є тестовим набором, який щільно поєднується з основним вихідним кодом тієї ж редакції, як, якби вони складали часові активи, такі як графіка.

Я досліджую переключення старого середнього / великого розміру (50 користувачів, 60-ти редакцій, історія 80Gb, робоча копія 2Gb) із сховища коду svn. Оскільки кількість користувачів зросла, в багажнику спостерігається велика потужність, а функції часто розповсюджуються на декілька комітетів, що робить перевірку коду важкою. Крім того, без розгалуження немає способу "погасити" поганий код, огляди можна робити лише після того, як він буде здійснений до ствола. Я розслідую альтернативи. Я сподівався, що ми можемо перейти до git, але у мене є деякі проблеми.

Проблема з поточним репо, що стосується git, - це розмір. Тут багато старої крихти, і очищення її за допомогою --filter-гілки при переході на git може скоротити її на розмір на порядок, приблизно до 5-10 Гб. Це все ще занадто велико. Найбільшою причиною великого розміру сховища є те, що існує багато бінарних документів, які входять до тестів. Ці файли варіюються від .5mb до 30mb, а їх сотні. Вони також мають досить багато змін. Я переглянув підмодулі, git-annex тощо, але тести в підмодулі почуваються неправильно, як і у додатку для багатьох файлів, для яких ви хочете отримати повну історію.

Тож розподілений характер git - це насправді те, що заважає мені його прийняти. Мене не дуже цікавить розподілене, я просто хочу дешевого розгалуження та потужних функцій злиття. Як я припускаю, що 99,9% користувачів git роблять, ми будемо використовувати блаженне, голове центральне сховище.

Я не впевнений, що розумію, чому кожен користувач повинен мати повну локальну історію під час використання git? Якщо робочий процес не є децентралізованим, що це за дані на дисках користувачів? Я знаю, що в останніх версіях git можна використовувати дрібний клон із лише недавньою історією. Моє запитання: чи можливо це зробити як стандартний режим роботи для всієї команди? Чи можна налаштувати git завжди неглибоко, щоб ви мали повну історію лише централізовано, але користувачі за замовчуванням мають лише 1000 обертів історії? Варіантом цього, звичайно, було б просто перетворити 1000 об. В git і зберегти svn repo для археології. Однак у цьому сценарії ми знову зустрінемося з тією ж проблемою після наступних кількох тисяч змін до тестових документів.

  • Що таке хороша найкраща практика для використання мерзотника з великими РЕПО , що містять багато бінарних файлів , які ви дійсно хочете історію? Більшість найкращих практик та навчальних посібників, схоже, уникають цієї справи. Вони вирішують проблему кількох величезних двійкових файлів або пропонують повністю скинути бінарні файли.
  • Чи є дрібне клонування корисним як звичайний режим роботи чи це "злом"?
  • Чи можуть підмодулі використовуватися для коду, коли ви маєте жорстку залежність між версією основного джерела та переглядом підмодуля (наприклад, у бінарних залежностях компіляції або наборі тестових пакетів)?
  • Наскільки великий "занадто великий" для сховища git (у приміщеннях)? Чи слід уникати комутації, якщо ми можемо знизити її до 4 Гб? 2 Гб?


Я багато шукав інформацію про це, і не знайшов нічого, що відповіло б на моє запитання. У пов'язаному запитанні робочі місця (підмодулі, додаток тощо) будуть працювати набагато краще, ніж у моєму сценарії.
Андерс Форсгрен


Perforce може бути кращим варіантом, ніж git, оскільки він розроблений для справлення з великою кількістю великих бінарних файлів, тому їх використовують багато розробників ігор. Пластик см також варто подивитися.
Ян

Лише вбік: якщо ви можете, уникайте підмодулів git, оскільки вони надто ускладнюють систему складання (що вже складно у вашому випадку).
ІгорГанапольський

Відповіді:


10

Нічого собі, це довге питання (і складна проблема). Я спробую спробувати.

Я не впевнений, що розумію, чому кожен користувач повинен мати повну локальну історію під час використання git?

Це центральне дизайнерське рішення з git. З точних причин вам потрібно запитати автора (Лінус Торвальдс), але, наскільки я знаю, головна причина - швидкість: наявність всього локального (на швидкому диску або навіть кешованій пам’яті) робить операції з історією набагато швидшими уникаючи доступу до мережі.

Найбільшою причиною великого розміру сховища є те, що існує багато бінарних документів, які входять до тестів. Ці файли варіюються від .5mb до 30mb, а їх сотні. Вони також мають досить багато змін.

Про це я б спершу задумався. Наявність такої кількості постійних змін бінарних файлів у керуванні джерелами мені здається проблематичною (навіть із SVN). Ви не можете використовувати інший підхід? Ідеї:

  • На відміну від вихідного коду, двійковий файл розміром 3 Мб, ймовірно, не пишеться від руки. Якщо якийсь інструмент / процес генерує його, розгляньте можливість інтегрувати його у свою збірку замість зберігання даних.

  • Якщо це не практично, бінарні файли, як правило, краще зберігати у сховищі артефактів (наприклад, Artifactory for Maven & co.). Можливо, це варіант для вас.

Я переглянув підмодулі, git-annex тощо, але тести в підмодулі почуваються неправильно, як і у додатку для багатьох файлів, для яких ви хочете отримати повну історію.

Насправді це виглядає так, що git-annex ідеально підійде. git-annex в основному дозволяє зберігати вміст файлів поза сховищем git (сховище містить замість заповнення). Ви можете зберігати вміст файлу різними способами (центральний git repo, спільний диск, хмарне зберігання ...), а також ви можете керувати тим, який вміст ви хочете мати локально.

Ви, можливо, неправильно зрозуміли, як працює git-annex? git-annex зберігає повну історію для всіх файлів, якими він керує - він просто дозволяє вибрати вміст файлу, який ви хочете мати локально.

Нарешті, про ваші запитання:

Яка найкраща найкраща практика використання git з великими репозитами, що містять багато бінарних файлів, для яких ви хочете історію?

На мій досвід, зазвичай такі варіанти:

  • уникайте потреби в бінарних файлах у репо-рене (генеруйте їх на вимогу, зберігайте їх в іншому місці)
  • використовувати git-annex (або подібне рішення, наприклад, Git LFS)
  • жити з великим репо (не всі операції з git впливають на великі файли, і якщо у вас швидкий комп'ютер і диск, це може бути досить працездатним)

Чи є дрібне клонування корисним як звичайний режим роботи чи це "злом"?

Це може бути здійснено; однак, я не думаю, що це вирішить вашу проблему:

  • ви втратите переваги git, що випливають із повної історії, як-от швидкий пошук історії
  • злиття можуть стати складними, тому що для AKAIK у вас повинен бути принаймні історія назад до точки розгалуження, щоб злитися
  • Користувачам доведеться періодично повторно клонувати, щоб розмір їх клону був невеликим
  • це просто незвичайний спосіб використання git, тому ви, швидше за все, зіткнетеся з проблемами з багатьма інструментами

Наскільки великий "занадто великий" для сховища git (у приміщеннях)? Чи слід уникати комутації, якщо ми можемо знизити її до 4 Гб? 2 Гб?

Це залежить від структури репо (мало / багато файлів тощо), від того, що ви хочете зробити, від того, наскільки надійні ваші комп’ютери, і від вашого терпіння :-).

Для швидкого уявлення: на моєму (новому, але малоефективному) ноутбуці створення файлом у 500 Мб займає 30-60 секунд. На великі файли не впливає лише перелік історії (журнал git тощо); такі речі, як "git log -S", який повинен сканувати вміст файлів, дуже повільний, проте швидкість в основному домінує вводу / виводу, так що це не справді вина Git.

На репо з об’ємом 3 ГБ із кількома доопрацюваннями "git log -S" займає близько хвилини.

Тому я б сказав, що пару ГБ гаразд, хоча і не ідеально. Більше 10-20 Гб, ймовірно, штовхає його, але це може бути здійсненим - вам доведеться спробувати.


Дякуємо за детальну відповідь. Я неодмінно буду вивчати використання додатку для тестових документів. Штрих для "розумної продуктивності", ймовірно, "близький до svn", тобто якщо він значно повільніший для будь-якої операції, то для перемикання буде занадто багато тертя.
Андерс Форсгрен

Я думаю, що Git LFS також можна використовувати для великого зберігання бінарних файлів.
ІгорГанапольський

@IgorG. Так, Git LFS - це альтернатива, є й інші. Дякую, що вказали на це, я відредагував свою публікацію.
sleske

4

Оскільки кількість користувачів зросла, в багажнику спостерігається велика потужність, а функції часто розповсюджуються на декілька комітетів, що робить складний перегляд коду. Крім того, без розгалуження немає способу "погасити" поганий код, огляди можна робити лише після того, як він буде здійснений до ствола

Переміщення до git не вирішить цих проблем, вони полягають у тому, як ви використовуєте цей інструмент, і якщо ви використовуєте git таким же чином, проблеми залишаться.

Ви можете розгалужувати в svn так само легко в git, і злиття, як правило, так само просто і має ті самі підводні камені. Git був розроблений для роботи з вихідним кодом ядра, тому він зробив деякі припущення, які можуть застосовуватися не у всіх випадках, наприклад, ваш з великими бінарними файлами та масовими історіями. Задум DVCS полягає в тому, щоб кожен користувач ефективно працював поодинці і лише після цього співпрацював - тобто у них є власне репо (копія), працювати як їм подобається, а потім надсилати зміни на всіх, хто цього хоче. Для цього ідеально підходить федеративна система, яка використовується в розробці ядра Linux - ви натискаєте свої зміни на наступного хлопця в ланцюжку, який з’єднує його зі своєю кодовою базою, а потім пересилає його до наступного хлопця, доки він не потрапить до Лінуса, який поставить його у реліз. Більшість команд використовують git аналогічно, але лише 1 хлопець вгору за течією, який часто є "золотим" репо на стороні сервера,

Тому я хотів би спершу змінити ваш робочий процес, лише перемістившись до git, коли ви матимете кращий спосіб роботи. Реалізуйте розгалуження та об'єднання в SVN, якщо ви не перейменовуєте файли чи каталоги, об'єднання пройде досить добре.


4
"Ви можете розгалужувати в svn так само легко в git, і злиття, як правило, так само просто і має ті самі підводні камені", ось це справді суперечливе твердження. Злиття в git, на мою думку, - це звичайно вітер, а в svn - це звичайно кошмар, навіть у версіях після напівзапеченої спроби слідування за злиттям (так, я працюю з git, не тільки над цим репо). Ми хочемо мати робочий процес, коли ви створюєте гілку функції, перегляд коду / CI будуєте на цій гілці. Просто немає способу зробити це у SVN без масових розладів.
Андерс Форсгрен

2
ні, ми робимо це постійно тут. Я просто проходжу 157 відділень у своєму репортажі SVN, щоб побачити, яку можна видалити. Ми розгалужуємо, розробляємо, переглядаємо, а потім зливаємось майже щодня тут, періодично потрапляючи в проблеми, але це завжди виправляється, знімаючи нову гілку зі стовбура та об'єднуючи зміни до цього (щоб це можна було легко злити назад до магістралі пізніше) . Це дійсно стосується лише стародавніх гілок. Якщо у вас масові розлади, ви не розумієте це досить добре. Git також доставить вам великі розчарування.
gbjbaanb

2
Я просто не переживаю цього. Під час роботи з git (як я вже казав, що я роблю, але в менших репостах) мені здається, що це дуже легко і природно робити функції розгалуження, відсікання, збивання та злиття. "Деревні конфлікти після перейменувань" і т.д. відчуваються набагато рідше, і той факт, що ви можете наслідувати лінійну та просту історію (через rebase + сквош тощо) є дуже важливим. Отже: задля збереження питання по темі (git з великими репозиціями): Дозвольте припустити, що svn не підтримує потрібний мені робочий процес, а git робить.
Андерс Форсгрен

1
У попередній компанії ми використовували git, і я знаю когось, хто раніше регулярно втрачав свою роботу, використовуючи її, тож це не є ідеальною системою жодним чином! Не SVN, але SVN набагато краще підходить для ваших обставин, ніж git IMHO, і він працює. На тему, як змусити git працювати так, як ти хочеш ... Я справді не впевнений, що це буде, вибач.
gbjbaanb

7
@gbjbaanb якщо хтось втрачає роботу з Git, вони роблять щось жахливо не так.
RubberDuck

2

Перегляньте список розсилки GCC. Міграція вихідного дерева компілятора GCC з SVN на GIT обговорюється зараз (серпень та вересень 2015 року), зберігаючи історію GCC. Див., Наприклад, сховище для механізмів перетворення та критерії прийняття для потоків пошти для перетворення git ; Ви знайдете посилання на інструменти та процедури, пов’язані з перетворенням (що не так просто, як здається; на перетворення такої великої історії бази коду потрібно 36 годин і приблизно 64 Гбайт оперативної пам’яті, IIRC)


Ви мали на увазі перехід із SVN до Git? Перехід від системи контролю версій до набору компіляторів здається трохи… дивним. Крім того, це трохи більше нагадує коментар, ніж відповідь.
8bittree

Так. Вибачте за друкарські помилки.
Базиль Старинкевич

Спасибі. 36 годин звучить як вітер, наш може перетворитись за пару тижнів ...
Anders Forsgren

2

Якщо перетворення всього сховища SVN в Git призводить до величезного сховища, яке неможливо клонувати, ви можете спробувати використовувати SubGit для створення менших дзеркал Git для певних частин вашого сховища Subversion.

Наприклад, ви можете імпортувати та синхронізувати деякий підкаталог вашого сховища SVN http://domain/repos/trunk/project/src:

subgit configure --layout auto --trunk trunk/project/src http://domain/repos project.git
edit project.git/subgit/config
edit project.git/subgit/authors.txt
subgit install project.git

Більш детальну інформацію про використання SubGit див. У його документації .

Як тільки у вас з'явиться дзеркало Git цього каталогу, ви можете використовувати репозиторій Git для подання нових змін, які негайно відображаються у сховищі SVN. Оскільки ви лише синхронізуєте певну частину сховища SVN, яка значно скорочує розмір перетвореного сховища Git, і ви все ще можете створювати гілки, об'єднувати їх, використовувати будь-який робочий процес з боку Git.

Крім того, ви можете імпортувати весь сховище SVN, але виключити великі файли з синхронізації:

subgit configure --layout auto --trunk trunk http://domain/repos project.git
edit project.git/subgit/config
...
[svn]
    excludePath = *.bin
    excludePath = *.iso
...
edit project.git/subgit/authors.txt
subgit install project.git

Результат сховища Git повинен мати розумний розмір, і розробники все ще можуть використовувати Git для подання змін до сховища Subversion.

Зауважте, що це рішення повинно працювати для вас, якщо ви готові підтримувати сервер Subversion і використовувати Git поряд зі своїм сховищем SVN.

Відмова: Я один із розробників SubGit; SubGit - комерційне програмне забезпечення, що пропонує безліч безкоштовних варіантів.


1

Я б підходив до вашої ситуації наступним чином:

1) Ініціалізуйте сховище git у тому самому каталозі, що і репортаж SVN. Зробіть git initі git remote add originзапустити цю git repo. Таким чином, ви можете продовжувати здійснювати SVN та git окремо, не займаючись повним перетворенням з одного на інший, поки ви не будете готові.

2) Активно використовуйте інструменти bfg та фільтр-філія, щоб спробувати зменшити git repo, як це обговорювалось тут: https://confluence.atlassian.com/bitbucket/reduce-repository-size-321848262.html

3) Використовуйте git-annex або Git LFS, або просто зовнішній сервер зберігання даних для великих бінарних файлів (транспортування файлів за допомогою скриптів оболонки під час збирання).

4) Після того, як вам зручно використовувати стратегію злиття / розгалуження у вашому git repo, і вам буде зручно розміром git repo, ви зможете зробити повну міграцію зі свого svn на git.

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.