Применить файл gradle из другого репозитория

У нас есть несколько репозиториев git для разных проектов. Существует также хранилище git для целей инфраструктуры. У нас есть пользовательские плагины gradle, написанные в этом репозитории инфраструктуры, которые мы используем в других репозиториях

Пример:

buildscript {
    apply from: 'foo/bar/devinfra-buildscript.gradle', to: buildscript
}
apply plugin: 'devinfra'

Здесь мы имеем файл buildscript {}, foo/bar/buildscript.gradle в каждом репозитории git. Я хочу знать, есть ли способ, которым мы можем применить файл непосредственно из репозитория инфраструктуры. Чтобы любые изменения были видны в других репозиториях напрямую.

Ответ 1

В этом случае вы можете добавить git сложение поддерева (отличное от git поддерева) для каждого вашего репо, ссылаясь на инфра-репо.

git read-tree --prefix=<subdirectory_name>/ –u <shared_library_branch>

Вы можете увидеть исследование, сделанное в " Управление вложенными библиотеками с помощью рабочего процесса git Subtree Merge Workflow.

http://www.typecastexception.com/image.axd?picture=Subtree%20Illustration_thumb_1.png

В вашем случае:

cd /path/to/project
git remote add infrarepo /url/to/infra/repo
git fetch infrarepo
git checkout -b infra infrarepo/master

git checkout master
git read-tree --prefix=infra/ –u infra
git commit -m "Add Infra subtree"

Чтобы обновить репо проекта с изменениями поддерева:

git checkout infra
git pull
git checkout master
git merge --squash –s subtree –-no-commit infra
git commit -m "update infra"

Чтобы обновить репозиторий поддерева с изменением из папки поддерева репо проекта:

git checkout infra
git merge --squash –s subtree --no-commit master
git commit -m "(infra subtree) nature of changes"

git push infrarepo infra

Ответ 2

Ответ зависит от того, что именно вы собираетесь достичь.

  • Если вы просто хотите обновить файл сборки в одном месте и "автоматически" получить изменения во всех репозиториях проекта, вы, вероятно, должны взять файл из GIT и, например, просто использовать ссылку или что-то подобное на внешнее местоположение.
  • Второй вариант состоит в том, чтобы переместить все материалы сборки в общий каталог, сделать этот каталог разделенным разделяемым репозиторием GIT, а затем подключить этот репозиторий во всех ваших проектах-репозиториях, например. как submodule Но в этом случае вы не будете получать "автоматические" обновления, потому что GIT строго привязывает содержимое подмодуля к определенному фиксации в подмодуль и une нужно запустить git submodule update и последующий git commit, чтобы получать обновленное содержимое в ваших проектах-репозиториях. Вариант этого метода git subtree merge, предложенный @VonC
  • Если ваш механизм сборки достаточно сложный, вы можете захотеть создать артефакт "gradle" и скрыть сложность. Затем вы можете подключить этот артефакт к своим проектам и полагаться не на определенную версию артефакта, а на целый ряд версий

Ответ 3

Предполагая, что репозиторий Git доступен через HTTP (S), одним из вариантов является использование apply from: "http://...". Обратите внимание, что плагины script, доступ к которым осуществляется через HTTP, в настоящее время не кэшируются, поэтому сборка завершится неудачно, если script не может быть извлечен.