Jak mogę pobrać tylko określony folder lub katalog ze zdalnego repozytorium Git hostowanego na GitHub?
Powiedz przykład, że repozytorium GitHub mieszka tutaj:
[email protected]:foobar/Test.git
Jego struktura katalogów:
Test/
├── foo/
│ ├── a.py
│ └── b.py
└── bar/
├── c.py
└── d.py
Chcę pobrać tylko folder foo i nie klonować całego projektu testowego.
Odpowiedzi:
Aktualizacja września 2016: społeczność stworzyła kilka narzędzi, które mogą to zrobić za Ciebie:
Git nie obsługuje tego, ale Github robi to za pośrednictwem SVN. Jeśli wypiszesz swój kod za pomocą subversion, Github zasadniczo skonwertuje repo z git na subversion na backendie, a następnie poda żądany katalog.
Oto, jak możesz użyć tej funkcji, aby pobrać określony folder.
lodash
Jako przykład użyję popularnej biblioteki javascript .Przejdź do folderu, który chcesz pobrać . Pobierzmy
/test
zmaster
oddziału.Zmodyfikuj adres URL subversion . Wymień
tree/master
siętrunk
.https://github.com/lodash/lodash/tree/master/test
➜https://github.com/lodash/lodash/trunk/test
Pobierz folder . Przejdź do wiersza poleceń i chwyć folder za pomocą SVN.
Nie możesz natychmiast zobaczyć żadnej aktywności, ponieważ Github przekształca większe repozytoria do 30 sekund, więc bądź cierpliwy.
To wszystko! Github obsługuje również więcej funkcji subversion , w tym obsługę zatwierdzania i wypychania zmian.
źródło
tree/master
siętrunk
i można dostać folder konkretnego.tree/master
ztrunk
. Informacje te należy dodać w odpowiedzi.svn export
, ponieważ nie chciałem kopii roboczej Subversion. Następnie dodałem powstały folder w Git. (Jakoś zgubiłem duży kawałek mojego drzewa katalogów, więc wyeksportowałem z repozytorium, który rozwidliłem.)branch
ścieżkę nabranches
, co moim zdaniem jest poprawne; jeśli nie, śmiało i zmień to z powrotem.Dwie opcje dla tej funkcji:
Opcja 1: Rozszerzenie przeglądarki GitZip
Stosowanie:
Zdobądź token:
Opcja 2: strona Github
Krok 1: Wpisz adres URL github w polu w prawym górnym rogu.
Krok 2: Naciśnij Enter lub kliknij Pobierz bezpośrednio do pobrania zip lub kliknij Szukaj, aby wyświetlić listę podfolderów i plików.
Krok 3: Kliknij przycisk „Pobierz plik zip” lub „Pobierz plik”, aby uzyskać pliki.
W większości przypadków działa dobrze, z tym wyjątkiem, że folder zawiera ponad 1000 plików z powodu ograniczeń interfejsu API drzew Github. (odnosi się do Github API # Contents )
Może także obsługiwać prywatne / publiczne repozytorium i aktualizować limit stawek, jeśli masz konto GitHub i używasz linku „get token” na tej stronie.
źródło
Przejdź do DownGit > Wpisz swój adres URL> Pobierz!
Teraz możesz BEZPOŚREDNIO POBRAĆ lub utworzyć POBIERANIE LINKU dla dowolnego katalogu publicznego lub pliku GitHub ( szczególnie dużego pliku ) z DownGit ! Oto prosta demonstracja
Możesz także skonfigurować szczegółowe wykorzystanie właściwości pobranego pliku .
źródło
downloaded 25 of 25 files
gdy próbuję pobrać z tego adresu URL: github.com/dssg/hitchhikers-guide/tree/master/curriculum/…Jeśli tak
svn
, możesz użyćsvn export
do tego:Zwróć uwagę na format adresu URL:
https://github.com/
/trunk
dołączone na końcuPrzed uruchomieniem
svn export
dobrze jest najpierw zweryfikować zawartość katalogu za pomocą:źródło
.git
rozszerzenie. Możesz użyć pełnego linku do projektu i rozpocząć od użyciasvn ls
pełnej ścieżki projektu. Przykład:svn ls https://github.com/RobTillaart/Arduino.git
. Aby wyeksportować tylko jeden folder, wystarczy dodać,/trunk
a następnie żądaną ścieżkę, npsvn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib
. Łatwiej utrzymać nietkniętą ścieżkę projektu.https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi
, uruchomsvn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi
. Wywołany katalogwsgi
zostanie utworzony w bieżącym katalogu roboczym. Tylko pliki źródłowe, nic więcej. Nie.git
, żadnych plików związanych z subversion.W przypadku ogólnego repozytorium git:
Jeśli chcesz pobrać pliki, a nie klonować repozytorium z historią, możesz to zrobić za pomocą
git-archive
.git-archive
tworzy skompresowane archiwum zip lub tar repozytorium git. Niektóre rzeczy, które sprawiają, że jest wyjątkowy:.git/
folderu ani żadnych nieśledzonych plików w repozytorium, w którym jest uruchomiony.Przykład tworzenia archiwum
docs/usage
katalogu ze zdalnego repozytorium, z którym jesteś podłączony za pomocą ssh:Więcej informacji w tym poście na blogu i dokumentacji git .
Uwaga na temat repozytoriów GitHub:
GitHub nie zezwala na
git-archive
dostęp . ☹️źródło
git archive --format tar
format nie jest tar.gz, ale tar.Stworzyłem projekt open source o nazwie GitHubFolderDownloader . Umożliwia pobranie jednego folderu repozytorium bez klonowania lub pobierania całego repozytorium.
źródło
Nie ma nic złego w innych odpowiedziach, ale pomyślałem, że po raz pierwszy podzielę się instrukcjami krok po kroku dla osób wędrujących przez ten proces.
Jak pobrać pojedynczy folder z repozytorium github (Mac OS X):
BTW - Jeśli korzystasz z systemu Windows lub innej platformy, możesz znaleźć binarne pobieranie subversion (svn) na stronie http://subversion.apache.org
Aktualizacja
Odnośnie komentarza o wznowieniu przerwanego pobierania / pobierania. Spróbowałbym uruchomić,
svn cleanup
a następniesvn update
. Wyszukaj w SO dodatkowe opcje.źródło
Ktokolwiek pracuje nad określonym folderem, musi sam sklonować ten konkretny folder. Aby to zrobić, wykonaj poniższe czynności, korzystając z rzadkiej realizacji transakcji.
Utwórz katalog.
Zainicjuj repozytorium Git. (
git init
)Włącz rzadkie kasy. (
git config core.sparsecheckout true
)Powiedz Git, które katalogi chcesz (echo 2015 / brand / May (sprawdź folder, nad którym chcesz pracować) >>
.git/info/sparse-checkout
)Dodaj pilota (
git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git
)Pobierz pliki (
git pull origin master
)źródło
Nie możesz; w przeciwieństwie do Subversion, gdzie każdy podkatalog może być wyewidencjonowany osobno, Git działa na zasadzie całego repozytorium.
W przypadku projektów, w których konieczny jest bardziej szczegółowy dostęp, możesz użyć submodułów - każdy submoduł jest osobnym projektem Git, a zatem można go klonować indywidualnie.
Można sobie wyobrazić, że front-end Gita (np. Interfejs sieciowy GitHub lub gitweb) może zdecydować się na udostępnienie interfejsu do wyodrębnienia danego folderu, ale o ile wiem, żaden z nich tego nie robi (chociaż pozwala on pobierać pojedyncze pliki , więc jeśli folder nie zawiera zbyt wielu plików, jest to opcja)
Edycja - GitHub oferuje dostęp przez SVN, co pozwoliłoby ci to zrobić (jak w komentarzu). Najnowsze instrukcje, jak to zrobić, zobacz https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away
źródło
Jeśli naprawdę chcesz po prostu „pobrać” folder, a nie „sklonować” go (w celu opracowania), najłatwiejszym sposobem jest po prostu uzyskanie kopii najnowszej wersji repozytorium (a zatem folderu / pliku w nim zawartego), bez konieczności klonowania całego repo, a nawet nawet instalowania git, należy pobrać archiwum zip (dla dowolnego repo, rozwidlenia, gałęzi, zatwierdzenia itp.), przechodząc do żądanego repozytorium / fork / branch / commit na GitHub (np.
http(s)://github.com/<user>/<repo>/commit/<Sha1>
dla kopii plików, które były po określonym zatwierdzeniu) i wybranieDownloads
przycisku w prawym górnym rogu.Ten format archiwum nie zawiera żadnej magii git-repo, tylko same śledzone pliki (i być może kilka plików .gitignore, jeśli zostały one wyśledzone, ale możesz je zignorować: p) - oznacza to, że jeśli kod się zmieni i chcesz pozostań na górze, będziesz musiał ręcznie pobrać go ponownie, a to oznacza również, że nie będziesz mógł go używać jako repozytorium git ...
Nie jestem pewien, czy tego właśnie szukasz w tym przypadku (ponownie „pobierz” / wyświetl vs. „klon” / rozwijaj), ale może to jednak być przydatne ...
źródło
tar.gz
:https://github.com/${owner}/${repo}/archive/${hash}.tar.gz
Podsumowanie 2019 r
Istnieje wiele sposobów radzenia sobie z tym, w zależności od tego, czy chcesz to zrobić ręcznie, czy programowo.
Istnieją cztery opcje podsumowane poniżej. A dla tych, którzy wolą bardziej praktyczne wyjaśnienia, przygotowałem film z YouTube: Pobierz pojedyncze pliki i foldery z GitHub .
Również zamieściłem podobną odpowiedź na StackOverflow dla tych, którzy muszą pobierać pojedyncze pliki z GitHub (w przeciwieństwie do folderów).
1. Interfejs użytkownika GitHub
2. Narzędzia stron trzecich
https://github.com/babel/babel-eslint/tree/master/lib
) I nacisnąć przycisk „Pobierz”.3. Subversion
svn export https://github.com/babel/babel-eslint/trunk/lib
i naciśnij klawisz enter.4. GitHub API
https://api.github.com/repos/:owner/:repo/contents/:path
. Po zastąpieniu symboli zastępczych przykładowym punktem końcowym jest:https://api.github.com/repos/babel/babel-eslint/contents/lib
. To daje dane JSON dla całej zawartości, która istnieje w tym folderze. Dane zawierają wszystko, czego potrzebujesz, w tym to, czy zawartość jest folderem lub plikiem, adres URL pobierania, jeśli jest to plik, oraz punkt końcowy interfejsu API, jeśli jest to folder (abyś mógł uzyskać dane dla tego folderu). Korzystając z tych danych, skrypt może rekurencyjnie przechodzić przez całą zawartość folderu docelowego, tworzyć foldery dla folderów zagnieżdżonych i pobierać wszystkie pliki dla każdego folderu. Sprawdź kod DownGit za inspiracji.źródło
Kolejny konkretny przykład:
Tak jak chcę pobrać folder „iOS Pro Geo” z adresu URL
https://github.com/alokc83/APRESS-Books-Source-Code-/ tree / master /% 20Pro% 20iOS% 20Geo
i mogę to zrobić za pośrednictwem
Uwaga pień na ścieżce
Edytowano: (zgodnie z komentarzem Tommie C.)
Tak, użycie eksportu zamiast kasy dałoby czystą kopię bez dodatkowych plików repozytorium git.
Edytowane: Jeśli drzewa / wzorca nie ma w adresie URL, rozwidl go i będzie tam w adresie Rozwidlony.
źródło
Nazywa się pakiet pip Python3,
githubdl
który może to zrobić *:Strona projektu jest tutaj
* Zastrzeżenie: Napisałem ten pakiet.
źródło
To jedno z niewielu miejsc, w których SVN jest lepszy niż Git.
Ostatecznie skupiliśmy się na trzech opcjach:
źródło
Jeśli nie masz nic przeciwko komendom uniksowym, nie potrzebujesz do tego specjalnych zależności ani aplikacji internetowych. Możesz pobrać repo jako archiwum i rozpakować tylko to, czego potrzebujesz.
Przykład (pliki woff2 z podkatalogu w fontawesome):
*/
), aby pasowała do dowolnego katalogu. Github tworzy katalog opakowujący z referencją zatwierdzenia w nazwie, więc nie można go poznać.--strip-components
być taki sam jak liczba ukośników (/
) na ścieżce (poprzedni argument).Spowoduje to pobranie całego archiwum. Użyj metody SVN wymienionej w innych odpowiedziach, jeśli trzeba tego uniknąć lub jeśli chcesz być miły dla serwerów GitHub.
źródło
Możesz zrobić proste pobranie drzewa katalogów:
Ale jeśli masz zamiar to sprawdzić i być w stanie dokonać zatwierdzeń i odepchnąć je z powrotem, nie, nie możesz tego zrobić.
źródło
Aby wzmocnić powyższe odpowiedzi, prawdziwym przykładem z prawdziwego repozytorium GitHub do katalogu lokalnego byłoby:
Czasami konkretny przykład pomaga wyjaśnić proponowane zastąpienia.
źródło
Żadna z odpowiedzi nie pomogła w mojej sytuacji. Jeśli tworzysz dla systemu Windows, prawdopodobnie nie masz svn. W wielu sytuacjach nie można liczyć na to, że użytkownicy zainstalują Git lub nie będą chcieli pobierać całych repozytoriów z innych powodów. Niektóre osoby, które odpowiedziały na to pytanie, takie jak Willem van Ketwich i Aztack, stworzyły narzędzia do wykonania tego zadania. Jeśli jednak narzędzie nie jest napisane dla używanego języka lub nie chcesz instalować biblioteki innej firmy, nie działają one.
Jest jednak o wiele łatwiejszy sposób. GitHub ma interfejs API, który umożliwia pobieranie pojedynczego pliku lub zawartości całego katalogu za pomocą żądań GET . Możesz uzyskać dostęp do katalogu za pomocą,
https://api.github.com/repos/:owner/:repo_name/contents/:path
który zwraca obiekt JSON wyliczający wszystkie pliki w katalogu. W wyliczeniu zawarty jest link do surowej zawartości pliku,download_url
parametr. Plik można następnie pobrać przy użyciu tego adresu URL.Jest to dwuetapowy proces, który wymaga zdolności do wysyłania żądań GET, ale można to zaimplementować w prawie dowolnym języku i na dowolnej platformie. Może być używany do pobierania plików lub katalogów.
źródło
Nasz zespół napisał skrypt bash, aby to zrobić, ponieważ nie chcieliśmy instalować SVN na naszym serwerze bez kości.
https://github.com/ojbc/docker/blob/master/java8-karaf3/files/git-download.sh
Korzysta z interfejsu API github i można go uruchomić z wiersza poleceń w następujący sposób:
źródło
Używam linuxa, więc wstaw to do ~ / .bashrc, nazywane nawet: D $ HOME / .bashrc
następnie odśwież powłokę za pomocą
następnie użyj go z git-downloadfolder blablabla: D
źródło
Pracuję z serwerami CentOS 7, na których nie mam dostępu do roota, ani git, svn itp. (I nie chcę!), Więc utworzyłem skrypt Pythona, aby pobrać dowolny folder github: https://github.com/andrrrl/github -folder-downloader
Użycie jest proste, po prostu skopiuj odpowiednią część z projektu github, powiedzmy, że projekt to https://github.com/MaxCDN/php-maxcdn/ , a chcesz folder, w którym są tylko niektóre pliki źródłowe, wtedy musisz zrób coś takiego:
$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(utworzy folder docelowy, jeśli nie istnieje)
Wymaga biblioteki lxml , można ją zainstalować.
easy_install lxml
Jeśli nie masz dostępu
.pydistutils.py
do konta root (jak ja), możesz utworzyć plik do swojego katalogu$HOME
z następującymi treściami:[install] user=1
Ieasy_install lxml
po prostu zadziała (zob. Https://stackoverflow.com/a/ 33464597/591257 ).źródło
Jeszcze tylko 5 kroków
źródło
Aby wyeksportować katalog z GitHub, zamień „/ tree / master /” w adresie URL katalogu na „/ trunk /”.
Na przykład, aby wyeksportować katalog z następującego adresu URL:
uruchom następujące polecenie:
źródło
Prostą odpowiedzią na to jest pierwszy żółw svn z następującego linku.
podczas instalacji włącz opcję CLI, aby można było jej używać z interfejsu wiersza poleceń.
skopiuj link do podkatalogu git hub.
zamień tree / master na trunk
i robić
pliki zostaną pobrane do folderu deeplab w bieżącym katalogu.
źródło
możesz użyć git svn w następujący sposób.
W ten sposób nie musisz męczyć się z ustawieniem svn, szczególnie dla użytkowników systemu Windows.
źródło
sudo apt install git-svn
jest wymagany podczas uruchamiania przez WSL.Jeśli musisz to zrobić programowo i nie chcesz polegać na SVN, możesz użyć GitHub API do pobrania całej zawartości rekurencyjnie.
Aby uzyskać inspirację, oto moja rubinowa treść: https://gist.github.com/cvengros/b2a7e82f66519d423b6f
źródło
Użyj tej funkcji, pierwszy argument to adres URL folderu, drugi to miejsce, w którym folder zostanie pobrany:
źródło
git clone --filter
z Git 2.19Ta opcja faktycznie pomija pobieranie niepotrzebnych obiektów z serwera:
Serwer powinien być skonfigurowany z:
Rozszerzono zdalny protokół Git do obsługi tej funkcji w wersji 2.19.0, ale w tym momencie nie ma obsługi serwera. Ale można go już przetestować lokalnie.
Omówiłem to bardziej szczegółowo na stronie: Jak sklonować podkatalog tylko repozytorium Git?
źródło
Z jakiegokolwiek powodu
svn
rozwiązanie nie działa dla mnie, a ponieważ nie potrzebujęsvn
niczego innego, nie ma sensu spędzać czasu na próbach jego wykonania, więc szukałem prostego rozwiązania przy użyciu narzędzi, które już miałem. Ten skrypt używa tylkocurl
iawk
do pobrania wszystkich plików z katalogu GitHub opisanego jako"/:user:repo/contents/:path"
.Zwrócona treść wywołania
"GET /repos/:user:repo/contents/:path"
komendy API GESTHub REST zwraca obiekt, który zawiera"download_url"
łącze do każdego pliku w katalogu.Ten skrypt wiersza poleceń wywołuje interfejs API REST
curl
i wysyła wynik za pośrednictwem AWK, który odfiltrowuje wszystkie wiersze oprócz „download_url”, usuwa znaki cudzysłowu i przecinki z łączy, a następnie pobiera łącza za pomocą innego wywołania zwijania.źródło
git sparse-checkout
Przykład z bieżącą wersją :
W szczególności
--sparse
pobiera tylko pliki katalogu najwyższego poziomugit
repozytorium do kopii roboczejgit sparse-checkout add t
przyrostowo dodaje / sprawdzat
podfolder plikugit
Inne elementy
git sparse-checkout init
robi pewne przygotowania, by umożliwić częściowe kasy--filter=blob:none
optymalizuje pobieranie danych, pobierając tylko niezbędne obiekty git (spójrz na funkcję częściowego klonowania w celu uzyskania dalszych informacji)--cone
przyspiesza także wydajność, stosując bardziej ograniczone wzorce dołączania plikówStatus GitHub
źródło