Git - projekt oparty na obcych repozytoriach

0

Część

Istnieje system którego ani nie napisałem ani formalnie nie utrzymuje ale chciałbym go zmodyfikować i wdrożyć u siebie. System, o którym mowa podzielony jest na dwa repozytoria - pierwsze z nich to repozytorium główne (najważniejsze elementy systemu) a drugie to repozytorium z wtyczkami. Wtyczki powinny być w folderu o nazwie plugins a sam folder plugins powinien być w głównym folderze aplikacji ale tak się akurat składa, że w repozytorium wtyczek struktura wygląda tak:

wtyczka1
wtyczka2

A nie tak

plugins/wtyczka1
plugins/wtyczka2

Jak wspomniałem wcześniej chciałbym swój system oprzeć o kod już istniejący i jednocześnie taki, który napisali inni. Najprościej byłoby więc po prostu pobrać dane z pierwszego repozytorium, następnie stworzyć folder plugins i umieścić tam dane z drugiego repozytorium. W kolejnym kroku usunąć foldery .git oraz plugins/.git i z tego wszystkiego stworzyć własne repozytorium. Takie coś by działało, ale mnie zależy także na aktualizacjach wydawanych przez twórców systemu.

Kombinowałem więc tak:

git init // utworzenie wlasnego repozytorium

// ...

git remote add [nazwa głównego repozytorium] [adres url do głównego repozytorium]

git remote add [nazwa repozytorium z wtyczkami] [adres URL do repozytorium z wtyczkami]

git fetch [nazwa głównego repozytorium]

git fetch [nazwa repozytorium z wtyczkami]

Aktualizacje swojego repozytorium (czyli naniesienie modyfikacji opracowanych przed twórców i hostowanych zupełnie gdzie indziej) chciałem wykonywać w następujący sposób:

git merge [nazwa głównego repozytorium]/[nazwa brancha] --squash --allow-unrelated-histories

git merge [nazwa repozytorium z wtyczkami]/[nazwa brancha] --squash --allow-unrelated-histories

Generalnie to nawet działa tylko problem w tym, że oba polecenia pracują na głównym folderze systemu. Według GIT-a nie ma żadnej wtyczki w folderze głównym więc nie ma czego łączyć i po prostu dodaje nowe pliki do repozytorium. Zachował by się inaczej gdyby nie pracował na głównym folderze aplikacji tylko na folderze plugins - tam są wszystkie wtyczki i to tutaj powinien być przeprowadzony merge. Innymi słowy: chciałbym, żeby ta druga komenda pracowała na folderze plugins a nie na folderze głównym systemu i wykonywała merge biorąc pod uwagę dane znajdujące się w folderze plugins. Da się to jakoś zrobić? A może problem da się rozwiązać inaczej?

Dodam, że nie chcę / nie mogę modyfikować repozytorium twórców systemu. Jeżeli więc zmodyfikuje jakąś wtyczkę to moja modyfikacja powinna być tylko w moim repozytorium. Natomiast modyfikacja autorów systemu powinna być we wszystkich repozytoriach.

3

git submodules :-)

0

Popraw mnie jeżeli się mylę, ale wydawało mi się, że moduły działają w ten sposób, że zatwierdzenie zmian w module powodują zmiany w jego repozytorium. Nie tak to działa?

Bo jeżeli tak to działa to jeżeli stworze sobie moduł plugins na podstawie repozytorium twórców systemu, to po operacji commit i push zmodyfikuje repozytorium twórców systemu (przy założeniu, że mógłbym to w ogóle zrobić). Ja nie mogę modyfikować repozytorium twórców systemu. Mogę jedynie swoje. Repozytorium twórców systemu jest mi potrzebne tylko do aktualizacji części bazowej, na której chce zbudować własne rozwiązanie. Czyli jeżeli w systemie, który wypuściła dana firma / organizacja znajdzie się błąd i firma / organizacja go poprawi to ja chce nałożyć tę poprawkę na swój system, który jest oparty na ich systemie. Natomiast ich repo nie może być zmodyfikowane.

2

Nie musisz robić podmodułu wprost do zewnętrznego repozytorium - IMO najwygodniej będzie Ci sklonować w całości "obce" repozytorium gdzieś na Twój serwer i potem w projekcie wykorzystać submodules do podlinkowania Twojej kopii repozytorium.

0

W sumie to chyba tak to zrobię. Stworze repozytorium pośrednie z wtyczkami i podlinkuje go ze swoim repozytorium głównym :)

3

Zewnętrzne biblioteki można dołączyć do projektu na wiele sposobów, niekoniecznie angażując w temat git-a.
Z C++ używałem maven (zwykle używany z Java), który ściągał potrzebne zależności i ich aktualizacje.
Słyszałem, że Conan jest całkiem fajny do tego celu (użyłem tylko hobbystycznie).
cmake też coś potrafi w tej materii (nie używałem).

W python masz pip i on jest chyba standardem dla python. Polecam używać razem z wirtualnym środowiskiem.

Obecnie używam git submodules, ale głownie dlatego, że czasami potrzebuje robić modyfikację w zależnościach.
Jest jeszcze git subtree nie miałem okazji korzystać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1