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

StackOverflow https://stackoverflow.com/questions/1811730

Вопрос

У меня есть медиа-репозиторий 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 .

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

<Ол>
  • Храните свои медиафайлы в одном репозитории git, который используется многими проектами
  • Если вы изменяете медиа-файл в любом из проектов на вашем локальном компьютере, он должен немедленно появиться в любом другом проекте (так что вы не хотите все время фиксировать + push + pull)
  • К сожалению, нет окончательного решения для того, что вы хотите, но есть некоторые вещи, с помощью которых вы можете сделать свою жизнь проще.

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

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

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

    <Ол>
  • Храните каждый проект в одном большом хранилище. Преимущество этого решения в том, что у вас будет только 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 .\Активы \ Тактические инструменты..\Тактические голографические инструменты

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

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top