Czy można sprawdzić podkatalogi repozytorium w Git?
Wyobraź sobie, że konfiguruję nową instalację WordPress. Utworzę dwa nowe katalogi dla mojej wtyczki i dostosowywania motywu:
wordpress/wp-content/plugins/myplugins/
wordpress/wp-content/themes/mytheme/
Chcę utrzymywać te katalogi przez Git. W Subversion osiągnąłbym to, mając trunk/myplugins/
i trunk/mytheme/
katalogi i sprawdzając podkatalogi. Czy Git ma sposób na wykonanie tego samego zadania przy użyciu jednego repozytorium?
Mogłem po prostu tęsknić za paradygmatem Git, jako długoletni użytkownik SVN z niewielkim kontaktem z Git.
Edycja: wiele gałęzi przechowujących różne treści to interesujący sposób na rozwiązanie tego problemu.
git
sparse-checkout
Annika Backstrom
źródło
źródło
Odpowiedzi:
Rzadkie płatności są teraz dostępne w Git 1.7 .
Zobacz także pytanie „ Czy można wykonać rzadkie pobieranie bez uprzedniego sprawdzenia całego repozytorium? ”.
Zwróć uwagę, że rzadkie wyewidencjonowania nadal wymagają pobrania całego repozytorium, mimo że niektóre pliki pobierane przez Git nie trafią do twojego drzewa roboczego.
źródło
git clone
proste polecenie? Cóż, używam tej odpowiedzi , działa!/foo/bar/foobar
, czy można zobaczyć to tylko/foobar
w moim lokalnym repozytorium?Nie ma prawdziwego sposobu, aby to zrobić w git. A jeśli nie będziesz wprowadzać zmian, które wpłyną na oba drzewa jednocześnie jako jedną jednostkę pracy, nie ma powodu, aby używać jednego repozytorium do obu. Pomyślałem, że przegapiłbym tę funkcję Subversion, ale odkryłem, że tworzenie repozytoriów wiąże się z tak niewielkim narzutem administracyjnym (po prostu z powodu faktu, że repozytoria są przechowywane tuż obok ich kopii roboczej, zamiast wymagać ode mnie wyraźnego wybrania miejsca poza kopia robocza), do których przyzwyczaiłem się po prostu tworzyć wiele małych repozytoriów o jednym przeznaczeniu.
Jeśli jednak nalegasz (lub naprawdę tego potrzebujesz), możesz utworzyć repozytorium git z tylko
mytheme
imyplugins
katalogami i dowiązaniami symbolicznymi do tych z instalacji WordPress.MDCore napisał:
Zauważ, że nie jest to problemem dla gita, jeśli zdecydujesz się umieścić oba katalogi w jednym repozytorium, ponieważ git całkowicie eliminuje koncepcję monotonicznie rosnących numerów wersji w dowolnej formie.
Jedynym kryterium tego, co należy umieścić w jednym repozytorium w git, jest to, czy stanowi on pojedynczą jednostkę, tj. w twoim przypadku, czy są zmiany, w których nie ma sensu patrzeć na edycje w każdym katalogu oddzielnie. Jeśli masz zmiany, w których musisz edytować pliki w obu katalogach jednocześnie, a zmiany należą do siebie, powinny to być jedno repozytorium. Jeśli nie, nie łącz ich razem.
Git naprawdę chce, abyś używał oddzielnych repozytoriów dla oddzielnych jednostek.
Podmoduły nie są odpowiedzią na chęć utrzymywania obu katalogów w jednym repozytorium, ponieważ w rzeczywistości wymuszałyby posiadanie oddzielnego repozytorium dla każdego katalogu, które są następnie łączone w innym repozytorium za pomocą modułów podrzędnych. Gorzej, ponieważ katalogi wewnątrz instalacji WordPress nie są bezpośrednimi podkatalogami tego samego katalogu i są również częścią hierarchii z wieloma innymi plikami, używanie repozytoriów dla poszczególnych katalogów jako modułów podrzędnych w ujednoliconym repozytorium nie przyniosłoby żadnych korzyści, ponieważ ujednolicony repozytorium nie odzwierciedla żadnego przypadku użycia / potrzeby.
źródło
git clone
prosta sekwencja poleceń? Cóż, używam tej odpowiedzi , działa!Jedną rzeczą, której nie lubię w rzadkich pobrań, jest to, że jeśli chcesz pobrać podkatalog, który jest głęboki na kilka katalogów, twoja struktura katalogów musi zawierać wszystkie katalogi do niego prowadzące.
Sposób obejścia tego polega na sklonowaniu repozytorium w miejscu, które nie jest moim obszarem roboczym, a następnie utworzeniu dowiązania symbolicznego w katalogu mojego obszaru roboczego do podkatalogu w repozytorium. Git działa w ten sposób całkiem nieźle, ponieważ rzeczy takie jak status git wyświetlają pliki zmian w stosunku do twojego bieżącego katalogu roboczego.
źródło
W rzeczywistości „wąskie”, „częściowe” lub „rzadkie” testy są obecnie intensywnie rozwijane dla Git. Uwaga, nadal będziesz mieć pełne repozytorium pod
.git
. Tak więc pozostałe dwa posty są aktualne dla bieżącego stanu Git, ale wygląda na to, że ostatecznie będziemy w stanie wykonać rzadkie sprawdzenia. Sprawdź listy mailingowe, jeśli chcesz poznać więcej szczegółów - szybko się zmieniają.źródło
git clone --filter
z Git 2.19Ta opcja faktycznie pominie pobieranie niepotrzebnych obiektów z serwera:
Serwer powinien być skonfigurowany z:
Od wersji 2.19.0 nie ma obsługi serwera, ale można ją już przetestować lokalnie.
file://$(path)
jest wymagany do przezwyciężeniagit clone
oszustw związanych z protokołem: jak płytko sklonować lokalne repozytorium git ze ścieżką względną?Pamiętaj, że
--depth 1
już sugeruje--single-branch
, zobacz także: Jak sklonować pojedynczą gałąź w Git?TODO:
--filter=blob:none
pomija wszystkie obiekty blob, ale nadal pobiera wszystkie obiekty drzewa. Ale w normalnym repozytorium powinno to być małe w porównaniu do samych plików, więc jest już wystarczająco dobre. Zapytany pod adresem : https://www.spinics.net/lists/git/msg342006.html Devs odpowiedział,--filter=tree:0
że pracuje nad tym.Format
--filter
jest udokumentowanyman git-rev-list
.Do zdalnego protokołu Git wprowadzono rozszerzenie obsługujące tę funkcję.
Dokumenty w drzewie Git:
Wypróbuj to
GitHub upstream .
Dane wyjściowe w Git v2.19:
Wnioski: brak wszystkich plamek z zewnątrz
d1/
.Należy pamiętać, że
root/root
imybranch/mybranch
są również brakuje, ale--depth 1
ukrywa, że z listy brakujących plików. Jeśli usuniesz--depth 1
, zostaną one wyświetlone na liście brakujących plików.źródło
Jak wskazuje Twoja edycja, możesz użyć dwóch oddzielnych gałęzi do przechowywania dwóch oddzielnych katalogów. Dzięki temu oba są w tym samym repozytorium, ale nadal nie możesz mieć zatwierdzeń obejmujących oba drzewa katalogów. Jeśli masz zmianę w jednym, która wymaga zmiany w drugim, będziesz musiał to zrobić jako dwa oddzielne zatwierdzenia i otworzysz możliwość, że para pobrań dwóch katalogów może stracić synchronizację.
Jeśli chcesz traktować parę katalogów jako jedną jednostkę, możesz użyć „wordpress / wp-content” jako katalogu głównego repozytorium i użyć pliku .gitignore na najwyższym poziomie, aby zignorować wszystko oprócz dwóch interesujących podkatalogów. Jest to prawdopodobnie najbardziej rozsądne rozwiązanie w tym momencie.
Rzadko wypisuje się rzekomo od dwóch lat, ale nadal nie ma śladu po nich w repozytorium rozwoju git, ani żadnych oznak, że niezbędne zmiany tam dotrą. Nie liczyłbym na nich.
źródło
Nie możesz pobrać pojedynczego katalogu repozytorium, ponieważ całe repozytorium jest obsługiwane przez pojedynczy folder .git w katalogu głównym projektu zamiast niezliczonych katalogów .svn subversion.
Problem z pracą nad wtyczkami w pojedynczym repozytorium polega na tym, że zatwierdzenie np. Mytheme zwiększy numer wersji myplugin , więc nawet w subversion lepiej jest używać oddzielnych repozytoriów.
Paradygmat subversion dla podprojektów to svn: externals, który tłumaczy się nieco na moduły podrzędne w git (ale nie do końca w przypadku, gdy wcześniej używałeś svn: externals).
źródło
Tu jest inspiracja. Po prostu użyj
shell regex
lubgit regex
.Użyj cudzysłowu, aby uniknąć interpretacji wyrażeń regularnych powłoki i przekazać symbole wieloznaczne do git.
Pierwsza nie jest rekurencyjna, tylko pliki o głębokości 1
subdir
. Ale druga jest rekurencyjna.Jeśli chodzi o twoją sytuację, poniższe mogą być wystarczające.
Po prostu zhakuj linie zgodnie z wymaganiami.
źródło
Możesz cofnąć niezatwierdzone zmiany tylko do określonego pliku lub katalogu:
źródło