Necesito eliminar ramas viejas y sin mantenimiento de nuestro repositorio remoto. Estoy tratando de encontrar una manera de enumerar las ramas remotas por su última fecha de modificación, y no puedo.
¿Hay una manera fácil de enumerar ramas remotas de esta manera?
git
maintenance
administration
branch
Roni Yaniv
fuente
fuente
Respuestas:
commandlinefu tiene 2 propuestas interesantes:
o:
Eso es para sucursales locales, en una sintaxis Unix. Utilizando
git branch -r
, puede mostrar ramas remotas de manera similar:Michael Forrest menciona en los comentarios que zsh requiere escapes para la
sed
expresión:Kontinuity agrega en los comentarios :
En multiples lineas:
Nota: la respuesta de n8tr , basada en es más limpia. Y mas rapido . Consulte también " Opción de solo nombre para ? "
git for-each-ref refs/heads
git branch --list
En términos más generales, tripleee nos recuerda en los comentarios :
(Ilustraba ese punto en 2014 con " ¿Cuál es la diferencia entre
$(command)
y`command`
en la programación de shell? ")fuente
/json
al final de cualquier URL de commandlinefu.com y obtendrás todos los comandos como JSON.Esto es lo que uso:
Esta es la salida:
Para ramas remotas, solo use "refs / remotes" en lugar de "refs / heads":
Sobre la base de la respuesta de n8tr , si también está interesado en el último autor en la rama y si tiene la herramienta "columna" disponible, puede usar:
Lo que te dará:
Es posible que desee llamar a "git fetch --prune" antes para obtener la información más reciente.
fuente
authordate
(¿qué parece ser cuando se creó la rama por primera vez?). Si cambiaauthordate
acommitterdate
, verá las fechas de la confirmación más reciente en cada rama. Así:git for-each-ref --sort='-committerdate:iso8601' --format=' %(committerdate:iso8601)%09%(refname)' refs/heads
Partiendo de Olivier Croquette , me gusta usar una fecha relativa y acortar el nombre de la rama de esta manera:
Lo que te da salida:
Recomiendo hacer un archivo Bash para agregar todos sus alias favoritos y luego compartir el script con su equipo. Aquí hay un ejemplo para agregar solo este:
Luego puede hacer esto para obtener una lista de sucursales locales bien formateada y ordenada:
fuente
Solo para agregar al comentario de @VonC, tome su solución preferida y agréguela a su lista de alias ~ / .gitconfig para mayor comodidad:
Luego, un simple "git branchdate" imprime la lista por usted ...
fuente
--format='%(authordate)%09%(objectname:short)%09%(refname)'
que también obtiene el hash corto de cada rama.| tac
, solo en--sort='authordate'
lugar de-authordate
Esto es lo que se me ocurrió después de también revisar esto .
La
PREV_REF
comprobación consiste en eliminar duplicados si más de una rama apunta a la misma confirmación. (Como en una sucursal local que también existe en el remoto).TENGA EN CUENTA que según la solicitud de OP,
git branch --merged
ygit branch --no-merged
son útiles para identificar qué ramas se pueden eliminar fácilmente.[ https://git-scm.com/docs/git-branch]
fuente
Ramas remotas ordenadas y la última fecha de confirmación para cada rama.
fuente
Hice dos variantes, basadas en la respuesta de VonC .
Mi primera variante
Esto maneja ramas locales y remotas (
-a
), maneja el estado de la cabeza separada (el comando sed más largo, aunque la solución es un poco cruda: simplemente reemplaza la información de la rama separada con la palabra clave HEAD), agrega el asunto de confirmación (% s ) y coloca las cosas en columnas mediante caracteres de canalización literales en la cadena de formato y pasando el resultado final acolumn -t -s "|"
. (Puede usar lo que sea como separador, siempre que sea algo que no espere en el resto de la salida).Mi segunda variante es bastante hacky, pero realmente quería algo que todavía tenga un indicador de "esta es la rama en la que estás actualmente" como lo hace el comando de rama.
Esto convierte lo
*
que marca la rama actual en una palabra clave, y cuando el cuerpo del bucle ve la palabra clave, establece una bandera y no muestra nada. El indicador se usa para indicar que se debe usar un formato alternativo para la siguiente línea. Como dije, es totalmente hacky, ¡pero funciona! (Principalmente. Por alguna razón, mi última columna se está quedando sin sangría en la rama actual).fuente
git for-each-ref
es la forma fácil de guiar para procesar ramas. Tendría que ejecutar la simbólica-ref una vez para obtener la rama actual.Hice un alias simple, no estoy seguro de si esto es exactamente lo que preguntó, pero es simple
Hice esto porque quería enumerar todas las ramas, no solo mis ramas locales, que los comandos anteriores solo hacen
alias git_brs="git fetch && git branch -av --format='\''%(authordate)%09%(authordate:relative)%09%(refname)'\'"
Puede canalizar arriba
grep origin
para obtener solo orígenesEsto enumera todas las ramas junto con la última fecha de modificación, me ayuda a decidir cuál debo obtener para la última versión
Esto da como resultado el siguiente tipo de pantalla
Intenta y avísame si te ayudó, feliz
fuente
O puede usar mi script PHP, https://gist.github.com/2780984
fuente
Aquí hay una función que puede agregar a su bash_profile para facilitar esto.
Uso en un repositorio Git:
branch
imprime todas las sucursales localesbranch -r
imprime todas las ramas remotasFunción:
fuente
En PowerShell, lo siguiente muestra ramas en el control remoto que ya están fusionadas y que tienen al menos dos semanas de antigüedad (el
author:relative
formato comienza a mostrar semanas en lugar de días a las dos semanas):fuente