Descrizioni delle filiali in Git


282

C'è un modo in Git di avere una "descrizione" per i rami?

Mentre provo a usare nomi descrittivi, lavorare per un po 'su un singolo ramo a volte smorza la mia memoria del perché ho creato alcuni degli altri rami dell'argomento. Cerco di usare nomi descrittivi per i rami, ma penso che una 'descrizione' (breve nota sullo scopo del ramo) sarebbe gradita.


1
Ho avuto un problema simile . Uso quel file per documentare i rami e perché esistono (tra le altre cose).
themis

2
Questa sarebbe una caratteristica davvero utile. git branch -a potrebbe mostrare le descrizioni accanto ai nomi dei rami. Forse git notes supporterà le note sui rami e si impegna in futuro?
Jhabbott,

1
Le descrizioni delle filiali non possono essere inviate, quindi sono piuttosto inutili a meno che tu non voglia inviare messaggi a te stesso.
Nurettin,

@nurettin Vero ma la mia richiesta era comunque per cose private. Volevo solo ricordare perché ho tagliato il ramo.
Noufal Ibrahim,

Risposte:


200

Git 1.7.9 supporta questo. Dalle note di rilascio 1.7.9 :

 * "git branch --edit-description" può essere usato per aggiungere un testo descrittivo
   per spiegare di cosa tratta un argomento.

Puoi vedere quella funzione introdotta a settembre 2011, con commit 6f9a332 , 739453a3 , b7200e8 :

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

--edit-description::

Apri un editor e modifica il testo per spiegare a cosa serve il ramo, da utilizzare con vari altri comandi (ad es request-pull.).

Si noti che non funzionerà per un ramo HEAD distaccato.

Tale descrizione viene utilizzata dallo script request-pull: consultare commit c016814783 , ma anche git merge --log.

request-pull è uno script utilizzato per riepilogare le modifiche tra due commit nell'output standard e include l'URL specificato nel riepilogo generato.

[Da @AchalDave] Sfortunatamente, non puoi inviare descrizioni poiché sono archiviate nella tua configurazione, rendendola inutile per il bene di documentare i rami in una squadra.


17
@Owen: L'unico modo che conosco al momento è usare git config branch.topic.descriptionper mostrare la descrizione per il ramo topic. È memorizzato nel .git/configfile.
Greg Hewgill,

12
@GregHewgill Grazie. Con alcuni alias non è in realtà un brutto modo di vederlo. Ora, se solo git branchmostrasse le descrizioni nell'elenco ...
Owen,

4
Al momento, l'essenza citata nel commento precedente non sembra essere disponibile, ma questo sembra essere simile: gist.github.com/carlosayam/5316969
pfalcon

166
Sfortunatamente, non puoi inviare descrizioni poiché sono archiviate nella tua configurazione, rendendola inutile per il bene di documentare i rami in una squadra.
Achal Dave

2
@PedroRodrigues purtroppo il tuo collegamento
fisico

40

Se non finisce per utilizzare il file README, creare un alias Git che modificano git checkoutin modo che il README viene visualizzata ogni volta che si accende rami.

Ad esempio, aggiungilo in ~ / .gitconfig, sotto [alias]

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

Successivamente, è possibile eseguire git cor <branch_name>per cambiare ramo e visualizzare il file README del ramo in cui si sta passando.


Per me la variabile $ 1 non funziona - non contiene nulla. Non so perché (sto usando la versione 1.7.11-msysgit.1). Sto usando $ 0 invece. E va tutto bene.
shytikov,

@shytikov per gli alias git che usano argomenti, per la portabilità, io uso una funzione rapida invece di " sh -c"; per esempio,. alias = "!f() { git checkout "${1}" && cat README.md; }; f" (parentesi e virgolette non necessarie in questo caso, incluse solo per completezza nel caso in cui siano necessarie per qualcosa di più complicato.)
michael

@michael_n il tuo alias, è un alias bash o un alias git
UpAndAdam

L'unico problema è che se README non si trova nella cartella in cui ci si trova al momento del checkout, si lamenta.
UpAndAdam

@UpAndAdam è un alias git, definito in ~/.gitconfig, under [alias], e il nome dell'alias è in effetti (e comprensibilmente confuso) chiamato aliasdal mio attuale config (avrei dovuto rinominarlo corper questo esempio per essere coerente). Il mio vero aliasalias è: alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f" Utilizzo: git alias {alias_name}o git alias {alias_regexp}. Analogamente al aliascomando bash , ad esempio, $ alias llrese (per me) alias ll='ls -l':; e $ git alias brrendimenti: alias.br branch -v --list(potrebbe anche usare: $ git alias 'b.*')
michael

31

Utilizzare git branch --edit-descriptionper impostare o modificare una descrizione del ramo.

Ecco una funzione shell per mostrare rami simili git branchma con descrizioni allegate.

# 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
}

Ecco come gbappare, mostrato qui come testo nel caso in cui l'immagine marcisca:

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

E come immagine, così puoi vedere i colori:

inserisci qui la descrizione dell'immagine


In che modo differisce dalla risposta accettata (pubblicata più di un anno prima)?
Peter Mortensen,


28

Il READMEsuggerito da Chris J può funzionare, purché sia ​​configurato con un driver di unione personalizzato definito in a.gitattribute .
In questo modo, la versione locale di READMEviene sempre conservata durante le fusioni.

La "descrizione" per i rami è anche conosciuta come un "commento" associato a quei metadati e non è supportato.

Almeno, con un READMEfile, puoi, per qualsiasi ramo, fare un:

$ git show myBranch:README

Se il tuo README si trova nella directory principale del tuo REPO, funzionerà da qualsiasi percorso, poiché il percorso utilizzato da git showè assoluto dalla directory superiore di detto repository.


3
Tutti i membri del team devono esserne consapevoli e impostarlo singolarmente nel proprio .gitattribute se lo desiderano? Se è così, mi sembra che questo sarebbe difficile da gestire, e le possibilità che la gente lo faccia davvero sarebbero ridotte.
Don Hatch,

@DonHatch: normalmente controlli il .gitattributesfile nel tuo repository, quindi no, funzionerebbe solo per tutti. Questo purtroppo non sembra funzionare quando si fondono attraverso alcune interfacce basate sul Web, ad esempio quando si usano richieste pull in Azure DevOps.
Soren Bjornstad,

19

Ci sono due suggerimenti popolari qui:

  1. git branch --edit-description: Non ci piace perché non puoi spingerlo. Forse riesco a ricordare cosa fanno i rami che ho creato, ma la mia squadra sicuramente non può.
  2. READMEfile pr. ramo. Questo è un dolore durante le fusioni: super-incline a unire i conflitti e ci uniremo READMEdai rami quando uniremo i rami delle caratteristiche. Anche le differenze tra i rami sono un dolore.

Abbiamo deciso di creare un branches-readmeramo orfano . I rami orfani sono rami con una loro storia separata - potresti conoscerli dai gh-pagesrami di Github . Questo ramo orfano contiene un singolo READMEfile. Ha contenuti come:

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

È a portata di mano e si adatta alla fusione. Visualizza READMEda qualsiasi ramo con:

git show branches-readme:README

Gli svantaggi sono che è necessario verificare lo strano ramo orfano quando si desidera aggiornare READMEe READMEnon si aggiorna automaticamente quando i rami vengono rinominati, vengono o vanno. Per noi va bene.

Fallo come:

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

Allo stesso modo, i singoli membri del team possono anche creare i propri branches-$userrami orfani descrivendo i propri rami privati ​​se lo desiderano, purché non li spingano al team.

Con ulteriori strumenti questo potrebbe anche essere integrato con l'output di git branch. A tal fine, forse un README.yamlfile potrebbe essere considerato al posto di un semplice README.


Uno potrebbe avere il README in master. Ciò aggiungerebbe disordine ma sarebbe sempre accessibile.
Peter - Ripristina Monica l'

2
@ PeterA.Schneider: Certo, ma aggiungere un nuovo ramo richiederebbe un commit da padroneggiare anche se la modifica non ha niente a che fare con il padrone. Inoltre, quando si dirama dal master, avrai una copia del README in tutti i rami, che è un casino.
Peter V. Mørch,

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

Il comando definirà un'opzione globale alias.aboutcome espressione shell. L'esecuzione git about <branch>in un repository visualizzerà la descrizione del ramo se impostata.


4
Grazie! L'ho cambiato in modo che sembra proprio presso la filiale sono su -"!describe() { git config branch.\"$(git symbolic-ref --short -q HEAD)\".description; }; describe"
Agosto

1
@aug - Ho dovuto lasciare cadere le barre rovesciate di fronte alle citazioni dell'argomento per farlo funzionare:git config --global --add alias.about '!describe() { git config branch."$(git symbolic-ref --short -q HEAD)".description; }; describe'
Tom Tresansky,

5

Ecco una possibile implementazione del git branchescomando a cui Greg Hewgill ha accennato:

#!/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

Ecco una git aliasche ti consente sia di impostare e leggere le descrizioni sul ramo corrente:

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

Uso / Esempi:

(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 ringraziamento speciale a @Felicio per la risposta che mi ha fatto iniziare.


Bello! Può essere compilato per shell o ohmyzsh?
mqliutie,

2

È possibile allegare commenti ai tag:

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

Per convenzione, potresti avere tag relativi ai nomi delle tue filiali oppure puoi usare tag -f per mantenere un tag commentato all'inizio dei rami dell'argomento.


13
questo non è l'ideale perché non traccia la testa del ramo
AndyL

1

Di 'che vuoi creare un ramo

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

0

Sono abbastanza sicuro che questa funzione non sia attualmente supportata. Penso che la soluzione migliore sia quella di creare un file di testo descrittivo, in pratica un file README, nel ramo che contiene le informazioni desiderate.


4
Dovrei preoccuparmi di (non) unire questo file tra i vari rami. No?
Noufal Ibrahim,

1
@KaspervandenBerg: forse lascia un commento invece di tirare fuori la carta -1, quindi aspetta un po 'di tempo, e se il richiedente non è disposto a cambiare il post, ma vedi che nel frattempo ha visitato questo sito, Fai lo spelling. O si controllare regolarmente tutte le risposte date per vedere se sono ancora corretti?
Sebastian Mach,

1
@phresnel: buon punto; la mia intenzione era di aiutare i futuri richiedenti di questa domanda e di avere buone risposte in alto e quelle errate in fondo, non era di "punire" Chris J e fargli perdere la reputazione. Purtroppo il sito dice che il mio voto è bloccato :(.
Kasper van den Berg,

1
@KaspervandenBerg: sono stato un po 'veloce a sospettare che tu abbia punito, scusa.
Sebastian Mach,

0

La risposta selezionata mi sembra eccessiva. Sarei propenso a mantenere un file di descrizione per ogni ramo che è un normale file di origine controllata, per esempio master.txt, dev.txte così via, e se v'è un numero ingombrante o rami mi piacerebbe creare una gerarchia per meglio organizzarla.


6
Quindi dovresti preoccuparti di unire questi file ad ogni altro ramo, o ricordati di usare ciò git show master:dev.txtche non è più semplice della risposta selezionata.
Sridhar Ratnakumar,

0

Usa solo:

git config branch.<branch name>.description

Per dare credito quando è dovuto il credito: https://glebbahmutov.com/blog/git-branches-with-descriptions/


Questo è stato aggiunto in una versione di git rilasciata dopo che ho aggiunto la domanda. La risposta accettata menziona questo.
Noufal Ibrahim,

Ah sì. È menzionato nei commenti.
Caleb Miller,


-3

Uso

git branch --list -v

per mostrare un ramo a monte:

git branch --list -vv

Aggiungi -rper mostrare solo telecomandi o -aper mostrare telecomandi e locali.


Per quanto utili, sto cercando qualcosa di personalizzato. Una nota di qualche tipo allegata a un riferimento.
Noufal Ibrahim,

2
Non mostra descrizioni. Penso che questa risposta sia fuorviante.
Pato Sandaña,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.