2012-06-21 10 views
22

A veces trabajo con repositorios de código fuente que contienen muchas ramas, la mayoría de las cuales son antiguas y, por lo general, ya no son relevantes.¿Cómo enumerar solo ramas activas/recientemente modificadas en git?

En estos casos, la lista completa de sucursales de git branch no es muy útil. ¿Hay alguna manera de solo enumerar las ramas "activas"? Por ejemplo, solo las ramas que recibieron confirmaciones en los últimos n días? Idealmente, la lista incluiría la fecha del último compromiso para cada sucursal e indicará si la sucursal ya está fusionada por completo.

P.S .: Me doy cuenta de que esto también se puede resolver eliminando ramas "antiguas" (como se describe en What to do with experimental non-merged git branches?), pero esto no siempre es práctico o aceptado en un proyecto determinado.

+0

Posible duplicado de [¿Cómo puedo obtener una lista de las ramas de git ordenadas por la confirmación más reciente?] (Http://stackoverflow.com/questions/5188320/how-can-i-get-a-list-of -git-branches-ordered-by-most-recent-commit) – sleske

+0

Acaba de darse cuenta de que este es un duplicado. – sleske

Respuesta

27

Puede utilizar git-for-each-ref para obtener una lista de todas las secciones locales y de seguimiento ordenados en orden descendente por la fecha confirmador de la última confirmación de esta manera:

git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname)' refs/heads refs/remotes 

Esto da salida por ejemplo .:

2012-06-23 refs/heads/master 
2012-06-21 refs/remotes/origin/HEAD 
2012-06-21 refs/remotes/origin/master 

Puede agregar --count=m para obtener como máximo m sucursales, puede --sort=-authordate en lugar de usar la fecha del confirmador, por supuesto, puede usar diferentes formatos. for-each-ref en sí mismo no limita el resultado por fecha, esto tiene que ser un script por separado, pero al menos tiene las fechas del objeto de confirmación en la mano.

+1

Genial, * exactamente * lo que estaba buscando. Es un poco irónico que esto ya sea parte de git. Tal vez debería leer los documentos ... – sleske

+0

Sí, yo también:/ – jkrcma

+4

No olvides ejecutar 'git remote prune origin' primero, de lo contrario podrías obtener una lista anterior que incluye cosas que ya no existen en el sitio remoto –

7
ls -1 --sort=time .git/refs/heads/ | while read b; do PAGER='' git log -n1 --color --pretty=format:'%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $b --; done; 

Este oneliner imprime todas las sucursales locales ordenados por el tiempo del más nuevo al más antiguo. Cada rama ha comprometido por última vez con cadena de fecha legible por humanos. Puede agregarlo a su .gitconfig.

Por ramas remotas me ocurrió con esta solución espeluznante:

git ls-remote -h origin | while read b; do PAGER='' git log -n1 --color --pretty=format:'%ct%C(yellow)%d%Creset - %Cred%h%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset%n' --abbrev-commit $(echo $b | cut -d' ' -f1) --; done | sort -rn -k1,10 | cut -c11- 

Editar: cuanto más lo pienso, más me temo que esto podría ser poco fiable, porque ls-remote siempre se conecta al lado remoto mientras que log no. Puede requerir hacer fetch antes de cada ejecución de este comando.

+0

Buen truco. Desafortunadamente, esto solo funciona para las sucursales locales, no para las remotas (bajo '/ refs/remote'). Tampoco funciona para las ramas de seguimiento locales, ya que el mtime del archivo ref generalmente refleja la última recuperación, no la última confirmación (ascendente). – sleske

+0

@sleske Puedo hacer magia de concha, ver la respuesta actualizada :) – jkrcma

Cuestiones relacionadas