Extraire un fichier de Subversion

320

"Il n'est pas possible d'extraire un seul fichier. Le meilleur niveau d'extraction que vous pouvez faire est au niveau du répertoire."

Comment contourner ce problème lors de l'utilisation de Subversion?

Nous avons ce dossier dans Subversion où nous gardons toutes nos images. Je veux juste extraire un fichier (image) de cela. Ce dossier est vraiment grand et contient des tonnes d'autres choses dont je n'ai pas besoin maintenant.

bluegene
la source
Vous pouvez le faire dans l'autre sens. Connectez-vous au serveur de production et svn upà votre répertoire local sur votre ordinateur.
Neocortex

Réponses:

403

La réponse simple est que vous avez svn exportle fichier au lieu de le vérifier.

Mais ce n'est peut-être pas ce que vous voulez. Vous voudrez peut-être travailler sur le fichier et le réarchiver, sans avoir à télécharger Go de fichiers inutiles dont vous n'avez pas besoin.

Si vous possédez Subversion 1.5+, effectuez une vérification clairsemée:

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

Pour une ancienne version de SVN, vous pourriez bénéficier des avantages suivants:

  • Extraire le répertoire en utilisant une révision dans un passé lointain, quand il était moins plein de déchets inutiles.
  • Mettez à jour le fichier que vous souhaitez, pour créer une révision mixte. Cela fonctionne même si le fichier n'existait pas dans la révision que vous avez extraite.
  • Profit!

Une alternative (par exemple si le répertoire contient trop d'ordures dès la révision dans laquelle il a été créé) est de faire une copie URL-> URL du fichier que vous voulez dans un nouvel emplacement dans le référentiel (en fait, c'est une branche de travail du fichier). Consultez ce répertoire et faites vos modifications.

Je ne sais pas si vous pouvez ensuite fusionner entièrement votre copie modifiée dans le référentiel sans une copie de travail de la cible - je n'en ai jamais eu besoin. Si oui, faites-le.

Si ce n'est pas le cas, malheureusement, vous devrez peut-être trouver quelqu'un d'autre qui a vérifié tout le répertoire et les faire le faire. Ou peut-être au moment où vous aurez fait vos modifications, le reste aura fini de télécharger ...

Steve Jessop
la source
13
La solution vraiment simple consiste à accéder au référentiel avec un navigateur Web.
dolmen
11
@dolmen - En supposant qu'il n'est peut-être pas nécessaire de modifier le fichier (et en supposant qu'une interface Web fonctionne pour ce référentiel). J'utilise la ligne de commande SVN, donc pour moi, c'est plus simple à utiliser svn exportqu'à utiliser l'interface web, si je sais quel fichier je veux. Le questionneur utilise déjà SVN, donc je suppose que cela dépend de quel client et si ce client le rend facile à utiliser svn export. svn lsCependant, je trouve l'interface Web meilleure pour la navigation que :-)
Steve Jessop
2
Le client SmartSVN verrouillera des fichiers individuels si votre serveur Subversion le prend en charge. Et il y a des hooks qui nécessitent des extractions doivent être effectués avant qu'un fichier binaire / exécutable puisse être archivé. Cela n'a pas vraiment de sens que deux personnes modifient une amende binaire et que ces changements soient fusionnés. Il peut s'agir de nouvelles fonctionnalités qui n'étaient pas disponibles lorsque cette question a été posée.
TamusJRoyce
@Tamus: "Cela n'a pas vraiment de sens", mais dans les cas que je décris, la fusion consiste simplement à remettre la nouvelle version à l'emplacement d'origine. Il n'est pas attendu que le fichier binaire ait été modifié dans la cible de la fusion. Ainsi, le fichier lui-même n'a pas besoin de "fusion" au-delà du remplacement de l'ancienne version par la nouvelle, c'est juste ce que SVN l'appelle et il enregistre d'où viennent les modifications pour référence future. Vous avez raison, l'évitement des conflits pourrait être appliqué en verrouillant le fichier pour la durée.
Steve Jessop
1
TortoiseSVN peut extraire des fichiers individuels. Je crois que cela fait la même chose dans les coulisses pour y parvenir.
Mike Starov
109

Essayez svn exportau lieu de svn checkout. Cela fonctionne pour les fichiers uniques.

La raison de cette limitation est la checkoutcréation d'une copie de travail contenant des méta-informations sur le référentiel, la révision, les attributs, etc. Ces métadonnées sont stockées dans des sous-répertoires nommés '.svn'. Et les fichiers uniques n'ont pas de sous-répertoires.

Mnementh
la source
2
Avertissement: les versions extrêmement anciennes de svnne feront pas d'exportations de fichier unique.
Mladen Jablanović
5
C'est la méthode supérieure si vous voulez simplement récupérer la dernière version d'un script particulier dans le cadre d'un déploiement, ou quelque chose.
william.berg
2
Cette mise en garde était un étirement même en 2011, mais des versions extrêmement anciennes peuvent le faire svn cat $url_to_file_in_repo > $local_file_name.
cprn
53

Utilisez svn catou svn export.

Pour cela, vous n'avez pas besoin de récupérer le répertoire de travail, mais vous ne pourrez pas valider les modifications que vous apportez. Si vous devez apporter des modifications et les valider, vous avez besoin d'un répertoire de travail, mais vous n'avez pas besoin de le récupérer complètement. Extraire la révision où le répertoire était encore / presque vide, puis utiliser «svn cat» pour extraire le fichier de HEAD.

Milan Babuškov
la source
svn cat svn://.../my_file.txtétait exactement ce que je cherchais. Je travaille dans un svn://seul (pas http://) référentiel, et il semble que les dernières interfaces websvn ne fournissent pas de téléchargement de fichier brut (ou nous l'avons mal configuré ou je suis aveugle). Plus facile à faire de cette façon que checkout+ upjuste pour télécharger un fichier.
ribamar
12

Si vous souhaitez afficher readme.txt dans votre référentiel sans le vérifier:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Ceci est un fichier README. Vous devriez lire ceci.

Astuce: si votre copie de travail est obsolète (ou si vous avez des modifications locales) et que vous souhaitez voir la révision HEAD d'un fichier dans votre copie de travail, svn cat récupère automatiquement la révision HEAD lorsque vous lui donnez un chemin:

$ cat foo.c
Ce fichier est dans ma copie de travail locale et contient les modifications que j'ai apportées.

$ svn cat foo.c
Dernière révision fraîchement sortie du référentiel!

La source

GEOCHET
la source
Vous pouvez également utiliser directement n'importe quel client HTTP. Votre navigateur Web ou un outil en ligne de commande tel que curlou wget.
dolmen
9

Une solution équivalente TortoiseSVN de la réponse acceptée (j'avais écrit ceci dans un document interne pour mon entreprise car nous adoptons récemment SVN). J'ai pensé qu'il serait utile de partager ici aussi:

Extraire un seul fichier: Subversion ne prend pas en charge l'extraction d'un seul fichier, il prend uniquement en charge l'extraction des structures de répertoires. (Référence: http://subversion.tigris.org/faq.html#single-file-checkout ). En effet, avec chaque répertoire extrait en tant que copie de travail, les métadonnées concernant les modifications / révisions de fichiers sont stockées dans un dossier caché interne (.svn / _svn). Ceci n'est pas pris en charge actuellement (v1.6) pour les fichiers uniques.

Autre stratégie recommandée: vous ne devrez effectuer la partie du répertoire d'extraction qu'une seule fois, après quoi vous pourrez directement aller extraire vos fichiers individuels. Effectuez une extraction clairsemée du dossier parent et de la structure du répertoire. Une extraction clairsemée consiste essentiellement à extraire uniquement la structure des dossiers sans remplir les fichiers de contenu. Ainsi, vous extrayez uniquement les structures de répertoires et n'avez pas besoin d'extraire TOUS les fichiers comme cela était le problème. Référence: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Étape 1 : passez au navigateur du référentiel

Étape 2 : cliquez avec le bouton droit sur le dossier parent dans le référentiel contenant tous les fichiers sur lesquels vous souhaitez travailler et sélectionnez Extraire.

Étape 3 : Dans la nouvelle fenêtre contextuelle, assurez-vous que le répertoire de paiement pointe vers l'emplacement correct sur votre PC local. Il y aura également un menu déroulant intitulé «profondeur de paiement». Choisissez «Uniquement cet article» ou «Enfants immédiats, y compris les dossiers» en fonction de vos besoins. La deuxième option est recommandée car, si vous souhaitez travailler sur un dossier imbriqué, vous pouvez directement procéder la prochaine fois, sinon vous devrez à nouveau suivre toute cette procédure pour le dossier imbriqué.

Étape 4 : Le ou les dossiers parents devraient maintenant être disponibles dans votre dossier choisi localement et sont maintenant surveillés avec SVN (un dossier caché ".svn" ou "_svn" devrait maintenant être présent). Dans le référentiel maintenant, cliquez avec le bouton droit sur le fichier unique que vous souhaitez extraire seul et sélectionnez l'option «Mettre à jour l'élément à réviser». Le fichier unique peut maintenant être travaillé et archivé dans le référentiel.

J'espère que ça aide.

Kaushik Gopal
la source
8

Vous pouvez le faire en deux étapes:

  1. Extraire un référentiel SVN vide avec des méta-informations uniquement:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Exécutez svn uppour mettre à jour le fichier spécifié:

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

Une mise à jour au cas où ce dont vous avez vraiment besoin peut être couvert en incluant le fichier dans une extraction d'un autre dossier.

Depuis SVN 1.6, vous pouvez créer des fichiers externes , une sorte de liens svn. Cela signifie que vous pouvez avoir un autre dossier versionné qui comprend un seul fichier. Il est également possible de valider les modifications apportées au fichier lors de l'extraction de ce dossier.

C'est très simple, extrayez le dossier dans lequel vous souhaitez inclure le fichier et ajoutez simplement une propriété au dossier

svn propedit svn:externals .

avec un contenu comme celui-ci:

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

Une fois que vous l'avez validé, le fichier apparaîtra lors des prochaines extractions du dossier. Fondamentalement, cela fonctionne, mais il existe certaines limitations, comme décrit dans la documentation liée ci-dessus.

blanne
la source
4

Allez dans le navigateur de dépôt, cliquez avec le bouton droit sur le fichier et utilisez «Enregistrer sous», j'utilise cependant TortoiseSVN.

Dave Anderson
la source
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

(Modifier le nom de fichier.log)

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

La réponse de Steve Jessop n'a pas fonctionné pour moi. J'ai lu les fichiers d'aide pour SVN et si vous avez juste une image, vous ne voudrez probablement pas la réintégrer à moins que vous ne fassiez Photoshop, donc l' exportation est une meilleure commande que la caisse car elle n'est pas versionnée (mais c'est mineur).

Et l' ARG --depth ne doit pas être vide mais des fichiers pour obtenir les fichiers dans le répertoire immédiat. Vous obtiendrez donc tous les champs, pas seulement celui, mais vide ne renvoie rien du référentiel.

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

ou

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

Quant aux autres réponses, cat vous permet de lire le contenu qui n'est bon que pour le texte, pas les images de toutes choses.

Vass
la source
1
Le point --depth emptyétait que les autres fichiers ne devaient pas être récupérés, et vous pouvez alors obtenir un seul fichier avec svn up <source/file>. Avec svn export, il n'est pas nécessaire de le faire, spécifiez simplement le fichier.
Kevin Vermeer
@reemrevnivek - vous avez raison. Eh bien, la question vient de se poser pour un seul fichier, cela fonctionne sans extraire la totalité du fichier de structure de répertoire même s'il est vide.
Vass
4

Je voudrais simplement le parcourir et exporter le fichier unique. Si vous avez un accès HTTP, utilisez simplement le navigateur Web pour trouver le fichier et le saisir.

Si vous devez le récupérer après l'avoir édité, cela pourrait être un peu plus fastidieux, mais je suis sûr qu'il pourrait y avoir une svn importfonction ...

Oli
la source
3

Faites quelque chose comme ça:

mkdir <your directory>/repos/test

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

Fondamentalement, l'idée est de créer le répertoire dans lequel vous souhaitez récupérer le fichier de SVN. Utilisez la svn catcommande et redirigez la sortie vers le même fichier nommé. Par défaut, le chat affichera les informations sur stdio.

Manish Singh
la source
2

Si vous voulez juste un fichier sans informations de révision, utilisez

svn export <URL>
Ted
la source
2

Avec Subversion 1.5, il devient possible d'extraire (tous) les fichiers d'un répertoire sans extraire aucun sous-répertoire (les différents drapeaux --depth). Pas tout à fait ce que vous demandiez, mais une forme de «moins que tout».

jackr
la source
2

En utilisant la technique d'extraction clairsemée, vous POUVEZ extraire un fichier particulier qui est déjà extrait ou qui existe ... avec une astuce simple:

Après avoir vérifié le niveau supérieur de votre référentiel en utilisant l'option «cet élément uniquement», dans l'explorateur Windows, vous DEVEZ d'abord faire un clic droit sur le fichier que vous devez mettre à jour; choisissez Repo Browser dans le menu contextuel; recherchez à nouveau ce fichier dans le navigateur du référentiel et cliquez avec le bouton droit. Vous devriez maintenant voir «mettre à jour l'élément à réviser» dans le menu contextuel.

Je ne sais pas s'il s'agit d'une fonctionnalité non documentée ou simplement d'un bug. Il m'a fallu de longues heures après le travail pour enfin trouver cette astuce. J'utilise TortoiseSVN 1.6.2.

devXen
la source
2

Je voulais extraire un seul fichier dans un répertoire, qui ne faisait pas partie d'une copie de travail.

Récupérons le fichier à l'URL suivante: http: //subversion.repository.server/repository/module/directory/myfile

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

J'ai donc vérifié le répertoire donné contenant le fichier cible que je voulais obtenir dans un répertoire factice (dites etcb pour l'URL se terminant par /etc).

Ensuite, j'ai vidé le fichier .svn / entrées de tous les fichiers du répertoire cible dont je n'avais pas besoin, pour ne laisser que le fichier que je voulais. Dans ce fichier .svn / entries , vous avez un enregistrement pour chaque fichier avec ses attributs, alors ne laissez que l'enregistrement concernant le fichier que vous souhaitez obtenir et enregistrer.

Il vous suffit maintenant de copier ensuite '' .svn '' dans le répertoire qui sera une nouvelle "copie de travail". Il vous suffit ensuite de:

cp .svn /directory
cd /directory
svn update myfile

Maintenant, le répertoire répertoire est sous contrôle de version. N'oubliez pas de supprimer le répertoire directoryb qui n'était qu'une '' copie de travail temporaire ''.

hendergassler
la source
N'est-ce pas ce que la caisse clairsemée fait? Vous ne devriez vraiment pas pirater manuellement les fichiers du répertoire .svn.
Lasse V. Karlsen
Peut-être, mais cela a résolu le problème correctement. Je suppose que c'est la façon dont la gestion des versions devrait fonctionner, étant également capable de gérer les fichiers comme extension de répertoires. Essayez-le et dites-moi ce qui ne va pas avec la logique. Je suggérerais à l'équipe de développement de subversion d'étendre l'utilitaire svn avec cette fonctionnalité, cela résoudrait les problèmes de tous les gars qui ont répondu à ce fil.
hendergassler
2

Puisqu'aucune des autres réponses n'a fonctionné pour moi, je l'ai fait en utilisant ce hack:

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

Cela va créer un nouveau dossier local qui ne contient que les fichiers du chemin distant. Ensuite, vous pouvez faire un lien symbolique vers les fichiers que vous souhaitez avoir ici.

Lacho Tomov
la source
L'OP a demandé au sujet svn cod'un fichier pour éviter un répertoire entier plein de fichiers image. De plus, l'ajout d'un lien symbolique ne peut qu'ajouter à la complexité, le déplacement à partir d'un répertoire temporaire peut fonctionner, mais vous devez toujours consulter l'intégralité du répertoire d'images pour une seule image. @ steve-jessop a eu la bonne idée
Chris Marotta
2
@ChrisMarotta l'OP a posé la question il y a 9 ans. Personne ici ne répond au PO. Il s'agit d'un sujet général pour ce type de problème, et cela n'a plus rien à voir avec l'OP d'origine. Les gens viennent ici pour trouver une solution à leur propre problème. Et quand ils le liront, certains d'entre eux seront dans ma situation où c'était la seule solution appropriée. C'est pourquoi je l'ai posté.
Lacho Tomov
1
Je suis heureux de cette réponse, cela m'a aidé
Leos Literak
1

Ce problème est couvert par:

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

Un script est joint qui vous permet d'extraire un seul fichier de svn, d'apporter des modifications et de valider les modifications dans le référentiel, mais vous ne pouvez pas exécuter "svn up" pour extraire le reste du répertoire. Il a été testé avec svn-1.3, 1.4 et 1.6.

ddkilzer
la source
1

Si vous souhaitez simplement exporter le fichier et que vous n'aurez pas besoin de le mettre à jour plus tard, vous pouvez le faire sans avoir à utiliser les commandes SVN.

À l'aide du navigateur de référentiel TortoiseSVN , sélectionnez le fichier, cliquez avec le bouton droit, puis sélectionnez " Copier l'URL dans le presse-papiers ". Collez cette URL dans votre navigateur, et après la connexion, vous serez invité à télécharger le fichier.

De cette façon, vous pouvez également sélectionner la révision souhaitée et télécharger une ancienne version du fichier.

Notez que cela est valable si votre serveur SVN possède une interface Web.

Daniel
la source