Як я можу працювати з сховищем git в іншому сховищі?


284

У мене є сховище Git media, де я зберігаю всі мої файли та скрипти JavaScript та CSS, які я буду використовувати в різних проектах.

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


Будь ласка , дивіться поддерево відповідь нижче від @ Ruslan-kabalin. Примітка: гачки попереднього вчинення (або перевиконання ) - це один із способів вирішити заперечення, висловлені Робертом Дандоном
Їжак

Відповіді:


348

Ключовим є підмодулі git .

Почніть читати розділ субмодулів Книги Git Community або Посібника користувача

Скажімо, у вас є сховища PROJECT1, PROJECT2 та MEDIA ...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

Повторіть інші репо ...

Найзручніше - щоразу, коли ви вносите зміни до медіа, ви можете це зробити:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

Це щойно зафіксувало той факт, що підмодуль MEDIA FORIN PROJECT2 зараз знаходиться у версії XYZ.

Це дає вам 100% контроль над тим, яку версію MEDIA використовує кожен проект. підмодулі git чудові, але вам потрібно експериментувати та дізнаватися про них.

З великою силою приходить великий шанс покусати в крупі.


Цей робочий процес нагадує мені про використання особистого модуля NPM stackoverflow.com/questions/7575627 / ...
cyrf

Якщо ви віддаєте перевагу за замовчуванням як останню версію, ви можете додати скрипт для поширення зобов’язань MEDIA у всіх залежних проектах.
jiggunjer

3
Як це інтегрується з github?
theonlygusti

27

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


6
Ось ще одна інформативна стаття про підкресле
Бенні Нойгебауер

3
Згідно з цією статтею, один з недоліків:> Відповідальність за не змішування коду супер та підпроекту у комітетах лежить на вас. Ніхто не встиг на це (IMO)
Роберт Дандон

20

Якщо я добре розумію вашу проблему, вам потрібні наступні речі:

  1. Нехай ваші медіа-файли зберігаються в одному сховищі git, яке використовується багатьма проектами
  2. Якщо ви змінюєте медіа-файл у будь-якому з проектів на вашій локальній машині, він повинен негайно з’являтися в кожному іншому проекті (тому ви не хочете весь час робити + push + тягнути)

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

Спочатку слід вирішити одне важливе: чи потрібно зберігати для кожної версії у сховищі проекту посилання на версію медіа-файлів? Так, наприклад, якщо у вас є проект, який називається example.com, вам потрібно знати, який style.css він використовував 2 тижні тому, або найновіший завжди (або в основному) найкращий?

Якщо вам цього не потрібно знати, рішення легко:

  1. створити сховище для медіа-файлів та одне для кожного проекту
  2. створити символічне посилання у своїх проектах, яке вказує на локально клонований медіа-сховище. Ви можете створити відносне символічне посилання (наприклад, ../media) і припустити, що всі перевірятимуть проект так, щоб медіа-каталог знаходився там же, або записали ім'я символічного посилання на .gitignore, і кожен може вирішити куди він / вона розміщує медіа-файли.

Однак у більшості випадків ви хочете знати цю інформацію про версії. У цьому випадку у вас є два варіанти:

  1. Зберігайте кожен проект в одному великому сховищі. Перевага цього рішення полягає в тому, що у вас буде лише 1 копія медіа-сховища. Великим недоліком є ​​те, що набагато складніше переходити між версіями проекту (якщо ви переходите на іншу версію, ви завжди модифікуєте ВСІ проекти)

  2. Використовуйте підмодулі (як пояснено у відповіді 1). Таким чином ви будете зберігати медіа-файли в одному сховищі, а проекти містять лише посилання на конкретну версію медіа-репо. Але таким чином у вас зазвичай буде багато локальних копій сховища медіа, і ви не можете легко змінити медіа-файл у всіх проектах.

Якби я був ти, я, певно, обрав би перше чи третє рішення (символічні посилання чи підмодулі). Якщо ви вирішили використовувати підмодулі, ви можете зробити багато речей, щоб полегшити своє життя:

  1. Перш ніж здійснити вчинок, ви можете перейменувати каталог підмодулів та помістити посилання на загальний медіа-каталог. Коли ви будете готові взяти на себе зобов'язання, ви можете видалити симпосилання та видалити підмодуль назад, а потім здійснити фіксацію.

  2. Ви можете додати одну зі своїх копій медіа-сховища як віддалене сховище до всіх своїх проектів.

Ви можете додати локальні каталоги як віддалений таким чином:

cd /my/project2/media
git remote add project1 /my/project1/media

Якщо ви модифікуєте файл у / my / project1 / media, ви можете скопіювати його та витягнути його з / my / project2 / media, не натискаючи на віддалений сервер:

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

Ви можете вийняти ці комісії пізніше (із скиданням git), оскільки ви не поділилися ними з іншими користувачами.


1
для веб-проектів, де ви працюєте в wwwпапці Apache , ви повинні розмістити .htaccessфайл у корені або wwwпапки, або проекту, з Options +FollowSymLinksним, або ще краще <IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule> (замінити {new line}фактично новим рядком ")

3

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

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

Тут є повний посібник: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Але в основному вам потрібно просто змігнути два контури в підвищеному командному рядку. Переконайтеся, що ви використовуєте префікс жорсткого посилання / J. Щось уздовж цих рядків: mklink / JC: \ projects \ MainProject \ plugins C: \ projects \ SomePlugin

Ви також можете використовувати відносні контури папок і помістити їх у бит, який повинен виконувати кожен чоловік, коли вони вперше перевіряють ваш проект.

Приклад: mklink / J. \ Assets \ TaqtileTools .. \ TaqtileHoloTools

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

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

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