Trovo la soluzione migliore per il mio problema qui: Come risolvere lo stato di sovversione «!»
Ma ora, vorrei solo scrivere una piccola sceneggiatura per farlo.
Come questo:
svn status | grep "!" | awk "{print $2}" | xargs svn revert
svn status | grep "!" | awk "{print $2}" | xargs svn delete
Ma in una riga.
Perché, dopo lo svn ripristinato, "svn status | grep"! "" Non restituisce risultati. Razionale.
Penso di aver trovato una soluzione: Mettere i dati passati a xargs due volte in una riga ma sono un po 'arrugginito in inglese e la linea di comando non è la mia abilità.
risposte:
1 per risposta № 1svn status | grep "!" | awk "{print $2}" | tee list.$$ | xargs svn revert
xargs svn delete < list.$$
rm list.$$
Il tee
il comando è come un raccordo a T; una copia dell'output passa a ciascun file denominato e un altro all'output standard. Qui, ho "nominato un solo file. Questo costringe tutti i ripristini a verificarsi prima di qualsiasi eliminazione. Il nome list.$$
è un modo semplice per proteggere lo script dal calpestare i file di altri processi; ci sono programmi come mktemp
che può essere utilizzato per creare nomi più sicuri, meno prevedibili. OTOH, se non stai funzionando in ambienti ostili, è improbabile che importi. Se stai davvero attento, creerai un trap
per assicurarsi che il file sia ripulito:
tmp=${TMPDIR:-/tmp}/list.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
svn status | grep "!" | awk "{print $2}" | tee $tmp | xargs svn revert
xargs svn delete < $tmp
rm $tmp
trap 0
Ci sono altri trucchi che potrebbero essere provati, ma almeno alcuni di essi non garantiscono l'operazione sequenziale. Ad esempio, la sostituzione del processo in bash
:
svn status | grep "!" | awk "{print $2}" | tee >(xargs svn revert) | xargs svn delete
Ogni file verrà sia ripristinato che cancellato, ma il sequenziamento non è prevedibile.
1 per risposta № 2
Entrambi i comandi in una riga. Nota la completa perdita di xargs. Non che xargs non sia meraviglioso, non è necessario qui.
x = "$ (svn status | grep"! "| awk" {print $ 2} ")"; svn ripristina "$ x" && svn elimina "$ x" || echo "no svn elimina $?"
Si noti che il svn delete non funzionerà se il svn ripristina non riesce. "No svn delete" indica che uno dei comandi svn non è riuscito.