Jak zmienić podmoduł git, aby wskazywał podfolder?

103

Przeglądając samouczek modułem , stworzyłem submodule z projektem boto . Potem odkryłem, że w rzeczywistości potrzebuję tylko części tego projektu - a konkretnie folderu boto .

Chciałbym zmienić mój moduł podrzędny, aby wskazywał ten folder. Kiedy patrzę w .gitmodules, widzę

[submodule "backup/src/boto"]
    path = backup/src/boto
    url = https://github.com/boto/boto.git

Jakiego adresu URL powinienem użyć zamiast https://github.com/boto/boto.git ? Czy po zmianie adresu URL powinienem lokalnie usunąć folder boto i ponownie go pobrać?

zrywak234
źródło
3
To nie jest dokładnie to, czego chcesz - nie moduł podrzędny - ale możesz git subtree
rzucić
1
Skończyło się na tym, że miałem cały moduł podrzędny i powiedziałem IntelliJ, że folder boto jest „folderem źródłowym”, aby mógł znaleźć w nim pakiety.
ripper234
15
Nie mogę uwierzyć, że git nie robi tego natywnie ... yikes.
rogerdpack
2
Znalazłem podobne pytanie - stackoverflow.com/questions/1121227/…
sashoalm

Odpowiedzi:

66

Obawiam się, że adres URL podmodułów zawsze wskazuje tylko na repozytorium - nie możesz określić, że chcesz mieć tylko podfolder repozytorium, w ten sam sposób, w jaki git nie obsługuje ogólnie „wąskich klonów”.

Jeśli nie możesz żyć, mając całe repozytorium jako moduł podrzędny, zawsze możesz utworzyć nowe repozytorium sklonowane z boto, a następnie skonfigurować zadanie cron, aby:

  1. git fetch repozytorium do katalogu
  2. Służy git filter-branchdo aktualizowania gałęzi, w której podkatalog znajduje się na najwyższym poziomie.
  3. Dodaj tę gałąź repozytorium jako moduł podrzędny. Jednak to wszystko jest trochę kłopotliwe i wolałbym żyć z całym repozytorium jako modułem podrzędnym.
Mark Longair
źródło
24

Nie możesz sklonować tylko części repozytorium. Dzieje się tak, ponieważ git traktuje repozytorium jako cały obiekt: kiedy je zdobędziesz, otrzymasz wszystko .

Tak więc rozwiązaniem tutaj byłoby pobranie modułu podrzędnego do innego katalogu, a następnie użycie łącza symbolicznego, aby osiągnąć swój cel.

Artefakt2
źródło
Mam linki symboliczne w oknach ... też działa dobrze. (to z powodu msys, które mam na swoim komputerze, więc mogę używać ln -sjak w Linuksie)
kumarharsh
7
Vista i & pochodzą z MKLink. Używam tego. howtogeek.com/howto/windows-vista/…
Angel S. Moreno
1
Możesz zamiast tego użyć twardych linków
KindDragon,
15

To, co chcesz zrobić, to utworzyć gałąź w module podrzędnym i przenieść folder w górę oraz usunąć to, czego nie potrzebujesz. Zamiast tego możesz zarządzać tą gałęzią. Jeśli chcesz przyspieszyć zmiany, najpierw powinieneś być w stanie przywrócić scalanie. Git będzie wiedział, że przeniosłeś pliki i pomyślnie scalisz.

Mam nadzieję że to pomoże.

Adam Dymitruk
źródło
Co to jest „scalanie wsteczne”? Czy możesz podać przykład?
Sukima,
scalanie, które idzie „w górę” - od gałęzi wyższego rzędu do niższego rzędu. Linus ich nienawidzi. Wiążą się z historią z innych gałęzi, które mogły już zostać połączone.
Adam Dymitruk
Czy mógłbyś dodać jakiś przykład dotyczący „scalania wstecznego” w tej sytuacji?
Xiao
Zwykle dzieje się tak, gdy próbujesz zachować aktualność gałęzi funkcji, łącząc elementy z gałęzi głównej, w której wszyscy scalają swoje najnowsze zmiany. To jest złe, ponieważ wiąże twoją gałąź z pracą innych. Jeśli produkt wymaga Twojej gałęzi, ale nie jednej z pozostałych już w gałęzi integracji, nie jest to możliwe.
Adam Dymitruk
ciekawy pomysł, czy ktoś tego próbował? Mam zamiar spróbować szybko, ale wciąż nie jestem pewien, że „powrót seryjnej” mogą być jasne i zautomatyzowane ...
moudrick