Как я могу работать с репозиторием 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
Как только папка была связана, вам может потребоваться игнорировать папку в вашем основном репозитории, которая ссылается на нее. В противном случае вам хорошо идти.
Примечание. Я удалил свой дублированный ответ из другого сообщения, поскольку этот пост был помечен как дублирующий вопрос к этому.