Pobierz pojedynczy folder lub katalog z repozytorium GitHub

1105

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.

g_inherit
źródło
4
Napisałem do tego skrypt powłoki za pomocą svn Checkout - github.com/Decad/github-downloader
Declan Cook
390
Czy ktoś może mi wyjaśnić, dlaczego nie ma „oficjalnego” rozwiązania interfejsu internetowego? Wydaje się, że jest to trywialna funkcja do wdrożenia, ale bardzo przydatna.
Alexander - Przywróć Monikę
3
Opracowałem rozszerzenie chrom za pomocą gitzip KinoLien. github.com/charany1/GHSDD
charany1
3
patrz @janos odpowiedź svn alternatywa jest najlepsza, bez autoryzacji, bez rejestracji, bez limitu, bez wtyczek
stackdave
5
Zrobiłem lekkie rozwiązanie dla tego ( download-directory.github.io ) i jest zintegrowane z Refined GitHub
fregante

Odpowiedzi:

1034

Aktualizacja września 2016: społeczność stworzyła kilka narzędzi, które mogą to zrobić za Ciebie:

  • GitZip (Podziękowania dla Kina - tutaj głosuj na jego odpowiedź ! )
  • DownGit (Podziękowania dla Minhasa Kamala - głosuj tutaj jego odpowiedź ! )

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. lodashJako przykład użyję popularnej biblioteki javascript .

  1. Przejdź do folderu, który chcesz pobrać . Pobierzmy /testz masteroddziału. Przykład adresu URL repozytorium github

  2. Zmodyfikuj adres URL subversion . Wymień tree/mastersię trunk.

    https://github.com/lodash/lodash/tree/master/test

    https://github.com/lodash/lodash/trunk/test

  3. Pobierz folder . Przejdź do wiersza poleceń i chwyć folder za pomocą SVN.

svn checkout https://github.com/lodash/lodash/trunk/test

Nie możesz natychmiast zobaczyć żadnej aktywności, ponieważ Github przekształca większe repozytoria do 30 sekund, więc bądź cierpliwy.

Pełne objaśnienie formatu adresu URL:

  • Jeśli interesuje Cię mastergałąź, użyj trunkzamiast tego. Tak więc pełna ścieżka jesttrunk/foldername
  • Jeśli interesuje Cię foogałąź, użyj branches/foozamiast tego. Pełna ścieżka wyglądabranches/foo/foldername
  • Protip: Możesz użyć, svn lsaby zobaczyć dostępne tagi i gałęzie przed pobraniem, jeśli chcesz

To wszystko! Github obsługuje również więcej funkcji subversion , w tym obsługę zatwierdzania i wypychania zmian.

nacięcie
źródło
162
Niesamowite, po prostu wymienić tree/mastersię trunki można dostać folder konkretnego.
Sérgio Michels,
6
Dzięki @ user1146881 i @ SérgioMichels, trzeba wymienić tree/masterz trunk. Informacje te należy dodać w odpowiedzi.
baptx,
8
Zmodyfikowałem to, aby użyć 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.)
Grault,
5
@ num3ric- przepraszam za spóźnioną odpowiedź, ale powinieneś być w stanie zastąpić „trunk” słowem „branches / yourbranch”
nick
2
@ElijahLynn Dzięki za edycję, powinienem był podać te informacje! 2 rzeczy - zaakceptowałem twoją edycję, ale wycofałem niektóre z moich własnych (i tak chciałem to zrobić, czułem się zbyt niechlujnie). Dodatkowo zmieniłem twoją branchścieżkę na branches, co moim zdaniem jest poprawne; jeśli nie, śmiało i zmień to z powrotem.
nick
566

Dwie opcje dla tej funkcji:

Opcja 1: Rozszerzenie przeglądarki GitZip

Rozszerzenie Chrome , dodatek do przeglądarki Firefox

Stosowanie:

  1. Na dowolnej stronie repozytoriów GitHub.
  2. Wystarczy dwukrotnie kliknąć pustą część potrzebnych elementów.
  3. Kliknij przycisk pobierania w prawym dolnym rogu.
  4. Zobacz pulpit postępu i poczekaj na pobranie wyzwalacza przeglądarki.
  5. Pobierz plik ZIP.

Zdobądź token:

  1. Kliknij ikonę rozszerzenia GitZip w przeglądarce.
  2. Kliknij link „Normalny” lub „Prywatny” oprócz „Uzyskaj token”.
  3. Autoryzuj uprawnienie GitZip na stronie autoryzacji Github.
  4. Powrót do strony repozytorium początku.
  5. Kontynuuj korzystanie.

Opcja 2: strona Github

http://kinolien.github.io/gitzip przy użyciu GitHub API i JSZip, biblioteki FileSaver.js.

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.

Kino
źródło
5
To jest niesamowite, ale wygląda na to, że jest tak niesamowity, że popyt popycha cię ponad limit ratelit, więc nie działa już ;-) Byłoby wspaniale móc zalogować się do GitHub oAuth - co pozwoliłoby na obsługę prywatnych repozytoriów, a także zwiększenie twój limit stawek, ponieważ byłyby to uwierzytelnione wnioski
hobailey
3
@ Hobailey Teraz może uzyskać token dostępu, aby zwiększyć limit stawek, a także uzyskać dostęp do prywatnych repozytoriów.
Kino
1
@MYounas Zobacz informacje na temat OAuth, drzew, obiektów Blob w Github API Doc. , a także używać bibliotek JS JSZip, FileSaver.js do implementacji gitzip.
Kino,
1
Czy ktoś byłby zainteresowany rozszerzeniem chrome, który to robi?
goldylucks
4
To naprawdę musi zostać dodane do faktycznej strony github, jest to niezwykle przydatne.
rzuca
508

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


DownGit


Możesz także skonfigurować szczegółowe wykorzystanie właściwości pobranego pliku .

Minhas Kamal
źródło
2
Bro, mam na myśli, jak stworzyć projekt taki jak DownGit, który stworzyłeś.
Muhammad Younus,
12
Podstawową metodą jest: 1. skorzystaj z linku do katalogu (użyłem trasy kątowej ), 2. przejdź do GitHub API , 3. przeszukaj katalog i pobierz wszystkie pliki, 4. utwórz z niego plik zip (użyłem jszip ) i zapisz go jako plik ( w tym celu wykorzystano wygaszacz plików ). Dla jasnego zrozumienia proponuję zajrzeć do mojego projektu .
Minhas Kamal,
1
dzięki za szczegółowe instrukcje, jestem ci bardzo wdzięczny, jeśli zaproponujesz tutorial lub link.
Muhammad Younus,
5
To jest fajne, ale nie działa z automatycznymi narzędziami (takimi jak wget)
Zadzwoń
1
Zawiesza się, downloaded 25 of 25 filesgdy próbuję pobrać z tego adresu URL: github.com/dssg/hitchhikers-guide/tree/master/curriculum/…
Wassadamo,
164

Jeśli tak svn, możesz użyć svn exportdo tego:

svn export https://github.com/foobar/Test.git/trunk/foo

Zwróć uwagę na format adresu URL:

  • Podstawowy adres URL to https://github.com/
  • /trunk dołączone na końcu

Przed uruchomieniem svn exportdobrze jest najpierw zweryfikować zawartość katalogu za pomocą:

svn ls https://github.com/foobar/Test.git/trunk/foo
janos
źródło
Czy to nadal działa? Wypróbowałem to z TortiseSVN i dostaję błąd uprawnień, prosząc mnie o podanie poświadczeń.
John
2
@ john Jestem pewien, że jest już za późno, aby pomóc, ale czy na Twoim koncie GitHub włączone jest uwierzytelnianie dwuskładnikowe? Jeśli tak, myślę, że gdzieś przeczytałem, że musisz użyć wstępnie wygenerowanego klucza do hasła (które musisz znaleźć w ustawieniach GitHub).
nick
1
Jeśli chodzi o formatowanie adresu URL, możesz zachować .gitrozszerzenie. Możesz użyć pełnego linku do projektu i rozpocząć od użycia svn lspełnej ścieżki projektu. Przykład: svn ls https://github.com/RobTillaart/Arduino.git. Aby wyeksportować tylko jeden folder, wystarczy dodać, /trunka następnie żądaną ścieżkę, np svn export https://github.com/RobTillaart/Arduino.git/trunk/libraries/DHTlib. Łatwiej utrzymać nietkniętą ścieżkę projektu.
jgrocha
@jgrocha Nie jestem pewien, czy to zadziałało w 2013 roku, ale teraz działa, więc dziękuję, zaktualizowałem post
Janos
1
Przykład: aby pobrać zawartość https://github.com/miguelgrinberg/python-socketio/tree/master/examples/wsgi, uruchom svn export https://github.com/miguelgrinberg/python-socketio.git/trunk/examples/wsgi. Wywołany katalog wsgizostanie utworzony w bieżącym katalogu roboczym. Tylko pliki źródłowe, nic więcej. Nie .git, żadnych plików związanych z subversion.
Rockallite,
74

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-archivetworzy skompresowane archiwum zip lub tar repozytorium git. Niektóre rzeczy, które sprawiają, że jest wyjątkowy:

  1. Możesz wybrać, które pliki lub katalogi w repozytorium git mają być archiwizowane.
  2. Nie archiwizuje .git/folderu ani żadnych nieśledzonych plików w repozytorium, w którym jest uruchomiony.
  3. Możesz zarchiwizować określoną gałąź, tag lub zatwierdzić. Projekty zarządzane za pomocą git często używają tego do generowania archiwów wersji projektu (beta, wydanie, 2.0 itd.) Do pobrania przez użytkowników.

Przykład tworzenia archiwum docs/usagekatalogu ze zdalnego repozytorium, z którym jesteś podłączony za pomocą ssh:

# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tar

Więcej informacji w tym poście na blogu i dokumentacji git .

Uwaga na temat repozytoriów GitHub:

GitHub nie zezwala na git-archivedostęp . ☹️

RobW
źródło
2
git archive --format tarformat nie jest tar.gz, ale tar.
出 羽 和 之
To powinna być najlepsza odpowiedź
Felipe Costa
2
Myślę, że to najlepsza odpowiedź, ale pamiętaj, że polecenie git archive nie działa z protokołem https.
bitfox
@yukihane zredagował rozszerzenie z tar.gz na tar, mam nadzieję, że OP jest na pokładzie
mihai
36

Stworzyłem projekt open source o nazwie GitHubFolderDownloader . Umożliwia pobranie jednego folderu repozytorium bez klonowania lub pobierania całego repozytorium.

VahidN
źródło
Działa świetnie, jeśli potrzebujesz tylko pobrać foldery z GitHub. Potrzebuje tylko tokena Github, aby pobrać żądany folder. Więcej pozytywnych opinii mogłoby nadać tej odpowiedziom znaczenie.
Alex Essilfie,
34

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):

~ Aby otworzyć Terminal, kliknij reflektor i wpisz terminal, a następnie naciśnij Enter

  1. Na komputerze Mac prawdopodobnie masz już SVN (do przetestowania wystarczy otworzyć terminal i wpisać „svn” lub „which svn” ~ bez znaków cudzysłowu)
  2. Na Github: zlokalizuj ścieżkę Github do folderu git (nie repozytorium), klikając nazwę określonego folderu w repozytorium
  3. Skopiuj ścieżkę z paska adresu przeglądarki
  4. Otwórz terminal i wpisz: svn export
  5. Następnie wklej adres (np.): Https://github.com/mingsai/Sample-Code/tree/master/HeadsUpUI
  6. Zamień słowa: drzewo / mistrz
  7. ze słowem: bagażnik
  8. Wpisz folder docelowy dla plików (w tym przykładzie przechowuję folder docelowy w folderze Pobrane dla bieżącego użytkownika)
  9. Tutaj spacja to tylko spacja, a nie słowo (spacja) ~ / Downloads / HeadsUpUI
  10. Końcowe polecenie terminalu pokazuje pełne polecenie pobrania folderu (porównaj adres z kroku 5) svn export https://github.com/mingsai/Sample-Code/trunk/HeadsUpUI ~ / Downloads / HeadsUpUI

BTW - Jeśli korzystasz z systemu Windows lub innej platformy, możesz znaleźć binarne pobieranie subversion (svn) na stronie http://subversion.apache.org

~ Jeśli chcesz kasy folder zamiast po prostu go pobrać spróbować użyć pomocy svn (tldr: zastąpić eksport ze kasie )

Aktualizacja

Odnośnie komentarza o wznowieniu przerwanego pobierania / pobierania. Spróbowałbym uruchomić, svn cleanupa następnie svn update. Wyszukaj w SO dodatkowe opcje.

Tommie C.
źródło
1
Muszę pobrać wiele plików z określonego folderu i otrzymałem ten błąd w trakcie pobierania: svn: E175002: RAPORT z '/ bgmartins / scripts-parlamento /! Svn / vcc / default': 200 OK ( github.com ) Jak mogę wznowić pobieranie?
Miguel
Pracował dla mnie. To jest wspaniałe.
Heath Raftery
24

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.

  1. Utwórz katalog.

  2. Zainicjuj repozytorium Git. ( git init)

  3. Włącz rzadkie kasy. ( git config core.sparsecheckout true)

  4. Powiedz Git, które katalogi chcesz (echo 2015 / brand / May (sprawdź folder, nad którym chcesz pracować) >> .git/info/sparse-checkout)

  5. Dodaj pilota ( git remote add -f origin https://jafartke.com/mkt-imdev/DVM.git)

  6. Pobierz pliki ( git pull origin master)

Mohammed Jafar
źródło
Szkoda, że ​​ten komentarz nie otrzymał wystarczającej liczby głosów pozytywnych. Wygląda na to, że dostarczone rozwiązanie dotyczy wszystkich repozytoriów git, a nie tylko repozytorium github.
Kalyan,
9
Jednak tak naprawdę nie spełnia oczekiwań. Nadal klonuje całe repozytorium, po prostu nie sprawdza niektórych folderów.
Chris
Otrzymuję ten błąd: rzadkie pobranie nie pozostawia żadnego wpisu w katalogu roboczym.
orangecaterpillar
20

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

michel-slm
źródło
czy jest coś za pośrednictwem github API?
g_inherit
14

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 wybranie Downloadsprzycisku 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 ...

Jasio
źródło
9
Jeśli nie widzisz linku do pobrania, upewnij się, że jesteś na głównej stronie repozytorium (a nie w katalogu podrzędnym). Wygląda na to, że możesz pobrać tylko zip całego repozytorium. Również ta strona pomocy github może być przydatna.
JD Smith
2
Łatwy dostęp typu „wskaż i kliknij”. Łatwo uzyskać wcześniejsze wydanie. Łatwo wyciągnij żądany folder z pobranego pliku zip. Dziękuję Ci.
Andy Thomas,
1
Ogólny adres URL, z którego można pobrać tar.gz:https://github.com/${owner}/${repo}/archive/${hash}.tar.gz
Krisztian,
11

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

  • Na stronie głównej repozytorium znajduje się przycisk pobierania. Oczywiście pobiera to całe repozytorium, po czym trzeba rozpakować pobieranie, a następnie ręcznie przeciągnąć potrzebny folder.

2. Narzędzia stron trzecich

  • Istnieje wiele rozszerzeń przeglądarki i aplikacji internetowych, które mogą to obsłużyć, a DownGit jest jednym z nich. Wystarczy wkleić adres URL GitHub do folderu (np. https://github.com/babel/babel-eslint/tree/master/lib) I nacisnąć przycisk „Pobierz”.

3. Subversion

  • GitHub nie obsługuje git-archive (funkcja git, która pozwoliłaby nam pobrać określone foldery). GitHub obsługuje jednak różne funkcje Subversion, z których jedną możemy wykorzystać w tym celu. Subversion to system kontroli wersji (alternatywa dla git). Będziesz musiał zainstalować Subversion. Chwyć adres URL GitHub dla folderu, który chcesz pobrać. Musisz jednak zmodyfikować ten adres URL. Chcesz link do repozytorium, po którym następuje słowo „trunk” i kończy się ścieżką do zagnieżdżonego folderu. Innymi słowy, używając tego samego przykładu linku do folderu, o którym wspomniałem powyżej, zamienilibyśmy „tree / master” na „trunk”. Na koniec otwórz terminal, przejdź do katalogu, do którego chcesz pobrać zawartość, wpisz następujące polecenie (zastępując adres URL skonstruowanym adresem URL):svn export https://github.com/babel/babel-eslint/trunk/libi naciśnij klawisz enter.

4. GitHub API

  • To rozwiązanie jest potrzebne, jeśli chcesz wykonać to zadanie programowo. I tego właśnie używa DownGit pod maską. Używając interfejsu API REST GitHub , napisz skrypt wykonujący żądanie GET do punktu końcowego treści. Punkt końcowy może być skonstruowany w sposób następujący: 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.
jabacchetta
źródło
9

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

svn checkout https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

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.

svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo

Edytowane: Jeśli drzewa / wzorca nie ma w adresie URL, rozwidl go i będzie tam w adresie Rozwidlony.

zeeawan
źródło
2
Wystarczy zmienić kasę, aby wyeksportować, jeśli chcesz pobrać kopię folderu, a nie kasę.
Tommie C.
Dziękujemy za odpowiedź, czy możemy nurkować w oddziale? powiedzmy, że chcę pobrać folder aaa oddziału
Feature1
7

Nazywa się pakiet pip Python3, githubdlktóry może to zrobić *:

export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo

Strona projektu jest tutaj

* Zastrzeżenie: Napisałem ten pakiet.

Willem van Ketwich
źródło
6

To jedno z niewielu miejsc, w których SVN jest lepszy niż Git.

Ostatecznie skupiliśmy się na trzech opcjach:

  1. Użyj wget, aby pobrać dane z GitHub (używając widoku plików raw).
  2. Poproś projekty upstream o opublikowanie wymaganego podzbioru danych jako artefakty kompilacji.
  3. Zrezygnuj i skorzystaj z pełnej kasy. Jest to duży hit w pierwszej wersji, ale jeśli nie masz dużego ruchu, w następnych wersjach nie będzie to zbyt trudne.
Manish Shrivastava
źródło
4
Cóż, to mniej Git vs Subversion, a więcej, że GitHub nie pozwala na git-archive. (Chciałbym wiedzieć, dlaczego.)
Rob Howard
6

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):

curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3
  • Więcej informacji o formacie linku: https://developer.github.com/v3/repos/contents/#get-archive-link (w tym jak uzyskać plik zip lub określone oddziały / referencje)
  • Zachowaj początkową część ścieżki ( */), aby pasowała do dowolnego katalogu. Github tworzy katalog opakowujący z referencją zatwierdzenia w nazwie, więc nie można go poznać.
  • Prawdopodobnie chcesz --strip-componentsbyć 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.

Albin
źródło
5

Możesz zrobić proste pobranie drzewa katalogów:

git archive --remote [email protected]:foobar/Test.git HEAD:foo | tar xf -

Ale jeśli masz zamiar to sprawdzić i być w stanie dokonać zatwierdzeń i odepchnąć je z powrotem, nie, nie możesz tego zrobić.

araqnid
źródło
1
Nieprawidłowe polecenie: 'git-upload-archive' foobar / Test.git '' Wygląda na to, że używasz ssh do sklonowania adresu URL git: //. Upewnij się, że opcja konfiguracji core.gitProxy i zmienna środowiskowa GIT_PROXY_COMMAND NIE są ustawione. fatal: Zdalny koniec zawiesił się nieoczekiwanie tar: To nie wygląda na tar archiwum tar: Wychodzenie ze statusem błędu z powodu wcześniejszych błędów
g_inherit
@g_inherit Mogę odtworzyć ten problem. Chociaż może to być właściwy kierunek, ta odpowiedź jest nieprawidłowa.
Uli Köhler
pomimo tylu głosów negatywnych jest to jedyna rada, która zadziałała dla mnie.
bhaskarc
5

Aby wzmocnić powyższe odpowiedzi, prawdziwym przykładem z prawdziwego repozytorium GitHub do katalogu lokalnego byłoby:

svn ls https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces

svn export https://github.com/rdcarp/playing-cards/trunk/PumpkinSoup.PlayingCards.Interfaces  /temp/SvnExport/Washburn

Czasami konkretny przykład pomaga wyjaśnić proponowane zastąpienia.

John Washburn
źródło
5

Ż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/:pathktóry zwraca obiekt JSON wyliczający wszystkie pliki w katalogu. W wyliczeniu zawarty jest link do surowej zawartości pliku, download_urlparametr. 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.

Calvin
źródło
4

Używam linuxa, więc wstaw to do ~ / .bashrc, nazywane nawet: D $ HOME / .bashrc

git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}

}

następnie odśwież powłokę za pomocą

source ~/.bashrc 

następnie użyj go z git-downloadfolder blablabla: D

użytkownik1088530
źródło
3

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.pydo konta root (jak ja), możesz utworzyć plik do swojego katalogu $HOMEz następującymi treściami: [install] user=1 I easy_install lxmlpo prostu zadziała (zob. Https://stackoverflow.com/a/ 33464597/591257 ).

aesede
źródło
3

Jeszcze tylko 5 kroków

1) Pobierz SVN od tutaj .
2) Otwórz CMD i przejdź do katalogu bin SVN, jak poniżej:

cd %ProgramFiles%\SlikSvn\bin

3) Załóżmy I wan pobierz to katalog URL 4) Teraz Wymień Z 5) Teraz ogień tego ostatniego polecenia do folderu pobierania w tym samym katalogu.
https://github.com/ZeBobo5/Vlc.DotNet/tree/develop/src/Samples

tree/develop
or
tree/master
trunk

svn export https://github.com/ZeBobo5/Vlc.DotNet/trunk/src/Samples

Muhammad Ali
źródło
To nie wydaje się działać w przypadku prywatnych
repozytoriów
Tak, to nie będzie działać dla prywatnych odpowiedzi, GIT jest zalecany do pobierania prywatnych odpowiedzi.
Muhammad Ali
2

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:

https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet

uruchom następujące polecenie:

svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet
Mohsen Abasi
źródło
2

Prostą odpowiedzią na to jest pierwszy żółw svn z następującego linku.

https://tortoisesvn.net/downloads.html

podczas instalacji włącz opcję CLI, aby można było jej używać z interfejsu wiersza poleceń.

skopiuj link do podkatalogu git hub.

Przykład

https://github.com/tensorflow/models/tree/master/research/deeplab

zamień tree / master na trunk

https://github.com/tensorflow/models/trunk/research/deeplab

i robić

svn Checkout https://github.com/tensorflow/models/trunk/research/deeplab

pliki zostaną pobrane do folderu deeplab w bieżącym katalogu.

Chan
źródło
2

możesz użyć git svn w następujący sposób.

git svn clone https://github.com/lodash/lodash/trunk/test

W ten sposób nie musisz męczyć się z ustawieniem svn, szczególnie dla użytkowników systemu Windows.

V3K3R
źródło
Dziękuję Ci. Mogę ręczyć, że to działa w systemie Windows. Nie działa jednak na gcloud. Mówi git: „svn” nie jest poleceniem
JOSEPH Blessingh
sudo apt install git-svnjest wymagany podczas uruchamiania przez WSL.
Jammy Dodger
1

Użyj tej funkcji, pierwszy argument to adres URL folderu, drugi to miejsce, w którym folder zostanie pobrany:

function github-dir() {
    svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"  
}
Szczęśliwa twarz
źródło
1

git clone --filter z Git 2.19

Ta opcja faktycznie pomija pobieranie niepotrzebnych obiektów z serwera:

git clone --depth 1 --no-checkout --filter=blob:none \
  "file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/

Serwer powinien być skonfigurowany z:

git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1

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?

Ciro Santilli
źródło
1
Ciekawe i entuzjastyczne. Przypuszczam, że musiałem wspomnieć o tej funkcji 2.19 gdzie indziej.
VonC
@VonC Myślę, że raz cię pobiłem: stackoverflow.com/questions/2466735/... i patrzyłem na to dopiero po wydaniu XD! Byłem oczywiście Googling dzisiaj trochę po wydaniu 2.22, wszystkie odpowiedzi zostały już oczywiście zaktualizowane ;-) Nigdy nie przestaje mnie to bawi, jak zawsze pozostało kolejne pół-duplikaty, i zawsze rok później znajduję to z nieco inne zapytanie. Nie zamierzam cię jednak bić na gitarze, zbyt mocno, ale miej oko na nekromantów! haha
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功 法轮功
Cóż, kontynuujcie dobrą robotę: cała społeczność skorzysta z tej małej konkurencji bocznej (i głosowałem wtedy za waszą inną odpowiedzią)
VonC
@VonC żartuję, oczywiście, głosuję również za waszymi rzeczami. Muszę tylko znaleźć sposób, aby wymienić te punkty na pieniądze teraz XD
Ciro Santilli 8 病毒 审查 六四 事件 法轮功
1

Z jakiegokolwiek powodu svnrozwiązanie nie działa dla mnie, a ponieważ nie potrzebuję svnniczego 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 tylko curli awkdo 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 curli 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.

curl -s https://api.github.com/repos/:user/:repo/contents/:path | awk \
     '/download_url/ { gsub("\"|,", "", $2); system("curl -O "$2"); }'
Szyszka
źródło
1

git sparse-checkout

Git 2.25.0 zawiera nowe git sparse-checkoutpolecenie eksperymentalne, które ułatwia korzystanie z istniejącej funkcji, a także ważne korzyści związane z wydajnością dużych repozytoriów. ( Blog GitHub )

Przykład z bieżącą wersją :

git clone --filter=blob:none --sparse https://github.com/git/git.git
cd git
git sparse-checkout init --cone
git sparse-checkout add t

W szczególności

  • --sparsepobiera tylko pliki katalogu najwyższego poziomu gitrepozytorium do kopii roboczej
  • git sparse-checkout add tprzyrostowo dodaje / sprawdza tpodfolder plikugit

Inne elementy

  • git sparse-checkout init robi pewne przygotowania, by umożliwić częściowe kasy
  • --filter=blob:noneoptymalizuje 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ów

Status GitHub

GitHub wciąż ocenia tę funkcję wewnętrznie, gdy jest ona włączona w kilku wybranych repozytoriach [...]. Gdy funkcja się ustabilizuje i dojrzeje, będziemy Cię informować o postępach. ( dokumenty )

ford04
źródło
Pozytywne. Przedstawiłem to polecenie w stackoverflow.com/a/59515426/6309 , z ustawionym wzorcem klonowania.
VonC