2014-07-12 11 views
10

Mamy wiele repozytoriów git dla różnych projektów. Istnieje również repozytorium git dla celów związanych z infrastrukturą. Mamy zwyczaj Gradle wtyczek napisanych w tym repozytorium infrastruktury, które używamy w innych repozytoriówZastosuj plik gradle z innego repozytorium

Przykład:

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

Tutaj jesteśmy o buildscript {} plik foo/bar/buildscript.gradle w każdym repozytorium Git . Chcę wiedzieć, czy istnieje sposób, w jaki możemy zastosować plik bezpośrednio z repozytorium infrastruktury. Aby każda zmiana była widoczna bezpośrednio w innych repozytoriach.

Odpowiedz

9

W takim przypadku można dodać do każdego z repozytoriów subskrypcję git subtree Merging (inną niż git), odnosząc się do infra repo.

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

Widać badania robi, że w "Managing Nested Libraries Using the GIT Subtree Merge Workflow".

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

W twoim przypadku:

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" 

Aby zaktualizować repo projektu ze zmianami poddrzewa:

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

aby zaktualizować repo poddrzewa ze zmianami z folderu poddrzewa projektu repo:

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

git push infrarepo infra 
4

Odpowiedź zależy od tego, co dokładnie zamierzasz osiągnąć.

  1. Jeśli chcesz po prostu zaktualizować plik gromadzeniu w jednym miejscu i „automagicznie” odbierać zmiany we wszystkich repo projektu, to prawdopodobnie należy wziąć plik spod kontroli GIT i, na przykład, wystarczy użyć linku lub coś w tym rodzaju do zewnętrznej lokalizacji.
  2. Drugą opcją jest przeniesienie wszystkich składników kompilacji do wspólnego katalogu, uczynienie tego katalogu oddzielnym, dzielonym repozytorium GIT, a następnie podłączenie tego repozytorium do wszystkich repozytoriów projektów, np. jako submodule Jednak w tym przypadku nie otrzymasz aktualizacji "automagicznych", ponieważ git ściśle wiąże treść modułu do konkretnego zatwierdzenia w module podległym i nie musi uruchamiać git submodule update, a następnie git commit, aby otrzymywać zaktualizowaną zawartość w repozytoriach projektu. Wariant tej metody to git subtree merge zaproponowany przez @VonC
  3. Jeśli twoja maszyna do budowania jest wystarczająco złożona, możesz rozważyć utworzenie "artefaktu gradulacyjnego" i ukryć w nim złożoność. Następnie możesz podłączyć ten artefakt do swoich projektów i nie polegać na konkretnej wersji artefaktu, ale raczej na szeregu wersji
+0

Wtyczki są w artefakaliach (artefakty gradulacyjne). Ale aby pobrać te artefakty, każdy build.gradle konsumenta (w innych repozytoriach git) będzie musiał dodać blok buildscript {}, aby określić konfigurację zależności repozytorium +.Próbowałem znaleźć rozwiązanie tam, gdzie nie jest to wymagane, a wtyczka gradle w artefakcie jest dostępna bez buildscript {} –

+0

Wtedy prawdopodobnie rozwiązanie # 2 (a może i @ VonC) jest najlepsze dla twojego przypadku. Prawdopodobne zmiany w skrypcie będą rzadkie, więc użytkownicy nie będą musieli aktualizować co pięć minut. – user3159253

1

Zakładając, że repozytorium Git jest dostępne przez HTTP (S), jedną z opcji jest użycie apply from: "http://...". Zauważ, że wtyczki skryptowe dostępne przez HTTP nie są obecnie buforowane, więc kompilacja nie powiedzie się, jeśli nie można pobrać skryptu.

Powiązane problemy