2011-10-04 10 views
21

Le varianti di questa domanda sono state poste prima, ma sembra che il problema di disturbare gli altri membri del team non sia stato menzionato. Nei post esistenti (vedere How to "unversion" a file in either svn and/or git) la risposta accettata è generalmente quella di eseguire svn rm FILE o svn rm --keep-local FILE e quindi impostare la proprietà svn:ignore se lo si desidera. Ho passato gli ultimi 20 minuti a giocare con questo (controllando un repository in due punti, eliminando un file da uno, quindi aggiornando l'altro, ecc.). Ecco cosa ho trovato (sto usando SVN 1.6.16):Come annullare la versione di un file in SVN con garbo (senza disturbare i membri del team)?

Prima di tutto, da quello che posso dire la flag --keep-local non influenza ciò che accade a tutti gli altri che stanno per aggiornare da il repository in seguito. A loro sembra la stessa come se si fosse appena fatto un regolare svn delete (nessuno della documentazione sovvertimento ho visto menziona esplicitamente - forse dovrebbe essere ovvio che si sta ancora facendo un'operazione svn delete e che "mantenere il locale" solo la volontà influenzare le cose sul lato locale, ma non era necessariamente ovvio per me).

Quindi ci sono due casi - 1. membro del team Un elimina un file che membro del team B non ha avuto modifiche locali o 2. Un membro del team elimina un file che membro del team B fatto hanno modifiche locali non impegnati in

.

In 1, dopo l'eliminazione, il file di B è stato cancellato. Ora deve recuperarlo da solo (ovvero svn merge -rHEAD:XXX FILE; svn revert FILE per riportare la versione XXX di FILE nella directory di lavoro e non essere reimpegnata al prossimo commit)

In 2, B vede un conflitto di alberi in fase di aggiornamento, e FILE ora ha lo stato A + C con il messaggio "modifica locale, eliminazione in arrivo su aggiornamento" sotto di esso. A questo punto, non sono esattamente sicuro di quale sia la soluzione consigliata. Quello che ho fatto è copiare FILE da qualche altra parte, giusto per essere sicuro, e quindi eseguire svn revert FILE. Non è più necessario perché FILE esiste ancora non controllato nella directory di lavoro con tutte le modifiche locali intatte. Ma non so quanto mi fido di questo, dato che ho avuto le mie modifiche senza commit cancellate da svn revert in altri scenari.

tl; dr: E 'davvero il caso che unico modo per non-versione di un file in SVN è quello di eliminarlo dalla directory di lavoro di tutti gli altri sulla squadra e farli recuperare se stessi? Sto usando --keep-local sbagliato, o manca un'altra opzione simile?

+0

Penso che il tuo flusso di lavoro potrebbe essere il problema, perché vuoi "unversion" un file? Per definizione, il tuo 'versione controllo sistema 'può solo tenere traccia delle versioni dei file che conosce. quando si rimuovono questi file dal repository, è solo logico ricorrere a rimuoverli anche dalle copie funzionanti. Hai un esempio di un altro VCS che ti permette di fare questo? – richo

+0

Che dire di un file di configurazione? (cioè il file .project di Eclipse). Tutto ciò di cui hanno bisogno tutti i membri del team, ma è leggermente diverso da una macchina all'altra. Quindi non dovrebbe essere nel controllo della versione, ma è arrivato lì accidentalmente. – danny

+0

Sarei 'svn mv'ing e passando un memo round in quel caso. – richo

risposta

9

è necessario aggiungere tutti i file che si desidera eliminare alla lista ignora (facile con TortoiseSVN -> uso eliminare e aggiungere l'opzione di ignorare lista) e impegnarsi quello.

Ora cancella.

Un'altra opzione è quella di fare uno svndumpfilter, come detto qui: How do I remove a file from svn versioning without deleting it from every working copy?

+4

hai effettivamente aggiunto la lista da ignorare e poi cancellato? ho provato e ha ancora cancellato i file. solo dopo averli copiati nella loro vecchia posizione manualmente, vengono visualizzati come file ignorati. se funziona davvero mi sembra di aver bisogno di una spiegazione più dettagliata. – peter

1

Una volta che un file si trova nella repository Subversion, non può mai essere completamente rimosso. Certo, puoi fare un svn rm e impegnarti a rimuovere il file dalla copia più recente di quel ramo, ma il file è ancora lì. Chiunque verifichi la revisione prima dell'eliminazione del file vedrà il file. E, puoi facilmente trovare il file cancellato eseguendo un svn log nell'albero delle directory.

Non c'è molto si può fare se accidentalmente aggiunto un file che contiene informazioni proprietarie (come login e password di un cliente) o è inadeguato, (abbiamo avuto uno sviluppatore verificare accidentalmente in una GIF che aveva nella sua area di lavoro che in seguito lo ha costretto a lasciare volontariamente la compagnia prima che diventasse un atto involontario.).

Le scelte sono come segue:

  • abbattere il repository, poi fare un svnadmin dump. Utilizzare svnfilter per collegare il dump a svnadmin load per creare una nuova versione del repository sans il file non amato.
  • Attendi Subversion 1.8 che promette di avere un comando svn obliterate. (In realtà, controllando la roadmap, non è più nella versione 1.8. Forse 1.9?).

La bandiera --keep-local solo mantiene una copia locale del file dopo un svn delete. L'impostazione predefinita è rimuovere il file localmente dal proprio spazio di lavoro su un svn delete.

+0

Forse la mia formulazione potrebbe essere stata più chiara - non mi interessa eliminare la prova di ciò, semplicemente non averlo nella revisione corrente e in quelle successive. Esempi interessanti e soluzione temporanea, però, +1 – danny

+0

@danny: Quindi, fare un 'svn delete' e' svn commit' dovrebbe farlo. Una volta eseguito il commit, non è più nel repository. '--keep-local' conserva semplicemente una copia del file nella directory di lavoro dopo averla cancellata. Cosa succede sulle copie di lavoro di altre persone? Quando eseguono un 'svn update', anche il file di eliminazione sparirà dalle loro copie di lavoro. Ci può essere un conflitto se non fanno un aggiornamento, modificano il file e provano a commetterlo. Tuttavia, è abbastanza semplice da risolvere. –

Problemi correlati