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ć?


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.

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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.