2009-06-16 6 views
5

Usiamo svn: esternali a revisioni specifiche di una libreria, ad es. comeCome proibire la sovversione si impegna in svn: esterno alle revisioni?

xyzlib -r12345 https://asdf.asdf.local/xyzlib/trunk/ 

Quando si effettua una modifica nella vostra copia di lavoro ad un tale estratto esterna, è possibile commettere anche se i link esterni ad una specifica revisione e non la testa.

Quando si esegue svn update dopo il commit, le modifiche verranno eliminate nella copia di lavoro poiché subversion ripristina tutto nella revisione 12345. Quindi non si vedono mai realmente le modifiche ma sono ancora nell'HEAD, che è male .

È possibile vietare i commit solo quando l'esterno non punta alla revisione HEAD?

+0

Che cosa significa "si impegnano a queste cose esterne" significa? Qualcuno si è impegnato a https: //asdf.asdf.local/xyzlib/trunk/? Il TESTO di ciò che contiene quale modifica? –

+0

Ive ha riformulato la domanda un po ' – martinus

risposta

3

Per questi tipi di convalida, vorrei anche raccomandare un hook pre-commit, ma invece di scrivere uno script che può facilmente risultare impossibile da capire, consiglio di utilizzare una libreria come SVNKit - http://svnkit.com/ (se si conosce Java) .

Ho già scritto alcuni hook di pre-commit utilizzando questa libreria ed è abbastanza facile lavorare con. Scrivi un piccolo programma Java eseguibile che viene chiamato dal hook pre-commit di Subversion. Quindi è facile estrarre per es. proprietà o parti dell'URL per eseguire la convalida e rifiutare il commit se non si applica alle "regole".

Date un'occhiata a classi SVNLookClient e SVNChangeEntry - hanno metodi per i casi più comuni (. Per esempio l'estrazione di informazioni su un commit in corso)

1

Poiché si utilizza https, presumo che si stia utilizzando mod_dav_svn. È possibile impostare un url aggiuntivo per il repository della libreria e concedere l'accesso in sola lettura ad esso. In questo modo anche gli sviluppatori che normalmente possono impegnarsi nella libreria, non saranno in grado di eseguire il commit tramite svn: external.

+0

hm Non mi piace molto perché quando passo all'URL dell'URL scrivibile tutti i file devono essere rimossi e ricontrollati – martinus

+1

Quindi stai passando da svn: esterno a una revisione diversa? Non ho mai provato a cambiarne uno in precedenza, ma non vedo perché dovrebbe forzare una rimozione sulla copia di lavoro. –

+2

Il problema credo sia che non cambierà, sarà ancora r12345 dopo il prossimo aggiornamento. E i cambiamenti commessi andranno in HEAD (o falliranno in caso di conflitto). Questo non è ciò che lo sviluppo di dev è stato destinato in entrambi i modi. – Eugene

2

Si potrebbe provare qualcosa di simile: utilizzare un pre-commit script per verificare se il commit sta per un tag. Se è così, quindi fallire e fornire un messaggio. Read some more about subversion hooks. Dovrai riscrivere la regex in modo che non funzioni se non è HEAD piuttosto che fallire se è un tag.

$SVNLOOK changed -t “$TXN” “$REPOS” | egrep -v “^[AD][[:space:]]+(.*/)?tags/[^/]+/$” | egrep “^[^[:space:]]+[[:space:]]+tags/[^/]+/.+” 
if [ $? -eq 0 ] ; then 
echo >&2 “***************************************” 
echo >&2 “* Modification of tags is not allowed *” 
echo >&2 “***************************************” 
exit 1 
fi 
1

Se non si è impegnati a mantenere l'esterno definito come una revisione del trunk, perché non creare un nuovo tag in base a tale revisione. Puoi quindi avere il tuo svn: punto esterno al tag, e usare uno dei metodi di controllo dell'accesso documentati per limitare i commit alla tua directory tag (o mettere il tag in un repository diverso e fare in modo che la repo sia di sola lettura).