Kasse eine Datei von Subversion

320

"Es ist nicht möglich, eine einzelne Datei auszuchecken. Die beste Stufe für das Auschecken ist die Verzeichnisebene."

Wie kann ich dieses Problem umgehen, wenn ich Subversion verwende?

Wir haben diesen Ordner in Subversion, in dem wir alle unsere Bilder aufbewahren. Ich möchte nur eine Datei (Bild) davon auschecken. Dieser Ordner ist wirklich groß und enthält eine Menge anderer Dinge, die ich jetzt nicht brauche.

Bluegene
quelle
Sie können es auch anders machen. Melden Sie sich beim Produktionsserver und svn upin Ihrem lokalen Verzeichnis auf Ihrem Computer an.
Neocortex

Antworten:

403

Die einfache Antwort ist, dass Sie svn export die Datei, anstatt sie auszuchecken.

Aber das ist vielleicht nicht das, was Sie wollen. Möglicherweise möchten Sie an der Datei arbeiten und sie erneut einchecken, ohne GB Junk herunterladen zu müssen, den Sie nicht benötigen.

Wenn Sie Subversion 1.5+ haben, führen Sie eine spärliche Kaufabwicklung durch:

svn checkout <url_of_big_dir> <target> --depth empty
cd <target>
svn up <file_you_want>

Bei einer älteren Version von SVN können Sie von folgenden Vorteilen profitieren:

  • Überprüfen Sie das Verzeichnis mit einer Revision aus der Vergangenheit, als es weniger Junk enthielt, den Sie nicht benötigen.
  • Aktualisieren Sie die gewünschte Datei, um eine gemischte Revision zu erstellen. Dies funktioniert auch dann, wenn die Datei in der von Ihnen ausgecheckten Revision nicht vorhanden war.
  • Profitieren!

Eine Alternative (zum Beispiel, wenn das Verzeichnis direkt nach der Revision, in der es erstellt wurde, zu viel Junk enthält) besteht darin, eine URL-> URL-Kopie der gewünschten Datei an einer neuen Stelle im Repository zu erstellen (dies ist praktisch ein funktionierender Zweig der Datei). Überprüfen Sie dieses Verzeichnis und nehmen Sie Ihre Änderungen vor.

Ich bin mir nicht sicher, ob Sie Ihre geänderte Kopie dann ohne eine Arbeitskopie des Ziels wieder vollständig im Repository zusammenführen können - das habe ich nie gebraucht. Wenn ja, dann mach das.

Wenn nicht, müssen Sie möglicherweise jemanden finden, der das gesamte Verzeichnis ausgecheckt hat, und ihn dazu bringen, dies zu tun. Oder bis Sie Ihre Änderungen vorgenommen haben, ist der Rest des Downloads abgeschlossen ...

Steve Jessop
quelle
13
Die wirklich einfache Lösung besteht darin, mit einem Webbrowser auf das Repository zuzugreifen.
Dolmen
11
@dolmen - Angenommen, die Datei muss möglicherweise nicht geändert werden (und es wird davon ausgegangen, dass für dieses Repository eine Webschnittstelle ausgeführt wird). Ich verwende Befehlszeilen-SVN, daher ist es für mich einfacher zu verwenden svn exportals die Weboberfläche, wenn ich weiß, welche Datei ich möchte. Der Fragesteller verwendet bereits SVN, daher hängt es wohl davon ab, welcher Client und ob dieser Client die Verwendung vereinfacht svn export. Ich finde das Webinterface besser zum Surfen als svn ls:-)
Steve Jessop
2
Der SmartSVN-Client sperrt einzelne Dateien, wenn Ihr Subversion-Server dies unterstützt. Und es gibt Hooks, bei denen das Auschecken erforderlich ist, bevor eine binäre / ausführbare Datei eingecheckt werden kann. Es ist nicht wirklich sinnvoll, wenn zwei Personen eine binäre Geldstrafe ändern und diese Änderungen zusammenführen. Dies können neue Funktionen sein, die zum Zeitpunkt der Beantwortung dieser Frage nicht verfügbar waren.
TamusJRoyce
@Tamus: "Es macht nicht wirklich Sinn" stimmte zu, aber in den Fällen, die ich beschreibe, dient die Zusammenführung nur dazu, die neue Version wieder an den ursprünglichen Speicherort zu bringen. Es wird nicht erwartet, dass die Binärdatei im Ziel der Zusammenführung geändert wurde. Die Datei selbst muss also nicht "zusammengeführt" werden, außer dass die alte Version durch die neue ersetzt wird. Es ist genau das, was SVN nennt, und es zeichnet auf, woher die Änderungen stammen, um später darauf zurückgreifen zu können. Sie haben Recht, Konfliktvermeidung kann durch Sperren der Datei für die Dauer erzwungen werden.
Steve Jessop
1
TortoiseSVN kann einzelne Dateien auschecken. Ich glaube, dass es hinter den Kulissen dasselbe tut, um dies zu erreichen.
Mike Starov
109

Versuchen Sie svn exportstatt svn checkout. Das funktioniert für einzelne Dateien.

Der Grund für die Einschränkung besteht darin, dass checkouteine Arbeitskopie erstellt wird, die Metainformationen zu Repository, Revision, Attributen usw. enthält. Diese Metadaten werden in Unterverzeichnissen mit dem Namen ".svn" gespeichert. Und einzelne Dateien haben keine Unterverzeichnisse.

Mnementh
quelle
2
Vorsichtsmaßnahme: Extrem alte Versionen von svnführen keine Einzeldateiexporte durch.
Mladen Jablanović
5
Dies ist die überlegene Methode, wenn Sie nur die neueste Version eines bestimmten Skripts als Teil einer Bereitstellung oder etwas anderem abrufen möchten.
William.berg
2
Diese Einschränkung war schon 2011 eine Strecke, aber extrem alte Versionen können es svn cat $url_to_file_in_repo > $local_file_name.
cprn
53

Verwenden Sie svn catoder svn export.

Dafür müssen Sie das Arbeitsverzeichnis nicht abrufen, können jedoch keine Änderungen vornehmen, die Sie vornehmen. Wenn Sie Änderungen vornehmen und festschreiben müssen, benötigen Sie ein Arbeitsverzeichnis, das Sie jedoch nicht vollständig abrufen müssen. Überprüfen Sie die Revision, in der das Verzeichnis noch / fast leer war, und extrahieren Sie die Datei mit 'svn cat' aus HEAD.

Milan Babuškov
quelle
svn cat svn://.../my_file.txtwar genau das, wonach ich gesucht habe. Ich arbeite in einem svn://einzigen (kein http://) Repository und es sieht so aus, als ob die neuesten Websvn-Schnittstellen keinen Rohdateidownload bieten (oder wir haben sie falsch konfiguriert oder ich bin blind). Dies ist einfacher als checkout+ upnur zum Herunterladen einer Datei.
Ribamar
12

Wenn Sie readme.txt in Ihrem Repository anzeigen möchten, ohne es auszuchecken:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Dies ist eine README-Datei. Sie sollten dies lesen.

Tipp: Wenn Ihre Arbeitskopie veraltet ist (oder Sie lokale Änderungen vorgenommen haben) und Sie die HEAD-Revision einer Datei in Ihrer Arbeitskopie sehen möchten, ruft svn cat die HEAD-Revision automatisch ab, wenn Sie ihr einen Pfad geben:

$ cat foo.c
Diese Datei befindet sich in meiner lokalen Arbeitskopie und enthält Änderungen, die ich vorgenommen habe.

$ svn cat foo.c
Neueste Version frisch aus dem Repository!

Quelle

GEOCHET
quelle
Sie können auch jeden HTTP-Client direkt verwenden. Ihr Webbrowser oder ein Befehlszeilentool wie curloder wget.
Dolmen
9

Es folgt eine TortoiseSVN-äquivalente Lösung der akzeptierten Antwort (ich hatte dies in einem internen Dokument für mein Unternehmen geschrieben, als wir SVN neu einführen). Ich dachte, es wäre hilfreich, auch hier zu teilen:

Auschecken einer einzelnen Datei: Subversion unterstützt nicht das Auschecken einer einzelnen Datei, sondern nur das Auschecken von Verzeichnisstrukturen. (Referenz: http://subversion.tigris.org/faq.html#single-file-checkout ). Dies liegt daran, dass bei jedem Verzeichnis, das als Arbeitskopie ausgecheckt wird, die Metadaten zu Änderungen / Dateirevisionen als interner versteckter Ordner (.svn / _svn) gespeichert werden. Dies wird derzeit (v1.6) für einzelne Dateien nicht unterstützt.

Alternative empfohlene Strategie: Sie müssen den Teil des Checkout-Verzeichnisses nur einmal ausführen. Anschließend können Sie Ihre einzelnen Dateien direkt auschecken. Führen Sie eine spärliche Überprüfung des übergeordneten Ordners und der Verzeichnisstruktur durch. Beim Auschecken mit geringer Dichte wird im Grunde nur die Ordnerstruktur ausgecheckt, ohne die Inhaltsdateien zu füllen. Sie checken also nur die Verzeichnisstrukturen aus und müssen nicht ALLE Dateien auschecken, wie es das Problem war. Referenz: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Schritt 1 : Fahren Sie mit dem Repository-Browser fort

Schritt 2 : Klicken Sie mit der rechten Maustaste auf den übergeordneten Ordner im Repository, der alle Dateien enthält, an denen Sie arbeiten möchten, und wählen Sie Checkout aus.

Schritt 3 : Stellen Sie in einem neuen Popup-Fenster sicher, dass das Checkout-Verzeichnis auf den richtigen Speicherort auf Ihrem lokalen PC verweist. Es wird auch ein Dropdown-Menü mit der Bezeichnung "Checkout-Tiefe" geben. Wählen Sie je nach Anforderung "Nur dieses Element" oder "Sofortige untergeordnete Elemente, einschließlich Ordner". Die zweite Option wird empfohlen, da Sie, wenn Sie an einem verschachtelten Ordner arbeiten möchten, beim nächsten Mal direkt fortfahren können. Andernfalls müssen Sie den gesamten Vorgang für den verschachtelten Ordner erneut ausführen.

Schritt 4 : Die übergeordneten Ordner sollten jetzt in Ihrem lokal ausgewählten Ordner verfügbar sein und werden jetzt mit SVN überwacht (ein versteckter Ordner ".svn" oder "_svn" sollte jetzt vorhanden sein). Klicken Sie jetzt im Repository mit der rechten Maustaste auf die einzelne Datei, die Sie alleine ausgecheckt haben möchten, und wählen Sie die Option "Element auf Revision aktualisieren". Die einzelne Datei kann nun bearbeitet und wieder in das Repository eingecheckt werden.

Ich hoffe das hilft.

Kaushik Gopal
quelle
8

Sie können dies in zwei Schritten tun:

  1. Kasse eines leeren SVN-Repositorys mit nur Metainformationen:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Ausführen svn up, um die angegebene Datei zu aktualisieren:

    $ svn up http://svn.your.company.ca/training/trunk/sql/showSID.sql
    
user2920375
quelle
6

Ein Update für den Fall, dass Sie wirklich etwas benötigen, kann abgedeckt werden, indem die Datei in eine Kasse eines anderen Ordners aufgenommen wird.

Seit SVN 1.6 können Sie externe Dateien erstellen , eine Art SVN-Links. Dies bedeutet, dass Sie einen anderen versionierten Ordner haben können, der eine einzelne Datei enthält. Das Festschreiben von Änderungen an der Datei beim Auschecken dieses Ordners ist ebenfalls möglich.

Es ist sehr einfach, den Ordner auszuchecken, in den Sie die Datei aufnehmen möchten, und dem Ordner einfach eine Eigenschaft hinzuzufügen

svn propedit svn:externals .

mit Inhalten wie diesen:

file.txt /repos/path/to/file.txt

Nachdem Sie dies festgeschrieben haben, wird die Datei in zukünftigen Kassen des Ordners angezeigt. Grundsätzlich funktioniert es, aber es gibt einige Einschränkungen, wie in der oben verlinkten Dokumentation beschrieben.

Mikkel Blanné
quelle
4

Gehen Sie zum Repo-Browser, klicken Sie mit der rechten Maustaste auf die Datei und verwenden Sie "Speichern unter". Ich verwende jedoch TortoiseSVN.

Dave Anderson
quelle
4
cd C:\path\dir
svn checkout https://server/path/to/trunk/dir/dir/parent_dir--depth empty
cd C:\path\dir\parent_dir
svn update filename.log

(Dateiname.log bearbeiten)

svn commit -m "this is a comment."
anon
quelle
4

Steve Jessops Antwort hat bei mir nicht funktioniert. Ich habe die Hilfedateien für SVN gelesen und wenn Sie nur ein Bild haben, möchten Sie es wahrscheinlich nicht erneut einchecken, es sei denn, Sie führen Photoshop aus. Daher ist der Export ein besserer Befehl als das Auschecken, da er nicht konvertiert ist (aber das ist geringfügig).

Und das --depth ARG sollte nicht leer sein, sondern Dateien , um die Dateien in das unmittelbare Verzeichnis zu bekommen. Sie erhalten also alle Felder, nicht nur das eine, sondern leer gibt nichts aus dem Repository zurück.

 svn co --depth files <source> <local dest>

oder

svn export --depth files <source> <local dest>

Bei den anderen Antworten können Sie mit cat den Inhalt lesen, der nur für Text und nicht für Bilder aller Dinge geeignet ist.

Vass
quelle
1
Der Punkt --depth emptywar, dass die anderen Dateien nicht ausgecheckt werden sollten und Sie dann nur eine einzige Datei mit erhalten können svn up <source/file>. Mit svn exportbesteht keine Notwendigkeit , dies zu tun ist, geben Sie einfach die Datei.
Kevin Vermeer
@reemrevnivek - du hast recht. Nun, die Frage wurde nur für eine einzelne Datei gestellt. Dies funktioniert ohne das Auschecken der gesamten Verzeichnisstrukturdatei, selbst wenn diese leer ist.
Vass
4

Ich würde es nur durchsuchen und die einzelne Datei exportieren. Wenn Sie HTTP-Zugriff haben, verwenden Sie einfach den Webbrowser, um die Datei zu finden und abzurufen.

Wenn Sie es nach dem Bearbeiten wieder einspielen müssen, ist das vielleicht etwas langwieriger, aber ich bin mir sicher, dass es eine svn importFunktion gibt ...

Oli
quelle
3

Mach so etwas:

mkdir <your directory>/repos/test

svn cat http://svn.red-bean.com/repos/test/readme.txt > <your directory>/repos/test/readme.txt

Grundsätzlich besteht die Idee darin, das Verzeichnis zu erstellen, in dem Sie die Datei aus SVN abrufen möchten. Verwenden Sie den svn catBefehl und leiten Sie die Ausgabe in dieselbe gleichnamige Datei um. Standardmäßig gibt die Katze Informationen auf stdio aus.

Manish Singh
quelle
2

Wenn Sie nur eine Datei ohne Revisionsinformationen möchten, verwenden Sie

svn export <URL>
Ted
quelle
2

Mit Subversion 1.5 ist es möglich, (alle) Dateien eines Verzeichnisses auszuchecken, ohne Unterverzeichnisse (die verschiedenen --depth-Flags) auszuchecken. Nicht ganz das, wonach Sie gefragt haben, aber eine Form von "weniger als alle".

jackr
quelle
2

Mit der Sparse-Check-Out-Technik können Sie eine bestimmte Datei auschecken, die bereits ausgecheckt ist oder existiert ... mit einem einfachen Trick:

Nach dem Auschecken der obersten Ebene Ihres Repositorys mit der Option "Nur dieses Element" MÜSSEN Sie im Windows-Explorer zuerst mit der rechten Maustaste auf die Datei klicken, die Sie aktualisieren möchten. Wählen Sie im Kontextmenü den Repo-Browser. Suchen Sie diese Datei WIEDER im Repository-Browser und klicken Sie mit der rechten Maustaste. Sie sollten nun das "Update-Element zur Revision" im Kontextmenü sehen.

Ich bin mir nicht sicher, ob es sich um eine undokumentierte Funktion oder einfach um einen Fehler handelt. Ich brauchte eine längere Nacharbeitszeit, um diesen Trick endlich zu finden. Ich benutze TortoiseSVN 1.6.2.

devXen
quelle
2

Ich wollte eine einzelne Datei in ein Verzeichnis auschecken, das nicht Teil einer Arbeitskopie war.

Lassen Sie uns die Datei unter der folgenden URL abrufen : http: //subversion.repository.server/repository/module/directory/myfile

svn co  http://subversion.repository.server/repository/module/directory/myfile /**directoryb**

Also habe ich das angegebene Verzeichnis mit der Zieldatei ausgecheckt, die ich in ein Dummy-Verzeichnis bringen wollte (sagen wir etcb für die URL, die mit endet /etc).

Dann habe ich die Datei .svn / entry aus allen Dateien des Zielverzeichnisses geleert, die ich nicht benötigte, um nur die gewünschte Datei zu belassen . In dieser .svn / entry- Datei haben Sie für jede Datei einen Datensatz mit ihren Attributen. Lassen Sie also nur den Datensatz für die Datei, die Sie abrufen und speichern möchten.

Jetzt müssen Sie nur noch '' .svn '' in das Verzeichnis kopieren, das eine neue "Arbeitskopie" sein wird. Dann müssen Sie nur noch:

cp .svn /directory
cd /directory
svn update myfile

Nun ist das Verzeichnis - Verzeichnis unter Versionskontrolle. Vergessen Sie nicht, das Verzeichnis directoryb zu entfernen, das nur eine temporäre Arbeitskopie war.

hendergassler
quelle
Ist es nicht das, was spärliche Kasse tut? Sie sollten die Dateien im .svn-Verzeichnis wirklich nicht manuell hacken.
Lasse V. Karlsen
Vielleicht hat es aber das Problem richtig gelöst. Ich nehme an, es ist die Art und Weise, wie das Versionsmanagement funktionieren sollte, und es ist auch möglich, Dateien als Erweiterung von Verzeichnissen zu behandeln. Probieren Sie es aus und sagen Sie mir, was mit der Logik falsch ist. Ich würde dem Subversion-Entwicklungsteam vorschlagen, das Dienstprogramm svn mit dieser Funktion zu erweitern, um die Probleme aller zu lösen, die diesen Thread beantwortet haben.
Hendergassler
2

Da keine der anderen Antworten für mich funktioniert hat, habe ich es mit diesem Hack gemacht:

$ cd /yourfolder
svn co https://path-to-folder-which-has-your-files/ --depth files

Dadurch wird ein neuer lokaler Ordner erstellt, der nur die Dateien aus dem Remote-Pfad enthält. Dann können Sie einen symbolischen Link zu den Dateien erstellen, die Sie hier haben möchten.

Lacho Tomov
quelle
Das OP fragte nach svn coeiner Datei, um ein ganzes Verzeichnis voller Bilddateien zu vermeiden. Das Hinzufügen eines Symlinks kann nur die Komplexität erhöhen. Das Verschieben aus einem temporären Verzeichnis könnte funktionieren, Sie müssen jedoch immer noch das gesamte Bildverzeichnis für nur ein Bild auschecken. @ Steve-Jessop hatte die richtige Idee
Chris Marotta
2
@ ChrisMarotta das OP hat die Frage vor 9 Jahren gestellt. Niemand hier antwortet auf das OP. Dies ist ein allgemeines Thema für diese Art von Problem und hat nichts mehr mit dem ursprünglichen OP zu tun. Die Leute kommen hierher, um eine Lösung für ihr eigenes Problem zu finden. Und wenn sie es lesen, werden einige von ihnen in meiner Situation sein, in der dies die einzig richtige Lösung war. Deshalb habe ich es gepostet.
Lacho Tomov
1
Ich freue mich über diese Antwort, sie hat mir geholfen
Leos Literak
1

Dieses Problem wird behandelt von:

http://subversion.tigris.org/issues/show_bug.cgi?id=823

Es ist ein Skript beigefügt, mit dem Sie eine einzelne Datei aus svn auschecken, Änderungen vornehmen und die Änderungen wieder in das Repository übertragen können. Sie können jedoch "svn up" nicht ausführen, um den Rest des Verzeichnisses auszuchecken. Es wurde mit svn-1.3, 1.4 und 1.6 getestet.

ddkilzer
quelle
1

Wenn Sie die Datei nur exportieren möchten und sie später nicht aktualisieren müssen, können Sie dies tun, ohne SVN-Befehle verwenden zu müssen.

Wählen Sie im TortoiseSVN-Repository-Browser die Datei aus, klicken Sie mit der rechten Maustaste und wählen Sie dann " URL in Zwischenablage kopieren ". Fügen Sie diese URL in Ihren Browser ein. Nach dem Anmelden sollten Sie aufgefordert werden, die Datei herunterzuladen.

Auf diese Weise können Sie auch die gewünschte Revision auswählen und eine ältere Version der Datei herunterladen.

Beachten Sie, dass dies gültig ist, wenn Ihr SVN-Server über eine Webschnittstelle verfügt.

Daniel
quelle