Acquista un file da Subversion


320

"Non è possibile estrarre un singolo file. Il miglior livello di checkout che puoi fare è a livello di directory."

Come aggirare questo problema quando si utilizza Subversion?

Abbiamo questa cartella in Subversion in cui conserviamo tutte le nostre immagini. Voglio solo controllare un file (immagine) da quello. Questa cartella è davvero grande e contiene moltissime altre cose di cui non ho bisogno ora.


Puoi farlo dall'altra parte. Accedi al server di produzione e svn upalla tua directory locale sul tuo computer.
Neocortex,

Risposte:


403

La semplice risposta è che è svn exportil file invece di verificarlo.

Ma potrebbe non essere quello che vuoi. Potresti voler lavorare sul file e ricontrollarlo, senza dover scaricare GB di spazzatura che non ti servono.

Se hai Subversion 1.5+, fai un checkout sparso:

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

Per una versione precedente di SVN, potresti trarre vantaggio da quanto segue:

  • Esegui il checkout della directory utilizzando una revisione in un lontano passato, quando era meno piena di spazzatura non necessaria.
  • Aggiorna il file desiderato per creare una revisione mista. Funziona anche se il file non esisteva nella revisione che hai estratto.
  • Profitto!

Un'alternativa (ad esempio se la directory ha troppa posta indesiderata dalla revisione in cui è stata creata) è fare una copia URL-> URL del file che si desidera in una nuova posizione nel repository (in realtà si tratta di un ramo funzionante del file). Dai un'occhiata a quella directory ed esegui le tue modifiche.

Non sono sicuro che sia possibile unire nuovamente la copia modificata interamente nel repository senza una copia funzionante della destinazione: non ne ho mai avuto bisogno. Se è così, allora fallo.

Altrimenti, purtroppo, potresti dover trovare qualcun altro che ha verificato l'intera directory e farglielo fare. O forse quando avrai apportato le modifiche, il resto avrà terminato il download ...


13
La soluzione davvero semplice è accedere al repository con un browser web.
dolmen,

11
@dolmen - Supponendo che non sia necessario modificare il file, forse (e supponendo che sia in esecuzione un'interfaccia web per quel repository). Uso la riga di comando SVN, quindi per me è più semplice da usare svn exportrispetto all'interfaccia web, se so quale file voglio. L'interrogante utilizza già SVN, quindi immagino che dipenda dal client e se quel client lo rende facile da usare svn export. Trovo l'interfaccia web migliore per la navigazione di svn ls, però :-)
Steve Jessop

2
Il client SmartSVN bloccherà i singoli file se il tuo Subversion Server lo supporta. E ci sono hook che richiedono che i check out debbano essere eseguiti prima che un file binario / eseguibile possa essere archiviato. Non ha davvero senso che due persone modifichino una multa binaria e che queste modifiche vengano unite. Queste potrebbero essere nuove funzionalità che non erano disponibili quando è stata posta questa domanda.
TamusJRoyce,

@Tamus: "Non ha davvero senso" concordato, ma nei casi in cui descrivo l'unione è solo per riportare la nuova versione nella posizione originale. Non è previsto che il file binario sia stato modificato nella destinazione dell'unione. Quindi il file stesso non ha bisogno di alcuna "fusione" oltre a sostituire la vecchia versione con quella nuova, è proprio come lo chiama SVN e registra da dove provengono le modifiche per riferimento futuro. Hai ragione, l'eliminazione dei conflitti potrebbe essere applicata bloccando il file per la durata.
Steve Jessop,

1
TortoiseSVN può controllare singoli file. Credo che faccia lo stesso dietro le quinte per raggiungerlo.
Mike Starov,

109

Prova svn exportinvece di svn checkout. Funziona con singoli file.

Il motivo della limitazione è che checkoutcrea una copia funzionante, che contiene meta-informazioni su repository, revisione, attributi, ecc. I metadati sono archiviati in sottodirectory denominate '.svn'. E i singoli file non hanno sottodirectory.


2
Avvertenza: le versioni estremamente vecchie di svnnon eseguono le esportazioni di singoli file.
Mladen Jablanović,

5
Questo è il metodo migliore se vuoi semplicemente prendere l'ultima versione di un particolare script come parte di una distribuzione, o qualcosa del genere.
william.berg,

2
Quel avvertimento è stato un tratto anche nel 2011, ma le versioni estremamente vecchie possono fare svn cat $url_to_file_in_repo > $local_file_name.
cprn,

53

Usa svn cato svn export.

Per questo, non è necessario recuperare la directory di lavoro, ma non sarà possibile eseguire il commit delle modifiche apportate. Se è necessario apportare modifiche e impegnarle, è necessaria una directory di lavoro, ma non è necessario recuperarla completamente. Controlla la revisione in cui la directory era ancora / quasi vuota, quindi usa 'svn cat' per estrarre il file da HEAD.


svn cat svn://.../my_file.txtera esattamente quello che stavo cercando. Lavoro in un svn://unico (no http://) repository e sembra che le più recenti interfacce websvn non forniscano un download di file non elaborato (o lo abbiamo configurato in modo errato o sono cieco). Più facile da fare in questo modo rispetto a checkout+ upsolo per il download di un file.
Ribamar,

12

Se si desidera visualizzare readme.txt nel proprio repository senza verificarlo:

$ svn cat http://svn.red-bean.com/repos/test/readme.txt
Questo è un file README. Dovresti leggere questo.

Suggerimento: se la tua copia di lavoro non è aggiornata (o hai delle modifiche locali) e vuoi vedere la revisione HEAD di un file nella tua copia di lavoro, svn cat recupererà automaticamente la revisione HEAD quando le dai un percorso:

$ cat foo.c
Questo file è nella mia copia di lavoro locale e presenta delle modifiche che ho apportato.

$ svn cat foo.c
Ultima revisione aggiornata dal repository!

fonte


Puoi anche utilizzare direttamente qualsiasi client HTTP. Il browser Web o uno strumento da riga di comando come curlo wget.
dolmen,

9

Segue una soluzione equivalente a TortoiseSVN della risposta accettata (l'avevo scritto in un documento interno per la mia azienda mentre stiamo adottando SVN). Ho pensato che sarebbe utile condividere anche qui:

Verifica di un singolo file: Subversion non supporta il checkout di un singolo file, ma supporta solo il checkout delle strutture di directory. (Riferimento: http://subversion.tigris.org/faq.html#single-file-checkout ). Questo perché con ogni directory che viene estratta come copia funzionante, i metadati relativi alle modifiche / revisioni dei file vengono archiviati come cartella nascosta interna (.svn / _svn). Questo non è attualmente supportato (v1.6) per singoli file.

Strategia alternativa consigliata: dovrai eseguire la parte della directory di checkout una sola volta, dopodiché puoi andare direttamente a checkout dei tuoi singoli file. Esegui un checkout scarso della cartella principale e della struttura della directory. Un checkout sparso sta fondamentalmente controllando solo la struttura delle cartelle senza popolare i file di contenuto. Quindi fai il checkout solo delle strutture di directory e non devi controllare TUTTI i file come è stato il problema. Riferimento: http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-checkout.html

Passaggio 1 : passare al browser del repository

Passaggio 2 : fare clic con il pulsante destro del mouse sulla cartella principale all'interno del repository contenente tutti i file su cui si desidera lavorare e selezionare Verifica.

Passaggio 3 : all'interno di una nuova finestra popup, assicurarsi che la directory di pagamento punti nella posizione corretta sul PC locale. Ci sarà anche un menu a discesa etichettato "profondità di pagamento". Scegli "Solo questo elemento" o "Bambini immediati, comprese le cartelle" a seconda delle tue esigenze. Si consiglia la seconda opzione poiché, se si desidera lavorare sulla cartella nidificata, è possibile procedere direttamente la volta successiva, altrimenti sarà necessario seguire nuovamente l'intera procedura per la cartella nidificata.

Passaggio 4 : Le cartelle padre dovrebbero ora essere disponibili nella cartella scelta localmente e ora vengono monitorate con SVN (una cartella nascosta ".svn" o "_svn" dovrebbe ora essere presente). All'interno del repository ora, fai clic con il pulsante destro del mouse sul singolo file che desideri che sia stato estratto da solo e seleziona l'opzione "Aggiorna elemento alla revisione". Ora è possibile lavorare sul singolo file e ricontrollarlo nel repository.

Spero che aiuti.


8

Puoi farlo in due passaggi:

  1. Acquista un repository SVN vuoto con solo meta informazioni:

    $ cd /tmp
    
    $ svn co --depth empty http://svn.your.company.ca/training/trunk/sql
    
  2. Esegui svn upper aggiornare il file specificato:

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

6

Un aggiornamento nel caso in cui ciò di cui hai veramente bisogno può essere coperto facendo includere il file in un checkout di un'altra cartella.

Da SVN 1.6 è possibile creare file esterni , una sorta di collegamenti svn. Significa che puoi avere un'altra cartella con versione che include un singolo file. È anche possibile eseguire modifiche al file in un checkout di questa cartella.

È molto semplice, controlla la cartella in cui desideri includere il file e aggiungi semplicemente una proprietà alla cartella

svn propedit svn:externals .

con contenuti come questo:

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

Dopo aver eseguito il commit, il file verrà visualizzato in futuri checkout della cartella. Fondamentalmente funziona, ma ci sono alcune limitazioni come descritto nella documentazione collegata sopra.


4

Vai al browser repo facendo clic con il pulsante destro del mouse sul file e usa "Salva con nome", sto usando TortoiseSVN.


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

(Modifica nomefile.log)

svn commit -m "this is a comment."

4

La risposta di Steve Jessop non ha funzionato per me. Ho letto i file della guida per SVN e se hai solo un'immagine probabilmente non vorrai riprovare a fare il check-in a meno che tu non stia eseguendo Photoshop, quindi esportare è un comando migliore del check-out in quanto non verificato (ma che è minore).

E --depth ARG non dovrebbe essere vuoto ma file per ottenere i file nella directory immediata. Quindi otterrai tutti i campi, non solo quello, ma vuoto non restituisce nulla dal repository.

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

o

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

Per quanto riguarda le altre risposte, cat ti permette di leggere il contenuto che è buono solo per il testo, non per le immagini di tutte le cose.


1
Il punto --depth emptyera che gli altri file non dovevano essere estratti e quindi è possibile ottenere solo un singolo file con svn up <source/file>. Con svn export, non è necessario farlo, basta specificare il file.
Kevin Vermeer,

@reemrevnivek - hai ragione. bene la domanda appena fatta per un singolo file, questo funziona senza il check-out dell'intero file della struttura di directory anche se è vuoto.
Vass

4

Lo sfogliavo ed esportavo il singolo file. Se si dispone dell'accesso HTTP, basta usare il browser Web per trovare il file e catturarlo.

Se è necessario ripristinarlo dopo averlo modificato, potrebbe essere leggermente più noioso, ma sono sicuro che potrebbe esserci una svn importfunzione ...


3

Fai qualcosa del genere:

mkdir <your directory>/repos/test

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

Fondamentalmente l'idea è quella di creare la directory in cui si desidera prendere il file da SVN. Utilizzare il svn catcomando e reindirizzare l'output sullo stesso file denominato. Per impostazione predefinita, il gatto scaricherà informazioni su stdio.


2

Se si desidera solo un file senza informazioni di revisione, utilizzare

svn export <URL>

2

Con Subversion 1.5, diventa possibile estrarre (tutti) i file di una directory senza estrarre alcuna sottodirectory (i vari flag --depth). Non proprio quello che hai chiesto, ma una forma di "meno di tutti".


2

Usando la tecnica di check sparse, PUOI estrarre un particolare file che è già stato estratto o esiste ... con un semplice trucco:

Dopo aver verificato il livello superiore del repository utilizzando l'opzione 'solo questo elemento', in Windows Explorer, DEVI prima fare clic con il pulsante destro del mouse sul file che devi aggiornare; scegli Repo Browser nel menu contestuale; trova di nuovo quel file nel browser del repository e fai clic con il tasto destro. Ora dovresti vedere "aggiorna l'elemento alla revisione" nel menu contestuale.

Non sono sicuro che si tratti di una funzione non documentata o semplicemente di un bug. Mi ci sono volute molte ore dopo il lavoro per trovare finalmente questo trucco. Sto usando TortoiseSVN 1.6.2.


2

Volevo fare il checkout di un singolo file in una directory, che non faceva parte di una copia funzionante.

Otteniamo il file al seguente URL: http: //subversion.repository.server/repository/module/directory/myfile

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

Quindi ho controllato la directory specificata contenente il file di destinazione che volevo raggiungere una directory fittizia, (diciamo etcb per l'URL che termina con /etc).

Quindi ho svuotato il file .svn / entry da tutti i file della directory di destinazione di cui non avevo bisogno, per lasciare solo il file che volevo. In questo file .svn / entry , hai un record per ogni file con i suoi attributi, quindi lascia solo il record relativo al file che vuoi ottenere e salvare.

Ora devi solo copiare '' .svn '' nella directory che sarà una nuova "copia funzionante". Quindi devi solo:

cp .svn /directory
cd /directory
svn update myfile

Ora la directory della directory è sotto il controllo della versione. Non dimenticare di rimuovere la directory directoryb che era solo una '' copia temporanea di lavoro ''.


Non è questo ciò che fa il checkout sparso? Non dovresti davvero hackerare manualmente i file nella directory .svn.
Lasse V. Karlsen,

Forse, ma ha risolto correttamente il problema. Suppongo che sia il modo in cui dovrebbe funzionare la gestione delle versioni, essendo anche able per gestire i file come estensione delle directory. Provalo e dimmi cosa non va nella logica. Suggerirei al team di sviluppo di sovversione di estendere l'utilità svn con questa funzione, risolverebbe i problemi di tutti i tipi che hanno risposto a questa discussione.
hendergassler,

2

Poiché nessuna delle altre risposte ha funzionato per me, l'ho fatto usando questo trucco:

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

Ciò creerà una nuova cartella locale che contiene solo i file dal percorso remoto. Quindi puoi fare un collegamento simbolico ai file che vuoi avere qui.


L'OP ha chiesto svn codi un file per evitare un'intera directory piena di file di immagini. Inoltre, l'aggiunta di un collegamento simbolico può solo aggiungere alla complessità, il passaggio da una directory temporanea potrebbe funzionare, ma è comunque necessario controllare l'intera directory di immagini per una sola immagine. @ steve-jessop ha avuto l'idea giusta
Chris Marotta,

2
@ChrisMarotta l'OP ha posto la domanda 9 anni fa. Nessuno qui sta rispondendo al PO. Questo è un argomento generale per questo tipo di problema e non ha più nulla a che fare con l'OP originale. Le persone vengono qui per trovare una soluzione al proprio problema. E quando lo leggeranno, alcuni di loro si troveranno nella mia situazione in cui questa era l'unica soluzione adeguata. Ecco perché l'ho pubblicato.
Lacho Tomov,

1
Sono felice per questa risposta, mi ha aiutato
Leos Literak,

1

Questo problema è coperto da:

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

È allegato uno script che consente di estrarre un singolo file da svn, apportare modifiche e ripristinare le modifiche nel repository, ma non è possibile eseguire "svn up" per estrarre il resto della directory. È stato testato con svn-1.3, 1.4 e 1.6.


1

Se vuoi solo esportare il file e non dovrai aggiornarlo in seguito, puoi farlo senza dover usare i comandi SVN.

Utilizzando TortoiseSVN Repository Browser , selezionare il file, fare clic con il pulsante destro del mouse, quindi selezionare " Copia URL negli Appunti ". Incolla l'URL nel tuo browser e dopo l'accesso dovresti ricevere il download del file.

In questo modo puoi anche selezionare la revisione desiderata e scaricare una versione precedente del file.

Nota che questo è valido se il tuo server SVN ha un'interfaccia web.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.