¿Hay una secuencia de comandos para enumerar las ramas de git creadas por mí?

4 minutos de lectura

avatar de usuario
ojo de halcón

Soy consciente de que las ramas en realidad no almacenan información del creador, y son solo un indicador de una confirmación.

Mi objetivo es poder limpiar mis sucursales antiguas que se han fusionado con la sucursal principal y enumerar las sucursales donde esto tampoco se ha hecho. (Una limpieza).

Esto es diferente a “buscar ramas no fusionadas” porque también quiero encontrar ramas fusionadas y quiero hacerlo por autor.

Mi pregunta es: ¿Hay una secuencia de comandos para enumerar las ramas de git creadas por mí?

  • El título y el cuerpo de su pregunta parecen contradictorios: ¿Desea que usted cree sucursales (que no creo que pueda) o desea enumerar sucursales no fusionadas? ¿O una combinación de ambos?

    – morxa

    16 de marzo de 2016 a las 3:56

  • Posible duplicado de git encontrando ramas no fusionadas

    – gzh

    16 de marzo de 2016 a las 4:09

  • Quiero ambas. Quiero todas las ramas creadas por mí, fusionadas o no fusionadas.

    – ojo de halcón

    16 de marzo de 2016 a las 4:50

  • No hay información sobre quién creó ninguna rama en git. Período. La respuesta tan corta es No, no hay ninguno.

    –Román Valeri

    4 abr a las 13:20


avatar de usuario
Habilidadzore

Un poco tarde para la fiesta aquí, pero este es el mejor resultado en Google cuando se busca “listar rama de git para autor”.

Una línea para encontrar sus sucursales remotas en git es:

git branch -r | xargs -L1 git --no-pager show -s --oneline --author="$(git config user.name)"

git rama -r – enumera todas las sucursales remotas.

xargs -L1 – convierte el resultado del comando anterior en argumentos para el siguiente comando.

mostrar – git show, muestra varios tipos de objetos en git. En este caso, mostrará la última confirmación en cada rama, con la diferencia completa.

La bandera -s suprime la salida diferencial.

La bandera –una línea condensa la información de confirmación en una sola línea.

La bandera –author=”$(git config usuario.nombre)” solo muestra las confirmaciones para el usuario actual de git.

La bandera –sin buscapersonas ejecuta git sin un buscapersonas. Sin este indicador, cada confirmación del resultado se abrirá en su propia instancia de buscapersonas, que podría funcionar dependiendo de su buscapersonas.

El resultado final será algo como esto:

efbd5d738b (origin/feature/A) commit feature A
297e83d9a6 (origin/feature/B) commit feature B
951f6638de (origin/test/A) commit test A
307d16741b (origin/master) latest master commit

Tenga en cuenta que la lista contendrá ramas maestras y de desarrollo si el autor dado es el último en confirmar estas ramas.

  • Curiosamente, esto es muy lento. Supongo que porque hay comunicación real con el control remoto. Esperaría que esto sea muy rápido, siempre y cuando extraiga todo el repositorio, ¿no serían locales todos los datos necesarios?

    – Pensamientos grávidos

    11 de febrero de 2020 a las 17:40

  • Tratando de mirar en el rendimiento lento. Parece que es el --author y el -s banderas que son las principales culpables. Sin estas banderas, el script responde, pero el resultado tarda un tiempo en imprimirse en repositorios más grandes. Realmente no puedo encontrar nada en línea que sugiera por qué son lentos o alguna alternativa más rápida. Buscaré tal vez informar la velocidad de estas banderas con mantenedores de git en alguna parte. La sensación que tengo es que solo suprimen alguna salida. Todavía parecen hacer todo el procesamiento para todas las ramas y todas las diferencias en segundo plano.

    – Skillzore

    17 de febrero de 2020 a las 8:30


  • Mi salida incluía un mensaje de error para la rama desprotegida en el origen: fatal: unrecognized argument: ->. Esto fue porque git branch -r impreso origin/HEAD -> origin/master para esa sucursal. Supongo que podrías evitar eso canalizando a través de grep -v -- '->'.

    – Noúmeno

    9 de julio de 2020 a las 14:32

  • @Noúmeno Yo también. Se solucionó agregando formato al primer término: git branch -r --format='%(refname)' | ...

    – ruibarbo

    11 de agosto de 2020 a las 18:02

  • En cuanto a la respuesta más votada, esto no es lo que quiere OP. Por cierto, lo que OP quiere no se puede obtener por diseño en git.

    –Román Valeri

    4 abr a las 13:18

En cuanto a la versión 2.23 de Git, simplemente puede escribir:

git branch

y le dará la lista de la lista local de sucursales. Recuerda que también incluirá master y otros que has fusionado. Para filtrar estos tubos el resultado con egrep -v "(^\*|master|development)

Si quieres incluir los mandos a distancia puedes hacerlo:
git for-each-ref --format=" %(authorname) %09 %(refname)" --sort=authorname | egrep -v "(^\*|master|development)"| grep 'Your Name'

para la eliminación, tubo xargs git branch -D

avatar de usuario
eric

Como una ligera condensación de la respuesta anterior de SachinSunny, puede usar las funciones de expresión regular de grep para lograr un comando más simple:

git branch --merged | grep -Pv "\*|master|dev" | xargs -n 1 git branch -d

avatar de usuario
paquete de matematicas

Prácticamente el mismo comando que la respuesta aceptada pero más conveniente con | while read

git for-each-ref --format="%(authorname),%(refname:lstrip=3),%(refname:short)" --sort=authorname | while IFS=',' read author branch remote_branch; do
  printf "%20s | %40s | %s\n" "$author" "$branch" "$remote_branch"
done

Producción:
ingrese la descripción de la imagen aquí

¿Ha sido útil esta solución?