Mam moje repozytorium Git, które w katalogu głównym ma dwa podkatalogi:
/finisht
/static
Gdy było to w SVN , /finisht
zostało wyewidencjonowane w jednym miejscu, podczas gdy /static
zostało wyewidencjonowane w innym miejscu, tak:
svn co svn+ssh://[email protected]/home/admin/repos/finisht/static static
Czy jest na to sposób w Git?
git
repository
subdirectory
git-clone
sparse-checkout
Nick Sierżant
źródło
źródło
git clone
najprostsze polecenie? Użyłem tej prostej odpowiedzi . Jeśli jest coś prostszego, prosimy o komentarzOdpowiedzi:
EDYCJA : Począwszy od Gita 2.19, jest to w końcu możliwe, jak widać w tej odpowiedzi .
Zastanów się nad poprawieniem tej odpowiedzi.
Uwaga: w Git 2.19 implementowana jest tylko obsługa po stronie klienta, nadal brakuje obsługi po stronie serwera, więc działa tylko podczas klonowania lokalnych repozytoriów. Zauważ również, że duże hosty Git, np. GitHub, tak naprawdę nie używają serwera Git, używają własnej implementacji, więc nawet jeśli wsparcie pojawia się na serwerze Git, nie oznacza to automatycznie, że działa na hostach Git. (OTOH, ponieważ nie używają serwera Git, mogą go zaimplementować szybciej we własnych implementacjach, zanim pojawi się na serwerze Git).
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.
Ogólnie rzecz biorąc, konsensus w społeczności Git jest taki, że jeśli masz kilka katalogów, które są zawsze sprawdzane niezależnie, to tak naprawdę są to dwa różne projekty i powinny żyć w dwóch różnych repozytoriach. Możesz skleić je z powrotem za pomocą Git Submodules .
źródło
git-read-tree
, który jest długo poget-fetch
. Pytanie nie dotyczyło wyewidencjonowania tylko podkatalogu, ale dotyczyło klonowania tylko podkatalogu. Nie widzę, jak mogłyby to zrobić rzadkie kasy, ponieważgit-read-tree
działa po zakończeniu klonowania.To, co próbujesz zrobić, nazywa się rzadką realizacją transakcji , a ta funkcja została dodana w git 1.7.0 (luty 2012 r.). Kroki, aby wykonać rzadki klon są następujące:
Tworzy to puste repozytorium za pomocą pilota i pobiera wszystkie obiekty, ale ich nie sprawdza. Następnie wykonaj:
Teraz musisz określić, które pliki / foldery chcesz faktycznie sprawdzić. Odbywa się to poprzez umieszczenie ich na liście
.git/info/sparse-checkout
, np .:Na koniec zaktualizuj swoje puste repozytorium o stan ze zdalnego:
Będziesz teraz mieć pliki „wyrejestrowany” do
some/dir
ianother/sub/tree
od systemu plików (z tych ścieżek wciąż), a nie inne ścieżki teraźniejszości.Możesz zajrzeć do rozszerzonego samouczka i prawdopodobnie powinieneś przeczytać oficjalną dokumentację dotyczącą rzadkich transakcji .
Jako funkcja:
Stosowanie:
Zauważ, że nadal pobierze to całe repozytorium z serwera - tylko rozmiar kasy zostanie zmniejszony. W tej chwili nie można klonować tylko jednego katalogu. Ale jeśli nie potrzebujesz historii repozytorium, możesz przynajmniej zaoszczędzić na przepustowości, tworząc płytki klon. Zobacz odpowiedź udondan poniżej, aby dowiedzieć się, jak połączyć płytki klon i rzadkie kasy.
Od wersji git 2.25.0 (styczeń 2020) w git dodano eksperymentalną komendę rzadkiego sprawdzania :
źródło
https://github.com/Umkus/nginx-boilerplate/tree/master/src
bezpośrednio do/etc/nginx
git remote add
Polecenie to nie oznacza pobrania, alegit remote add -f
użyte tutaj! To właśnie-f
oznacza.--depth=1
, sklonowałem Chromium Devtools w 338 MB zamiast 4,9 GB pełnego źródła Blink + historii. Świetny.git clone --filter
z Git 2.19Ta opcja faktycznie pomija pobieranie niepotrzebnych obiektów z serwera. Również
--filter=tree:0
z Git 2.20 i--filter=combine
filtra kompozytowego dodanego w Git 2.24, otrzymujemy:Serwer powinien być skonfigurowany z:
Rozszerzono zdalny protokół Git, aby obsługiwać tę funkcję
v2.19.0
i faktycznie pomijać pobieranie niepotrzebnych obiektów, ale w tym czasie nie ma obsługi serwera. Ale można go już przetestować lokalnie.Podział poleceń:
--filter=blob:none
pomija wszystkie obiekty BLOB, ale nadal pobiera wszystkie obiekty drzewa--filter=tree:0
pomija niepotrzebne drzewa: https://www.spinics.net/lists/git/msg342006.html--depth 1
już sugeruje--single-branch
, zobacz także: Jak sklonować pojedynczy oddział w Git?file://$(path)
jest wymagane do przezwyciężeniagit clone
protokołu shenanigans: Jak płytko sklonować lokalne repozytorium git za pomocą ścieżki względnej?--filter=combine:FILTER1+FILTER2
to składnia do używania wielu filtrów jednocześnie, próba przekazania--filter
z jakiegoś powodu kończy się niepowodzeniem: „nie można łączyć wielu specyfikacji filtrów”. Zostało to dodane w Git 2.24 na e987df5fe62b8b29be4cdcdeb3704681ada2b29e „lista-obiektów-filtrów: implementuj filtry kompozytowe”Format
--filter
jest udokumentowany naman git-rev-list
.Dokumenty na drzewie Git:
Przetestuj to
GitHub w górę .
Dane wyjściowe w Git v2.19.0:
Wnioski:
d1/
brakuje wszystkich obiektów blob spoza . Np.0975df9b39e23c15f63db194df7f45c76528bccb
, Któregod2/b
nie ma po sprawdzeniud1/a
.Zauważ, że
root/root
imybranch/mybranch
również ich brakuje, ale--depth 1
ukrywa to na liście brakujących plików. Jeśli usuniesz--depth 1
, zostaną one wyświetlone na liście brakujących plików.Mam Marzenie
Ta funkcja może zrewolucjonizować Git.
Wyobraź sobie, że cała baza kodu Twojego przedsiębiorstwa znajduje się w jednym repozytorium bez brzydkich narzędzi innych firm, takich jak
repo
.Wyobraź sobie, że przechowujesz ogromne obiekty BLOB bezpośrednio w repozytorium bez żadnych brzydkich rozszerzeń stron trzecich .
Wyobraź sobie, że GitHub zezwala na metadane dla plików / katalogów, takie jak gwiazdki i uprawnienia, abyś mógł przechowywać wszystkie swoje rzeczy osobiste w jednym repozytorium.
Wyobraź sobie, że podmoduły były traktowane dokładnie tak, jak zwykłe katalogi : po prostu poproś o SHA drzewa, a mechanizm podobny do DNS rozwiąże twoje żądanie , najpierw patrząc na lokalne
~/.git
, a następnie bliżej serwerów (dublowanie / pamięć podręczna przedsiębiorstwa) i kończąc na GitHub.źródło
fatal: invalid filter-spec 'combine:blob:none+tree:0'
W każdym razie dzięki! Może będzie działać z nowszymi wersjami.Możesz połączyć rzadką kasę i płytkie funkcje klonowania . Te płytkie klonów odcina historii i rozrzedzony kasie ciągnie tylko pliki dopasowania wzorców.
Aby to zadziałało, potrzebujesz minimum git 1.9. Testowałem to sam tylko w wersji 2.2.0 i 2.2.2.
W ten sposób będziesz w stanie naciskać , co nie jest możliwe
git archive
.źródło
git pull --depth=1 origin master
alegit pull --depth=1 origin <any-other-branch>
. to takie dziwne, patrz moje pytanie tutaj :stackoverflow.com/questions/35820630/...W przypadku innych użytkowników, którzy chcą tylko pobrać plik / folder z github, po prostu użyj:
na przykład
(tak, to jest svn tutaj. najwyraźniej w 2016 roku nadal potrzebujesz svn, aby po prostu pobrać niektóre pliki github)
Dzięki uprzejmości: Pobierz pojedynczy folder lub katalog z repozytorium GitHub
Ważne - upewnij się, że zaktualizowałeś adres URL github i zastąpiłeś
/tree/master/
go „/ trunk /”.Jako skrypt bash:
Uwaga Ta metoda pobiera folder, nie klonuje go / nie pobiera. Nie możesz wypchnąć zmian z powrotem do repozytorium. Z drugiej strony - powoduje to mniejsze pobieranie w porównaniu do rzadkiego pobierania lub płytkiego pobierania.
źródło
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity
ale dostałemsvn: E170000: URL 'https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/trunk/udacity' doesn't exist
błąd :(Jeśli nigdy nie planujesz wchodzić w interakcje z repozytorium, z którego sklonowałeś, możesz wykonać pełny klon git i przepisać swoje repozytorium za pomocą git filter-branch --subdirectory-filter . W ten sposób przynajmniej historia zostanie zachowana.
źródło
git filter-branch --subdirectory-filter <subdirectory>
git clone https://github.com/your/repo_xx.git && cd repo_xx && git filter-branch --subdirectory-filter repo_xx_subdir
To wygląda na znacznie prostsze:
źródło
svn export
zamiast tegoGit 1.7.0 ma „rzadkie kasy”. Patrz „core.sparseCheckout” w git config podręcznika systemowego „Sparse kasie” w git odczytu drzewo manpage i „bit Skip-worktree” w git update-index podręcznika .
Interfejs nie jest tak wygodny jak SVN (np. Nie ma sposobu na rzadkie pobranie w momencie początkowego klonowania), ale dostępna jest teraz podstawowa funkcjonalność, na której można zbudować prostsze interfejsy.
źródło
Nie można klonować podkatalogu tylko za pomocą Git, ale poniżej jest kilka obejść.
Filtruj gałąź
Możesz przepisać repozytorium, aby wyglądało, jakby
trunk/public_html/
było jego katalogiem głównym projektu, i odrzucić całą pozostałą historię (używającfilter-branch
), spróbuj na gałęzi już kasy:Uwagi: To,
--
które oddziela opcje gałęzi filtru od opcji rewizji oraz--all
przepisuje wszystkie gałęzie i znaczniki. Wszystkie informacje, w tym oryginalne czasy zatwierdzenia lub informacje o scaleniu, zostaną zachowane . To polecenie honoruje.git/info/grafts
plik i odwołuje się dorefs/replace/
przestrzeni nazw, więc jeśli maszrefs
zdefiniowane przeszczepy lub zamienniki , uruchomienie tego polecenia spowoduje, że będą trwałe.Rzadka kasa
Oto proste kroki z rzadkim podejściem do pobierania, które rzadko wypełnia katalog roboczy, dzięki czemu możesz powiedzieć Gitowi, które foldery lub pliki w katalogu roboczym warto sprawdzić.
Klonuj repozytorium jak zwykle (
--no-checkout
jest opcjonalne):Możesz pominąć ten krok, jeśli repozytorium zostało już sklonowane.
Wskazówka: w przypadku dużych repozytoriów rozważ płytkie klonowanie (
--depth 1
), aby pobrać tylko najnowszą wersję i / lub--single-branch
tylko.Włącz
sparseCheckout
opcję:Określ foldery dla rzadkich transakcji ( bez spacji na końcu):
lub edytuj
.git/info/sparse-checkout
.Kasa oddziału (np.
master
):Teraz powinieneś wybrać foldery w bieżącym katalogu.
Możesz rozważyć użycie dowiązań symbolicznych, jeśli masz zbyt wiele poziomów katalogów lub gałęzi filtrujących.
źródło
pull
?filter-branch
przepisałby zatwierdzenia nadrzędne, aby miały różne identyfikatory SHA1, a zatem twoje filtrowane drzewo nie miałoby żadnych wspólnych zatwierdzeń z drzewem zdalnym.git pull
nie wiedziałbym, skąd próbować się połączyć.Właśnie napisałem skrypt dla GitHub .
Stosowanie:
źródło
Spowoduje to sklonowanie określonego folderu i usunięcie całej niezwiązanej z nim historii.
źródło
Oto skrypt powłoki, który napisałem dla przypadku użycia pojedynczego rzadkiego pobrania z podkatalogu
coSubDir.sh
źródło
ln -s ./.$localRepo/$subDir $localRepo
zamiastln -s ./.$localRepo$subDir $localRepo
Napisałem a
.gitconfig
[alias]
za wykonanie „rzadkiej kasy”. Sprawdź to (bez zamierzonej gry słów):W systemie Windows uruchom
cmd.exe
Inaczej:
Zastosowanie :
Te
git config
polecenia są „minified” dla wygody i przechowywania, ale tutaj jest alias rozszerzony:źródło
L=${1##*/} L=${L%.git}
:? Czy kosmos jest operatorem?Używasz Linuksa? I chcesz tylko mieć łatwy dostęp i czyste drzewo robocze? bez kłopotania się resztą kodu na twoim komputerze. spróbuj dowiązań symbolicznych !
Test
źródło
Aby wyjaśnić niektóre świetne odpowiedzi tutaj, kroki przedstawione w wielu odpowiedziach zakładają, że masz już gdzieś zdalne repozytorium.
Biorąc pod uwagę: istniejące repozytorium git, np.
[email protected]:some-user/full-repo.git
Z jednym lub większą liczbą katalogów, które chcesz pobrać niezależnie od reszty repozytorium, np. Katalogi o nazwachapp1
iapp2
Zakładając, że masz repozytorium git jak wyżej ...
Następnie: możesz uruchomić następujące kroki, aby pobrać tylko określone katalogi z tego większego repozytorium:
Myślałem błędnie, że opcje rzadkich transakcji musiały być ustawione w oryginalnym repozytorium: tak nie jest. Definiujesz katalogi, które chcesz lokalnie, przed pobraniem ze zdalnego. Mam nadzieję, że to wyjaśnienie pomoże komuś innemu.
źródło
Chociaż nienawidzę faktycznego korzystania z svn podczas obsługi repozytoriów git: / Używam tego cały czas;
Umożliwia to skopiowanie z adresu github bez modyfikacji. Stosowanie;
źródło
Jeśli jesteś naprawdę zainteresowany najnowszymi plikami wersji katalogu, Github umożliwia pobranie repozytorium jako pliku Zip, który nie zawiera historii. Pobieranie jest więc znacznie szybsze.
źródło
Więc próbowałem wszystkiego w tym bieżniku i nic nie działało dla mnie ... Okazuje się, że w wersji 2.24 Git (tej, która jest dostarczana z panelem w momencie tej odpowiedzi), nie musisz tego robić
wszystko czego potrzebujesz to nazwa folderu
Krótko mówiąc, robicie to
następnie edytujesz .git / info / sparse-checkout i dodajesz nazwy folderów (jeden w linii) za pomocą / * na końcu, aby uzyskać podfoldery i pliki
Zapisz i uruchom polecenie kasy
Rezultatem był oczekiwany folder z mojego repozytorium i nic więcej Upvote, jeśli to zadziałało dla Ciebie
źródło