2012-04-26 13 views
12

Ho trovato lo script seguente che elenca i rami per data. Come faccio a filtrare questo per escludere i nuovi rami e inserire i risultati nel comando Elimina Git?Elimina tutti i rami più vecchi di X giorni/settimane

for k in $(git branch | sed /\*/d); do 
    echo "$(git log -1 --pretty=format:"%ct" $k) $k" 
done | sort -r | awk '{print $2}' 
+0

Questo non elimina un po 'lo scopo di un sistema di controllo della versione? – haziz

+1

@haziz: eliminare un ramo non significa cancellare la cronologia; i rami sono semplicemente indicati come puntatori sui commit. – CharlesB

+0

Wer git localmente e svn in remoto, quindi il git è solo per lavoro locale. – Kenoyer130

risposta

23

Come sull'utilizzo --since e --before?

Per esempio, questo eliminerà tutti i rami che non hanno ricevuto alcun commit per una settimana:

for k in $(git branch | sed /\*/d); do 
    if [ -n "$(git log -1 --since='1 week ago' -s $k)" ]; then 
    git branch -D $k 
    fi 
done 

Se si desidera eliminare tutti i rami che sono più di una settimana di vita, utilizzare --before:

for k in $(git branch | sed /\*/d); do 
    if [ -n "$(git log -1 --before='1 week ago' -s $k)" ]; then 
    git branch -D $k 
    fi 
done 

Si avverta tuttavia che questo eliminerà anche i rami che non sono stati uniti in master o qualunque sia il ramo estratto.

+0

Questa soluzione è più elegante della mia. – Julian

+12

Il codice precedente è bello, ma il mio test elimina solo i rami che HAVE ha ricevuto commit nella settimana passata. Ho dovuto cambiare -n a -z per farlo funzionare. Inoltre, se vuoi essere un po 'più sicuro, cambia da -D a -d in modo che cancelli solo i rami uniti. – ben

+0

Questo non ha funzionato per me finché non ho rimosso lo spazio tra '$ k)" 'e'] 'sulla riga 3. (Potrebbe essere specifico per OSX?Non sono sicuro) –

1

Suppongo che vogliate cancellare solo i refs, non i commit nei rami. Per eliminare tutti i rami uniti ad eccezione del più recente __X__:

git branch -d `for k in $(git branch | sed /\*/d); do 
    echo "$(git log -1 --pretty=format:"%ct" $k) $k" 
done | sort -r | awk 'BEGIN{ORS=" "}; {if(NR>__X__) print $2}'` 

Per eliminare tutti i rami prima timestamp __Y__:

git branch -d `for k in $(git branch | sed /\*/d); do 
    echo "$(git log -1 --pretty=format:"%ct" $k) $k" 
done | sort -r | awk 'BEGIN{ORS=" "}; {if($1<__Y__) print $2}'` 

Sostituire l'opzione -d da -D se si desidera eliminare i rami che non sono stati unite pure ... ma attenzione, perché a un certo punto i pegni pendenti saranno raccolti dalla spazzatura.

3

E 'qualcosa di simile a Daniel Baulig risposta, ma prende anche in considerazione commento di Ben s'. Inoltre filtra le diramazioni di un dato patter, dal momento che stiamo usando la convenzione try-XX per la ramificazione.

for k in $(git branch -r | awk -F/ '/\/YOUR_PREFIX_HERE/{print $2}' | sed /\*/d); do 
    if [ -z "$(git log -1 --since='Jul 31, 2015' -s origin/$k)" ]; then 
    echo deleting "$(git log -1 --pretty=format:"%ct" origin/$k) origin/$k"; 
    git push origin --delete $k; 
    fi; 
done 
1

Questo è ciò che ha funzionato per me:

for k in $(git branch -r | sed /\*/d); do 
    if [ -z "$(git log -1 --since='Aug 10, 2016' -s $k)" ]; then 
    branch_name_with_no_origin=$(echo $k | sed -e "s/origin\///") 
    echo deleting branch: $branch_name_with_no_origin 
    git push origin --delete $branch_name_with_no_origin 
    fi 
done 

La parte cruciale è che il nome del ramo (variabile $ k) contiene il /origin/ parte ad esempio origin/feature/my-cool-new-branch Tuttavia, se si tenta di git push - -delete, fallirà con un errore del tipo:
impossibile eliminare 'origine/funzione/my-cool-new-branch': il ref remoto non esiste.
Quindi usiamo sed per rimuovere la parte /origin/ in modo da lasciare un nome di ramo come feature/my-cool-new-branch e ora git push --delete funzionerà.

Problemi correlati