Wie kann ich nur einen bestimmten Ordner oder ein bestimmtes Verzeichnis von einem auf GitHub gehosteten Git-Repo herunterladen?
Angenommen, das Beispiel von GitHub-Repo lebt hier:
[email protected]:foobar/Test.git
Die Verzeichnisstruktur:
Test/
foo/
a.py
b.py
bar/
c.py
d.py
Ich möchte nur den Ordner foo herunterladen und nicht das gesamte Testprojekt klonen.
Update September 2016: Es gibt ein paar Tools, die von der Community erstellt wurden und die dies für Sie tun können:
GitZip (Credits zu Kino - hat seine Antwort direkt hier! )
DownGit (Credits an Minhas Kamal - hat seine Antwort bestätigt genau hier! )
Git unterstützt das nicht, aber Github via SVN. Wenn Sie Ihren Code mit Subversion auschecken, konvertiert Github im Wesentlichen das Repo von git in Subversion im Backend und stellt dann das angeforderte Verzeichnis bereit.
So können Sie mit dieser Funktion einen bestimmten Ordner herunterladen. Ich verwende die beliebte Javascript-Bibliothek lodash
als Beispiel.
Holen Sie sich die Repo-URL. Kopieren Sie zunächst die URL des Github-Repos in Ihre Zwischenablage .
Ändern Sie die URL für Subversion. Ich möchte den Ordner unter /docs
aus dem Zweig master
herunterladen. Ich werde also trunk/docs
anhängen. Die vollständige URL lautet jetzt https://github.com/lodash/lodash/trunk/docs
. In meinem Hinweis unten finden Sie eine ausführlichere Erklärung, warum wir dieses URL-Format verwenden müssen.
Laden Sie den Ordner herunter. Gehen Sie zur Befehlszeile und greifen Sie den Ordner mit SVN auf.
svn checkout https://github.com/lodash/lodash/trunk/docs
Es wird möglicherweise nicht sofort eine Aktivität angezeigt, da Github bis zu 30 Sekunden für die Konvertierung größerer Repositories benötigt.
Erklärung zum vollständigen URL-Format:
- Wenn Sie sich für
master
branch interessieren, verwenden Sie stattdessentrunk
. Der vollständige Pfad ist alsotrunk/foldername
- Wenn Sie sich für
foo
branch interessieren, verwenden Sie stattdessenbranches/foo
. Das vollständiger Pfad sieht aus wiebranches/foo/foldername
- Protip: Sie können
svn ls
verwenden, um verfügbare Tags und Verzweigungen vor dem Herunterladen anzuzeigen, wenn Sie dies wünschen
Das ist alles! Github unterstützt weitere Subversion-Funktionen , einschließlich der Unterstützung für das Festschreiben und Durchführen von Änderungen.
Verwendungszweck:
Bekomme Token:
http://kinolien.github.io/gitzip mithilfe der GitHub-API und JSZip, FileSaver.js-Bibliotheken.
Schritt 1: Geben Sie github url in das Feld oben rechts ein.
Schritt 2: Drücken Sie die Eingabetaste, oder klicken Sie auf Herunterladen, um die ZIP-Datei direkt herunterzuladen, oder klicken Sie auf Suchen, um die Liste der Unterordner und Dateien anzuzeigen.
Schritt 3: Klicken Sie auf "Download Zip File" oder "Get File", um die Dateien abzurufen.
In den meisten Fällen funktioniert es einwandfrei, mit der Ausnahme, dass der Ordner aufgrund der Einschränkung der Github Trees-API mehr als 1.000 Dateien enthält. (bezieht sich auf Github API # Inhalt )
Es kann auch private/öffentliche Repos unterstützen und das Ratenlimit erhöhen, wenn Sie über ein GitHub-Konto verfügen und den "get token" -Link auf dieser Site verwenden.
Jetzt können Sie DIRECTLY DOWNLOAD oder DOWNLOAD LINK für jedes öffentliche GitHub-Verzeichnis oder eine Datei (besonders große Datei) aus DownGit ! Hier ist eine einfache Demonstrations-
Sie können auch die Eigenschafts- detaillierte Verwendung der heruntergeladenen Datei konfigurieren.
Wenn Sie svn
haben, können Sie svn export
dazu verwenden:
svn export https://github.com/foobar/Test.git/trunk/foo
Beachten Sie das URL-Format:
https://github.com/
/trunk
am Ende angehängtBevor Sie svn export
ausführen, sollten Sie zunächst den Inhalt des Verzeichnisses mit folgendem Befehl überprüfen:
svn ls https://github.com/foobar/Test.git/trunk/foo
Wenn Sie Dateien herunterladen möchten, nicht das Repository mit Historie klonen, können Sie dies mit git-archive
tun.
git-archive
erstellt ein komprimiertes Zip- oder Tar-Archiv eines Git-Repositorys. Einige Dinge, die es besonders machen:
.git/
-Ordner oder nicht gespeicherte Dateien in dem Repository, auf dem es ausgeführt wird.Ein Beispiel für das Erstellen eines Archivs des docs/usage
-Verzeichnisses aus einem Remote-Repo, mit dem Sie mit ssh verbunden sind:
# in terminal
$ git archive --format tar --remote ssh://server.org/path/to/git HEAD docs/usage > /tmp/usage_docs.tgz
Weitere Informationen in diesem Blogbeitrag und der git-Dokumentation .
Ich habe ein Open-Source-Projekt namens GitHubFolderDownloader erstellt. Sie können einen einzelnen Ordner eines Repositorys herunterladen, ohne das gesamte Repository zu klonen oder herunterzuladen.
Es ist nichts falsch mit anderen Antworten, aber ich dachte nur, ich würde Schritt-für-Schritt-Anweisungen für diejenigen geben, die diesen Prozess zum ersten Mal durchwandern.
~ Um das Terminal zu öffnen, klicken Sie einfach auf spotlight und geben Sie terminal ein
Übrigens - Wenn Sie Windows oder eine andere Plattform verwenden, finden Sie einen binären Download von Subversion (svn) unter http://Subversion.Apache.org .
~ Wenn Sie den Ordner auschecken möchten, statt ihn einfach herunterzuladen, versuchen Sie es mit der svn-Hilfe (tldr: ersetzen Sie export durch checkout).
Update
Zum Kommentar zum Fortsetzen eines unterbrochenen Download/Checkout. Ich würde versuchen, svn cleanup
gefolgt von svn update
auszuführen. Suchen Sie nach SO, um nach weiteren Optionen zu suchen.
Du kannst nicht; Im Gegensatz zu Subversion, wo jedes Unterverzeichnis einzeln ausgecheckt werden kann, arbeitet Git auf Repository-Basis.
Für Projekte, bei denen ein differenzierter Zugriff erforderlich ist, können Sie Submodule verwenden. Jedes Submodul ist ein separates Git-Projekt und kann daher einzeln geklont werden.
Es ist denkbar, dass ein Git-Front-End (z. B. das GitHub-Webinterface oder Gitweb) ein Interface für das Extrahieren eines bestimmten Ordners bereitstellt. Dies ist jedoch meines Wissens nicht der Fall (obwohl Sie einzelne Dateien herunterladen können) Wenn der Ordner nicht zu viele Dateien enthält, ist dies eine Option.)
Edit - GitHub bietet tatsächlich den Zugriff über SVN an, mit dem Sie genau dies tun können (per Kommentar). Die neuesten Anweisungen dazu finden Sie unter https://github.com/blog/1438-improved-svn-here-to-stay-old-svn-going-away
Wenn Sie wirklich nur "download" den Ordner und nicht "klonen" it (für die Entwicklung) möchten, ist der einfachste Weg, einfach eine copy der neuesten Version des Repository (und daher ein Ordner/eine Datei darin), ohne das gesamte Repo klonen zu müssen oder gar git überhaupt zu installieren, ist das Herunterladen eines Zip-Archivs (für jedes Repo, Fork, Branch, Commit usw.), indem Sie gehen zu dem gewünschten Repository/Fork/Branch/Commit auf GitHub (z. B. http(s)://github.com/<user>/<repo>/commit/<Sha1>
für eine Kopie der Dateien, wie sie nach einem bestimmten Commit waren) und klicken Sie auf die Schaltfläche Downloads
oben rechts.
Dieses Archivformat enthält nichts von der git-repo-Magie, nur die verfolgten Dateien selbst (und möglicherweise einige .gitignore-Dateien, wenn sie verfolgt wurden, aber Sie können diese ignorieren: p) - das bedeutet, wenn sich der Code ändert und Sie dies möchten Bleiben Sie oben, Sie müssen es manuell erneut herunterladen, und es bedeutet auch, dass Sie es nicht als Git-Repository verwenden können ...
Nicht sicher, ob Sie in diesem Fall danach suchen (wieder "download"/view vs "clone"/weiterentwickeln), aber es kann trotzdem nützlich sein ...
Wer gerade an einem bestimmten Ordner arbeitet, muss diesen Ordner selbst klonen. Außerdem müssen Sie die folgenden Schritte ** befolgen, indem Sie SPARSE CHECKOUT verwenden.
Schritt 1: Erstellen Sie ein Verzeichnis.
Schritt 2: Initialisieren Sie ein Git-Repository. (git init
)
Schritt 3: Aktivieren Sie spärliche Kassen. (git config core.sparsecheckout true
)
Schritt 4: Teilen Sie Git mit, welche Verzeichnisse Sie benötigen (echo 2015/brand/May (siehe Ordner, an dem Sie arbeiten möchten) >> .git/info/sparse-checkout
)
Schritt 5: Hinzufügen der Fernbedienung (git remote add -f Origin https://jafartke.com/mkt-imdev/DVM.git
)
Letzter Schritt 6: Abrufen der Dateien (git pull Origin master
)
1.Klicken Sie auf diesen Link http://kinolien.github.io/gitzip/
2.Paste-Link des Github-Ordners, den Sie herunterladen möchten.
3. Klicken Sie auf Suchen, um alle Dateien zum Download anzuzeigen.
Hinweis: - Bei der Suche ist keine Eingabe des Token-Schlüssels erforderlich.
Ein anderes konkretes Beispiel:
Ich möchte den Ordner "iOS Pro Geo" von der URL herunterladen
https://github.com/alokc83/APRESS-Books-Source-Code-/tree/master /% 20Pro% 20iOS% 20Geo
und ich kann das über
svn checkout https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo
Beachten Sie trunk im Pfad
Editiert: (gemäß dem Kommentar von Tommie C)
Ja, die Verwendung von export anstelle von checkout würde eine saubere Kopie ohne zusätzliche git-Repository-Dateien ergeben.
svn export https://github.com/alokc83/APRESS-Books-Source-Code-/trunk/%20Pro%20iOS%20Geo
Editiert: Wenn Baum/Master nicht in URL vorhanden ist, dann Fork und dann in Forked URL.
Es ist einer der wenigen Orte, an denen SVN besser ist als Git.
Am Ende haben wir uns auf drei Optionen konzentriert:
Um die obigen Antworten zu verdeutlichen, wäre ein reales Beispiel aus einem echten GitHub-Repository in einem lokalen Verzeichnis:
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
Manchmal hilft ein konkretes Beispiel, die vorgeschlagenen Substitutionen zu verdeutlichen.
Sie können den Verzeichnisbaum einfach herunterladen:
git archive --remote [email protected]:foobar/Test.git HEAD:foo | tar xf -
Aber wenn Sie vorhaben, es auszuprobieren und Commits ausführen und zurückschieben können, können Sie das nicht tun.
Ich benutze Linux also, setze dies in ~/.bashrc, genannt even: D $ HOME/.bashrc
git-dowloadfolder(){
a="$1"
svn checkout ${a/tree\/master/trunk}
}
aktualisieren Sie dann die Shell mit
source ~/.bashrc
dann mit git-downloadfolder blablabla: D verwenden
Es gibt ein Python3-Pip-Paket mit dem Namen githubdl
, das dies kann *:
export GIT_TOKEN=1234567890123456789012345678901234567890123
pip install githubdl
githubdl -u http://github.com/foobar/test -d foo
Die Projektseite ist hier
* Haftungsausschluss: Ich habe dieses Paket geschrieben.
Wenn Sie mit Unix-Befehlen vertraut sind, benötigen Sie hierfür keine besonderen Abhängigkeiten oder Web-Apps. Sie können das Repo als Tarball herunterladen und nur das herunterladen, was Sie brauchen.
Beispiel (woff2-Dateien aus einem Unterverzeichnis in fontawesome):
curl -L https://api.github.com/repos/FortAwesome/Font-Awesome/tarball | tar xz --wildcards "*/web-fonts-with-css/webfonts/*.woff2" --strip-components=3
*/
) bei, um zu einem beliebigen Verzeichnis zu passen. Github erstellt ein Wrapper-Verzeichnis mit dem Commit-Ref im Namen, sodass es nicht bekannt ist.--strip-components
der Anzahl der Schrägstriche (/
) im Pfad entspricht (vorheriges Argument).Dadurch wird das gesamte Archiv heruntergeladen. Verwenden Sie die SVN-Methode, die in den anderen Antworten erwähnt wird, wenn dies vermieden werden muss oder Sie auf den GitHub-Servern nett sein möchten.
Ich arbeite mit CentOS 7-Servern, auf die ich keinen Root-Zugriff habe, noch git, svn usw. (oder möchte!). Deshalb habe ich ein Python-Skript zum Herunterladen eines beliebigen github-Ordners erstellt: https://github.com/andrrrl/github-ordner-downloader
Die Verwendung ist einfach. Kopieren Sie einfach den relevanten Teil aus einem Github-Projekt. Angenommen, das Projekt ist https://github.com/MaxCDN/php-maxcdn/ . Sie möchten einen Ordner, in dem sich nur Quelldateien befinden. dann musst du etwas tun wie:
$ python gdownload.py "/MaxCDN/php-maxcdn/tree/master/src" /my/target/dir/
(erstellt Zielordner, falls nicht vorhanden)
Es benötigt die Bibliothek lxml und kann mit easy_install lxml
installiert werden.
Wenn Sie keinen Root-Zugriff haben (wie ich), können Sie eine .pydistutils.py
-Datei mit folgendem Inhalt in Ihr $HOME
-Verzeichnis erstellen:
[install]
user=1
Und easy_install lxml
funktioniert einfach (ref: https: // stackoverflow.com/a/33464597/591257 ).
Keine der Antworten half in meiner Situation. Wenn Sie für Windows entwickeln, verfügen Sie wahrscheinlich nicht über svn. In vielen Situationen kann man sich nicht darauf verlassen, dass Benutzer Git installiert haben oder aus anderen Gründen nicht ganze Repositorys herunterladen möchten. Einige der Personen, die diese Frage beantworteten, wie Willem van Ketwich und Aztack, entwickelten Werkzeuge, um diese Aufgabe zu erfüllen. Wenn das Tool jedoch nicht für die von Ihnen verwendete Sprache geschrieben wurde oder Sie keine Drittanbieter-Bibliothek installieren möchten, funktionieren diese nicht.
Es gibt jedoch einen viel einfacheren Weg. GitHub verfügt über eine API, mit der Sie eine einzelne Datei oder den gesamten Inhalt eines Verzeichnisses herunterladen können mithilfe von GET-Anfragen . Sie können auf ein Verzeichnis mit https://api.github.com/repos/:owner/:repo_name/contents/:path
zugreifen, das ein JSON-Objekt zurückgibt, das alle Dateien im Verzeichnis auflistet. In der Aufzählung ist ein Link zum rohen Inhalt der Datei enthalten, der download_url
-Parameter. Die Datei kann dann mit dieser URL heruntergeladen werden.
Dies ist ein zweistufiger Prozess, für den GET-Anforderungen gestellt werden müssen. Dies kann jedoch in nahezu jeder Sprache und auf jeder Plattform implementiert werden. Es kann verwendet werden, um Dateien oder Verzeichnisse abzurufen.
Unser Team hat dazu ein Bash-Skript geschrieben, da wir SVN nicht auf unserem Bare-Bones-Server installieren müssen.
https://github.com/ojbc/docker/blob/master/Java8-karaf3/files/git-download.sh
Es verwendet die github-API und kann wie folgt von der Befehlszeile aus ausgeführt werden:
git-download.sh https://api.github.com/repos/ojbc/main/contents/shared/ojb-certs
git clone --filter
von Git 2.19
Diese Option überspringt das Abrufen nicht benötigter Objekte vom Server:
git clone --depth 1 --no-checkout --filter=blob:none \
"file://$(pwd)/server_repo" local_repo
cd local_repo
git checkout master -- mydir/
Der Server sollte konfiguriert sein mit:
git config --local uploadpack.allowfilter 1
git config --local uploadpack.allowanysha1inwant 1
Das Git-Remote-Protokoll wurde erweitert, um diese Funktion in Version 2.19.0 zu unterstützen. Derzeit wird jedoch kein Server unterstützt. Es kann aber schon vor Ort getestet werden.
Ich habe dies ausführlicher behandelt unter: Wie klone ich ein Unterverzeichnis nur eines Git-Repositorys?
Ich habe dazu ein Tool mit Node.js geschrieben. Check it out Repo-Verzeichnis herunterladen
installation mit npm i -g dl-repo-dir
und Befehl repo
ist global verfügbar.
repo download aztack/download-repo-dir lib src/lib/new-name
repo download aztack/download-repo-dir '' src/lib/download-repo-dir
export GITLAB_API_PRIVATE_TOKEN=YOUR_TOKEN_HERE
repo download gitlab:mygitlab.com:topgroup/subgroup/repo#v1.0.0 dir src/lib/new-name
und es wird eine repo.json
-Datei zum Speichern aller Informationen geben.
In einem neuen Projekt können Sie das Projekt mit dem vorhandenen Code repo.json
mit dem Befehl repo init
initialisieren.
Wenn Sie es programmgesteuert machen müssen und sich nicht auf SVN verlassen möchten, können Sie die GitHub-API verwenden, um den gesamten Inhalt rekursiv herunterzuladen.
Zur Inspiration hier mein Ruby Gist: https://Gist.github.com/cvengros/b2a7e82f66519d423b6f
Um ein Verzeichnis aus GitHub zu exportieren, ersetzen Sie "/ tree/master /" in der Verzeichnis-URL durch "/ trunk /".
So exportieren Sie das Verzeichnis beispielsweise über die folgende URL:
https://github.com/liferay/liferay-plugins/tree/master/portlets/sample-hibernate-portlet
führen Sie den folgenden Befehl aus:
svn export https://github.com/liferay/liferay-plugins/trunk/portlets/sample-hibernate-portlet
Verwenden Sie diese Funktion. Das erste Argument ist die URL des Ordners. Das zweite ist der Ort, an den der Ordner heruntergeladen wird:
function github-dir() {
svn export "$(sed 's/tree\/master/trunk/' <<< "$1")" "$2"
}
Wenn Sie Python und SVN zum Herunterladen eines bestimmten GitHub-Verzeichnisses verwenden möchten, ist hier der Code, den Sie verwenden würden:
import validators
from svn.remote import RemoteClient
def download_folder(url):
if 'tree/master' in url:
url = url.replace('tree/master', 'trunk')
r = RemoteClient(url)
r.export('output')
if __== '__main__':
url = input('Enter folder URL: ')
if not validators.url(url):
print('Invalid url')
else:
download_folder(url)
Weitere Details zu diesem Code und anderen Such- und Download-Tipps für GitHub finden Sie in diesem Tutorial: https://python.gotrained.com/search-github-api/
Eine direkte Antwort auf diese Frage ist die erste Schildkröte svn über den folgenden Link.
aktivieren Sie während der Installation die CLI-Option, damit sie über die Befehlszeilenschnittstelle verwendet werden kann.
kopieren Sie den Link zum Git Hub-Unterverzeichnis.
Beispiel
https://github.com/tensorflow/models/tree/master/research/deeplab
baum/Meister durch Stamm ersetzen
und TU
svn checkout https://github.com/tensorflow/models/trunk/research/deeplab
dateien werden in den Ordner deeplab im aktuellen Verzeichnis heruntergeladen.