2012-04-26 13 views
12

Encontré el siguiente script que enumera las ramas por fecha. ¿Cómo puedo filtrar esto para excluir ramas más nuevas y alimentar los resultados en el comando de eliminación de Git?Eliminar todas las ramas que tienen más de X días/semanas de antigüedad

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

¿Esto no acaba un poco con el propósito de un sistema de control de versiones? – haziz

+1

@haziz: eliminar una rama no significa borrar el historial; las ramas solo se nombran punteros en commits. – CharlesB

+0

Wer ejecuta git localmente y svn de forma remota, por lo que el git es solo para el trabajo local. – Kenoyer130

Respuesta

23

Cómo sobre el uso --since y --before?

Por ejemplo, esto eliminará todas las ramas que no han recibido ningún commit durante una semana:

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 

Si desea eliminar todas las ramas que son más de una semana de edad, use --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 

Tenga en cuenta, sin embargo, que esto también eliminará las ramas que no se fusionaron en el maestro o cualquiera que sea la rama desprotegida.

+0

Esta solución es más elegante que la mía. – Julian

+12

El código anterior es bueno, pero si lo pruebo esto solo borrará las ramas que HAVE recibió confirmadas la semana pasada. Tuve que cambiar la -n a -z para que funcione. Además, si quiere ser un poco más seguro, cambie el -D por el -d para que solo elimine las ramas fusionadas. – ben

+0

Esto no funcionó para mí hasta que eliminé el espacio entre '$ k)" 'y'] 'en la línea 3. (¿Podría ser específico de OSX?No estoy seguro) –

1

Supongo que quiere eliminar solo las referencias, no las confirmaciones en las ramas. Para eliminar todas las ramas fusionadas, excepto el más reciente __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}'` 

Para eliminar todas las ramas antes de marca de tiempo __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}'` 

Reemplazar la opción -d por -D si quiere eliminar las ramas que no han sido se fusionó también ... pero ten cuidado, porque eso hará que los commit pendientes cuelguen basura en algún momento.

3

Es algo similar a Daniel Baulig respuesta, pero también toma en consideración el comentario de ben. También filtra ramas por un patrón dado, ya que estamos usando la convención try-XX para la ramificación.

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

Esto es lo que funcionó para mí:

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 fundamental es que el nombre de la sucursal (variable $ k) contiene el /origin/ parte por ejemplo origin/feature/my-cool-new-branch Sin embargo, si se intenta git push - -delete, fallará con un error como:
no se puede eliminar 'origin/feature/my-cool-new-branch': la referencia remota no existe.
Así que usamos sed para eliminar la pieza /origin/ para que nos quede un nombre de rama como feature/my-cool-new-branch y ahora git push --delete funcionará.

Cuestiones relacionadas