2008-10-15 23 views
34

Io non sono molto sicuro di come questo è accaduto, ma in qualche modo una gerarchia completamente vuoto di directory è finito nel mio repository:Rimuovere la directory vuota da CVS?

com/ 
com/companyname/ 
com/companyname/blah/ 
com/sun/ 
com/sun/java/ 
com/sun/java/jax_rpc_ri/ 

Penso che quello che è successo è che queste directory hanno avuto i file in esse, ma poi uno sviluppatore si è reso conto che non avrebbe dovuto controllarli in primo luogo poiché questi sono sottoprodotti del processo di costruzione, quindi ha rimosso i file ma in qualche modo le directory vuote sono rimaste nel repository come reliquie antiche.

Come posso rimuovere questo da CVS? Gli unici risultati che riesco a trovare su google dicono che non dovrebbe esserci la necessità di rimuovere le directory vuote dal momento che CVS non le manterrà in primo piano e che le opzioni -P (prune) a cvs update devono essere rimosse li dalla directory di lavoro - che è zero aiuto se in realtà hai directory vuote nel tuo repository.

A cvs remove e cvs commit non sembra prendersi cura di questa situazione:

$ cvs remove -Rf com 
cvs remove: Removing com 
cvs remove: Removing com/companyname 
cvs remove: Removing com/companyname/blah 
cvs remove: Removing com/sun 
cvs remove: Removing com/sun/java 
cvs remove: Removing com/sun/java/jax_rpc_ri 
$ cvs commit com 
cvs commit: Examining com 
cvs commit: Examining com/companyname 
cvs commit: Examining com/companyname/blah 
cvs commit: Examining com/sun 
cvs commit: Examining com/sun/java 
cvs commit: Examining com/sun/java/jax_rpc_ri 
$ ls -l com 
total 24 
drwxrwxr-x 2 matt matt 4096 Oct 15 14:38 CVS 
drwxrwxr-x 9 matt matt 4096 Oct 15 14:38 companyname 
drwxrwxr-x 4 matt matt 4096 Oct 15 14:38 sun 

E 'ancora lì!

SVN ha anche questo strano comportamento?

risposta

36

AFAIK il protocollo CVS non consente di rimuovere le directory. Dovresti andare alla console del server e rimuoverli dal repository fisico reale.


http://www.network-theory.co.uk/docs/cvsmanual/Removingdirectories.html

non si rimuove la directory stessa; non c'è modo di farlo.

+4

Avvertenza! È necessario andare al repository reale, fisico perché una volta che CVS perde una directory, non potrà mai più recuperarla. CVS memorizza i file che sono stati cancellati in cartelle speciali chiamate 'Attic'. Se cancelli il 'Attic', quei file sono persi per sempre. –

+1

Pensa sempre due volte prima di fare qualcosa di simile, ma non vedo alcun problema: 'ssh cvsserver:/cvsroot 'tar cvf com.tar com''; 'scp cvsserver: /cvsroot/com.tar .'; 'cvs add com.tar'; 'cvs ci com.tar'; 'cvs rm -f com.tar'; 'ssh cvsserver:/cvsroot 'rm -rf com.tar com'' – minopret

20

checkout CVS e aggiornamento controlleranno sempre le directory vuote; questo è solo il modo in cui è costruito CVS. Fare un aggiornamento con "-P" - "prugna" - per rimuovere directory vuote:

cvs update -dP 

(aggiunta di "-d" aggiornerà nuove directory che sono apparse dopo l'ultimo aggiornamento, in caso contrario, CVS ignorerà loro)

+4

Questo rimuove solo le directory vuote dalla copia di lavoro - Voglio rimuoverle dal repository. –

1

cvs tende a lavorare su un approccio a due fasi per quanto riguarda le directory, ecco perché esiste un'opzione -P per molti comandi cvs su "Elimina directory vuote".

Quando ciò si è verificato, ad es. voglio rinominare una directory che ho appena aggiunto, elimino la directory, cancelli la voce per la directory nel file CVS/Entries, sarà una riga preceduta da una "D".

Lavoro terminato.

Se ho eseguito il commit, mi assicuro che la mia area di lavoro corrente che contiene la/le directory/i vuote siano tutte archiviate. Quindi faccio saltare via la parte dell'area di lavoro a cui ho aggiunto le directory.

Per esempio, in

~/Sandbox/my_project/some_stuff_i_want 
~/Sandbox/my_project/empty_dir_1 
~/Sandbox/my_project/other_stuff_i_want 

I assicurarsi che tutto sia aggiornato in entrambe le directory che contengono la roba che voglio mantenere. Soffio via my_project dalla mia sandbox.

Quindi eliminare le directory vuote dal repository stesso.

Tornando indietro e verificando la stessa area di lavoro, ad es. my_project mi fornirà l'area di lavoro senza le directory vuote.

Oppure lasciare tutto come è e utilizzare l'opzione -P per ottenere CVS controllare tutto (o aggiornare tutto), quindi eliminare le directory vuote.

HTH

applausi,

Rob

+0

Grazie. Questo mi ha aiutato a eliminare i danni provocati da qualche idea al lavoro. – Tanktalus

4

CVS ha un certo numero di difetti di progettazione, non essendo in grado di sbarazzarsi di una directory, senza perdere la storia è uno. Difficoltà a rinominare file e directory senza perdere la cronologia è un altro.

Prendere in considerazione la laurea allo Subversion. cvs2svn fa un ottimo lavoro nella conversione di repository inclusi tutti i rami e tag. I set di comandi CVS e SVN sono molto simili e richiedono una regolazione minima. (E per evitare che diventi un "controllo di versione che dovresti usare") una volta che usi SVN puoi passare a qualsiasi numero di sistemi di controllo di versione più avanzati come git o SVK.

7

appena fatto

  1. rm -rvf/localCopy/progetto/emptyDirectory
  2. modificare/localCopy/progetto/CVS/Entries, eliminare la linea D/emptyDirectory ////, salvare il file
  3. rmdir -v/CVSROOT/project/emptyDirectory

per sbarazzarsi di emptyDirectory nel progetto. Ammettere non è legittimo confondere con i dati interni CVS, ma sembra aver funzionato (versione cvs 1.12.13).

4

Questo ha funzionato per me. Fondamentalmente Quando lo fai

rmdir -v/CVSROOT/project/emptyDirectory # Stiamo cancellando la directory dalla directory del repository CVS.

Se si dispone dell'accesso di accesso al server di repository unix, è possibile spostarsi sul percorso e cancellare la directory o sollevare lo stesso problema con il team unix.

1

Non è possibile eliminare la directory dal proprio spazio di lavoro, è necessario eliminarla dal server su cui è conservato il repository effettivo. ma puoi cancellare i file dalla directory con il comando cvs remove.

Problemi correlati