Как мне работать с Git-репозиторием в другом репозитории? - PullRequest
255 голосов
/ 28 ноября 2009

У меня есть Git media-репозиторий, в котором я храню все свои мастер-файлы JavaScript и CSS и сценарии, которые я буду использовать в различных проектах.

Если я создаю новый проект, который находится в своем собственном Git-репозитории, как мне использовать файлы JavaScript из моего медиа-репозитория в моем новом проекте таким образом, чтобы мне не пришлось обновлять обе копии скрипта, когда Я делаю изменения?

Ответы [ 4 ]

326 голосов
/ 28 ноября 2009

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

Начните читать главу Submodules 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 великолепны, но вам нужно поэкспериментировать и узнать о них.

С большой силой появляется отличный шанс быть укушенным в попу.

24 голосов
/ 21 ноября 2012

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

20 голосов
/ 28 ноября 2009

Если я хорошо понимаю вашу проблему, вам нужны следующие вещи:

  1. Храните ваши медиа файлы в одном репозитории git, который используется во многих проектах
  2. Если вы модифицируете медиа-файл в любом из проектов на вашем локальном компьютере, он должен немедленно появиться в любом другом проекте (так что вы не хотите фиксировать + толкать + извлекать все время)

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

Сначала вы должны решить одну важную вещь: хотите ли вы хранить для каждой версии в репозитории вашего проекта ссылку на версию медиа-файлов? Так, например, если у вас есть проект под названием 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 reset), потому что вы не поделились ими с другими пользователями.

2 голосов
/ 26 мая 2016

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

Вместо этого я использовал SymLinks, и это, кажется, работает хорошо, поэтому я публикую его здесь как возможную альтернативу.

Здесь есть полное руководство: 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

Вы также можете использовать относительные пути к папкам и поместить их в список «летучих мышей», которые будут выполняться каждым человеком, когда он впервые проверяет ваш проект.

Пример: mklink / J. \ Assets \ TaqtileTools .. \ TaqtileHoloTools

После того, как папка была связана, вам, возможно, придется игнорировать папку в вашем основном репозитории, которая на нее ссылается. В противном случае вы можете идти.

Примечание Я удалил дублирующийся ответ из другого поста, так как этот пост был помечен как дублирующий вопрос к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...