Как я могу работать с репозиторием git в другом репозитории?

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

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

Ответ 1

Хороший вопрос. Ключ - 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 подмодули велики, но вам нужно поэкспериментировать и узнать о них.

С большой силой приходит отличный шанс укусить в крупу.

Ответ 2

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

Ответ 3

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

  • Сохраняйте медиафайлы в одном репозитории git, который используется многими проектами
  • Если вы изменяете медиафайл в любом из проектов на вашем локальном компьютере, он должен немедленно появляться в каждом другом проекте (так что вы не хотите совершать + push + тянуть все время)

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

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

Если вам не нужно это знать, решение легко:

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

В большинстве случаев, однако, вы хотите знать эту информацию о версии. В этом случае у вас есть два варианта:

  • Хранить каждый проект в одном большом хранилище. Преимущество этого решения заключается в том, что у вас будет только одна копия медиа-репозитория. Большим недостатком является то, что переключиться между версиями проекта гораздо сложнее (если вы заказываете другую версию, вы всегда будете изменять ВСЕ проекты)

  • Используйте подмодули (как объяснено в ответе 1). Таким образом, вы будете хранить медиафайлы в одном репозитории, а проекты будут содержать только ссылку на конкретную версию репо. Но таким образом у вас обычно будет много локальных копий медиа-репозитория, и вы не сможете легко изменить медиафайл во всех проектах.

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

  • Перед фиксацией вы можете переименовать каталог подмодулей и поместить символическую ссылку в общий медиа-каталог. Когда вы будете готовы к фиксации, вы можете удалить символическую ссылку и удалить субмодуль назад, а затем зафиксировать.

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

Вы можете добавить локальные каталоги как удаленные:

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

Если вы изменяете файл в /my/project 1/media, вы можете зафиксировать его и вытащить его из /my/project 2/media, не нажимая его на удаленный сервер:

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

Вы можете удалить эти коммиты позже (с помощью git reset), потому что вы не поделились ими с другими пользователями.

Ответ 4

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

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

Здесь есть полное руководство: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

Но в основном вам просто нужно mklink два пути в командной строке с повышенными правами. Убедитесь, что вы используете префикс жесткой ссылки /J. Что-то в этих строках: mklink/J C:\projects\MainProject\plugins C:\projects\SomePlugin

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

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

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

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