Il comando Git Branch si comporta come 'meno'


415

Quando uso il git branchcomando per elencare tutti i rami, vedo l'output di git branch | less.

Il comando git branchdovrebbe mostrare un elenco di rami, come lsfa per i file.

Questo è l'output che ottengo:

Inserisci qui la descrizione dell'immagine

Come posso ottenere il comportamento predefinito di git branch? Cosa causa l'output di paging?

Sto usando ZSH con oh_my_zsh(niente per Git lì dentro), e il mio .gitconfigassomiglia a questo:

[user]
  email = myemail@mail.com
  name = Dennis Haegler
[push]
  default = simple
[merge]
   tool = vimdiff
[core]
  editor = nvim
  excludesfile = /Users/dennish/.gitignore_global
[color]
  ui = true
[alias]
  br = branch
  ci = commit -v
  cam = commit -am
  co = checkout
  df = diff
  st = status
  sa = stash
  mt = mergetool
  cp = cherry-pick
  pl = pull --rebase
[difftool "sourcetree"]
  cmd = opendiff \"$LOCAL\" \"$REMOTE\"
[mergetool "sourcetree"]
  cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh 
  \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
  trustExitCode = true

Risposte:


738

Come menzionato nei commenti alla risposta di Mark Adelsberger , si è trattato di un cambiamento di comportamento predefinito introdotto in Git 2.16 .

È possibile disattivare l'output di paging per il git branchripristino per impostazione predefinita con l' pager.branchimpostazione di configurazione :

git config --global pager.branch false

128
Questa è una strana, strana decisione di fare default. Mi aspetto che i miei strumenti unix-y cli si comportino come semplici stupidi programmi che puoi concatenare se vuoi, ma immagino che la discussione sia per un altro sito.
Stragulus

7
@Stragulus Nota che il nuovo default non ti impedisce di concatenarti git branchcon qualcos'altro. Usando il rilevamento delle condotte, Git mostrerà l'elenco delle diramazioni su stdout all'interno dei comandi git branch > branches.txto git branch | wc -l.
Rory O'Kane,

3
@ RoryO'Kane ma con il cercapersone, ho un tipo in più ESC/qdopo un semplice git branchcontrollo.
mitnk,

23
@mitnk Non necessariamente. Se il tuo cercapersone lo è less, puoi aggiungere --no-init --quit-if-one-screenalla tua LESSvariabile d'ambiente, che causerà lesssemplicemente scrivere su stdout se il testo può essere visualizzato senza scorrere. Vedi man lessper maggiori dettagli.
Rory O'Kane,

13
Se vuoi aggiungerlo manualmente nel tuo file di configurazione, è [pager] branch = false(su due righe).
Sam,

56

Come sottolineato da altre risposte, per impostazione predefinita Git esegue il piping stesso in un cercapersone ( lessper impostazione predefinita) per la maggior parte dei comandi.

Un punto importante, tuttavia, è che quando la variabile di ambiente LESS non è impostata, Git la imposta su FRX , e la conseguenza è che il comportamento visibile all'utente è lo stesso che se il cercapersone non fosse usato quando l'output del comando è breve (ovvero se hai solo poche filiali). Vedi meno uomo :

-F o --quit-if-one-screen
Fa sì che meno esca automaticamente se l'intero file può essere visualizzato sulla prima schermata.

-R o --RAW-CONTROL-CHARS
[...] Le sequenze di escape "color" ANSI vengono emesse in forma "grezza".

-X o --no-init
Disabilita l'invio delle stringhe di inizializzazione e deinizializzazione del termcap al terminale. Questo è talvolta desiderabile se la stringa di deinizializzazione fa qualcosa di non necessario, come cancellare lo schermo.

Se ottieni il comportamento che descrivi, molto probabilmente ti sei $LESSimpostato su qualcos'altro, e disabilitandolo ( unset LESS) elimineresti il ​​problema mantenendo il comportamento "cercapersone" per un output lungo. In alternativa, puoi attivare il comportamento mantenendo così $LESScom'è aggiungendo questo al tuo .gitconfigfile:

[core]
    pager = less -FRX

Se non ti piace davvero il cercapersone, puoi disattivarlo a livello globale o in base al comando (vedi altre risposte).


40

Per non discutere della semantica, ma il comportamento che stai assumendo è l'impostazione predefinita. Ecco perché lo ottieni quando non chiedi qualcosa di diverso. Per impostazione predefinita, branch(e numerosi altri comandi Git) utilizzano un cercapersone quando si invia l'output al terminale.

Puoi ignorare questo valore predefinito usando l' --no-pageropzione:

git --no-pager branch

Oppure, se si reindirizza l'output su un file, Git dovrebbe rilevare che non sta scrivendo su un terminale e quindi non dovrebbe usare comunque un cercapersone. (D'altra parte, ciò suggerisce un caso d'uso di scripting, nel qual caso dovresti prendere in considerazione l'uso di un comando idraulico come git for-each-refpreferibilmente a git branch.)


git --no-pager branchlavori. Ma come è questo set? Solo la PAGERvariabile di ambiente è impostata su less. Questo non è il comportamento predefinito. Tutti i miei college hanno un output come un elenco stampato sul terminale.
DenniJensen,

Quale versione di Git stai usando? E quale stanno usando i tuoi colleghi?
Lasse V. Karlsen,

2.16.0! È questa una funzionalità introdotta per git in questa versione?
DenniJensen,

Sì, è predefinito ora. github.com/git/git/blob/master/Documentation/RelNotes/… Il mio college accanto a me usa la stessa versione e non ha questo problema :) thx @mark
DenniJensen

1
Questa è la risposta più eccellente qui, triste per il fatto che abbia così pochi voti, perché ho fatto un bel giro per trovare questo capolavoro.
codepleb,

26

Questo comportamento Git è stato sempre più fastidioso anche per me. Ho inserito la mia lista di tagless quando volevo solo elencare i tag, ad esempio.

È possibile controllare questo comportamento anche modificando Git PAGER predefinito in catinvece diless . Preferirei scorrere in iTerm piuttosto che in un editor. Mi piace usare l'editor quando voglio.

Così:

git config --global core.pager cat

2
Sì, questa dovrebbe essere una risposta valida per me
Tura

2
Grazie per il testa a testa. Lo ammetto dopo un paio di mesi di utilizzo, sto ancora usando cat, ma ad esempio quando lo faccio git logè fastidioso. Mi manca solo il comportamento originale, ma non ho avuto il tempo di migliorare il mio flusso di lavoro quotidiano in questa prospettiva.
ionescu77

Hai vinto! ... Perfetto!
sdlins,

2
Nota che questo vale anche per git log...
Bagerard,

10

Per coloro che vogliono aggiornare il proprio ~/.gitconfigper risolvere questo problema, sarebbe simile al seguente:

[pager]
   branch = false

cosa strana qui: questa impostazione funzionava e da alcuni giorni non è più, qualcosa è cambiato o la mia configurazione non è stata applicata?
ConquerorsHaki

@ConquerorsHaki Questa soluzione funziona per me con git v2.17.1 Prova git config --list --show-origina eseguire il debug di quali impostazioni sono / non sono impostate per te / il tuo sistema e da dove ( stackoverflow.com/q/12254076/1590950 ).
indivisibile

7

Il comando Git Branch si comporta come 'meno'

Perché Git di default apre l'output nel cercapersone (almeno in Ubuntu). La risposta accettata sostituirà completamente il cercapersone, che potrebbe non piacerti se l'output è molto lungo.

Consiglierei di sostituire il cercapersone con less, in modo che non "scorri" le uscite in modo inferiore all'altezza del terminale.

git config --global --replace-all core.pager "less -F -X"


2

La risposta accettata sembra sbagliata. Ci sono due problemi:

  1. Il comportamento è in realtà diverso tra bash (configurato per impostazione predefinita) e zsh. Il "problema" si presenta solo sotto zsh.
  2. La soluzione suggerita git branchnon farà sempre uso di un cercapersone, che non sarà desiderato quando c'è molto output.

Il vero motivo è che bash e zsh hanno diverse definizioni predefinite su LESS: bash non definisce nulla, mentre zsh lo definisce -R. Quando io facciounset LESS in zsh, tutto torna alla normalità ....

Il -Rcomportamento può ancora essere desiderato. In tal caso, puoi aggiungere le seguenti istruzioni al tuo .zshrc per far funzionare tutto:

export LESS=-FRX

-F'causa la chiusura automatica di meno se l'intero file può essere visualizzato sulla prima schermata'. Tuttavia, -Xdeve essere specificato contemporaneamente, altrimenti non verrà mostrato alcun output quando c'è meno di una schermata di output.


0

https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables

GIT_PAGER controlla il programma utilizzato per visualizzare l'output di più pagine sulla riga di comando. Se questo non è impostato, PAGER verrà utilizzato come fallback.

Per risolvere il problema, è possibile annullare l'impostazione di PAGER e GIT_PAGER nella shell.


1
Il problema non impostato PAGER( GIT_PAGERera non impostato) è ancora presente. Ci sono dei posti in cui devo controllare questo ambiente?
DenniJensen,

@DenniJensen È possibile impostare il cercapersone sul comando come PAGER= git branch(con uno spazio dopo e nessuno prima del segno uguale esattamente come scritto). Nessuna idea, se è meglio di es git branch | cat.
Maaartinus

-1

Ho avuto lo stesso problema git statuse git config --global pager.status falserisolvo anche quello.

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.