Применить файл 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 не может быть извлечен.