Descripciones de ramas en Git


282

¿Hay alguna manera en Git de tener una 'descripción' para las ramas?

Si bien trato de usar nombres descriptivos, trabajar por un tiempo en una sola rama a veces amortigua mi memoria de por qué hice algunas de las otras ramas temáticas. Intento usar nombres descriptivos para las ramas, pero creo que una 'descripción' (nota breve sobre el propósito de la rama) sería buena.


1
Yo tenía un problema similar . Utilizo ese archivo para documentar ramas y por qué existen (entre otras cosas).
themis

2
Esta sería una característica realmente útil. git branch -a podría mostrar las descripciones junto a los nombres de las ramas. ¿Tal vez las notas de git admitirán notas en sucursales y confirmaciones en el futuro?
jhabbott

1
Las descripciones de ramas no se pueden enviar, por lo que son bastante inútiles a menos que desee enviarse mensajes a usted mismo.
nurettin 12/0618

@nurettin Es cierto, pero mi solicitud fue para cosas privadas de todos modos. Solo quería recordar por qué corté la rama.
Noufal Ibrahim

Respuestas:


200

Git 1.7.9 lo admite. De las notas de la versión 1.7.9 :

 * "git branch --edit-description" se puede usar para agregar texto descriptivo
   para explicar de qué trata una rama temática.

Puede ver esa característica introducida en septiembre de 2011, con commits 6f9a332 , 739453a3 , b7200e8 :

struct branch_desc_cb {
  const char *config_name;
  const char *value;
};

--edit-description::

Abra un editor y edite el texto para explicar para qué es la rama, para ser utilizado por varios otros comandos (por ejemplo request-pull).

Tenga en cuenta que no funcionará para una rama HEAD separada.

El script request-pull utiliza esa descripción: consulte commit c016814783 , pero también git merge --log.

request-pull es un script utilizado para resumir los cambios entre dos confirmaciones en la salida estándar e incluye la URL dada en el resumen generado.

[De @AchalDave] Desafortunadamente, no puede enviar descripciones ya que están almacenadas en su configuración, lo que lo hace inútil por el simple hecho de documentar ramas en un equipo.


17
@Owen: La única forma que conozco en este momento es usar git config branch.topic.descriptionpara mostrar la descripción de la rama topic. Se almacena en el .git/configarchivo.
Greg Hewgill el

12
@GregHewgill Gracias. Con unos pocos alias, en realidad no es una mala forma de verlo. Ahora si solo git branchmostrara las descripciones en la lista ...
Owen

44
En este momento, gist citado en el comentario anterior no parece estar disponible, pero esto parece ser similar: gist.github.com/carlosayam/5316969
pfalcon

166
Desafortunadamente, no puede enviar descripciones ya que están almacenadas en su configuración, por lo que es inútil por el simple hecho de documentar ramas en un equipo.
Achal Dave

2
@PedroRodrigues lamentablemente su enlace esencial está roto
UpAndAdam

40

Si no terminan usando el README, crear un alias de git modifican git checkoutpara que su README se visualiza cada vez que se enciende ramas.

Por ejemplo, agregue esto en ~ / .gitconfig, en [alias]

cor = !sh -c 'git checkout $1 && cat README' -

Después de esto, puede ejecutar git cor <branch_name>para cambiar de rama y mostrar el archivo README de la rama a la que está cambiando.


Para mí, la variable $ 1 no funciona, no contiene nada. No sé por qué (estoy usando la versión 1.7.11-msysgit.1). Estoy usando $ 0 en su lugar. Y todo está bien.
shytikov

@shytikov para alias git que usan argumentos, para portabilidad, uso una función rápida en lugar de " sh -c"; p.ej,. alias = "!f() { git checkout "${1}" && cat README.md; }; f" (los corchetes y las citas son innecesarios en este caso, solo se incluyen para completar en caso de que sean necesarios para algo más complicado.)
michael

@michael_n su alias, es un alias bash o un alias git
UpAndAdam

El único problema es que si README no está en la carpeta en la que se encuentra cuando finaliza la compra, simplemente se queja.
UpAndAdam

@UpAndAdam es un alias de git, definido en ~/.gitconfig, debajo [alias], y el nombre del alias se llama de hecho (y comprensiblemente confuso) aliasdesde mi configuración real (debería haberle cambiado el nombre corpara que este ejemplo sea coherente). Mi aliasalias actual es: alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f" Uso: git alias {alias_name}o git alias {alias_regexp}. Análogo al aliascomando bash , por ejemplo, $ alias llrendimientos (para mí) alias ll='ls -l':; y $ git alias brlos rendimientos: alias.br branch -v --list(también podrían utilizar: $ git alias 'b.*')
michael

31

Use git branch --edit-descriptionpara establecer o editar una descripción de rama.

Aquí hay una función de shell para mostrar ramas similares git branchpero con descripciones adjuntas.

# Shows branches with descriptions
function gb() {
  current=$(git rev-parse --abbrev-ref HEAD)
  branches=$(git for-each-ref --format='%(refname)' refs/heads/ | sed 's|refs/heads/||')
  for branch in $branches; do
    desc=$(git config branch.$branch.description)
    if [ $branch == $current ]; then
      branch="* \033[0;32m$branch\033[0m"
     else
       branch="  $branch"
     fi
     echo -e "$branch \033[0;36m$desc\033[0m"
  done
}

Esto es lo que gbparece, mostrado aquí como texto en caso de que la imagen se pudra:

$ gb
* logging Log order details.  Waiting for clarification from business.
  master 
  sprocket Adding sprockets to the parts list.  Pending QA approval.

Y como imagen, para que puedas ver los colores:

ingrese la descripción de la imagen aquí


¿Cómo es esto diferente de la respuesta aceptada (publicada más de un año antes)?
Peter Mortensen el


28

Lo READMEsugerido por Chris J puede funcionar, siempre que esté configurado con un controlador de fusión personalizado definido en a.gitattribute .
De esa manera, la versión local de la READMEsiempre se conserva durante las fusiones.

La "descripción" de las ramas también se conoce como un "comentario" asociado con esos metadatos, y no es compatible.

Al menos, con un READMEarchivo, puede, para cualquier rama, hacer:

$ git show myBranch:README

Si su archivo README se encuentra en el directorio raíz de su REPO, funcionará desde cualquier ruta, ya que la ruta utilizada por git showes absoluta desde el directorio superior de dicho repositorio.


3
¿Todos los miembros del equipo deben ser conscientes de esto y establecerlo en su atributo .gitat individualmente si lo desean? Si es así, me parece que esto sería difícil de manejar, y las posibilidades de que la gente realmente lo haga sería escasa.
Don Hatch

@DonHatch: normalmente verifica el .gitattributesarchivo en su repositorio, por lo que no, simplemente funcionaría para todos. Desafortunadamente, esto no parece funcionar cuando se fusiona a través de algunas interfaces basadas en web, por ejemplo, cuando se usan solicitudes de extracción en Azure DevOps.
Soren Bjornstad

19

Aquí hay dos sugerencias populares:

  1. git branch --edit-description: No nos gusta esto porque no puedes presionarlo. Tal vez puedo recordar lo que hacen las ramas que creé, pero mi equipo no puede.
  2. READMEarchivo pr. rama. Esto es un dolor durante las fusiones: es muy propenso a fusionar conflictos y nos retiraremos READMEde las ramas cuando fusionamos ramas de características. Las diferencias entre las ramas también son un dolor.

Hemos decidido crear una branches-readmerama huérfana . Las ramas huérfanas son ramas con su propia historia separada; puedes conocerlas de las gh-pagesramas de Github . Esta rama huérfana contiene un solo READMEarchivo. Tiene contenidos como:

master:
    The default branch
mojolicious:
    Start using Mojolicious
branch-whatever:
    Description of the whatever branch

Es empujable y fácil de combinar. Ver READMEdesde cualquier sucursal con:

git show branches-readme:README

Las desventajas son que debe pagar la rama huérfana extraña cuando desea actualizar el READMEy elREADME no se actualiza automáticamente a medida que las ramas cambian de nombre, van o vienen. Sin embargo, eso está bien para nosotros.

Hazlo como:

git checkout --orphan branches-readme
# All the files from the old branch are marked for addition - skip that
git reset --hard
# There are no files yet - an empty branch
ls
vi README
# put in contents similar to above
git add README
git commit -m "Initial description of the branches we already have"
git push origin branches-readme
# get all your original files back
git checkout master

De manera similar, los miembros individuales del equipo también pueden crear sus propios branches-$user ramas huérfanas describiendo sus propias ramas privadas si lo desean, siempre que no los empujen al equipo.

Con herramientas adicionales esto también podría integrarse con la salida de git branch. Con ese fin, tal vez README.yamlpodría considerarse un archivo en lugar de un simple README.


Uno podría tener el archivo README en master. Eso agregaría desorden pero siempre estará accesible.
Peter - Restablece a Mónica el

2
@ PeterA.Schneider: Claro, pero luego agregar una nueva rama requeriría un compromiso para master aunque el cambio no tenga nada que ver con master. Además, cuando se bifurca de master, tendrá una copia de README en todas las ramas, lo cual es un desastre.
Peter V. Mørch

10
git config --global --add alias.about '!describe() { git config branch."$1".description; }; describe'

El comando definirá una opción global alias.aboutcomo expresión de shell. Si se ejecuta git about <branch>en un repositorio, se mostrará la descripción de la rama si está establecida.


44
¡Gracias! Lo cambié para que solo mire la rama en la que estoy -"!describe() { git config branch.\"$(git symbolic-ref --short -q HEAD)\".description; }; describe"
ago

1
@aug - Tenía que dejar las barras diagonales delante de las citas de los argumentos para que esto funcione:git config --global --add alias.about '!describe() { git config branch."$(git symbolic-ref --short -q HEAD)".description; }; describe'
Tom Tresansky

5

Aquí hay una posible implementación del git branchescomando al que Greg Hewgill aludió:

#!/usr/bin/perl

sub clean {
    map { s/^[\s\*]*\s// } @_;
    map { s/\s*$// } @_;
    return @_;
}

sub descr {
    $_ = `git config branch.@_.description`;
    s/\s*$//;
    return $_;
};
sub indent {
    $_ = shift;
    s/^/      /mg;
    return $_;
};

my @branches = clean `git branch --color=never --list`;
my %merged = map { $_ => 1 } clean `git branch --color=never --merged`;

for my $branch (@branches) {
    my $asis = `git branch --list --color=always $branch`;
    $asis =~ s/\s*$//;
    print "  $asis";
    print " \033[33m(merged)\033[0m" if ($merged{$branch} and $branch ne "master");
    print "\n";

    print indent descr $branch;
    print "\n";
    print "\n";
}

4

Aquí hay una git aliasque le permite establecer y leer descripciones en la rama actual:

git config --global --add alias.about '!describe() { msg="$1"; git config branch."$(git rev-parse --abbrev-ref HEAD)".description ${msg:+"$msg"}; }; describe'

Uso / ejemplos:

(develop) $ git about
(develop) $ git about message
(develop) $ git about
message
(develop) $ git about "this is a new message"
(develop) $ git about
this is a new message
(develop) $ git checkout -b test_branch
Switched to a new branch 'test_branch'
(test_branch) $ git about
(test_branch) $ git about "this is the test branch"
(test_branch) $ git about
this is the test branch
(test_branch) $ git checkout -
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
(develop) $ git about
this is a new message

Un agradecimiento especial a @Felicio por la respuesta que me ayudó a comenzar.


¡Agradable! ¿Se puede compilar a shell o ohmyzsh?
mqliutie

2

Puede adjuntar comentarios a las etiquetas:

git tag -m 'this was a very good commit' tag1

Por convención, podría tener etiquetas relacionadas con los nombres de sus sucursales o podría usar la etiqueta -f para mantener una etiqueta comentada al frente de las ramas de sus temas.


13
esto no es ideal porque no rastrea al jefe de la sucursal
AndyL

1

Digamos que quieres crear una rama

git branch branch-20200328
git notes add branch-20200328 -m "This branch is for whatever"
git notes show branch-20200328

0

Estoy bastante seguro de que esa característica no es compatible actualmente. Creo que su mejor opción es crear un archivo de texto descriptivo, un archivo README básicamente, en la rama que tenga la información que desea.


44
Me tendría que preocupar por (no) fusionar este archivo en todas las ramas. Yo no?
Noufal Ibrahim

1
@KaspervandenBerg: Tal vez solo deje un comentario en lugar de sacar la tarjeta -1, luego espere un momento, y si el autor de la pregunta no está dispuesto a cambiar la publicación, pero ve que él / ella / él visitó este sitio mientras tanto, deletrearlo. ¿O se comprueba regularmente todas sus respuestas dadas a ver si todavía son correctos?
Sebastian Mach

1
@phresnel: buen punto; mi intención era ayudar a los futuros que formulan esta pregunta y tener buenas respuestas para ir arriba y las incorrectas para abajo, no era "castigar" a Chris J y hacer que pierda reputación. Lamentablemente, el sitio dice que mi voto está bloqueado :(.
Kasper van den Berg

1
@KaspervandenBerg: Fui un poco rápido para sospechar que castigabas, lo siento.
Sebastian Mach

0

La respuesta seleccionada me parece exagerada. Me inclinaría a mantener un archivo de descripción por sucursal que es un archivo normal controlada por la fuente, por ejemplo master.txt, dev.txt, etc, y si hay un número difícil de manejar o ramas que crearía una jerarquía a una mejor organizarlo.


66
Entonces tendría que preocuparse por fusionar estos archivos con cualquier otra rama, o recuerde usar el git show master:dev.txtque no es más simple que la respuesta seleccionada.
Sridhar Ratnakumar

0

Solo usa:

git config branch.<branch name>.description

Para dar crédito donde se debe: https://glebbahmutov.com/blog/git-branches-with-descriptions/


Esto se agregó en una versión de git que se lanzó después de agregar la pregunta. La respuesta aceptada menciona esto.
Noufal Ibrahim

Ah, sí. Se menciona en los comentarios.
Caleb Miller


-3

Utilizar

git branch --list -v

para mostrar una rama aguas arriba:

git branch --list -vv

Agregar -rpara mostrar solo controles remotos o -apara mostrar controles remotos y locales.


Por útiles que sean, estoy buscando algo personalizado. Una nota de algún tipo adjunta a una referencia.
Noufal Ibrahim

2
No muestra descripciones. Creo que esta respuesta es engañosa.
Pato Sandaña
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.