Макет сховища GIT для сервера з декількома проектами


96

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

\main
    \ProductA
    \ProductB
    \Shared

тоді

svn checkout http://.../main/ProductA

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

  1. Створіть окремий проект для кожного Продукту.
  2. Створіть єдиний масштабний проект і зберігайте товари в підпапках.

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

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

Чи існують якісь рекомендації чи найкращі практики для роботи з дуже великими сховищами для декількох проектів?

Відповіді:


65

Щодо обмежень Git, настанова проста :

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


В OP Paul Alexander коментарі :

Це звучить схоже на підтримку "зовнішніх", яку надає диверсія.
Ми спробували це і виявили надзвичайно громіздким постійно оновлювати посилання на версії в зовнішніх версіях, оскільки проекти розробляються одночасно із залежностями один від одного. Чи є інший варіант ??

@Paul: так, замість оновлення версії з основного проекту ви:

  • розробляйте свої підпроекти безпосередньо в рамках основного проекту (як пояснено в " Справжня природа підмодулів "),
  • або ви посилаєтеся в суб-репо originна те саме суб-репо, яке розробляється в іншому місці: звідти вам просто потрібно взяти з цього суб-репо зміни, внесені в іншому місці.

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

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

Я відповів:

Чесно кажучи, ви, можливо, мали рацію ... тобто до останнього випуску Git 1.7.1 .
git diffі git statusобидва навчилися враховувати стани підмодулів, навіть якщо вони виконуються з основного проекту.
Ви просто не можете пропустити модифікацію підмодуля.

Це сумно:


Також варто зазначити, що якщо ви включаєте підмодулі в основний проект, кожен підмодуль - це власне сховище git, тому ви можете вільно включати певні версії підмодулів, певні теги тощо
Деймієн Вілсон,

1
@VonC: Це звучить схоже на підтримку "зовнішніх", яку надає диверсія. Ми спробували це і виявили надзвичайно громіздким постійно оновлювати посилання на версії в зовнішніх версіях, оскільки проекти розробляються одночасно із залежностями один від одного. Чи є інший варіант ??
Пол Олександр

@Paul: так, замість того, щоб оновлювати версію основного проекту, ви або розробляєте свої підпроекти безпосередньо всередині основного проекту (див. Stackoverflow.com/questions/1979167/git-submodule-update/… ), або посилаєтесь у sub-repo походження до того самого sub-repo, що розробляється в іншому місці: звідти вам просто потрібно витягти з цього sub-repo зміни, внесені в іншому місці. В обох випадках вам доведеться не забути вчинити основний проект, щоб записати нову конфігурацію. немає "зовнішнього" властивості для оновлення. Весь процес набагато природніший.
VonC

3
@ Пол: чесно, можливо, ти мав рацію ... тобто до останнього випуску Git 1.7.1. ( kernel.org/pub/software/scm/git/docs/RelNotes-1.7.1.txt ) git diffі git statusобидва навчилися враховувати стани підмодулів, навіть якщо вони виконуються з основного проекту. Ви просто не можете пропустити модифікацію підмодуля.
VonC

1
Поки @PaulAlexander щось не говорить, я вирішую вірити, що він насправді зараз використовує підмодулі.
cregox

2

GitSlave дозволяє управляти кількома незалежними репо-файлами як одне. Кожним репо можна керувати за допомогою звичайних команд git, тоді як gitslave дозволяє додатково запускати команду над усіма репозиторіями.

super-repo
+- module-a-repo
+- module-b-repo

gits clone url-super-repo
gits commit -a -m "msg"

Repo-per-project має переваги завдяки компонентності та спрощеній побудові за допомогою таких інструментів, як Maven. Repo-per-project додає захист, обмежуючи сферу того, що розробник змінює - з точки зору помилкових фіксів сміття.


Чи не могли б ви трохи розповісти про плюси і мінуси підмодуля gitslave проти git?
MM

1
Великою перевагою Gitslave є те, що він дозволяє вашим репозиторіям Git стояти окремо. Ви можете керувати репозиторіями за допомогою простих команд git, не впливаючи на відносини gitslave. Але коли ви хочете виконати тег, наприклад, у всіх репозиторіях, тоді gitslave може це зробити.
Андре

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