web-dev-qa-db-fra.com

Commander un fichier de Subversion

"Il n'est pas possible d'extraire un seul fichier. Le niveau de contrôle le plus précis que vous puissiez faire est au niveau du répertoire."

Comment résoudre ce problème avec Subversion?

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

312
bluegene

La réponse simple est que vous svn export le fichier au lieu de l'extraire.

Mais ce n'est peut-être pas ce que vous voulez. Vous voudrez peut-être travailler sur le fichier et le réintégrer, sans avoir à télécharger des Go de déchets inutiles.

Si vous avez Subversion 1.5+, faites un checkout clairsemé:

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

Pour une version antérieure de SVN, vous pouvez tirer parti des avantages suivants:

  • Consultez le répertoire en utilisant une révision dans le passé lointain, quand il était moins plein de bric-à-brac dont vous n'avez pas besoin.
  • Mettez à jour le fichier souhaité pour créer une révision mixte. Cela fonctionne même si le fichier n'existait pas dans la révision extraite.
  • Profit!

Une alternative (par exemple si le répertoire contient trop de fichiers indésirables dès la révision dans laquelle il a été créé) consiste à créer une copie URL-> URL du fichier souhaité dans un nouvel emplacement du référentiel (il s’agit en réalité d’une branche active). du fichier). Consultez ce répertoire et faites vos modifications.

Je ne sais pas si vous pouvez alors 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, alors fais ça.

Sinon, vous devrez peut-être trouver quelqu'un d'autre qui vérifiera tout l'annuaire et le convaincre de le faire. Ou peut-être qu'au moment où vous aurez apporté vos modifications, le téléchargement sera terminé ...

392
Steve Jessop

Essayez svn export au lieu de svn checkout. Cela fonctionne pour des fichiers uniques.

La raison de cette limitation est que checkout crée 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 simples n'ont pas de sous-répertoires.

106
Mnementh

Utilisez svn cat ou svn export.

Pour cela, vous n'avez pas besoin d'extraire 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 à le récupérer complètement. Vérifiez la révision où le répertoire était encore/presque vide, puis utilisez 'svn cat' pour extraire le fichier de HEAD.

53
Milan Babuškov

Si vous souhaitez afficher le fichier readme.txt dans votre référentiel sans l'extraire:

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

Conseil: 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érera 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îche du référentiel!

Source

12
GEOCHET

Une solution équivalente à TortoiseSVN de la réponse acceptée (je l'avais écrite dans un document interne pour mon entreprise alors que nous adoptions récemment SVN) est la suivante. J'ai pensé qu'il serait utile de partager ici aussi:

Extraction d'un fichier unique: Subversion ne prend pas en charge l'extraction d'un fichier, mais uniquement 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 fichier sont stockées dans un dossier caché interne (.svn/_svn). Ceci n'est pas supporté actuellement (v1.6) pour les fichiers individuels.

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

Étape 1 : passer au navigateur de référentiel

Étape 2 : cliquez avec le bouton droit de la souris sur le dossier parent du référentiel contenant tous les fichiers sur lesquels vous souhaitez travailler, puis sélectionnez Extraire.

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

Étape 4 : le ou les dossiers parents doivent 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). À présent dans le référentiel, cliquez avec le bouton droit de la souris sur le fichier que vous souhaitez extraire seul et sélectionnez l’option "Mettre à jour l’élément en révision". Le fichier unique peut maintenant être traité et archivé dans le référentiel.

J'espère que ça aide.

8
Kaushik Gopal

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 up pour mettre à jour le fichier spécifié:

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

Une mise à jour au cas où ce dont vous avez vraiment besoin peut être couverte en incluant le fichier dans la vérification d'un autre dossier.

Depuis SVN 1.6, vous pouvez faire externals de fichiers , 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 des modifications dans le fichier à la fin de ce dossier.

C'est très simple, vérifiez 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 avez validé cela, le fichier apparaîtra lors des extractions futures du dossier. En gros, cela fonctionne, mais il existe certaines limitations décrites dans la documentation ci-dessus.

5
Mikkel Blanné

Je viens de 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 récupérer.

Si vous avez besoin de 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 fonction svn import ...

4
Oli

Allez sur le repo-browser, faites un clic droit sur le fichier et utilisez "Enregistrer sous", mais j'utilise TortoiseSVN.

4
Dave Anderson

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é-enregistrer sauf si vous utilisez Photoshop, donc exportez est une meilleure commande que checkout car elle est non versionnée (mais c'est mineur).

Et le - profondeur ARG ne doit pas être vide mais fichiers pour obtenir les fichiers dans le répertoire immédiat. Ainsi, vous obtiendrez tous les champs, pas seulement celui-ci, mais vide renvoie rien à partir du dépôt.

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

ou

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

En ce qui concerne les autres réponses, cat vous permet de lire le contenu, ce qui n’est valable que pour le texte et non pour les images.

4
Vass

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

svn export <URL>
2
Ted

Avec Subversion 1.5, il devient possible d'extraire (tous) les fichiers d'un répertoire sans extraire les sous-répertoires (les différents indicateurs --depth). Pas tout à fait ce que vous avez demandé, mais une forme de "moins que tout".

2
jackr

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

En utilisant Navigateur du référentiel TortoiseSVN, sélectionnez le fichier, cliquez avec le bouton droit de la souris, puis sélectionnez "Copier l’URL dans le presse-papiers". Collez cette URL dans votre navigateur, et après la connexion, vous devriez être invité avec le téléchargement du fichier.

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

Notez que ceci est valable si votre serveur SVN a une interface Web.

1
Daniel

Je voulais extraire un seul fichier d'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 extrait le répertoire donné contenant le fichier cible que je voulais obtenir dans un répertoire factice (par exemple, etcb pour l'URL se terminant par /etc).

Ensuite, j'ai vidé le fichier . Svn/ 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. Par conséquent, laissez uniquement l'enregistrement concernant le fichier que vous souhaitez obtenir et sauvegardez-le. .

Maintenant, il vous suffit de copier ensuite ".svn" dans le répertoire qui sera une nouvelle "copie de travail". Ensuite, il vous suffit de:

cp .svn /directory
cd /directory
svn update myfile

Maintenant, le 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".

1
hendergassler

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 voulez extraire le fichier de SVN. Utilisez la commande svn cat et redirigez la sortie vers le même fichier nommé. Par défaut, le chat dumpera les informations sur stdio.

1
Manish Singh

En utilisant la technique de contrôle clairsemé, vous POUVEZ extraire un fichier particulier qui est déjà extrait ou existe déjà ... avec une astuce simple:

Après avoir vérifié le niveau supérieur de votre référentiel à l'aide de l'option "Cet élément uniquement", dans l'Explorateur Windows, vous DEVEZ d'abord cliquer avec le bouton droit de la souris sur le fichier à mettre à jour. choisissez Repo Browser dans le menu contextuel; Recherchez ce fichier à nouveau dans le navigateur de référentiel, puis cliquez avec le bouton droit de la souris. Vous devriez maintenant voir le "item de mise à jour à la révision" dans le menu contextuel.

Je ne suis pas sûr que ce soit une fonctionnalité non documentée ou simplement un bogue. Il m'a fallu de longues heures après le travail pour enfin trouver cette astuce. J'utilise TortoiseSVN 1.6.2.

1
devXen

Ce problème est couvert par:

http://Subversion.tigris.org/issues/show_bug.cgi?id=82

Il y a un script attaché 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.

0
ddkilzer

Comme 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 créera un nouveau dossier local contenant uniquement les fichiers du chemin distant. Ensuite, vous pouvez créer un lien symbolique vers les fichiers que vous voulez avoir ici.

0
Lacho Tomov