So ziehen Sie ein bestimmtes Verzeichnis mit git


193

Ich habe ein Projekt mit git und möchte nur ein bestimmtes Verzeichnis klonen oder abrufen, wie myproject / javascript, genau wie Subversion.
Nehmen Sie einige Änderungen vor, legen Sie fest und drücken Sie erneut zurück.
Es ist möglich?


3
Eine spärliche Kaufabwicklung könnte Sie interessieren (obwohl Sie noch alles abrufen
VonC

Antworten:


205
  1. CD oben auf Ihrer Repo-Kopie
  2. git fetch
  3. git checkout HEAD path/to/your/dir/or/file

    • Wobei " path/..." in (3) im Verzeichnis direkt unter dem Repo-Stammverzeichnis beginnt, in dem sich Ihr " .../file" befindet

    • HINWEIS: Anstelle von "HEAD" kann der Hash-Code eines bestimmten Commits verwendet werden. Anschließend erhalten Sie die für dieses Commit spezifische Revision (Datei) oder Revision (Verzeichnis).


1
Ich habe gerade festgestellt, dass ich die Frage falsch verstanden habe. Meine Antwort befasst sich stattdessen mit dem Auschecken einer einzelnen Datei, die dann geändert und festgeschrieben werden kann.
vergueishon

Sie haben den Titel der Frage angesprochen, was gut genug ist. Dies hat mich nur gerettet, soweit es mich betrifft, ist dies die richtige Antwort - zumal dies ein Top-Hit bei Google für dieses Problem war.
Morgon

21
Dies bekommt aber immer noch das ganze Repo. Für ein Projekt mit einer Größe von 2 GB spart dies nicht viel Zeit.
Pithikos

5
Für diejenigen, die diese Kommentare lesen und nicht wissen, wie dies die Frage nicht beantwortet, bietet diese Lösung nur eine Kopie dieses einen Ordners, aber keine Arbeitskopie, was bedeutet, dass Sie sie nicht ändern und erneut bearbeiten können -verpflichten. Wie @Morgon sagte, wird der Titel der Frage angesprochen (Sie KÖNNEN nur ein Verzeichnis ziehen), aber der Hauptteil der Frage wird nicht beantwortet ("Nehmen Sie einige Änderungen vor, legen Sie fest und drücken Sie erneut zurück").
MSB

@StanHolodnak --ist jedoch nicht erforderlich. Es erzwingt, dass die Bits danach als Pfad interpretiert werden. Also, ja, wenn Sie eine Datei mit dem Namen haben --help, den Sie auschecken möchten, müssen Sie diese Bindestriche voranstellen:git checkout HEAD -- --help
Tim Visée

105

In einem leeren Verzeichnis:

git init
git remote add [REMOTE_NAME] [GIT_URL]
git fetch REMOTE_NAME
git checkout REMOTE_NAME/BRANCH -- path/to/directory

Dies funktioniert, wenn Sie nur die Remote-Version einer Datei verwenden möchten, um die lokale Datei zu ersetzen, denke ich
John

Dies zieht den Ordner auch, wie man den Ordner nicht herunterlädt, sondern nur Dinge innerhalb des Ordners?
Al Kasih

Es gibt keine Notwendigkeit fetchoder checkoutBefehle, wir können einfach die Pull-Anfrage nach dem remote addBefehl stellen, um den gesamten Hauptzweig abzurufen.
Iqra.

2
Wie Pithkos in der akzeptierten Antwort hervorhebt, lädt diese Antwort auch das GANZE Remote-Repository auf Ihren lokalen Computer herunter. Shingaras Antwort ist die klarste - es gibt keine Möglichkeit, einen Teil eines Repos aus der Ferne zu ziehen. Für diejenigen, denen die Bandbreite des GANZEN Abrufs nichts ausmacht und die daran interessiert sind, eine Arbeitskopie eines Teils des lokalen Caches zu erstellen, zeigt Ihnen die akzeptierte Antwort, wie. Aber ich möchte nur klarstellen, dass der gesamte Verlauf des Repos (in einem komprimierten Format) auf Ihren Computer heruntergeladen werden muss.
Gabe Halsmer

39

Nachdem ich viel nach einer Antwort gesucht, nicht gefunden, aufgegeben, erneut versucht usw. hatte, fand ich schließlich in einem anderen SO-Thread eine Lösung dafür:

Wie man alle Ordner bis auf einen git-pull

So kopieren und einfügen, was da ist:

git init
git remote add -f origin <url>
git config core.sparsecheckout true
echo <dir1>/ >> .git/info/sparse-checkout
echo <dir2>/ >> .git/info/sparse-checkout
echo <dir3>/ >> .git/info/sparse-checkout
git pull origin master

Um das zu tun, was OP will (arbeiten Sie nur an einem Verzeichnis), fügen Sie einfach dieses eine Verzeichnis hinzu .git/info/sparse-checkout, wenn Sie die obigen Schritte ausführen.

Vielen vielen Dank an @cforbish!


2
Ich poste es hier hauptsächlich, weil dies immer dann ein Top-Ergebnis ist, wenn ich versuche zu googeln, wie das geht, und dieser Thread nicht einmal annähernd angezeigt wird. :( Ich fühle mich schlecht beim Einfügen von Kopien, aber ich denke, es ist SO Best Practices?
MSB

1
Dies ist die einzige saubere Lösung. Versuchte die Antworten oben. Nachdem ich meinen Zweig mit den anderen Antworten ausgecheckt hatte, konnte ich nicht mehr ziehen und hatte mehrere neue Dateien, die festgeschrieben werden mussten. Mit dieser Lösung sieht alles richtig aus. Aber HINWEIS: Unabhängig davon, welcher Zweig ausgecheckt wurde, wird git denken, dass Sie sich in befinden master. git branch --set-upstream-to=origin/<branch>
Stellen

12

Es ist nicht möglich. Sie müssen alle Repository oder nichts ziehen.


1
Auch wenn Sie alles abrufen müssen , wäre in diesem Fall ein Ziehen an einem spärlichen Checkout-Arbeitsbaum von Interesse? Siehe stackoverflow.com/questions/2416815/…
VonC

10
Der Grund, warum Sie nicht nur ein Verzeichnis abrufen können, ist, dass git die semantische Datenverfolgung und nicht die semantische Dateiverfolgung verwendet, sodass Sie Code (oder andere Daten) nahtlos in und aus Dateien verschieben können, ohne die Quelle angeben zu müssen Tracking-System (bis Sie natürlich aktualisieren.) Aus diesem Grund kann Code auch nahtlos in Verzeichnisse und aus Verzeichnissen verschoben werden, sodass es nicht so sinnvoll ist, nur ein Verzeichnis abzurufen. Hoffe das hilft.
OmnipotentEntity

12
@ OmnipotentEntity Sorry, aber meiner Meinung nach macht es Sinn. Die Implementierung sollte die Verwendung nicht einschränken. Git weiß, was Verzeichnisse sind (zumindest beim Erstellen einer lokalen Arbeitskopie), daher gibt es keinen Grund, warum es keinen ähnlichen Vorgang auf dem Server ausführen und nur die entsprechende Ausgabe senden könnte. Zugegeben, das ist derzeit nicht implementiert, aber das liegt an einem fehlenden Feature, nicht an einer grundsätzlichen Unmöglichkeit. Persönlich denke ich, dass es ein ziemlich wichtiges Feature ist, aber hey, das ist ein Grund, warum ich Git meide, wenn es möglich ist.
Basic

10

Vielleicht kann dieser Befehl hilfreich sein:

git archive --remote=MyRemoteGitRepo --format=tar BranchName_or_commit  path/to/your/dir/or/file > files.tar

"Et voilà"


2
Dadurch wird ein bestimmtes Dateiverzeichnis für Archivierungszwecke heruntergeladen. Es wird keine Kopie abgerufen, die Sie ändern und zurückschieben können.
leetNightshade

Sehr cool. Wahrscheinlich nicht akzeptabel als Lösung für das OP, aber es ist genau das, wonach ich gesucht habe, da ich nur den Inhalt eines großen Ordners in einem noch größeren Repo durchsuchen muss, das ich definitiv nicht abrufen möchte, und ich muss / nicht ändern drücken.
Oliver

7

Wenn Sie die neuesten Änderungen in einem Verzeichnis abrufen möchten, ohne es einzugeben, haben Sie folgende Möglichkeiten:

$ git -C <Path to directory> pull


1

Versucht und getestet funktioniert das!

mkdir <directory name> ;  //Same directory name as the one you want to pull
cd <directory name>;
git remote add origin <GIT_URL>;
git checkout -b '<branch name>';
git config core.sparsecheckout true;
echo <directory name>/ >> .git/info/sparse-checkout;
git pull origin <pull branch name>

Hoffe das war hilfreich!


0

Manchmal möchten Sie nur einen Blick auf frühere Kopien von Dateien werfen, ohne die Mühe zu haben, die Unterschiede durchzugehen.

In einem solchen Fall ist es genauso einfach, einen Klon eines Repositorys zu erstellen und das spezifische Commit zu überprüfen, an dem Sie interessiert sind, und sich das Unterverzeichnis in diesem geklonten Repository anzusehen. Da alles lokal ist, können Sie diesen Klon einfach löschen, wenn Sie fertig sind.


-1

Bei all den Schwierigkeiten mit theoretischen Dateipfaden und Beispielen wie ich hier ein Beispiel aus der Praxis: Microsoft bietet seine Dokumente und Beispiele auf Git Hub an. Leider sammeln sie alle Beispieldateien für eine große Anzahl von Themen in diesem Repository:

https://github.com/microsoftarchive/msdn-code-gallery-community-s-z

Ich war nur an den Microsoft Dynamics js-Dateien im Pfad interessiert

msdn-code-gallery-community-s-z/Sdk.Soap.js/

Also habe ich folgendes gemacht

ein ... kreieren

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

Datei in meinem Repositorys-Ordner auf der Festplatte

git sparse-checkout init

in diesem Verzeichnis mit cmd unter Windows

Der Dateiinhalt von

msdn-code-gallery-community-s-zSdkSoapjs\.git\info\sparse-checkout

ist

Sdk.Soap.js/*

endlich mach ein

git pull origin master
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.