Как мне работать с репозиторием git в другом репозитории?
-
06-07-2019 - |
Вопрос
У меня есть медиа-репозиторий Git, где я храню все мои мастер-файлы JavaScript и CSS и скрипты, которые я буду использовать в различных проектах.
Если я создаю новый проект, который находится в его собственном репозитории Git, как мне использовать файлы JavaScript из моего медиа-репозитория в моем новом проекте таким образом, чтобы мне не приходилось обновлять обе копии скрипта при внесении изменений?
Решение
Ключ - это подмодули git . Р>
Начните читать главу «Подмодули» Git Community Book или Руководство пользователя
Допустим, у вас есть хранилище PROJECT1, PROJECT2 и MEDIA ...
cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"
Повторите с другим репо ...
Теперь круто то, что каждый раз, когда вы вносите изменения в MEDIA, вы можете сделать это:
cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"
Это только что зафиксировал тот факт, что подмодуль MEDIA WITHIN PROJECT2 теперь имеет версию XYZ.
Это дает вам 100% контроль над тем, какую версию MEDIA использует каждый проект. Подмодули git великолепны, но вам нужно поэкспериментировать и узнать о них. Р>
С большой силой появляется отличный шанс быть укушенным в попу.
Другие советы
Попробуйте использовать поддерево Вместо субмодулей это сделает вашу жизнь пользователей репо намного проще. Вы можете найти более подробное руководство в книге Pro Git . р>
Если я хорошо понимаю вашу проблему, вам нужны следующие вещи:
<Ол>К сожалению, нет окончательного решения для того, что вы хотите, но есть некоторые вещи, с помощью которых вы можете сделать свою жизнь проще.
Сначала вы должны решить одну важную вещь: хотите ли вы хранить для каждой версии в репозитории вашего проекта ссылку на версию медиа-файлов? Так, например, если у вас есть проект под названием example.com, вам нужно знать, какой style.css он использовал 2 недели назад или последний всегда (или в основном) лучший?
Если вам не нужно это знать, решение легко:
<Ол>Однако в большинстве случаев вам нужна эта информация о версиях. В этом случае у вас есть два варианта:
<Ол>Храните каждый проект в одном большом хранилище. Преимущество этого решения в том, что у вас будет только 1 копия хранилища мультимедиа. Большой недостаток заключается в том, что переключаться между версиями проекта намного сложнее (если вы переходите на другую версию, вы всегда изменяете ВСЕ проекты)
Используйте подмодули (как объяснено в ответе 1). Таким образом, вы будете хранить медиа-файлы в одном репозитории, и проекты будут содержать только ссылку на конкретную версию медиа-репо. Но таким образом у вас обычно будет много локальных копий хранилища мультимедиа, и вы не сможете легко изменить медиафайл во всех проектах.
На вашем месте я бы выбрал первое или третье решение (символические ссылки или подмодули). Если вы решите использовать подмодули, вы все равно сможете сделать многое, чтобы упростить свою жизнь:
<Ол>Перед фиксацией вы можете переименовать каталог подмодуля и поместить символическую ссылку в общий каталог мультимедиа. Когда вы будете готовы к фиксации, вы можете удалить символическую ссылку и удалить подмодуль назад, а затем зафиксировать.
Вы можете добавить одну из своих копий хранилища мультимедиа в качестве удаленного хранилища для всех своих проектов.
Вы можете добавить локальные каталоги как удаленные следующим образом:
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 reset), потому что вы не поделились ими с другими пользователями.
У меня были проблемы с поддеревьями и подмодулями, о которых свидетельствуют другие ответы...главным образом потому, что я использую SourceTree, и он кажется довольно глючным.
Вместо этого я в конечном итоге использовал символические ссылки, и это, кажется, работает хорошо, поэтому я публикую это здесь как возможную альтернативу.
Здесь есть полное руководство: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/
Но в принципе вам просто нужно связать два пути в командной строке с повышенными правами.Убедитесь, что вы используете префикс жесткой ссылки /J.Что- то в этом роде:mklink /J C:\projects\MainProject\plugins C:\projects\SomePlugin
Вы также можете использовать относительные пути к папкам и поместить их в bat, чтобы они выполнялись каждым пользователем при первом просмотре вашего проекта.
Пример:mklink /J .\Активы \ Тактические инструменты..\Тактические голографические инструменты
После того, как папка была связана, вам может потребоваться игнорировать папку в вашем основном репозитории, которая ссылается на нее.В противном случае вы можете идти.
Примечание Я удалил свой дублирующий ответ из другого поста, поскольку этот пост был помечен как дублирующий вопрос к этому.