sprawdzanie części repozytorium git

8

Jak mogę sprawdzić tylko część repozytorium Git? Mam repozytorium, które ma kilka modułów i chcę tylko jeden z modułów zainstalowany na konkretnej stronie.

W Subversion zrobiłbym svn export http://example.com/repository/path/to/module ./module-name.

ceejayoz
źródło

Odpowiedzi:

4

Jak wspomniano @Chris, obecne wersje Git obsługują rzadkie pobieranie.

Aby przekonwertować lokalne repozytorium, aby zawierało tylko określone katalogi:

cd <repo/location>
git config core.sparsecheckout true
echo desiredDir/ >> .git/info/sparse-checkout    # repeat to add multiple subdirs (the rest will be removed)

Teraz, aby usunąć wszystkie, ale określone katalogi:

 git read-tree -mu HEAD             # remove all, but those in .git/info/sparse-checkout
Brent Faust
źródło
2

Myślę, że najbliższym odpowiednikiem eksportu svn byłoby archiwum git . Możesz pobrać katalog path/to/modulez głównej gałęzi repozytorium i umieścić w katalogu lokalnym w module-namenastępujący sposób:

git archive --remote=url-of-Git-repository --prefix=module-name/ master:path/to/module |
tar xf -

Jeśli serwer zdalny nie obsługuje archiwizacji, wyciągnij archiwum z lokalnego (nagiego) klonu (użycie pustego klonu pozwala uniknąć posiadania kolejnej kopii plików w lokalnym repozytorium, jeśli jest to ważne).


Jednak użycie polecenia „sprawdź” sugeruje (dla mnie), że chcesz mieć funkcjonalne drzewo robocze Git z obecnymi tylko niektórymi plikami. Można to osiągnąć za pomocą funkcji „rzadkiego pobierania” wprowadzonej w Git 1.7.0.

Włącz tę funkcję przez

  1. ustawienie opcji konfiguracji core.sparseCheckout na „true” * i
  2. wypełnianie $GIT_DIR/info/sparse-checkoutpliku dla repozytorium wzorcami ścieżek, które należy zachować ** .

    Można użyć niskopoziomowego „bitu pomijania-pracy” w indeksie *** do zarządzania rzadkością pojedynczych plików, ale prawdopodobnie łatwiej jest zamiast tego użyć mechanizmu wyższego poziomu.

Istnieją pewne luki w ogólnym interfejsie użytkownika (tzn. Nie ma łatwego sposobu na powiedzenie „klonowanie repozytorium pod tym adresem URL, ale tylko pobranie X, Y i Z”), ale powinno wystarczyć, aby uzyskać funkcję „częściowego pobierania”.

* Patrz „core.sparseCheckout” w git config manpage
** patrz „Sparse kasę” w git odczytu drzewo podręcznika
*** patrz „skip-worktree trochę” w git update-index manpage

Chris Johnsen
źródło
Nie potrzebuję drzewa roboczego ( svn exporteksportuje niedziałającą kopię do użytku produkcyjnego). Co module-1odpowiada itp.? Foldery w repozytorium?
ceejayoz
Przepisałem przykład archiwum git, aby lepiej równolegle z przykładem SVN. Ale w odpowiedzi na twoje pytanie, tak module-1, module-2i file-abyły wszystkie przykłady ścieżek plików przechowywanych w drzewie, do których odwołuje się zatwierdzenie, do którego odwołuje się ref masterw repozytorium. Nowy przykład umieszcza specyfikację katalogu bezpośrednio w argumencie drzewiastym, aby mógł użyć --prefixopcji wyodrębnienia katalogu z repozytorium bezpośrednio do katalogu lokalnego o innej nazwie.
Chris Johnsen
1

https://stackoverflow.com/questions/600079/is-there-any-way-to-clone-a-git-repositorys-sub-directory-only

Nie, to nie jest możliwe w Git.

Wdrożenie czegoś takiego w Git byłoby dużym wysiłkiem i oznaczałoby, że nie można już zagwarantować integralności repozytorium po stronie klienta. Jeśli jesteś zainteresowany, poszukaj dyskusji na temat „sparse clone” i „sparse fetch” na liście mailowej git.

Adam
źródło
Tak. Dość zaskakujące pominięcie, jeśli mnie zapytacie. Prawdopodobnie skończę przy użyciu kasy do katalogu i linków do niego z mojego katalogu internetowego. Chciałbym podzielić je na osobne repozytoria, ale Github pobiera opłaty za repozytorium za prywatne.
ceejayoz
6
Git 1.7.0 wprowadził rzadkie wypłaty.
Chris Johnsen,