Ist es mit der neuen Funktion zum Auschecken mit geringer Dichte in Git 1.7.0 möglich, nur den Inhalt eines Unterverzeichnisses abzurufen, wie Sie es in SVN können? Ich habe dieses Beispiel gefunden , aber es behält die vollständige Verzeichnisstruktur bei. Stellen Sie sich vor, ich wollte nur den Inhalt des Verzeichnisses 'perl' ohne ein tatsächliches Verzeichnis namens 'perl'.
- BEARBEITEN -
Beispiel:
Mein Git-Repository enthält die folgenden Pfade
repo/.git/
repo/perl/
repo/perl/script1.pl
repo/perl/script2.pl
repo/images/
repo/images/image1.jpg
repo/images/image2.jpg
repo/doc/
repo/doc/readme.txt
repo/doc/help.txt
Was ich möchte, ist, aus dem obigen Repository dieses Layout erstellen zu können:
repo/.git/
repo/script1.pl
repo/script2.pl
Mit der aktuellen Funktion zum Auschecken mit geringer Dichte scheint es jedoch nur möglich zu sein, diese zu erhalten
repo/.git/
repo/perl/script1.pl
repo/perl/script2.pl
Das ist NICHT was ich will.
Antworten:
Sie müssen noch das gesamte Repository klonen, das alle Dateien enthält. Sie können das
--depth
Flag verwenden, um nur eine begrenzte Anzahl von Verlaufsdaten abzurufen.Sobald das Repository geklont ist, beschränkt der Lesebaum-Trick Ihre "Ansicht" des Repositorys auf nur die Dateien oder Verzeichnisse, die sich in der
.git/info/sparse-checkout
Datei befinden.Ich habe ein schnelles Skript geschrieben, um die Spärlichkeit zu bewältigen, da es im Moment etwas unfreundlich ist:
Wenn Sie dieses Skript
git-sparse.sh
in dem Pfad speichern , der durch Aufrufen gemeldet wurde,git --exec-path
können Siegit sparse foo/ bar/
nur die Verzeichnisse foo und bar "auschecken" odergit sparse '*'
alles wieder zurückerhalten.quelle
Die kurze Antwort lautet nein. Git sieht alle Dateien als eine Einheit.
Was ich empfehle, ist, dass Sie Ihre Repositorys in logische Blöcke aufteilen. Eine separate für Perl, Bilder und Dokumente. Wenn Sie auch den Uber-Repo-Stil beibehalten müssen, können Sie ein Repo aus Submodulen erstellen .
quelle
Die Antwort von richq war knapp, aber es fehlte ein Schritt. Sie müssen das Auschecken mit geringer Dichte explizit aktivieren:
In diesem Blog-Beitrag sind alle Schritte klar umrissen:
quelle
Ohne ins Detail zu gehen, warum Sie dies tun möchten, kann Ihr Problem (wahrscheinlich) einfach durch einen Symlink / eine Verknüpfung gelöst werden.
Um die Frage zu beantworten - nein und mit einem sinnvollen Grund. Die gesamte Geschichte des Repos wird auch bei einem "spärlichen Checkout" heruntergeladen. Um zu klären, warum dies notwendig ist - andernfalls wäre das Verfolgen umbenannter Dateien ein Schmerz im Nacken. Stellen Sie sich vor, Sie verschieben die Datei
/repo_root/asd/file1.cpp
nach/repo_root/fgh/file1.cpp
- wenn Sie jetzt nur/repo_root/fgh
Deltas heruntergeladen haben , wissen Sie nichts über file1.cpp. Das bedeutet, dass Sie alle Deltas herunterladen müssen. Aber dann haben Sie ein vollständiges Repository; nicht nur ein Ordnerausschnitt davon, daher ist nur der/rero_root/fgh
Ordner selbst kein Repo. Dies mag beim Auschecken nicht wichtig klingen, aber wenn Sie sich verpflichten, weiß Git möglicherweise nicht genug, um in Ordnung zu funktionieren.Problemumgehung : Wenn Sie wirklich möchten, können Sie ein Skript erstellen, das git-checkout auf diese Weise aufruft (für die sh-Shell sollte es nicht schwierig sein, einen Stapel für Windows zu erstellen):
Hier ist das erste Argument der Zweig zum Auschecken, das zweite - der Ordner, in dem sich das Repo gerade befindet, das dritte - das Unterverzeichnis, das Sie wirklich verwenden möchten, und das vierte - der Speicherort, an den es kopiert werden soll.
Warnung: Meine Shell-Fähigkeiten sind fast nicht vorhanden. Verwenden Sie diese nach dem Testen. Es sollte nicht schwer sein, die Rückseite dieses Skripts neu zu erstellen, das zurückkopiert, damit es für das Repo festgeschrieben werden kann.
quelle
git filter-branch --subdirectory-filter
ist das, was Sie brauchen, siehe Unterverzeichnis trennen (verschieben) in separates Git-Repository .Hier ist ein kleines Bash-Skript, um das zu tun.
Dadurch wird zuerst eine Arbeitskopie des ursprünglichen Repos erstellt und anschließend der Zweig mithilfe des Unterverzeichnisfilters gefiltert, um das zu erhalten, was Sie möchten.
Verwenden Sie für das Beispiel in der Frage,
git-subdir.sh repo perl
würde funktionieren.quelle
Sie können das Geflecht ausprobieren - es verfolgt Fernbedienungen und ordnet sie einem Pfad zu. https://github.com/evilchelu/braid/wiki
quelle
Es scheint, dass Sie versuchen, den Verzeichnisbaum so umzubenennen, dass Ihre Dateien an einem anderen Ort landen. Es scheint mir, dass Sie eine Anti-Vorlage für das Code- / Projektmanagement in zweierlei Hinsicht benötigen: Kategorisierung von Modulen (Java-Bits unter Java-Knoten, Perl unter Perl-Knoten) und ein Projekt mit Dateien an verschiedenen Speicherorten von wo aus der Entwickler sie visualisiert. Da git Hashes von Verzeichnisinhalten verwaltet, um zu sehen, was geändert wird, bricht dies auch git als solches.
Daemeon Reiydelle
quelle