Rimuovi le proprietà svn: mergeinfo non necessarie


136

Quando unisco elementi nel mio repository Subversion vuole aggiungere / modificare molte svn:mergeinfoproprietà ai file che non sono assolutamente correlati alle cose che voglio unire.

Domande su questo comportamento sono state poste prima qui su StackTranslate.it:

Da quanto ho capito dagli argomenti sopra menzionati sembra che molti file nel mio repository abbiano svn:mergeinfoproprietà esplicite su di essi, quando non dovrebbero. Il consiglio è di ridurre la quantità e mettere queste proprietà solo su file / cartelle rilevanti.

Quindi ora la mia domanda: come posso rimuovere facilmente quelle proprietà non necessarie? Sto usando TortoiseSVN, ma sono riluttante a controllare / correggere manualmente centinaia di file. C'è un modo più semplice per rimuovere quelle svn:mergeinfoproprietà non necessarie ?

PS sto , non alla ricerca di C ++ SVN codice API.

Risposte:


142

Ecco un altro modo per eliminare tutte le sottostrutture svn: proprietà mergeinfo ma non nella cartella principale (questo è necessario per il corretto funzionamento delle ramificazioni).

Dalla radice del progetto fai:

svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"

57
Oppure, non farlo sulla directory principale "svn propdel -R svn: mergeinfo ./*"
JeremyWeir,

3
"svn propdel -R svn: mergeinfo ./* ./.[^.[*" se hai anche "dot" / * ix file nascosti, probabilmente non è un problema per un utente di Windows per la domanda.
Peter,

3
la soppressione dell'output lo accelera: "svn propdel svn: mergeinfo -R> nul" (o> / dev / null usando Linux)
bebbo

2
@JeremyWeir Cosa intendi con "semplicemente non farlo sulla directory principale"? Da allora? Hai molti voti positivi su quel commento, ma non vedo l'alternativa.
TT.

3
@TT. Penso che l'idea sia quella di andare alla directory che ha tutte le informazioni di unione incasinate e farlo da lì, quindi non è necessario ripristinare la directory principale. Non vuoi fare confusione con il mergeinfo della radice.
JeremyWeir,

15

Ecco un modo per eliminare tutte le proprietà sottotree svn: mergeinfo. Eseguilo nella radice del tuo repository:

svn propget svn:mergeinfo --depth=infinity 
    | grep -v "^/"
    | grep -v "^\."   
    | cut -d- -f1 
    | xargs svn propdel svn:mergeinfo

Tutto in una riga per una facile copia / incolla:

svn propget svn:mergeinfo --depth=infinity | grep -v "^/" | grep -v "^\." | cut -d- -f1 | xargs svn propdel svn:mergeinfo

Per vedere in anteprima quali file avranno effetto prima di eseguirlo, cambia l'ultimo "propdel" in "propget" o rimuovi del tutto l'ultimo pipe di xargs.


2
Funziona con trattini nei file: svn propget -R svn: mergeinfo | grep -v "^ /" | grep -v "^ \." | taglia "-d" -f1 | xargs svn propdel svn: mergeinfo
Scoiattolo

12

Come menzionato in questa discussione :

  • La maggior parte di mergeinfo vuota ("vuoto") può essere causata da copie di lavoro su copie / spostamenti di copie di lavoro in cui l'elemento di origine non ha mergeinfo esplicito. L'uso di propdel può essere la soluzione a meno che non si stia utilizzando un SVN 1.6: dal 1.5.5 queste copie da WC a WC non creano più mergeinfo vuote sulla destinazione
  • un'operazione di ristrutturazione mossa svn (rinominare) precedente può anche propagare mergeinfo, invece di lasciarli nella directory principale
  • c'è un potenziale problema di memoria, monitorato dal caso 3393 che verrà risolto in una versione 1.6.2 imminente e trasferito nella versione 1.5

6

Poiché non sono sicuro della svn:merge-infocancellazione cieca delle proprietà, ho implementato uno strumento per analizzare la situazione corrente su una copia funzionante e rimuovere quante più revisioni di unione possibili dalle proprietà di informazioni di unione non root. Dopo ulteriori controlli e controlli umani, è possibile eseguire il commit delle modifiche sulla copia di lavoro.

Ecco qui: svn-clean-mergeinfo

Non esitare a segnalare qualsiasi problema relativo al suo utilizzo per migliorarlo.

Subversion 1.10 introduce un nuovo strumento dedicato a tale compito: svn-mergeinfo-normalizer


2
Questo strumento è ottimo per consolidare le proprietà di unione-informazioni, come i tipi che vengono creati con fusioni parziali della sottodirectory che possono creare molti meno di sviluppatori perfettamente coordinati in un grande team. Lo strumento sembra avere un problema con i file che non esistono in ogni ramo, ottengo le proprietà di merge-info rimanenti sui file che indicano le revisioni sui rami in cui il file non è mai esistito.
Davenpcj,

Sono d'accordo che non è perfetto ... ecco perché sono ancora necessari "controlli e verifiche umane". Nel tuo caso, se hai identificato revisioni non rilevanti nelle proprietà di unione-informazioni, puoi rimuovere queste revisioni o l'intera proprietà svn: merge-info su quei file prima di eseguire il commit. Si prega di utilizzare github per chiedere miglioramenti.
Yves Martin,

4

So che è passato un po 'di tempo, ma ho riscontrato un problema simile. Sto usando TortoiseSVN 1.6.7. È successo che la proprietà fosse alla radice della mia copia di lavoro. Quando ho visualizzato le proprietà sul root e ho cliccato su Rimuovi su svn: mergeinfo, mi ha chiesto se volevo rimuoverlo in modo ricorsivo. Questo mi ha sbarazzato di tutti i miei svn: mergeinfo cockups.


Ero nella stessa situazione. Ha funzionato per me. Grazie!
andrewd18

2

Se sei sicuro di voler rimuovere in massa le proprietà mergeinfo, puoi usare il seguente script BASH.

FILES=`svn status |grep "^ M      " |sed s/" M      "// |tr '\n', ' '`
svn revert $FILES

Ottiene un elenco di file modificati, lo filtra per modificare solo mergeinfo, rimuove tutto tranne il percorso del file effettivo, converte i percorsi uno per riga in un elenco delimitato da spazi e le chiamate ritornano in tale elenco.


2
Grazie, ma come avrai saputo da me menzionando TortoiseSVN Sono un utente Windows e non uso la shell Bash :-)
LeonZandman,

La stessa cosa dovrebbe essere possibile in DOS, anche se probabilmente non è così conciso.
Chase Seibert,

1
Questo non ripristina solo i file con mergeinfo modificato nella directory di lavoro corrente? In tal caso, non risolve il problema: il mergeinfo esplicito esistente. Per questo, avresti bisogno di propdel.
Dominic Scheirlinck,

2
Questo è abbastanza difettoso - hai un nome file con spazi bianchi nel suo nome? Con i personaggi glob nel suo nome? Cattive notizie in entrambi i casi. Il modo approvato / supportato per analizzare l'output dallo stato svn sta usando il --xmlflag e un parser XML; qualsiasi altra cosa può cambiare tra le versioni, poiché non è garantita la compatibilità in avanti sul formato di output testuale.
Charles Duffy,

2

Invece di cancellare ciecamente le proprietà di mergeinfo, è anche possibile completare le fusioni "mancanti".

Copiare la proprietà mergeinfo dalla cartella principale, quindi eseguire un'unione nella cartella figlio per il percorso relativo appropriato e lo stesso elenco di revisione esatto. (Puoi, ma non è necessario, elencare solo le differenze tra questo elenco e quello già presente nella cartella figlio.)

Normalmente questa unione dovrebbe finire solo modificando le proprietà di mergeinfo, non alcun file reale. (Se finisce per cambiare i file, una delle precedenti fusioni deve essere stata solo una fusione parziale, che potrebbe aver causato comunque problemi.)

In questo modo dovrebbe finire per eliminare la proprietà mergeinfo per te, una volta che hai ottenuto che entrambi corrispondano esattamente. Potrebbe anche essere necessario fare il contrario: unisci nella radice tutte le revisioni di unione presenti solo nella cartella figlio (di nuovo, puoi semplicemente incollare l'elenco completo e lasciare che SVN risolva la ricerca delle differenze per te).


1

Per apportare modifiche in una struttura di directory, ciò sarebbe (solo "trova" non DOS):

find . -path "*/.svn" -prune -or -exec svn propdel svn:mergeinfo '{}' \;

Eseguendo un client 1.6.12 connesso a un server 1.5, ho un problema simile; c'è una sottodirectory del progetto che ha bisogno di un proprio svn: mergeinfo, ma avere 121 tali voci (di cui 5 directory sotto ./var con "svn: ignore *") sembra un po 'fuori luogo. Pertanto, sarebbe bello avere uno script (ad esempio Python) in grado di rimuovere le informazioni di unione ovviamente superflue e raccontare altre differenze ...

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.