Frage Wie klone ich ein Unterverzeichnis nur eines Git-Repositorys?


Ich habe mein Git-Repository, das an der Wurzel zwei Unterverzeichnisse hat:

/finisht
/static

Als das war SVN, /finisht wurde an einem Ort ausgecheckt, während /static wurde anderswo ausgecheckt, so:

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

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


999
2018-03-01 16:46


Ursprung


Antworten:


Diese Antwort ist veraltet und gilt nur für Git-Versionen unter 1.7.0 (Feb. 2012). Siehe unten für neuere Versionen.

Nein, das ist in Git nicht möglich.

Eine solche Implementierung in Git wäre ein erheblicher Aufwand und würde dazu führen, dass die Integrität des clientseitigen Repositories nicht mehr gewährleistet wäre. Wenn Sie interessiert sind, suchen Sie auf der git-Mailingliste nach Diskussionen zu "spärlichem Klon" und "sparse fetch".

Im Allgemeinen besteht der Konsens in der Git-Community darin, dass, wenn Sie mehrere Verzeichnisse haben, die immer unabhängig voneinander ausgecheckt werden, diese wirklich zwei verschiedene Projekte sind und in zwei verschiedenen Repositories leben sollten. Sie können sie wieder zusammenkleben mit Git Submodule.


421
2018-03-01 18:00



Was Sie versuchen zu tun, heißt a Sparsamer Checkoutund diese Funktion wurde in Git 1.7.0 (Feb. 2012) hinzugefügt. Die Schritte, um spärlich zu machen Klon sind wie folgt:

mkdir <repo>
cd <repo>
git init
git remote add -f origin <url>

Dies erstellt ein leeres Repository mit Ihrer Fernbedienung und ruft alle Objekte ab, überprüft sie jedoch nicht. Dann mach:

git config core.sparseCheckout true

Jetzt müssen Sie definieren, welche Dateien / Ordner Sie tatsächlich auschecken möchten. Dies geschieht durch Auflisten in .git/info/sparse-checkout, z.B:

echo "some/dir/" >> .git/info/sparse-checkout
echo "another/sub/tree" >> .git/info/sparse-checkout

Nicht zuletzt aktualisieren Sie Ihr leeres Repo mit dem Status von der Fernbedienung:

git pull origin master

Sie haben jetzt Dateien "ausgecheckt" für some/dir und another/sub/tree auf Ihrem Dateisystem (mit diesen Pfaden noch), und keine anderen Pfade vorhanden.

Vielleicht möchten Sie einen Blick auf die erweitertes Tutorial und Sie sollten wahrscheinlich den Beamten lesen Dokumentation für sparsamen Checkout.

Als eine Funktion:

function git_sparse_clone() (
  rurl="$1" localdir="$2" && shift 2

  mkdir -p "$localdir"
  cd "$localdir"

  git init
  git remote add -f origin "$rurl"

  git config core.sparseCheckout true

  # Loops over remaining args
  for i; do
    echo "$i" >> .git/info/sparse-checkout
  done

  git pull origin master
)

Verwendung:

git_sparse_clone "http://github.com/tj/n" "./local/location" "/bin"

Beachten Sie, dass das gesamte Repository vom Server heruntergeladen wird - nur die Kasse wird verkleinert. Im Moment ist es nicht möglich, nur ein einzelnes Verzeichnis zu klonen. Wenn Sie jedoch den Verlauf des Repositorys nicht benötigen, können Sie zumindest Bandbreite sparen, indem Sie einen flachen Klon erstellen. Sehen Udondans Antwort unten für Informationen, wie man flach kombiniert Klon und sparsamer Checkout.


1347
2017-12-06 07:37



Sie können das kombinieren Sparsamer Checkout und das seichter Klon Eigenschaften. Das seichter Klon schneidet die Geschichte und die Sparsamer Checkout zieht nur die Dateien, die Ihren Mustern entsprechen.

git init <repo>
cd <repo>
git remote add origin <url>
git config core.sparsecheckout true
echo "finisht/*" >> .git/info/sparse-checkout
git pull --depth=1 origin master

Sie benötigen mindestens Git 1.9, damit dies funktioniert. Getestet habe ich es nur mit 2.2.0 und 2.2.2.

Auf diese Weise werden Sie immer noch in der Lage sein drücken, was mit nicht möglich ist git archive.


325
2018-01-20 07:33



Für andere Benutzer, die will nur herunterladen eine Datei / Ordner von github, benutze einfach:

svn export <repo>/trunk/<folder>

z.B.

svn export https://github.com/lodash/lodash.com/trunk/docs

(Ja, das ist Svn hier. Offensichtlich im Jahr 2016 brauchen Sie immer noch Svn, um einfach einige Github-Dateien herunterladen)

Höflichkeit: Laden Sie einen einzelnen Ordner oder ein Verzeichnis von einem GitHub Repo herunter 

Wichtig - Stellen Sie sicher, dass Sie die Github-URL aktualisieren und ersetzen /tree/master/ mit '/ trunk /'.

Als Bash-Skript:

git-download(){
    folder=${@/tree\/master/trunk}
    folder=${folder/blob\/master/trunk}
    svn export $folder
}

Hinweis Diese Methode lädt einen Ordner herunter, klont diesen nicht ab. Sie können Änderungen nicht zurück an das Repository senden. Auf der anderen Seite - dies führt zu einem kleineren Download im Vergleich zu Sparse-Checkout oder flachen Checkout.


77
2017-09-04 13:02



Git 1.7.0 hat "Sparse Checkouts". Sehen "Core.sparseCheckout" in der Git-Konfiguration Manpage, "Sparse Kasse" in der Git Lese-Baum Manpage, und "Skip-Arbeitsbaum-Bit" in der Git Update-Index Manpage.

Die Schnittstelle ist nicht so praktisch wie SVNs (z. B. gibt es keine Möglichkeit, zum Zeitpunkt eines anfänglichen Klons eine spärliche Überprüfung durchzuführen), aber die Basisfunktionalität, auf der einfachere Schnittstellen aufgebaut werden können, ist nun verfügbar.


63
2018-05-18 21:15



Wenn Sie nie beabsichtigen, mit dem Repository zu interagieren, von dem Sie geklont haben, können Sie einen vollständigen Abgleich durchführen Git Klon und überschreiben Sie Ihr Repository mit git filter-branch --subdirectory-filter. So bleibt zumindest die Geschichte erhalten.


60
2018-03-01 21:17



Dies sieht viel einfacher aus:

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

60
2017-09-10 17:03



Es ist nicht möglich, Unterverzeichnis nur mit Git zu klonen, aber unten sind einige Problemumgehungen.

Zweig filtern

Vielleicht möchten Sie das Repository neu schreiben, so als ob trunk/public_html/ war sein Projekt root, und verwerfen alle anderen Geschichte (mit filter-branch), probiere schon die Kasse aus:

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

Hinweise: Die -- das trennt Filter-Zweig-Optionen von Revisionsoptionen, und die --all um alle Zweige und Tags neu zu schreiben. Alle Informationen einschließlich Original-Commit-Zeiten oder Zusammenführungsinformationen werden sein konserviert. Dieser Befehl ehrt .git/info/grafts Datei und Refs in der refs/replace/ Namespace, also wenn Sie Transplantate oder Ersatz haben refs Wenn Sie diesen Befehl definieren, werden sie permanent.

Warnung! Der neu geschriebene Verlauf wird für alle Objekte unterschiedliche Objektnamen haben und nicht mit dem ursprünglichen Zweig konvergieren. Sie werden nicht in der Lage sein, den umgeschriebenen Zweig auf den ursprünglichen Zweig zu schieben und zu verteilen. Bitte verwenden Sie diesen Befehl nicht, wenn Sie die vollständigen Implikationen nicht kennen, und vermeiden Sie es trotzdem, wenn ein einfaches einzelnes Commit ausreichen würde, um Ihr Problem zu beheben.


Sparse Kasse

Hier sind einfache Schritte mit Sparsamer Checkout Ansatz, der das Arbeitsverzeichnis spärlich auffüllt, damit Sie Git sagen können, welche Ordner oder Dateien im Arbeitsverzeichnis einen Blick wert sind.

  1. Klon-Repository wie gewohnt (--no-checkout es 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, überlegen seichter Klon (--depth 1) zum Auschecken nur die letzte Version oder / und --single-branch nur.


22
2018-03-22 23:06