Come posso impedire a 'git diff' di usare un cercapersone?


640

C'è un'opzione da riga di comando a cui passare git diffe altri comandi che utilizzano il lesscercapersone per impostazione predefinita?

So di poterlo reindirizzare a cat, ma ciò rimuove l'evidenziazione di tutta la sintassi.

So di poter impostare il cercapersone nel .gitconfig globale su cat GITPAGER=cat(o qualcosa del genere); ma a volte voglio avere un cercapersone (a seconda della dimensione del diff).

Preferirei un'opzione della riga di comando se ce n'è una; e non riesco a trovarne uno, sfogliando le pagine man.


16
Nota: core.pager 'less -+F -+X'sarebbe un modo più recente per rimuovere quelle opzioni. Vedi la mia risposta qui sotto .
VonC,

"less - + F - + X" è l'impostazione magica per rimuovere i fastidiosi marcatori "... saltando ..." nei registri lunghi. Grazie mille per queste opzioni, mi hai salvato la giornata!
Guillaume Perrot,


Vedi la domanda correlata sull'uso lessdi git (varia in base alla lessversione): unix.stackexchange.com/questions/107315/…
Pierz,

Risposte:


691

--no-pagera Git gli dirà di non usare un cercapersone. Passando l'opzione -Fsu lessdirai di non pagina se l'output si adatta in una singola schermata.

Uso:

git --no-pager diff

Altre opzioni dai commenti includono:

# Set an evaporating environment variable to use 'cat' for your pager
GIT_PAGER=cat git diff

# Tells 'less' not to paginate if less than a page
export LESS="-F -X $LESS"
# ...then Git as usual
git diff

3
Grazie, immagino di poter alias git --no-pager per gitc in .bashrc, giusto?
Lakshman Prasad,

42
Oppure usa le variabili d'ambiente GIT_PAGER o PAGER o la variabile core.pagergit config.
Jakub Narębski,

74
Tieni presente che devi aggiungere --add-pager prima del tuo comando, come in "git --no-pager log --format = blah"
Ana Betts,

6
Inoltre, se il tuo terminale cancella lo schermo dopo essere uscito meno, ti consigliamo di aggiungere -Ealle tue lessopzioni per renderlo -Futilizzabile.
mgalgs

9
Si noti che se si desidera includere --no-pagerin un alias, è necessario prefisso il comando con essa, e per evitare un errore, è necessario creare un alias come questo: git config alias.foo '!git --no-pager foo'. Un po 'confuso. Il semplice aliasing '--no-pager foo'non funzionerà.
Jim Stewart,

272

Come menzionato in una risposta precedente, passare l' -Fopzione lessper chiuderla se il contenuto è inferiore a una schermata. Tuttavia, dopo averlo fatto, lo schermo viene ripristinato e si finisce per non vedere il contenuto.

L' -Xopzione elimina questo comportamento. Quindi, utilizzo quanto segue per abilitare il paging condizionale in base alla quantità di contenuto:

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

46
Nota: ho dovuto usare git config --global --add core.pager "less -F -X"in git 1.8.0.2, quello sopra non funzionava.
Dogbert,

7
Grande! Anche per farlo comportare così non solo con git ma tutti i programmi aggiungono qualcosa di simile export LESS="-RFX"al tuo .bashrco.zshrc
defhlt

Grazie per questo; Sono stato afflitto da un'opzione in cui git troncava la prima riga dall'output, e quindi usciva dalla sincronizzazione in modo tale che scendere su una riga e poi su una riga causasse che la prima riga del corretto occupasse la parte superiore, seguito dalla terza riga dall'output corretto. Ad ogni modo, specificando questa opzione è stato risolto il problema. Così bizzarro.
Tim Harper,

Se si utilizza Git per Windows (che utilizza meno software Greenwood), il parametro necessario è -E (fonte: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward

1
Sì, come ho spiegato nella mia risposta, preferisco che la schermata non venga ripristinata prima e dopo l'avvio e la chiusura del cercapersone, soprattutto se tutto si adatta a una schermata, che è esattamente ciò che -Xfa. Non usarlo se non ti piace. Mi piace perché in questo modo posso fare riferimento a cose come git SHAs guardando il risultato dei precedenti comandi git nella mia storia senza dover digitare nuovamente il comando. Ognuno per se stesso.
Ishaaq,

169

Uso

git config --global core.pager cat

per sbarazzarsi di un cercapersone per tutti i comandi per tutti i repository.

Puoi anche disabilitare il paging per i singoli sottocomandi Git usando pager.<cmd>setting invece di core.pager, e puoi cambiare le tue impostazioni per repository Git (ometti --global).

Vedi man git-confige cerca i pager.<cmd>dettagli.


La domanda non era come disabilitare del tutto il cercapersone ma come disabilitarlo per il sottocomando grep. la risposta di mtahmed è perfetta.
TilmanBaumann,

9
Questo potrebbe essere ciò che la spiegazione estesa ha chiesto, ma questo è quello che stavo cercando ed è stato uno dei migliori risultati di Google, quindi grazie @geekQ
Brian F Leighty,

70

Le recenti modifiche apportate alla documentazione menzionano un modo diverso di rimuovere un'opzione predefinita per less(essere "opzioni predefinite"FRSX ).

Per questa domanda, questo sarebbe (git 1.8+)

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

Ad esempio, Dirk Bester suggerisce nei commenti :

export LESS="$LESS -FRXK" 

così che divento colorato con Ctrl-Cquit da less.

Wilson F menziona nei commenti e nella sua domanda che:

meno supporta lo scorrimento orizzontale, quindi quando le linee vengono troncate, meno disabilita la schermata di chiusura in modo che l'utente possa ancora scorrere il testo a sinistra per vedere cosa è stato tagliato.


Tali modifiche erano già visibili in git 1.8.x, come illustrato in " Usa sempre il cercapersone pergit diff " (vedere i commenti). Ma la documentazione è appena stata riformulata ( per git 1.8.5 o 1.9, Q4 2013 ).

Visualizzatore di testo per l'uso da parte dei comandi Git (ad esempio, "meno").
Il valore deve essere interpretato dalla shell.

L'ordine di preferenza è:

  • il $GIT_PAGER variabile d'ambiente,
  • poi core.pager configurazione,
  • poi $PAGER ,
  • e quindi il valore predefinito scelto al momento della compilazione (di solito "meno").

Quando la LESSvariabile d'ambiente non è impostata, Git la imposta su FRSX
(se LESSla variabile d'ambiente è impostata, Git non la modifica affatto).

Se si desidera sostituire selettivamente l'impostazione predefinita di Git per LESS, è possibile impostare core.pagerad esless -+S .
Questo sarà passato alla shell da Git, che tradurrà il comando finale in LESS=FRSX less -+S. L'ambiente dice al comando di impostare l' Sopzione per tagliare le linee lunghe, ma la linea di comando la reimposta sul valore predefinito per piegare le linee lunghe.


Vedi commit 97d01f2a per il motivo dietro la nuova formulazione della documentazione:

config: riscrivi la core.pagerdocumentazione

Il testo menziona core.pagere GIT_PAGERsenza dare il quadro generale della precedenza. Prendi in prestito una descrizione migliore dalla git var(1) documentazione.

L'uso del meccanismo per consentire i file di configurazione a livello di sistema, globale e per repository non è limitato a questa particolare variabile. Rimuovilo per chiarire il paragrafo.

Riscrivi la parte che spiega come la variabile di ambiente LESSè impostata sul valore predefinito di Git e come personalizzarla in modo selettivo.


Nota: commit b327583 ( Matthieu Moymoy , aprile 2014, per git 2.0.x / 2.1, Q3 2014) rimuoverà la S di default:

cercapersone: rimuovere 'S' da $ LESS per impostazione predefinita

Per impostazione predefinita, Git utilizzato per impostare $LESSper -FRSXse $LESSnon è stato impostato dall'utente.
Le FRXbandiere in realtà hanno senso per Git ( Fe Xperché a volte l'output delle pipe di Git su short è corto, e Rperché le pipe di Git hanno un output colorato).
Il Sflag (chop long line), d'altra parte, non è correlato a Git ed è una questione di preferenza dell'utente. Git non dovrebbe decidere che l'utente cambi LESSle impostazioni predefinite .

Più specificamente, il Sflag danneggia gli utenti che esaminano il codice non attendibile all'interno di un cercapersone, poiché una patch appare come:

-old code;
+new good code; [... lots of tabs ...] malicious code;

sembrerebbe identico a:

-old code;
+new good code;

Gli utenti che preferiscono il vecchio comportamento possono comunque impostare -FRSXesplicitamente la variabile d'ambiente $ LESS su , oppure impostare core.pager su ' less -S'.

La documentazione leggerà:

L'ambiente non imposta l' Sopzione ma la riga di comando sì, indicando meno di troncare le linee lunghe.
Allo stesso modo, l'impostazione core.pagersu less -+Fdisattiverà l' Fopzione specificata dall'ambiente dalla riga di comando, disattivando il quit if one screencomportamento " " di less.
È possibile attivare in modo specifico alcuni flag per comandi particolari: ad esempio, l'impostazione pager.blameper less -Sabilitare il troncamento di linea solo per git blame.


2
Grazie grazie! Ho cercato un modo per fare in modo che git smettesse di tagliare lunghe file per i MESI!
coredumperror,

@CoreDumpError note: il prossimo Git (2.0.X o 2.1) non taglierà la linea di default ! Vedi la mia risposta modificata sopra.
VonC,

2
Grazie. Questo mi permette di capire che voglio esportare LESS = "$ LESS -FRXK" in modo da ottenere una differenza di colore con ctrl-c uscire da less.
Dirk Bester,

@DirkBester Suggerimento interessante. L'ho incluso nella risposta per una maggiore visibilità.
VonC

1
@WilsonF Non lo so, ma sembra una buona domanda: perché non farne una domanda invece di lasciarla qui, sepolta nei commenti?
VonC,

58

È possibile disabilitare / abilitare i cercapersone per output specifici anche nella configurazione globale:

git config --global pager.diff false

O per impostare l'opzione core.pager, basta fornire una stringa vuota:

git config --global core.pager ''

Secondo me è meglio che impostarlo catcome dici tu.


Questo è ciò che ha funzionato per me su Git 1.9 ... tutto il resto non ha funzionato.
Jordon Bedwell,

Questo è quello che ha funzionato per megit version 2.5.4 (Apple Git-61)
Ashley Coolman,

Questo è quello che volevo perché altri comandi disabilitano completamente il cercapersone, ma questa è l'unica risposta che disabilita solo git diffmentre lo fa funzionare per altri comandi
SingleNegationElimination

al momento della stesura di questo ... su Windows / PowerShell ho dovuto modificare manualmente code "$($env:UserProfile)\.gitconfig"e aggiungere pager = sotto le [core]impostazioni. La risposta ha funzionato per la mia attuale sessione PowerShell ma non sembrava salvare l'impostazione da nessuna parte, quindi era efficace al prossimo lancio.
Nessun rimborso Nessun

12

Per quanto riguarda il colore disabilitato durante il piping:

Utilizzare --colorper evitare che la colorazione sia disabilitata.

git diff --color | less -R

O configurarlo forzato (ad esempio in .gitconfig):

[color]
        ui = on

git diff | less -R

Per strumenti non colorati, quindi utilizzare:

git diff --no-color | some-primitive-tool

L'esportazione della variabile di ambiente LESS=-R(ad esempio .bashrc) attiva il supporto colore per impostazione predefinita in "less":

git diff | less


2
Nota che git imposterà la LESSvariabile d'ambiente su FRSXquando chiama il cercapersone, se non è impostato.
Tobbez,

10

Questo ha funzionato per me con Git versione 2.1.4 su Linux:

git config --global --replace-all core.pager cat

Questo fa usare Git catinvece di less. catscarica l'output diffsullo schermo senza effettuare il paging.


In generale, le risposte sono molto più utili se includono una spiegazione di ciò che il codice è destinato a fare e perché risolve il problema senza introdurre altri. (Questo post è stato segnalato da almeno un utente, presumibilmente perché pensavano che una risposta senza spiegazioni dovesse essere cancellata.)
Nathan Tuggy,

3
@NathanTuggy Ho pensato che fosse abbastanza chiaro che stavo rispondendo alla domanda posta. Sembra che ad alcuni utenti piaccia andare in giro segnalando brevi risposte per divertimento. Aggiungerò del testo.
jcoffland,

7

È possibile aggiungere un alias a diff con il proprio cercapersone con pager.alias, in questo modo:

[alias]
  dc = diff
  dsc = diff --staged
[pager]
  dc = cat
  dsc = cat

Ciò manterrà il colore acceso e utilizzerà 'cat' come cercapersone quando viene invocato a 'git dc'.

Inoltre, cose da non fare:

  • utilizzare --no-pagernel tuo alias. Git (1.8.5.2, Apple Git-48) si lamenterà che stai cercando di modificare l'ambiente.
  • usa una shell con !sho !git. Questo eviterà l'errore di ambiente, sopra, ma ripristinerà la tua directory di lavoro (ai fini di questo comando) sulla directory Git di livello superiore, quindi eventuali riferimenti a un file locale non funzioneranno se sei già in una sottodirectory di il tuo repository.

+1 Questa tecnica è utile quando si desidera navigare dopo il commit git logma non git log --oneline. Utilizzare pager.log = less -FXR +/^commit.*, mentre si utilizza il caso speciale l' --onelineopzione con alias.l1 = log --onelinee pager.l1 = less -FXR.
Claudio,

6

Ho questo pezzo nel mio .gitconfige sembra funzionare bene (disabilitato sia per diff che per show):

[pager]
    diff = false
    show = false

5

Mi piace disabilitare il paging di volta in volta, quando so che l'output non è molto lungo. Per questo, ho trovato un trucco accurato usando gli alias Git:

git config --global --add alias.n '!git --no-pager'

Oppure aggiungi quanto segue alla [alias]sezione di ~ / .gitconfig:

n = !git --no-pager

Ciò significa che è possibile utilizzare il prefisso nper disattivare il paging per qualsiasi comando Git, ovvero:

git n diff # Show the diff without pager
git n log -n 3 # Show the last three commits without pager
git n show v1.1 # Show information about a tag

2

Per uno script veloce e sporco che ho scritto, l'ho fatto in questo modo:

PAGER=cat git diff ...

Questo non funzionerà se $GIT_PAGERimpostato. git --no-pagerfa lo stesso ma in modo più affidabile.
Matthieu Moy,

2

Come dice man git , puoi usare --no-pagerqualsiasi comando.

Lo uso su:

git --no-pager diff
git --no-pager log --oneline --graph --decorate --all -n 10

Quindi utilizzare un alias per evitare di usare (e ricordare) comandi lunghi.


2

Per Windows è:

git config --global core.pager ""

Questo disattiverà il paging per tutto git, incluso quello super fastidioso git branch.


Funziona anche con Linux!
rustysys-dev il

2

Se usi oh-my-zsh, nel ~/.oh-my-zsh/lib/misc.zshfile, commenta questa riga:

env_default 'LESS' '-R'

Ehi, penso che l'OP volesse avere un interruttore da riga di comando da usare una volta sola con git diff, piuttosto che una soluzione globale permanente. Inoltre, non so quanto sarebbe bello modificare il codice sorgente oh-my-zsh, dal momento che sarebbe difficile aggiornare oh-my-zsh in seguito. Meglio impostare quel valore predefinito sul tuo file .zshrc.
Karri Rasinmäki,

1
Grazie hai ragione. Se usi oh-my-zsh e hai bisogno di una soluzione globale permanente, puoi aggiungere unset LESSalla fine di .zshrc.
Pioggia lenta,

1

Di default git usa usa meno come cercapersone. Normalmente preferisco di più, in quanto stamperà la prima pagina e quindi ti permetterà di scorrere il contenuto.

Inoltre, al termine, il contenuto rimarrà nella console. Questo di solito è conveniente, poiché spesso vuoi fare qualcosa con il contenuto dopo la ricerca (ad esempio, invia un'email al commiter e digli che ha introdotto un bug nel suo ultimo commit).

Se si desidera quindi reindirizzare il contenuto, sarebbe scomodo scorrere per stampare tutto. La cosa buona con più è che sarai in grado di combinarlo con la pipeline e attraverserà tutto, ad es.

# Find the commit abcdef123 in the full commit history and read author and commit message
git log |grep -C 5 'abcdef123'

Fondamentalmente è tutto ciò di cui potresti aver bisogno, a meno che non desideri che il contenuto rimanga nella console una volta terminato. Per usare altro invece, fai come di seguito.

git config --global core.pager 'more'

0
git -P diff

O --no-pager .

A proposito: per preservare il colore con il gatto

git diff --color=always | cat

0

Segui le istruzioni seguenti.

  1. Digita il vi ~/.gitconfigtuo terminale.
  2. Incolla LESS="-F -X $LESS"linea.
  3. Premi :wqed entra.
  4. Riavvia il tuo terminale.
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.