Переміщення репортажу SVN багато Гб в Git


13

В даний час у моїй компанії є рішення Visual Studio в репортажі SVN, яке організоване так:

SolutionFolder (~3.5 GB)
|-> SolutionName.sln
|-> .. Some source code folders... (~250 MB)
|-> ThirdParty (~3 GB)
|-> Tools
    | -> Tool1
    | -> Tool2

Tool1 та Tool2 будуються незалежно (мають власні рішення), але створюють виконувані файли, які використовуються в основній збірці. Папка ThirdParty містить всі залежності для проекту, включаючи деякі попередньо складені 100+ МБ файлів .lib та великі бібліотеки на зразок boost.

Це зручно мати все в одному репортажі SVN, так що (1) розробник повинен зробити лише одну перевірку, і (2) нам не потрібно відслідковувати, які версії залежностей нам потрібні для кожної версії збірки. З іншого боку, щоб перевірити це репо, потрібно певний час.

Що було б найкращим способом перемістити цю структуру проекту до git? Імовірно, найкраще виключити ThirdParty та, можливо, Інструменти з основного репортажу, але ми хотіли б, щоб ThirdParty легко завантажувався за один крок, і нам це подобається (і невідповідності версій між основною репо та ThirdParty / Tools були б поганими).

На даний момент мене не цікавить збереження історії, а лише з'ясування способів організації такого проекту.


Це розміри вище розмірів у репост, включаючи історію, чи ті розміри локальної робочої копії?
Док Браун

1
@DocBrown лише локальна робоча копія, не включає історію.
ikh

Відповіді:


10

Використовуйте належний інструмент для роботи. У Windows це означає

Використовуйте NuGet для сторонніх залежностей

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

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

Редагувати після коментарів: Найкращий спосіб використання NuGet - це налаштування локального джерела NuGet, або на загальному диску, або на повному сервері. В іншому випадку налаштування не повинно зайняти більше декількох хвилин. Таким чином, ви можете гарантувати, що всі необхідні вам пакунки завжди будуть доступні, незалежно від місця їх виникнення.


Чи будується командний рядок підтримки NuGet? Я завжди шукаю портативну конструкцію, яку я можу змусити Дженкінса побудувати і протестувати для мене. Чи підтримує NuGet такі сервери CI, як Jenkins?
uncletall

Ще одна думка: як довго вам потрібно підтримувати ваш продукт? Якщо вам потрібно буде надавати підтримку дуже довго, я б не розраховував на те, що в NuGet буде доступна правильна версія ваших третіх сторін. Ви можете зіткнутися з дуже великими проблемами, покладаючись на такі інструменти, як NuGet, щоб отримати правильну комбінацію інструментів третьої сторони, навіть через 2-3 роки.
uncletall

3
@uncletall: так, NuGet має повний інтерфейс командного рядка. Ідея полягає у створенні локального сховища NuGet, яке може бути просто папкою в мережевій спільній доступності (називається "feed", docs.nuget.org/docs/creating-packages/… )
Doc Brown

Так, я припускаю, звичайно, що ви використовуєте місцеве дзеркало. Я оновлю відповідь.
Вільберт

2
@ikh досить просто і прямо зараз будувати натурні пакети для зовнішніх залежностей. Мені потрібно було близько півдня, щоб упакувати 9 залежностей по 50 dll, ще ніколи цього не робив.
Вільберт

5

Для інструментів можна використовувати підмодулі . Таким чином, ви можете зберігати їх у підкаталозі, як ви робите зараз, і використовувати окреме репо для їх версії. Це також означає, що ви можете клонувати (заряджати) інструменти та розробляти їх окремо, і що інші проекти можуть покладатися на ці репортажі - і на конкретні, зручні версії їх також.

Ви також можете використовувати підмодулі для сторонніх бібліотек, але якщо це можливо, я рекомендую використовувати для них менеджер залежностей.


4

Суб'єкти, які ви перетворюєте на сховища git, обов'язково є особами, які ви версії та філії; якщо SolutionFolder/Tools/Tool1відповідає одній такій речі, це рівень сутності. Це відбувається тому , що мерзотник стосується всього стану дерева каталогів бути versionable об'єкт, в той час як з SVN можна (навіть якщо не дуже хороша ідея) , щоб мати trunk, branchesі в tagsбудь-якому місці дерева.

Отримані артефакти не повинні зберігатися у сховищі, а також не повинні зберігатись у зовнішніх бібліотеках. Є кращі способи впоратися з цим. (Якщо ви працюєте з Java, подумайте про використання приватного сховища Maven; з ними порівняно просто працювати та інтегруватись із багатьма іншими речами.)

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


Які варіанти управління зовнішніми бібліотеками? Ми працюємо над Visual Studio з C ++ та C #, тому Maven не схоже на гарну форму. Основне питання тут полягає в тому, що мати ThirdPartyпапку в репо є настільки проклято зручно, і важко придумати хорошу альтернативу.
ikh

2
@ikh: У середовищі Visual Studio ти зазвичай використовуєш Nuget для цього, docs.nuget.org , який уже включений у VS 2012 та новіші версії.
Док Браун

2

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

Те, з чим я грав, - це налаштування інструментів третьої сторони в окремому репо. Тоді у мене був один простий пакетний скрипт, який читав текстовий файл з sha1 ref і перевіряв правильну версію. Це дозволило б мені мати різні версії третьої сторони для різних проектів. Цю ідею я отримав від інструмента побудови Facebook Buck. Але врешті-решт, багато розробників не люблять використовувати інструменти командного рядка (тут продається MS VC), тому я відмовився від ідеї.

Однією з головних причин, чому не завантажувати ваші треті сторони, коли вам потрібні (використовуючи NuGet), є те, що якщо вам потрібно довго підтримувати ваш продукт. У моїй галузі нам потрібно коли-небудь надавати оновлення для старих версій, які покладаються на старі конверти третьої сторони. Ми не хочемо витрачати багато часу, розбираючи, які ваги ми можемо оновити чи ні, а просто використовуємо ті, що використовуються у цій версії. А тепер уявіть, що ви використовуєте NuGet, ой ... остання версія лібу, яка вам потрібна, - 3,98, але вам потрібно 2,04 ..... як пояснити своєму начальнику, що вам потрібно витратити 2 місяці, щоб оновити стару версію, щоб мати можливість користуватися останніми лайками, коли він очікував невеликих змін!


3
Хоча я і дав вам +1, оскільки «залишити все як є» є прагматичним рішенням, я думаю, що «багаторазові репости» можуть бути не єдиною проблемою. DVCS, як Git, заохочують мати кілька локальних відділень, і в кожній гілці повну локальну копію всього. Таким чином, це може призвести до того, що одна і та ж велика бібліотека третьої сторони (як правило, одна і та ж версія!) Кілька разів, як локальна копія. В одних ситуаціях це може бути здійснено, в інших я можу уявити, що це матиме негативний вплив на продуктивність розгалуження та злиття.
Док Браун

Наскільки я знаю, гілка - це дуже дешева операція в Git, яка лише створить покажчик і займе майже нульовий простір.
uncletall


Якщо я чогось не пропускаю, гілки "вільні" в Git. Я щойно перевірив свої .git / refs / heads, і всі гілки - це текстові файли розміром 1 КБ, .git / logs / refs / head містить журнали, де найбільший розмір 11KB для майстра. Моя нормальна структура проекту становить близько 500 МБ у коді, вуста третьої сторони та інші інструменти. Я дуже радий прийняти хіт на 1
КБ

1
@MichaelT: розгалуження само по собі безкоштовне, звичайно, але я кажу про ситуацію, коли у вас паралельно є кілька робочих копій різних гілок на локальній робочій станції. І якщо ви перевірите коментарі нижче оригінального питання, то ОП посилається на 3 Гб сторонніх інструментів як розмір робочої копії.
Док Браун
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.