Git - включить файлы из других репозиториев - программирование
Подтвердить что ты не робот

Git - включить файлы из других репозиториев

С Git я хотел бы включить в мой проект некоторые общие JS/CSS-библиотеки и/или утилиты (т.е. конкретные файлы из другого репо), и я бы хотел, чтобы они всегда были в курсе событий, встретиться. Мне не нужен весь удаленный репозиторий (хранилища). Бонус, если я могу работать с моими "локальными копиями" удаленных файлов и подталкивать изменения.

Несколько параллельный пример: в ASP.NET я сделал бы это, ссылаясь на ("remote") другие библиотеки .dll файлов (без "copy local" ), так что всякий раз, когда я перекомпилирую внешние библиотеки, мой проект будет указывать на новейшие версии.

Пример сценария

Мой проект... MyProject, и я просто хочу пару файлов из внешних репозиториев ExternalLibrary и External2. Я бы предпочел не клонировать каждый репозиторий где-то еще и копировать файлы в мой репо. Если я сделаю улучшение до MyProject/scripts/common1.js, я хотел бы вернуть его обратно в ExternalLibrary.

  • MyProject/
    • index.html
    • Сценарии /
      • mycode.js
      • otherplugin.js
      • common1.js < - из ExternalLibrary
      • plugin2.js < - из ExternalLibrary
    • стили /
      • mystyle.css
      • common.css < - from External2
  • ExternalLibrary/
    • common1.js
    • plugin1.js
    • plugin2.js
    • bunchofothercrap...
  • External2/
    • common.css
    • bunchofothercrap...

Ссылки по теме:

4b9b3361

Ответ 1

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

То, что я обычно делаю, это использовать symlinks. Это можно сделать, добавив проекты в качестве подмодулей в ваш проект, а затем символизируя файлы в нужном месте.

В вашем примере будет выглядеть примерно так:

$ git clone <url> myproject
$ cd myproject
$ git submodule add <url> external_library
$ git submodule add <url> external2
$ cd scripts
$ ln -s ../external_library/common1.js
$ ln -s ../external_library/plugin2.js
$ cd ../styles
$ ln -s ../external2/common.css

Чтобы заставить символические ссылки работать в окнах:

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

$ cd external_library
$ git checkout -b myproject
# make changes back in ../myproject
$ git commit <files> # in external_library

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

Вы можете синхронизироваться следующим образом:

$ cd external_library
$ git checkout master
$ git pull
$ git checkout myproject
$ git merge master

Вам также необходимо обновить родительский проект при изменении подмодуля (например, git commit external_library). Любой, кто использует ваш проект, должен будет сделать git clone --recursive <url_to_myproject>.

ПРИМЕЧАНИЕ. Вы можете достичь большей части этого, не используя отдельную ветку для своего проекта. Используйте то, что имеет для вас наибольшее значение.