Domanda

Ho giocato un po' con CVS e non ho molta familiarità con tutte le sue capacità, ma per me è un grosso fastidio cercare di aggiungere nuove directory che ne contengono di più.Corsa "cvs add" aggiunge solo il contenuto della directory corrente e utilizzando "cvs import" non sembrava nemmeno la cosa giusta dal momento che è ancora tutto codice che sto producendo (questo howto dichiarato import è per Fonti di terze parti)

Ragazzi, conoscete un modo per aggiungere ricorsivamente tutto in una determinata directory all'attuale progetto CVS (o se SVN o git lo rendono notevolmente più semplice)?

È stato utile?

Soluzione

Ah, spazi.Funzionerà con gli spazi:

find . -type f -print0| xargs -0 cvs add

Altri suggerimenti

Ho scoperto che funzionava in modo abbastanza efficace:

Innanzitutto, aggiungi tutte le directory, ma non quelle denominate "CVS":

find . -type d \! -name CVS -exec cvs add '{}' \;

Quindi aggiungi tutti i file, escludendo qualsiasi cosa in una directory CVS:

find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

Ora, se qualcuno ha una cura per l'imbarazzo nell'usare CVS al giorno d'oggi...

Io uso questo:

Per prima cosa aggiungi ricorsivamente tutte le directory meno quelle CVS:

$> find . -type d \! -name CVS -exec cvs add '{}' \;

Secondo aggiungi tutti i file, meno le directory CVS:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs add '{}' \; \)

Terzo, esegui il "commit" in modo ricorsivo come il commento della "prima versione":

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs commit -m "first version" '{}' \; \)

Ultimo tagging tutto in modo ricorsivo:

 find . \( -type d -name CVS -prune \) -o \( -type f -exec cvs tag -F MY_CVS_TAG '{}' \; \)

Per prima cosa aggiungi tutte le directory al CVS

find . -type d -print0| xargs -0 cvs add

Quindi aggiungi tutti i file nelle directory a CVS

find . -type f | grep -v CVS | xargs cvs add

Ha funzionato per me

cvs import non è solo per fonti di terze parti.Infatti, le directory non sono versionate da CVS, quindi non sono soggette alle politiche della filiale.Finché importi directory vuote, va bene.

Tieni presente che puoi utilizzare solo cvs add su file e cartelle che si trovano all'interno di una copia di lavoro già estratta, altrimenti otterrai il file "Impossibile aprire CVS/voci per la lettura" Messaggio.Una tecnica per creare un nuovo "modulo root" utilizzando cvs add è spiegato in questo articolo FAQ di WinCVS: http://cvsgui.sourceforge.net/newfaq.htm#add_rootmodule

Se utilizzi Windows, sia TortoiseCVS che WinCVS supportano l'aggiunta ricorsiva (e il commit opzionale) di più file in un'unica operazione.In WinCvs cercare la macro Aggiungi>Aggiungi ricorsivo (commit automatico)...In Tortoise usa il comando Aggiungi contenuto su una directory.Entrambi ti permetteranno di selezionare quali file aggiungere e quali modalità di espansione delle parole chiave utilizzare per essi (utilizzate principalmente per definire quali file sono binari).

Per ulteriori informazioni sull'aggiunta ricorsiva in WinCvs guarda qui: http://cvsgui.sourceforge.net/newfaq.htm#cvs-add_recursive


A parte quello cvs import è particolarmente adatto per aggiunte di massa.Tuttavia, il modo cvs import è implementato nel CVS vanilla presenta due inconvenienti (perché era originariamente scritto per codice di terze parti):

  • crea un ramo obbligatorio con semantica speciale.
  • non crea i metadati del repository (ad es.le directory CVS nascoste) necessarie per stabilire il codice importato come una copia di lavoro sottoposta a check-out, il che significa che per poter lavorare effettivamente con i file importati devi prima check-out dal repository

Se stai usando CVSNT puoi evitare entrambi gli inconvenienti specificando il file -nC opzione all'importazione. -n serve per evitare il ramo "venditore" e -C serve per creare le directory CVS.

Questa risposta di Mark è stata utile (trova .-Type F -print0 | Xargs -0 cvs aggiungi) ma ho risolto alcuni problemi che si sono verificati quando i CV aggiungono prova ad aggiungere i suoi file come tag, voci, ect ..

  1. Aggiungi la cartella di livello più alto denominata NEW_FOLDER
cvs add NEW_FOLDER
  1. Utilizzare il comando precedente con qualche esclusione per aggiungere l'albero di tutte le sottocartelle

trova NEW_FOLDER/ -digita d !-nome "CVS" -e !-nome "Tag" -e !-nome "Entries.Log" -e !-nome "Voci" -e !-nome "Repository" -e !-name "root" -print0 | Xargs -0 cvs Aggiungi

  1. Utilizza il comando precedente con qualche esclusione per aggiungere tutti i file

trova NEW_FOLDER/ -digita f !-nome "CVS" -e !-nome "Tag" -e !-nome "Entries.Log" -e !-nome "Voci" -e !-nome "Repository" -e !-name "root" -print0 | Xargs -0 cvs Aggiungi

Penso che questo sia quello che ho fatto ai tempi del CVS:

find . -type f | xargs cvs add

Per prima cosa aggiungi tutte le directory al CVS

find . -type d -print0| xargs -0 cvs add

Quindi aggiungi tutti i file nelle directory a CVS

find . -type f -print0| xargs -0 cvs add

Sto utilizzando questo semplice script di shell, che dovrebbe essere avviato da una directory CVS già verificata.Cercherà stupidamente di aggiungere/impegnare tutti i file e le directory che trova durante la sua ricerca ricorsiva, quindi alla fine dovresti ritrovarti con un albero di commit completo.

Salva semplicemente questo come qualcosa di simile /usr/bin/cvsadd e non dimenticare di farlo chmod +x /usr/bin/cvsadd.

#!/bin/sh
# @(#) add files and directories recursively to the current CVS directory
# (c) 2009 by Dirk Jagdmann 

if [ -z "$1" ] ; then
    echo "usage: cvsadd 'import message'"
    exit 1
fi

if [ -d "$2" ] ; then
    cvs add "$2"
    cd "$2" || exit 1
fi

if [ ! -d CVS ] ; then
    echo "current directory needs to contain a CVS/ directory"
    exit 1
fi

XARGS="xargs -0 -r -t -L 1"

# first add all files in current directory
find . -maxdepth 1 -type f -print0 | $XARGS cvs add
find . -maxdepth 1 -type f -print0 | $XARGS cvs ci -m "$1"

# then add all directories
find . -maxdepth 1 -type d -not -name CVS -a -not -name . -print0 | $XARGS "$0" "$1"

I metodi già discussi faranno una ricerca ricorsiva, ma fallirà se esegui di nuovo la stessa azione (se si desidera aggiungere la sottostruttura all'albero esistente) per questo motivo devi verificare che le tue directory non siano state ancora aggiunte e quindi aggiungi solo file che non aggiunto ancora.Per fare ciò utilizziamo output of cvs up per vedere quali elementi non sono stati ancora aggiunti: avrà un punto interrogativo all'inizio della riga.

Usiamo le opzioni -0, -print0 E -zZ per essere sicuri di elaborare correttamente gli spazi nei nomi dei file.Usiamo anche --no-run-if-empty per evitare di eseguire se non è necessario aggiungere nulla.

CVS_PATTERN=/tmp/cvs_pattern
cvs -z3 -q up | egrep '^\?.*' | sed -e 's/^? //' > $CVS_PATTERN
find . -type d \! -name CVS -print0 | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
find . \( -type d  -name CVS -prune \) -o \( -type f  -print0 \) | grep -zZf $CVS_PATTERN | xargs -0 --no-run-if-empty cvs add
cvs commit -m 'commiting tree recursively'

Con questo approccio eviteremo tali errori:

cvs add: cannot add special file `.'; skipping
cvs [add aborted]: there is a version in ./dirname1 already

E

cvs add: `./dirname2/filename' already exists, with version number 1.1.1.1

mi piace fare (poiché la directory necessita di un'aggiunta a)

cvs status 2>/dev/null | awk '{if ($1=="?")system("cvs add "$2)}'

potrebbe essere necessario eseguirlo più volte (prima per le directory e poi per i suoi figli) finché non viene visualizzato alcun output

La soluzione di Marco risolve il problema degli spazi, ma produce questo problema:

cv aggiungi:Impossibile aprire CV/voci per la lettura:Nessun file o directory con questo nome
CVS [Aggiungi abortito]:nessun deposito

Per risolverlo, il comando effettivo da utilizzare è:

find . -type f -exec cvs add {} \;

SVN rende sicuramente questo compito banale, tuttavia utilizzare una GUI come Tortoise è ancora più semplice.

Questo potrebbe essere un buon punto di partenza: http://www-mrsrl.stanford.edu/~brian/cvstutorial/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top