Descubre un creador de sucursales de Git

159

Quiero saber quién creó una sucursal.

Soy capaz de hacerlo con:

git branch -a | xargs -L 1 bash -c 'echo "$1 `git log --pretty=format:"%H %an" $1^..$1`"' _

Sin embargo, esto devuelve el último confirmador por rama, no necesariamente la persona que creó la rama.

Ofir Farchy
fuente
77
No puede obtener un autor / creador de sucursales en git. Lo que está haciendo aquí es obtener el autor de la sugerencia de la sucursal. Cambiará tan pronto como alguien empuje un nuevo compromiso allí.
sylvain.joyeux
1
Descargo de responsabilidad: El supuesto implícito en esta pregunta / respuesta es "en un flujo de trabajo con una sola persona por rama ". En otros flujos de trabajo donde al menos dos compañeros de trabajo comparten una rama, esta información (creador de la rama) no se puede obtener a través de git, y las respuestas anteriores podrían llevar a alguien a suposiciones falsas.
RomainValeri

Respuestas:

56

Una rama no es más que un puntero de confirmación. Como tal, no rastrea metadatos como "quién me creó". Ver por ti mismo. Prueba cat .git/refs/heads/<branch>en tu repositorio.

Dicho esto, si realmente le gusta rastrear esta información en su repositorio, consulte las descripciones de las ramas. Le permiten adjuntar metadatos arbitrarios a las ramas, al menos localmente.

También la respuesta de DarVar a continuación es una forma muy inteligente de obtener esta información.

Christopher
fuente
Para mí esto estaba en .git / refs / heads / <branch> "ref" era plural
Jeffrey LeCours
44
La respuesta de DarVar, aunque probablemente sea útil para algunos, no es una respuesta precisa. Es simplemente una forma más sucinta de hacer lo que el autor de la pregunta original ya estaba haciendo (es decir, obtener el nombre del último usuario de una rama).
peabody
296

Enumere las ramas remotas de Git por autor ordenadas por fecha de confirmación

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' --sort=committerdate
DarVar
fuente
8
Es la última persona que se compromete con esa rama. Dado que una rama es solo un puntero a una confirmación.
DarVar
77
¿Debería funcionar esto en Windows? Obtuve el "Archivo de entrada especificado dos veces".
Steve Chambers
27
Con formato tabular: git for-each-ref --format='%(committerdate)%09%(authorname)%09%(refname)' | sort -k5n -k2M -k3n -k4n | grep remotes | awk -F "\t" '{ printf "%-32s %-27s %s\n", $1, $2, $3 }'(idea de stackoverflow.com/a/3631819 - puede que necesite ajustar los números en la impresión awk dependiendo de la fecha máxima / longitud del nombre del autor)
Gary S. Weaver
15
En caso de que no haya habido ninguna confirmación en la rama y si se ha creado desde el maestro, el "autor de la rama" no tiene ninguna relación con esa rama, sino solo el último confirmador en el maestro. Si realiza cambios desde master y es un avance rápido, nuevamente es el último committer en master, que posiblemente nunca trabajó en esa rama.
Gustave
9
Si bien esta respuesta y este comando son potencialmente útiles, creo que es una respuesta engañosa a la pregunta. Esto enumera los nombres de los autores en todas las ramas que son el último responsable de una rama. Hay una serie de circunstancias bajo las cuales ese no sería realmente el creador de la rama. La verdadera respuesta es que git simplemente no almacena esta información.
peabody
46

Modifiqué las respuestas anteriores usando la --sortbandera y agregué algo de color / formato:

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=authordate refs/remotes
Miguel
fuente
1
perfecto para culpar a los colores
suarsenegger
8
git for-each-ref --format='%(authorname) %09 -%(refname)' | sort
KhaledMohamedP
fuente
8

Añadiendo a la respuesta de DarVar :

git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -k5n -k2M -k3n -k4n | awk '{print $7 $8}'

PD: Usamos AWK para imprimir bastante el autor y la rama remota.

suryakrupa
fuente
3
eso solo funciona si el nombre del autor es una sola palabra. Si se separan el nombre y el apellido, verás el apellido en lugar del nombre de la rama ...
Legato
5

Puede averiguar quién creó una sucursal en su repositorio local al

git reflog --format=full

Salida de ejemplo:

commit e1dd940
Reflog: HEAD@{0} (a <a@none>)
Reflog message: checkout: moving from master to b2
Author: b <b.none>
Commit: b <b.none>
(...)

Pero esto probablemente sea inútil, ya que generalmente en su repositorio local solo crea ramas.

La información se almacena en ./.git/logs/refs/heads/ branch . Contenido de ejemplo:

0000000000000000000000000000000000000000 e1dd9409c4ba60c28ad9e7e8a4b4c5ed783ba69b a <a@none> 1438788420 +0200   branch: Created from HEAD

La última confirmación en este ejemplo fue del usuario "b", mientras que la rama "b2" fue creada por el usuario "a". Si cambia su nombre de usuario, puede verificar que git reflog toma la información del registro y no utiliza el usuario local.

No conozco ninguna posibilidad de transmitir esa información de registro local a un repositorio central.

Gustave
fuente
4

Podemos averiguarlo en base al nombre del autor

git for-each-ref --format='%(authorname) %09 %(if)%(HEAD)%(then)*%(else)%(refname:short)%(end) %09 %(creatordate)' refs/remotes/ --sort=authorname DESC
tech2504
fuente
1

Asumiendo:

  1. rama fue hecha de master
  2. no ha sido fusionado al masterembargo

 git log --format="%ae %an" master..<HERE_COMES_THE_BRANCH_NAME> | tail -1
Trident D'Gao
fuente
0

Sé que esto no es del todo el alcance de la pregunta, pero si encuentra la necesidad de filtrar solo las confirmaciones de un autor específico, siempre puede canalizar a grep :)

# lists all commits in chronological order that
# belong to the github account with
# username `MY_GITHUB_USERNAME` (obviously you
# would want to replace that with your github username,
# or the username you are trying to filter by)


git for-each-ref --format='%(committerdate) %09 %(authorname) %09 %(refname)' | sort -committerdate | grep 'MY_GITHUB_USERNAME'

feliz codificación! :)

aguacate
fuente
0

para aquellos que buscan un DESC ... esto parece funcionar --sort=-

Ty para el formateo, nuevo en esto ... mis ojos están perdiendo algo de sangre

git for-each-ref --format='%(color:cyan)%(authordate:format:%m/%d/%Y %I:%M %p)    %(align:25,left)%(color:yellow)%(authorname)%(end) %(color:reset)%(refname:strip=3)' --sort=-authordate refs/remotes

Ref. adicional: https://stackoverflow.com/a/5188364/10643471

robar abeja
fuente
-1

Hasta donde yo sé, puedes ver si eres el creador de una rama solamente. Esto se indica mediante la primera fila en .git / ref / heads / <branch>. Si termina con "Creado a partir de HEAD", usted es el creador.

Kendor
fuente