Cosa devo fare quando 'svn cleanup' fallisce?


245

Ho molte modifiche in una cartella funzionante e qualcosa ha rovinato il tentativo di fare un aggiornamento.

Ora quando emetto un 'svn cleanup' ottengo:

>svn cleanup .
svn: In directory '.'
svn: Error processing command 'modify-wcprop' in '.'
svn: 'MemPoolTests.cpp' is not under version control

MemPoolTests.cpp è un nuovo file aggiunto da un altro sviluppatore ed è stato rimosso dall'aggiornamento. Non esisteva prima nella mia cartella di lavoro.

C'è qualcosa che posso fare per provare ad andare avanti senza dover fare il checkout di una nuova copia del repository?

Chiarimento: grazie per i suggerimenti su come spostare la directory e toglierne una nuova copia. So che è un'opzione, ma è una che vorrei evitare poiché ci sono molti cambiamenti che hanno annidato diverse directory in profondità (questo avrebbe dovuto essere un ramo ...)

Spero in un modo più aggressivo di fare la pulizia, forse in qualche modo forzare il file SVN sta avendo problemi a tornare in uno stato noto (e ho provato a cancellare la copia funzionante di esso ... che non ha aiutato).


Ri: Utilizzo di una nuova copia. Prendi una copia di oltre per confrontare le versioni l'una contro l'altra
Jon Winstanley,

2
La soluzione di Amin non ha funzionato per te? Sicuramente una risposta ovvia per accettare il contrario?
Alice Purcell,

2
Assicurati che i file non siano aperti da un'applicazione, è facile dimenticarli. Process Explorer e una rapida ricerca sul percorso sono molto utili per scoprire questo: technet.microsoft.com/en-us/sysinternals/bb896653.aspx
angularsen il

4
IMHO l'esistenza del comando "svn cleanup" è un'ammissione di fallimento.
yoyo

Risposte:


223

Quando ricominciare da capo non è un'opzione ...

Ho cancellato il file di registro nella .svndirectory (ho anche eliminato il file offensivo in .svn/props-base), ho fatto una pulizia e ho ripreso il mio aggiornamento.


3
Stavo riscontrando un problema simile alla domanda originale qui (a causa di un checkout svn interrotto). Questo mi ha risolto. Anche se dovevo anche andare alla directory principale e fare lo stesso lì.
Nigel Hawkins,

2
+1 Non posso dirti quante volte sono stato in questa situazione. Quando si tratta di una sottocartella, nessun problema, basta eliminare l'intera cartella, ripulirla e aggiornarla. Ma quando si tratta di un file a livello di root, questa non è un'opzione economica (diverse ore per ricontrollare l'intero progetto). Suggerimento fantastico - molte grazie.
Ewan Makepeace,

9
Per me lo ha fatto l'eliminazione dei file di blocco. Forse di interesse per qualcuno. Puoi eliminarli in modo ricorsivo con il seguente comando: rm -rffind . -type f -name lock
H6.

1
Il comando di happy-coding non funziona. Questo fa:sudo rm -rf | find . -type f -name lock
Zachary Schuessler

2
Non sono riuscito a trovare .svn/prop-base che ho.svn/[pristine|tmp|entries|format|wc.db]
bigpony

112

Le cose sono cambiate con SVN 1.7 e la popolare soluzione di eliminare il file di registro nella directory .svn non è possibile con il passaggio a un'implementazione della copia di lavoro del database.

Ecco cosa ho fatto che sembrava funzionare:

  1. Elimina la directory .svn per la tua copia di lavoro.
  2. Avvia un nuovo checkout in una nuova directory temporanea.
  3. Annulla il checkout (non vogliamo aspettare che tutto venga rimosso).
  4. Esegui una pulizia su questo checkout annullato.
  5. Ora abbiamo una nuova directory .svn con un database pulito (anche se nessun / pochi file)
  6. Copia questo .svn nella tua vecchia directory di lavoro danneggiata.
  7. Esegui svn update e dovrebbe velocizzare la tua nuova directory parziale .svn con la tua vecchia directory di lavoro.

È tutto un po 'confuso, saggio. In sostanza, ciò che stiamo facendo è eliminare il file .svn corrotto, quindi creare un nuovo .svn per lo stesso percorso di pagamento. Quindi spostiamo questo nuovo .svn nella nostra vecchia directory di lavoro e lo aggiorniamo al repository.

Ho appena fatto questo in TSVN e sembra funzionare bene e non richiede un checkout completo e il download.

-Jody


8
Mi sembra di farlo almeno due volte al mese. Che dolore. Il team svn dovrebbe aggiungere questi passaggi svn cleanup --force. E, naturalmente, tutte le operazioni di aggiunta, eliminazione e (con 1.8) rinomina vanno perse.
Martin,

2
@Adgezaza Sì. Sì lo fa.
mjs

1
questo risolve il problema per me. È un po 'diverso: dopo aver cambiato svn, l'aggiornamento non riesce per 1 cartella specifica. Elimina quella cartella e tutto va bene
Hoàng Long

@Pup, dovrebbe. Fondamentalmente stai solo tirando giù i metadati per un nuovo checkout e poi popolandoli con i file. SVN determinerà se i file corrispondono o meno ai metadati. Ma, sai, comprimi tutto prima nel caso ...
JKoplo,

1
Ho reinstallato SVN (Tortoise SVN 1.8), ho rimosso tutte le cartelle svn dal mio progetto, quindi ho eseguito le operazioni menzionate qui e voilà! Grazie all'autore!
Dmitry,

110

Date un'occhiata al

http://www.anujvarma.com/svn-cleanup-failedprevious-operation-has-not-finished-run-cleanup-if-it-was-interrupted/

Riepilogo della correzione dal link sopra (Grazie a Anuj Varma)

  1. Installa la shell della riga di comando sqlite (sqlite-tools-win32) da http://www.sqlite.org/download.html

  2. sqlite3 .svn/wc.db "select * from work_queue"

SELECT dovrebbe mostrarti la tua cartella / file offensivo come parte della coda di lavoro. Quello che devi fare è eliminare questo elemento dalla coda di lavoro.

  1. sqlite3 .svn/wc.db "delete from work_queue"

Questo è tutto. Ora puoi eseguire nuovamente la pulizia e dovrebbe funzionare. Oppure puoi procedere direttamente con l'attività che stavi facendo prima che ti venga richiesto di eseguire la pulizia (aggiungendo un nuovo file ecc.)


Si noti che le risposte solo al collegamento sono sconsigliate, le risposte SO dovrebbero essere il punto finale di una ricerca di una soluzione (rispetto a un altro scalo di riferimento, che tende a diventare stantio nel tempo). Si prega di considerare l'aggiunta di una sinossi stand-alone qui, mantenendo il collegamento come riferimento.
Kleopatra,

8
Firefox ha l' estensione sqlite manager che può aprire e modificare il file .svn / wc.db. Fornisce una comoda GUI per eseguire operazioni equivalenti su work_queue.
Magicianeer,

Se hai una versione recente di SVN e Firefox, l'addon sqlite manager risolve questo problema in 30 secondi. Non preoccuparti di eliminare le directory o di utilizzare il Repobrowser. Nel 2016 penso che questa dovrebbe essere la risposta accettata
arbit

5
Per me eseguendo "elimina da WC_LOCK;" è richiesto anche.
Tristan.Liu,

Funziona perfettamente! Svn fa schifo! Ma dopo aver eliminato da work_queue svn dammi un altro errore "svn bloccato", corri solo con la tartaruga (eclissi non ha l'opzione) ripulisci con "rompi i blocchi" selezionato
amdev

42

Se tutti gli altri falliscono:

  1. Guarda in una nuova cartella.
  2. Copia i tuoi file modificati sopra.
  3. Torna indietro.
  4. Comprimi da qualche parte la vecchia cartella (non sai mai + la paranoia è buona) prima di cancellarla e usare quella nuova.

27

L'ultima versione (sto usando 1.9.5) risolve questo problema aggiungendo un'opzione di "Blocca blocchi" nel menu di pulizia. Assicurati solo che questa casella di controllo sia selezionata durante la pulizia.

finestra eclean up


Sembra così ovvio ora! Grazie
Billy Jake O'Connor il

Ha funzionato come un fascino!
Viswanath,

Funziona bene per me.
Sergey,

Lavorato! Quando ho visto questa soluzione ho subito capito quale fosse il problema ... (credo): avevo ancora un Excel aperto, che lo modifica. Volevo eseguire il commit delle mie modifiche su alcuni file Java e ho visto il file Excel ed era come "Non ho cambiato nulla lì ... Ripristina". Il che non ha funzionato, poi ho capito che era ancora aperto, chiuso, F5, non compariva più in commit, quindi procedi al commit. E poi mi dice "pls run cleanup" e da lì in poi sono rimasto bloccato. Quindi grazie! :)
BAERUS,

16

Questa risposta si applica solo alle versioni precedenti alla 1.7 (grazie @ ŁukaszBachman) .

Subversion memorizza le sue informazioni per cartella (in .svn), quindi se hai a che fare con una sottocartella non hai bisogno di controllare l'intero repository - solo la cartella che ha funzionato:

cd dir_above_borked
mv borked_dir borked_dir.bak
svn update borked_dir

Questo ti darà una buona copia funzionante della cartella borked, ma avrai comunque il backup delle tue modifiche in borked_dir.bak. Lo stesso principio si applica a Windows / TortoiseSVN.

Se hai delle modifiche in una cartella isolata, dai un'occhiata a

svn checkout -N borked_dir   # Non-recursive, but deprecated

o

svn checkout --depth=files borked_dir
# 'depth' is new territory to me, but do 'svn help checkout'

risparmiato un sacco di tempo usando il tuo suggerimento "se hai a che fare con una sottocartella non hai bisogno di controllare l'intero repository"
iBabur,

Questo ha funzionato per me - tutto quello che ho fatto è stato svn uplo stesso repository che si trovava nel mezzo di una svn upscheda diversa - Ho dimenticato di averlo fatto e l'ho lasciato incompleto la sera prima.
Jon z,

Non è più vero: con l'ultima versione SVN ora utilizza solo una .svndirectory.
ŁukaszBachman,

9
$ ls -la .svn
$ rm -f .svn/lock

Poi

$ svn update

Spero che sia d'aiuto


6

Ho avuto lo stesso identico problema. Non potevo impegnarmi e la pulizia fallirebbe.

Utilizzando un client da riga di comando sono stato in grado di visualizzare un messaggio di errore che indicava che non riusciva a spostare un file da .svn/propsa.svn/prop-base .

Ho esaminato il file specifico e ho scoperto che era contrassegnato come di sola lettura. Dopo aver rimosso l'attributo di sola lettura sono stato in grado di ripulire la cartella e confermare le mie modifiche.


Ho rinunciato a quell'albero e ne ho ottenuto uno nuovo alla fine. Ma grazie per il suggerimento su qualcosa da controllare la prossima volta.
Rob Walker,

ah ... ho anche rinominato le cartelle nell'area .svn \ pristine da {name} a {name} _old e poi di nuovo al {name} originale e ha funzionato
beauXjames

5

È possibile che tu abbia un problema con due nomi di file che differiscono solo per le maiuscole. Se si è verificato questo problema, la creazione di un'altra directory di copia funzionante non risolve il problema.

I filesystem di Windows attuali (cioè scadenti) semplicemente non colgono la differenza tra Filenamee FILEname. Hai due possibili correzioni:

  1. Dai un'occhiata alla piattaforma con un vero filesystem (basato su Unix), rinomina il file e apporta le modifiche.
  2. Quando si è immagazzinati in Windows, è possibile rinominare i file nel browser del repository SVN di Eclipse che riconosce la differenza e rinomina il file lì.
  3. È possibile rinominare i file problematici anche in remoto da qualsiasi client SVN della riga di comando utilizzando svn rename -m "broken filename case" http://server/repo/FILEname http://server/repo/filename

Questo si è rivelato essere il mio problema; un collega era riuscito in qualche modo a controllare diversi file di progetto Xcode, ognuno con due copie diverse solo in lettere maiuscole. Ho usato TortoiseSVN per sfogliare il repository ed eliminare i file extra. Quindi ho eliminato le mie cartelle locali contenenti i file duplicati e l'aggiornamento svn alla fine è riuscito.
kgriffs,

Non solo un problema di Windows. Questo riguarda anche i Mac. I filesystem HFS + per Mac, per impostazione predefinita, fanno anche distinzione tra maiuscole e minuscole, ma conservano i nomi dei file. Ho installato una seconda partizione sul mio disco rigido che fa nomi di file con distinzione tra maiuscole e minuscole per ovviare a questi problemi.
David W.

4

Esegui il svn cleanupcomando in un terminale (se fallisce da Eclipse che era il mio caso):

~/path/to/svn-folder/$ svn cleanup

Ho provato diverse soluzioni spiegate qui, ma nessuna ha funzionato .

Team di azione → L' aggiornamento alla testa non riesce:

svn: E155004: Ci sono elementi di lavoro incompiuti in '/ home / user / path / to / svn-folder'; eseguire prima "svn cleanup".

Team di azione → Pulizia non con lo stesso errore.

Soluzione che ha funzionato per me: esegui il comando svn cleanup in un terminale .

Il comando è riuscito.

Quindi il TeamAggiorna in Eclipse ha funzionato di nuovo.

Nota: la mia versione SVN è 1.9.3.

Controlla anche la risposta di Chris se svn cleanupnon funziona.


3

Ho provato a fare svn cleanuptramite la console e ho ricevuto un errore del tipo:

svn: E720002: Can't open file '..\.svn\pristine\40\40d53d69871f4ff622a3fbb939b6a79932dc7cd4.svn-base':
The system cannot find the file specified.

Quindi ho creato questo file manualmente (vuoto) e l'ho fatto di svn cleanupnuovo. Questa volta è stato fatto bene.


3

Ho avuto lo stesso problema. Per me la causa è stata un conflitto con EasySVN e (TortoiseSVN o solo SVN). Ho avuto l'aggiornamento automatico e il commit con EasySVN (che non funzionava).

Quando l'ho disattivato, non sono stato in grado di pulire, eseguire il commit o aggiornare. Nessuna delle soluzioni precedenti ha funzionato, ma il riavvio ha funzionato :)


Yaaaaay jimi, sei il mio eroe (dentro).
TRoa,

2

Ho avuto questo stesso problema su Windows 7 a 64 bit. Ho eseguito la console come amministratore e ho eliminato la directory .svn dalla directory problematica (ho riscontrato un errore sui log o qualcosa del genere, ma l'ho ignorata). Quindi, in Explorer, ho eliminato la directory del problema che non veniva più visualizzata sotto il controllo della versione. Quindi, ho eseguito un aggiornamento e le cose sono andate come previsto.


2

Se il problema è la distinzione tra maiuscole e minuscole (che può essere un problema quando si esegue il checkout su un Mac e su Windows) e non si ha la possibilità di effettuare il checkout su un sistema * nix, dovrebbe funzionare quanto segue. Ecco il processo dall'inizio:

% svn co http://[domain]/svn/mortgages mortgages

(Il checkout segue ... quindi ...)

svn: In directory 'mortgages/trunk/images/rates'
svn: Can't open file 'mortgages/trunk/images/rates/.svn/tmp/text-base/Header_3_nobookmark.gif.svn-base': No such file or directory

Qui SVN sta provando a controllare due file con nomi simili che differiscono solo per caso - Header_3_noBookmark.gife Header_3_nobookmark.gif. I filesystem Mac di default non fanno distinzione tra maiuscole e minuscole in un modo che fa soffocare SVN in situazioni come questa. Così...

% cd mortgages/trunk/images/rates/
% svn up
svn: Working copy '.' locked
svn: run 'svn cleanup' to remove locks (type 'svn help cleanup' for details)

Tuttavia, la corsa svn cleanupnon funziona, come sappiamo.

% svn cleanup
svn: In directory '.'
svn: Error processing command 'modify-wcprop' in '.'
svn: 'spacer.gif' is not under version control

spacer.gifnon è il problema qui ... Non può semplicemente passare oltre l'errore precedente al file successivo. Quindi ho eliminato tutti i file dalla directory diversa da .svne ho rimosso il registro SVN. Questo ha fatto funzionare la pulizia, in modo che potessi controllare e rinominare il file offensivo.

% rm *; rm -rf .svn/log; svn cleanup
% svn up Header_3_nobookmark.gif
A    Header_3_nobookmark.gif
Updated to revision 1087.
% svn mv Header_3_nobookmark.gif foo
A         foo
D         Header_3_nobookmark.gif
% svn up
A    spacer.gif
A    Header_3_noBookmark.gif

In seguito, sono stato in grado di tornare alla directory principale del progetto ed eseguire svn upper controllare il resto.


2

Ogni volta che ho problemi simili uso rsync (NB: utilizzo Linux o Mac OS X) per dare una mano in questo modo:

# Go to the parent directory
cd dir_above_borked

# Rename corrupted directory
mv borked_dir borked_dir.bak

# Checkout a fresh copy
svn checkout svn://... borked_dir

# Copy the modified files to the fresh checkout
# - test rsync
#   (possibly use -c to verify all content and show only actually changed files)
rsync -nav --exclude=.svn borked_dir.bak/ borked_dir/

# - If all ok, run rsync for real
#   (possibly using -c again, possibly not using -v)
rsync -av --exclude=.svn borked_dir.bak/ borked_dir/

In questo modo hai un nuovo checkout, ma con gli stessi file di lavoro. Per me funziona sempre come un fascino.


2

L'ho incontrato troppo ultimamente. Il trucco per me è stato dopo aver selezionato "Pulisci", nella finestra di dialogo delle opzioni popup, selezionare "Blocca blocchi", quindi "OK". Ha ripulito con successo per me.


1
SVN non ha una finestra popup di per sé; forse stai usando Tortoise. L'OP sta utilizzando il client della riga di comando, quindi il tuo consiglio non è molto utile.
Robert,

1

Subclipse viene confuso dal comportamento di blocco veramente diabolico di Windows. Unlocker è tuo amico. Questo può trovare file bloccati e rilasciare forzatamente i blocchi.


1

(Prima di provare a spostare le cartelle e fare un nuovo checkout.)

Elimina la cartella in cui si trovano i file offensivi: sì, anche la .svncartella, quindi esegui una operazione svn cleanupnella cartella principale / principale.


1

Ho affrontato lo stesso problema. Dopo alcune ricerche su Internet ho trovato l' articolo qui sotto . Quindi mi sono reso conto che ero registrato come un utente diverso dall'utente che avevo usato per impostare SVN in, un problema di autorizzazione fondamentalmente.


1

Quando incontro questo problema con TortoiseSVN (Windows), vado su Cygwin ed eseguo ' svn cleanup ' da lì; pulisce correttamente per me, dopo di che tutto funziona da TortoiseSVN.


Questo funziona anche con una finestra cmd. Non so perché funzioni quando Tortoise fallisce, ma a volte lo fa.
Watusimoto,

0

Le risposte qui non mi hanno aiutato, ma prima di ricontrollare il progetto, ho chiuso e aperto Eclipse (Subversive è il mio client SVN) e il problema è scomparso.


0

Potrebbe non essere applicabile in tutte le situazioni, ma quando ho riscontrato di recente questo problema la mia "correzione" era aggiornare il pacchetto Subversion sul mio sistema. Avevo eseguito 1.4.qualcosa e quando ho eseguito l'aggiornamento alla versione più recente (1.6.6 nel mio caso) il checkout ha funzionato.

(Ho provato a scaricarlo di nuovo, ma un checkout in una directory pulita si è sempre bloccato nello stesso punto.)


0

Il blocco in sola lettura a volte si verifica su unità di rete con Windows. Prova a disconnetterti e riconnetterlo di nuovo. Quindi ripulire e aggiornare.


0

Dopo aver esaminato la maggior parte delle soluzioni citate qui, continuavo a ricevere l'errore.

Il problema era OS X senza distinzione tra maiuscole e minuscole . Il check-out di una directory con due file con lo stesso nome, ma l'utilizzo di maiuscole / minuscole diverse causa un problema. Ad esempio, ApproximationTest.java e Approximationtest.java non devono trovarsi nella stessa directory. Non appena ci liberiamo di uno dei file, il problema scompare.


0

Ho riscontrato un problema in cui in seguito a un aggiornamento, SVN ha mostrato una cartella in conflitto. Stranamente, questo era visibile solo attraverso la riga di comando - TortoiseSVN pensava che andasse tutto bene.

#>svn st
!       my_dir
!       my_dir\sub_dir

svn cleanup, svn revert, svn updateE svn resolveerano tutti senza successo al fixing questo.

Alla fine ho risolto il problema come segue:

  • Cerca nella directory .svn "sub_dir"
  • Usa RC -> Proprietà per deselezionare il flag 'sola lettura' sul file delle voci
  • Apri il file delle voci ed elimina la riga "incompiuta ..." e il checksum corrispondente
  • Salvare e riattivare il flag di sola lettura
  • Ripetere l'operazione per la directory my_dir

Successivamente, tutto andava bene.

Nota che non ho apportato modifiche locali, quindi non so se saresti a rischio se lo facessi. Non ho usato il metodo di eliminazione / aggiornamento suggerito da altri - sono entrato in questo stato provandolo nella directory my_dir / sub_dir / sub_sub_dir (che ha iniziato con gli stessi sintomi) - quindi non volevo rischiare di peggiorare le cose ancora!

Non abbastanza in tema, ma forse utile se qualcuno si imbatte in questo post come ho fatto io.


0

No no no! Se stai usando SVN 1.7 o versioni successive, il comando cleanup dovrebbe fare il lavoro!

Ho anche fatto alcuni esperimenti e ho scoperto che la soluzione (almeno in Eclipse ) stava eseguendo la pulizia solo per la cartella specificata nel messaggio di errore e non per l'intero progetto!


Questo ha funzionato per me oggi, quindi vado a +1. D'altra parte, un'altra volta che sono entrato in un ciclo era esattamente l'opposto: stavo facendo clic con il tasto destro su una cartella e scegliendo "cleanup" quando invece dovevo fare clic con il tasto destro su uno spazio vuoto. Quindi dipende molto dalla situazione specifica.
Daphne B,

downvote perché la risposta a "come posso risolvere le cose quando svn cleanup fallisce" non è "dovrebbe funzionare"
mjs

0

Ho fatto sudo chmod 777 -R .per poter cambiare i permessi. Senza sudo, non funzionerebbe, dandomi lo stesso errore dell'esecuzione di altri comandi.

Ora puoi fare svn updatequalsiasi cosa, senza dover eliminare l'intera directory e ricrearla. Ciò è particolarmente utile, poiché l'IDE o l'editor di testo potrebbero già avere alcune schede aperte o avere problemi di sincronizzazione. Non è necessario eliminare e sostituire la directory di lavoro con questo metodo.


0

Ho risolto questo problema copiando la directory .svn di alcuni colleghi nella mia e quindi aggiornando la mia copia di lavoro. È stata una soluzione piacevole, veloce e pulita.


0

Ci sono alcuni ottimi suggerimenti nella risposta precedente, ma se si riscontra un problema con TortoiseSVN su Windows (un buon prodotto, ma ...) si ricorre sempre alla riga di comando e si esegue prima un semplice "svn cleanup".

In molte circostanze il client Windows non eseguirà il comando cleanup, ma cleanup funziona bene usando l'utilità della riga di comando SVN.


0

Pur affrontando un problema simile, l'unione manuale nella vista di sincronizzazione del repository ha aiutato a risolvere il problema.

Il nome di un file era in conflitto con l'altro e indicava chiaramente il problema. La ridenominazione del file più recente con un nome diverso lo ha risolto.

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.