Podmoduł Git vs klon Git

18

Pracuję nad projektem open source na GitHub.

Ma podkatalog / Vendor, w którym ma kopię kilku bibliotek zewnętrznych. Oryginalny opiekun projektu aktualizował ten katalog raz na jakiś czas nowszą kopią biblioteki zewnętrznej.

Jeden deweloper wysłać do mnie prośbę ciągnącego się pomysł, aby zastąpić tę kopię przez git modułem .

Zastanawiam się, czy to dobry pomysł, czy nie.

Zalety podmodułu Git:

  • Submoduły zostały zaprojektowane specjalnie dla podobnych scenariuszy
  • Usuwa możliwość przypadkowego zatwierdzenia dostawcy, który zostanie zastąpiony podczas następnej aktualizacji

Wady podmodułu Git:

  • Wygląda na to, że podmoduły git przekazują złożoność od opiekuna do osoby, która sklonuje / pociągnie projekt (po sklonowaniu wymagane są dodatkowe kroki w celu rozpoczęcia pracy z projektem: „git submodule init”, „git submodule update”

Jakie jest twoje zdanie na ten temat?

Jeszcze jedna rzecz. Ten problem to stosunkowo niewielka biblioteka z bardzo ograniczonymi zewnętrznymi zależnościami. Myślę, że każde narzędzie do budowania byłoby na razie nadmierne.

Victor Ronin
źródło
4
Alternatywnie mogą to zrobić, git clone --recursivea następnie nie muszą wykonywać poleceń submodułu. Nikt inny nie wspominał o tym smakołyku; większość osób, które znam, mają podmoduły, reklamują to w README.
Levi Morrison

Odpowiedzi:

9

Alternatywą dla submodułu jest użycie git subtree. Daje to korzyści, git submoduleale bez przesuwania złożoności do użytkownika końcowego. Repozytorium innej firmy jest scalone z głównym drzewem projektu, ale metadane są przechowywane w taki sposób, że można:

  • wyodrębnij repozytorium strony trzeciej później, jeśli wprowadzono jakieś interesujące zmiany
  • scalaj nowe aktualizacje z repozytorium strony trzeciej ( scal notatkę , nie zastępuj)

Dla użytkowników Git, którzy nie są wystarczająco zaawansowani, aby zrozumieć submoduły, podejście do poddrzewa sprawia, że ​​uzyskanie klona projektu nie jest trudniejsze niż jakikolwiek inny klon. Krótka notka z dokumentacji:

Poddrzewa pozwalają na włączenie podprojektów do podkatalogu głównego projektu, opcjonalnie łącznie z całą historią podprojektu.

Na przykład możesz dołączyć kod źródłowy biblioteki jako podkatalog swojej aplikacji.

Poddrzewa nie należy mylić z podmodułami, które są przeznaczone do tego samego zadania. W przeciwieństwie do podmodułów, poddrzewa nie wymagają żadnych specjalnych konstrukcji (takich jak pliki .gitmodule lub gitlinks), które są obecne w twoim repozytorium i nie zmuszają użytkowników końcowych twojego repozytorium do robienia czegoś specjalnego lub do zrozumienia, jak działają poddrzewa. Poddrzewo to tylko podkatalog, który można przypisać, rozgałęzić i scalić z projektem w dowolny sposób.

Założyłem projekt w pracy przy użyciu submodułów, a kłopoty z utrzymywaniem aktualności submodułów w klonach wszystkich były zbyt pracochłonne. Niedawno zmieniłem na używanie poddrzewa wszędzie i te problemy zniknęły.

Zauważ, że git-subtree jest częścią git/contribkatalogu i musi być zainstalowany osobno.

Greg Hewgill
źródło
4

Jedną wadą korzystania z podmodułów jest to, że archiwa tar lub zip-archiwa w Github (i wielu innych usługach) nie zawierają źródeł podmodułów. Oznacza to, że archiwa nie są samodzielne. Jest to problem, jeśli repozytorium jest małe i tak naprawdę nie ma skryptu kompilacji, takiego jak statyczna witryna HTML w zależności od biblioteki JavaScript.

Lekensteyn
źródło
3

Jest to idealne miejsce do korzystania z submodułów. Zmniejszają rozmiar i złożoność repozytorium oraz ułatwiają aktualizację bibliotek zewnętrznych do nowej wersji.

Nie są trudne do zrozumienia, jak używać, i są dość powszechnie stosowane w tej sytuacji, więc po prostu zanotuj w README projektu, że korzystasz z submodułów i co robić, a ludzie powinni być w stanie wymyślić to się skończyło. Gdy po raz pierwszy zetknąłem się z repozytorium z podmodułem, uruchomiłem je w ciągu 10–15 minut i nigdy nie miałem problemu z ustaleniem, co robić dalej.

Jonathan Patt
źródło
1
Jako dodatek do tego, jeśli twoja aplikacja nie zainicjuje się, możesz chcieć sprawdzić, czy podmoduł został zainicjowany - i dostarczyć przyjazny komunikat o błędzie, jeśli nie został zainicjowany.
Jonathan Rich
1
Zobacz także odpowiedź Lekensteyn na temat archiwów zip brakujących plików submodułów. Oznacza to, że podmoduły nie są najlepszym rozwiązaniem, jeśli podajesz kod publicznie, ale są w porządku w przypadku kodu prywatnego, który ma zostać sklonowany. W przeciwnym razie preferuj poddrzewa.
Inżynier
3

Korzystanie z podmodułów uniemożliwia dokonywanie lokalnych zmian w kodzie i tworzy zależność od zewnętrznego repozytorium. Jeśli masz pewność, że nigdy nie będziesz chciał dostosowywać biblioteki ani wprowadzać lokalnych poprawek, i możesz mieć pewność, że zewnętrzny serwer będzie zawsze dostępny, gdy będziesz chciał sklonować nową kopię, jest to dobra droga.

W skrócie - czy chcesz po prostu korzystać z bibliotek lib, czy uważasz, że są one częścią twojej bazy kodu? Jeśli nie są to „twoje” kody, to dlaczego mają kontrolę wersji, a nie tylko coś, co trzeba zainstalować?

Sean McSomething
źródło
6
Podmoduły nie uniemożliwiają wprowadzania lokalnych zmian. Wręcz przeciwnie, pozwalają śledzić te zmiany i używać różnych wersji (poprawek lub wydań biblioteki) biblioteki w różnych projektach.
Steve Fallows