2121 Stimmen

Wie kann ich nur ein Unterverzeichnis eines Git-Repositorys klonen?

Ich habe mein Git-Repository, das im Stammverzeichnis zwei Unterverzeichnisse hat:

/finisht
/static

Als dies der Fall war SVN , /finisht wurde an einem Ort ausgecheckt, während /static wurde an anderer Stelle überprüft, etwa so:

svn co svn+ssh://admin@domain.com/home/admin/repos/finisht/static static

Gibt es eine Möglichkeit, dies mit Git zu tun?

18 Stimmen

Mögliche Duplikate von Unterverzeichnisse in Git auschecken?

2 Stimmen

Für einen Nutzer des Jahres 2014, was die git clone einfachsten Befehl? Ich habe este einfache Antwort . Wenn es etwas mehr einfach, bitte kommentieren

1 Stimmen

Für diejenigen, die versuchen, den Inhalt des Repositorys zu klonen (und nicht den Root-Ordner zu erstellen), ist dies eine sehr einfache Lösung: stackoverflow.com/questions/6224626/

82voto

hillu Punkte 9105

Wenn Sie nie vorhaben, mit dem Repository, von dem Sie geklont haben, zu interagieren, können Sie eine vollständige git clone und schreiben Sie Ihr Repository neu mit

git filter-branch --subdirectory-filter <subdirectory>

Auf diese Weise wird zumindest die Geschichte erhalten bleiben.

13 Stimmen

Für Leute, die den Befehl nicht kennen, lautet er git filter-branch --subdirectory-filter <subdirectory>

10 Stimmen

Diese Methode hat den Vorteil, dass das von Ihnen gewählte Unterverzeichnis zum Stammverzeichnis des neuen Repositorys wird, was zufällig genau das ist, was ich will.

0 Stimmen

Das ist definitiv die beste und einfachste Methode, die man anwenden kann. Hier ist ein Ein-Schritt-Befehl mit subdirectory-filter git clone https://github.com/your/repo_xx.git && cd repo_xx && git filter-branch --subdirectory-filter repo_xx_subdir

72voto

ErichBSchulz Punkte 13834

Diese sieht viel einfacher aus:

git archive --remote=<repo_url> <branch> <path> | tar xvf -

19 Stimmen

Wenn ich dies auf Github tue, erhalte ich die Fehlermeldung: Operation not supported by protocol. Unerwartetes Ende des Befehlsstroms

1 Stimmen

Der Protokollfehler könnte durch HTTPS oder : in der Repo-Url verursacht werden. Es könnte auch an einem fehlenden ssh-Schlüssel liegen.

2 Stimmen

Wenn Sie Github verwenden, können Sie svn export stattdessen

64voto

Chris Johnsen Punkte 199970

Git 1.7.0 hat "spärliche Checkouts". Siehe "core.sparseCheckout" in der Git-Konfiguration Manpage , "Sparsame Kasse" in der git-lese-baum Manpage und "Skip-worktree bit" in der git update-index Manpage .

Die Schnittstelle ist nicht so komfortabel wie die von SVN (z.B. gibt es keine Möglichkeit, beim ersten Klonen ein Sparse-Checkout zu machen), aber die Basisfunktionalität, auf der einfachere Schnittstellen aufgebaut werden könnten, ist jetzt verfügbar.

42voto

kenorb Punkte 134883

Es ist nicht möglich, Unterverzeichnisse nur mit Git zu klonen, aber unten sind einige Umgehungsmöglichkeiten.

Zweig filtern

Vielleicht möchten Sie das Repository so umschreiben, dass es aussieht, als ob trunk/public_html/ sein Projekt Root war, und verwerfen alle andere Geschichte (mit filter-branch ), versuchen Sie es mit einem bereits ausgecheckten Zweig:

git filter-branch --subdirectory-filter trunk/public_html -- --all

Anmerkungen: Die -- das die Filterzweigoptionen von den Revisionsoptionen trennt, und die --all um alle Verzweigungen und Tags neu zu schreiben. Alle Informationen, einschließlich der ursprünglichen Commit-Zeiten oder Merge-Informationen, werden erhalten . Dieser Befehl beachtet .git/info/grafts Datei und Verweise in der refs/replace/ Namespace, wenn Sie also irgendwelche Transplantate oder Ersatz refs definiert sind, werden sie durch die Ausführung dieses Befehls dauerhaft.

Warnung! Die neu geschriebene Historie wird andere Objektnamen für alle Objekte haben und nicht mit dem ursprünglichen Zweig konvergieren. Sie werden nicht in der Lage sein, den neu geschriebenen Zweig einfach über den ursprünglichen Zweig zu schieben und zu verteilen. Bitte verwenden Sie diesen Befehl nicht, wenn Sie sich der vollen Tragweite nicht bewusst sind, und vermeiden Sie es auf jeden Fall, ihn zu verwenden, wenn ein einfacher Commit ausreichen würde, um Ihr Problem zu lösen.


Spärliche Kasse

Hier sind einfache Schritte mit spärliche Kasse Ansatz, der das Arbeitsverzeichnis spärlich füllt, so dass Sie Git mitteilen können, welche Ordner oder Dateien im Arbeitsverzeichnis es wert sind, überprüft zu werden.

  1. Klonen Sie das Repository wie gewohnt ( --no-checkout ist optional):

    git clone --no-checkout git@foo/bar.git
    cd bar

    Sie können diesen Schritt überspringen, wenn Sie Ihr Repository bereits geklont haben.

    Tipp: Für große Repos sollten Sie flacher Klon ( --depth 1 ), um nur die letzte Revision auszuchecken oder/und --single-branch nur.

  2. Aktivieren Sie sparseCheckout Option:

    git config core.sparseCheckout true
  3. Geben Sie Ordner für Spar-Checkout an ( ohne Leerzeichen am Ende):

    echo "trunk/public_html/*"> .git/info/sparse-checkout

    oder bearbeiten .git/info/sparse-checkout .

  4. Prüfen Sie den Zweig (z. B. master ):

    git checkout master

Jetzt sollten Sie Ordner in Ihrem aktuellen Verzeichnis ausgewählt haben.

Wenn Sie zu viele Verzeichnisebenen oder Filterverzweigungen haben, können Sie stattdessen symbolische Links verwenden.


0 Stimmen

Würde Zweig filtern erlauben Ihnen dennoch pull ?

2 Stimmen

@sam: Nein. filter-branch würde die übergeordneten Commits umschreiben, so dass sie unterschiedliche SHA1-IDs hätten, und somit hätte Ihr gefilterter Baum keine Commits mit dem entfernten Baum gemeinsam. git pull wüsste nicht, von wo aus ich versuchen sollte, zu fusionieren.

0 Stimmen

Dieser Ansatz ist für meinen Fall eine weitgehend zufriedenstellende Lösung.

14voto

Carson Punkte 3411

Das tue ich

git init
git sparse-checkout init
git sparse-checkout set "YOUR_DIR_PATH"
git remote add origin https://github.com/AUTH/REPO.git
git pull --depth 1 origin <SHA1_or_BRANCH_NAME>

Einfacher Hinweis

  • Spar-Checkout

  • git sparse-checkout init In vielen Artikeln wird Ihnen empfohlen, die git sparse-checkout init --cone Wenn ich hinzufüge --cone wird einige Dateien erhalten, die ich nicht haben will.

  • git sparse-checkout set "..." setzt die .git\info\sparse-checkout Dateiinhalte als ...

    Angenommen, Sie wollen diesen Befehl nicht verwenden. Stattdessen können Sie die git\info\sparse-checkout und dann bearbeiten.


Exemple

Angenommen, ich möchte 2 Ordner vollständig Repo Größe>10GB (einschließlich git) wie unten Gesamtgröße < 2MB

  1. chrome/common/erweiterungen/api
  2. chrome/common/extensions/permissions

    git init git sparse-checkout init // git sparse-checkout set "chrome/common/extensions/api/" start .git\info\sparse-checkout open the "sparse-checkut" file

    / .git\info\sparse-checkout for example you can input the contents as below chrome/common/extensions/api/ !chrome/common/extensions/api/commands/ ! unwanted : https://www.git-scm.com/docs/git-sparse-checkout#_full_pattern_set !chrome/common/extensions/api/devtools/ chrome/common/extensions/permissions/ /

    git remote add origin https://github.com/chromium/chromium.git start .git\config

    / .git\config [core] repositoryformatversion = 1 filemode = false bare = false logallrefupdates = true symlinks = false ignorecase = true [extensions] worktreeConfig = true [remote "origin"] url = https://github.com/chromium/chromium.git fetch = +refs/heads/:refs/remotes/Github/ partialclonefilter = blob:none // Add this line, This is important. Otherwise, your ".git" folder is still large (about 1GB) / git pull --depth 1 origin 2d4a97f1ed2dd875557849b4281c599a7ffaba03 // or // git pull --depth 1 origin master


  • partialclonefilter = blob:none

    Ich weiß, dass ich diese Zeile hinzufügen muss, weil ich sie kenne: git clone --filter=blob:none schreibt es diese Zeile. also imitiere ich sie.

Git-Version: git version 2.29.2.windows.3

1 Stimmen

Sehr interessantes Beispiel. Hochgevotet. Sie brauchten also nicht git read-tree -mu Ich erwähne am Anfang von stackoverflow.com/a/59515426/6309 ? Haben Sie den neuen Kegelmodus verwendet, der, wie in stackoverflow.com/a/59515444/6309 ist die read-tree für Sie?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X