Jak zapobiec używaniu pagera przez „git diff”?

638

Czy istnieje przełącznik wiersza poleceń do przekazania git diffi inne polecenia lessdomyślnie korzystające z pagera?

Wiem, że mogę przesłać potokiem do kota, ale to usuwa wszystkie podświetlanie składni.

Wiem, że mogę ustawić pager w globalnym .gitconfig na cat przez GITPAGER=cat(lub coś takiego); ale czasami chcę mieć pager (w zależności od rozmiaru pliku różnicowego).

Ale wolałbym przełącznik linii poleceń, jeśli taki istnieje; i nie jestem w stanie go znaleźć, przeglądając strony podręcznika.

Lakshman Prasad
źródło
16
Uwaga: core.pager 'less -+F -+X'byłby nowszym sposobem na usunięcie tych opcji. Zobacz moją odpowiedź poniżej .
VonC
„mniej - + F - + X” to magiczne ustawienie do usuwania irytujących znaczników „... pomijanie ...” w długich kłodach. Wielkie dzięki za te opcje, uratowałeś mi dzień!
Guillaume Perrot
powiązane: stackoverflow.com/questions/12352049/…
Trevor Boyd Smith
Zobacz podobne pytanie dotyczące korzystania lessz git (zależy od lesswersji): unix.stackexchange.com/questions/107315/...
Pierz

Odpowiedzi:

688

--no-pagerGit powie, żeby nie używał pagera. Przechodząc opcję -Fdo lesspowie to, aby strona nie pasuje, jeśli wyjście w jednym ekranie.

Stosowanie:

git --no-pager diff

Inne opcje z komentarzy to:

# 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
Ignacio Vazquez-Abrams
źródło
3
Dzięki, myślę, że mogę alias git - no-pager do gitc w .bashrc, prawda?
Lakshman Prasad
42
Lub użyj zmiennych środowiskowych GIT_PAGER lub PAGER albo core.pagerzmiennej konfiguracyjnej git.
Jakub Narębski
74
Pamiętaj, że przed poleceniem musisz dodać --add-pager , jak w „git --no-pager log --format = blah”
Ana Betts
6
Ponadto, jeśli twój terminal wyczyści ekran po wyjściu z mniejszej liczby, będziesz chciał dodać -Edo lessopcji, aby był -Fużyteczny.
mgalgs,
9
Należy pamiętać, że jeśli chcesz dołączyć --no-pagerdo aliasu, trzeba poprzedzić komendę z nim, oraz w celu uniknięcia błędu, trzeba zrobić alias takiego: git config alias.foo '!git --no-pager foo'. Trochę mylące. Po prostu aliasing do '--no-pager foo'nie działa.
Jim Stewart,
271

Jak wspomniano w poprzedniej odpowiedzi, przekazanie -Fopcji lesspowoduje zamknięcie, jeśli zawartość jest mniejsza niż jeden ekran. Jednak po wykonaniu tej czynności ekran zostanie zresetowany i zawartość nie zostanie wyświetlona.

-XOpcja znosi tego zachowania. Korzystam z następujących opcji, aby włączyć stronicowanie warunkowe na podstawie ilości treści:

git config --global --replace-all core.pager "less -F -X"
ishaaq
źródło
46
Uwaga: musiałem użyć git config --global --add core.pager "less -F -X"git 1.8.0.2, powyższy nie działał.
Dogbert
7
Świetny! Również, aby export LESS="-RFX".bashrc.zshrc
działał
Dziękuję Ci za to; Prześladuje mnie opcja, w której git obciąłby pierwszą linię z wyjścia, a następnie zsynchronizował się tak, że przejście w dół o jedną linię, a następnie w górę o jedną linię spowoduje, że pierwsza linia poprawnego zajmie górę, a następnie trzeci wiersz z prawidłowego wyjścia. W każdym razie określenie tej opcji rozwiązało ten problem. Taki dziwny.
Tim Harper,
Jeśli używasz Git dla systemu Windows (który wykorzystuje mniej zbudowany przez Greenwood Software), potrzebny jest parametr -E (źródło: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward
1
Tak, jak wyjaśniłem w mojej odpowiedzi, wolę, aby ekran nie był resetowany przed i po uruchomieniu i zamknięciu pagera, szczególnie jeśli wszystko mieści się na jednym ekranie, co jest dokładnie tym, co -Xdziała. Nie używaj go, jeśli ci się nie podoba. Podoba mi się, ponieważ w ten sposób mogę odwoływać się do rzeczy takich jak git SHAs, patrząc na wynik poprzednich poleceń git w mojej historii bez konieczności ponownego wpisywania polecenia. Każdy według własnego uznania.
ishaaq
169

Posługiwać się

git config --global core.pager cat

pozbyć się pagera dla wszystkich poleceń dla wszystkich repozytoriów.

Możesz także wyłączyć stronicowanie dla pojedynczych komend Git, używając pager.<cmd>ustawienia zamiast core.pager, i możesz zmienić ustawienia dla repozytorium Git (pomiń --global).

Zobacz man git-configi wyszukaj pager.<cmd>szczegóły.

geekQ
źródło
Pytanie nie brzmiało jak całkowicie wyłączyć pager, ale jak to wyłączyć dla podkomendy grep. Odpowiedź mtahmeda jest idealna.
TilmanBaumann
9
Być może tego wymagało rozszerzone wyjaśnienie, ale tego właśnie szukałem i był to jeden z najlepszych wyników Google, dzięki dzięki @geekQ
Brian F Leighty
70

Ostatnie zmiany w dokumentacji wspominają o innym sposobie usuwania domyślnej opcji dla less(„domyślnymi opcjami” FRSX).

W przypadku tego pytania byłoby to (git 1.8+)

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

Na przykład Dirk Bester sugeruje w komentarzach :

export LESS="$LESS -FRXK" 

tak, że otrzymałem kolorową różnicę przy Ctrl-Crezygnacji z less.

Wilson F wspomina w komentarzach i swoim pytaniu, że:

mniej obsługuje przewijanie w poziomie, więc gdy linie są odcinane, mniej wyłącza wyjście z jednego ekranu, dzięki czemu użytkownik może nadal przewijać tekst w lewo, aby zobaczyć, co zostało obcięte.


Modyfikacje te były już widoczne w git 1.8.x, jak pokazano w „ Zawsze używaj pagera dlagit diff ” (patrz komentarze). Ale dokumentacja właśnie została przeredagowana ( dla git 1.8.5 lub 1.9, IV kw. 2013 ).

Przeglądarka tekstu do użytku przez komendy Git (np. „Mniej”).
Wartość ma być interpretowana przez powłokę.

Kolejność preferencji jest następująca:

  • $GIT_PAGERzmienna,
  • następnie core.pager konfiguracja,
  • następnie $PAGER ,
  • a następnie domyślny wybrany w czasie kompilacji (zwykle „mniej”).

Gdy LESSzmienna środowiskowa jest rozbrojona, Git ustawia ją na FRSX
(jeśli LESSzmienna środowiskowa jest ustawiona, Git w ogóle jej nie zmienia).

Jeśli chcesz selektywnie zastąpić domyślne ustawienie Git dla LESS, możesz ustawić core.pagernpless -+S .
To zostanie przekazane do powłoki przez Git, który przetłumaczy ostatnie polecenie LESS=FRSX less -+S. Środowisko nakazuje komendzie ustawienie Sopcji odcinania długich linii, ale linia poleceń resetuje ją do domyślnej opcji składania długich linii.


Zobacz commit 97d01f2a, aby poznać powód sformułowania nowej dokumentacji:

config: przepisz core.pagerdokumentację

Tekst wspomina core.pageri GIT_PAGERnie daje ogólnego obrazu pierwszeństwa. Pożycz lepszy opis z git var(1) dokumentacji.

Wykorzystanie mechanizmu umożliwiającego ogólnosystemowe, globalne i konfiguracyjne dla repozytorium pliki nie jest ograniczone do tej konkretnej zmiennej. Usuń go, aby wyjaśnić akapit.

Przepisz część, która wyjaśnia, w jaki sposób zmienna środowiskowa LESSjest ustawiona na wartość domyślną Git i jak ją selektywnie dostosowywać.


Uwaga: zatwierdzenie b327583 ( Matthieu Moymoy , kwiecień 2014 r., Dla git 2.0.x / 2.1, III kw. 2014) domyślnie usunie literę S:

pager: domyślnie usuwa „S” z $ LESS

Domyślnie Git ustawiał $LESSna -FRSXif, jeśli $LESSnie został ustawiony przez użytkownika.
Te FRXflagi faktycznie sens dla Git ( Fi Xdlatego czasami wyjście Git rury do mniej jest krótki, a Rponieważ rury Git kolorowe wyjście).
Z Sdrugiej strony flaga (przerywaj długie linie) nie jest powiązana z Git i jest kwestią preferencji użytkownika. Git nie powinien decydować, aby użytkownik zmienił LESSustawienia domyślne .

Mówiąc dokładniej, Sflaga wyrządza szkodę użytkownikom, którzy przeglądają niezaufany kod w pagerze, ponieważ łatka wygląda następująco:

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

wyglądałby identycznie jak:

-old code;
+new good code;

Użytkownicy, którzy wolą stare zachowanie, nadal mogą -FRSXjawnie ustawić zmienną środowiskową $ LESS lub ustawić core.pager na ' less -S'.

Dokumentacja będzie zawierać:

Środowisko nie ustawia tej Sopcji, ale robi to w wierszu poleceń, nakazując mniej obcinania długich linii.
Podobnie ustawienie core.pagerna less -+Fdezaktywuje Fopcję określoną przez środowisko z wiersza poleceń, dezaktywując zachowanie " quit if one screen" less.
Można aktywować jakieś flagi specjalnie dla poszczególnych poleceń, na przykład: ustawienie pager.blamedo less -Sumożliwia obcinanie linii tylko dla git blame.

VonC
źródło
2
Dziękuję dziękuję! Szukałem sposobu, aby git przestał siekać długie linie na MIESIĄCE!
coredumperror
@CoreDumpError uwaga: następny Git (2.0.X lub 2.1) domyślnie nie przerywa linii ! Zobacz moją zredagowaną odpowiedź powyżej.
VonC
2
Dzięki. Pozwoliło mi to zorientować się, że chcę eksportować LESS = "$ LESS -FRXK", aby uzyskać kolorową różnicę przy wychodzeniu z ctrl-c z mniej.
Dirk Bester
@DirkBester Ciekawa sugestia. Uwzględniłem to w odpowiedzi dla większej widoczności.
VonC
1
@WilsonF Nie wiem, ale to brzmi jak dobre pytanie: dlaczego nie uczynić z tego pytania zamiast zostawiać je tutaj, pochowane w komentarzach?
VonC
58

Możesz także włączyć / wyłączyć pagery dla określonych wyjść w konfiguracji globalnej:

git config --global pager.diff false

Lub, aby ustawić opcję core.pager, po prostu podaj pusty ciąg:

git config --global core.pager ''

Moim zdaniem jest to lepsze niż ustawienie tego, catco mówisz.

mtahmed
źródło
To działało dla mnie na Git 1.9 ... wszystko inne nie działało.
Jordon Bedwell
Ten zadziałał dla mniegit version 2.5.4 (Apple Git-61)
Ashley Coolman,
Tego właśnie chciałem, ponieważ inne polecenia całkowicie wyłączają pager, ale jest to jedyna odpowiedź, która wyłącza się tylko git diff, pozostawiając działającą dla innych poleceń
SingleNegationElimination
od tego pisania ... w Windows / PowerShell musiałem ręcznie edytować code "$($env:UserProfile)\.gitconfig"i dodawać pager = w [core]ustawieniach. Odpowiedź zadziałała w mojej bieżącej sesji PowerShell, ale nigdzie nie zapisała ustawienia, więc była skuteczna przy następnym uruchomieniu.
Bez zwrotów Bez zwrotów
12

Jeśli chodzi o wyłączony kolor podczas instalacji rurowej:

Użyj, --coloraby uniknąć wyłączenia kolorowania.

git diff --color | less -R

Lub skonfiguruj wymuszone włączenie (np. .Gitconfig):

[color]
        ui = on

git diff | less -R

W przypadku narzędzi bez kolorów użyj:

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

Eksportowanie zmiennej środowiskowej LESS=-R(np. .Bashrc) domyślnie włącza obsługę kolorów w „mniej”:

git diff | less

StellarVortex
źródło
2
Zauważ, że git ustawi LESSzmienną środowiskową na FRSXpodczas wywoływania pagera, jeśli nie jest ustawiony.
tobbez
10

Działa to dla mnie z Git w wersji 2.1.4 na Linuksie:

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

To sprawia, że ​​Git używa catzamiast less. catpo prostu zrzuca dane wyjściowe diffna ekran bez stronicowania.

jcoffland
źródło
Zasadniczo odpowiedzi są o wiele bardziej pomocne, jeśli zawierają wyjaśnienie, do czego służy kod i dlaczego rozwiązuje problem bez przedstawiania innych. (Ten post został oflagowany przez co najmniej jednego użytkownika, prawdopodobnie dlatego, że uważali, że odpowiedź bez wyjaśnienia powinna zostać usunięta.)
Nathan Tuggy
3
@NathanTuggy Myślałem, że było całkiem jasne, że odpowiadam na zadane pytanie. Wygląda na to, że niektórzy użytkownicy lubią biegać w poszukiwaniu krótkich odpowiedzi dla zabawy. Dodam trochę tekstu.
jcoffland
7

Możesz dodać alias do różnicowania z własnym pageriem z pager.alias, tak jak poniżej:

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

Spowoduje to utrzymanie koloru i użycie „cat” jako pager, gdy zostanie wywołany w „git dc”.

Ponadto rzeczy, których nie należy robić:

  • użyj --no-pagerw swoim aliasie. Git (1.8.5.2, Apple Git-48) narzeka, że ​​próbujesz zmodyfikować środowisko.
  • użyj powłoki z !shlub !git. Spowoduje to ominięcie powyższego błędu środowiska, ale spowoduje zresetowanie katalogu roboczego (na potrzeby tego polecenia) do katalogu Git najwyższego poziomu, więc wszelkie odniesienia do pliku lokalnego nie będą działać, jeśli użytkownik znajduje się już w podkatalogu twoje repozytorium.
Joseph Cheek
źródło
+1 Ta technika jest przydatna, gdy chcesz nawigować przez zatwierdzenie po, git logale nie git log --oneline. Użyj pager.log = less -FXR +/^commit.*, specjalną obudowę --onelineopcji za pomocą alias.l1 = log --onelinei pager.l1 = less -FXR.
Claudio
6

Mam ten przystojniak .gitconfigi wydaje się, że działa dobrze (wyłączony zarówno dla diff, jak i show):

[pager]
    diff = false
    show = false
sekmo
źródło
5

Od czasu do czasu lubię wyłączać stronicowanie, gdy wiem, że dane wyjściowe nie są zbyt długie. W tym celu znalazłem fajną sztuczkę przy użyciu aliasów Git:

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

Lub dodaj następującą [alias]sekcję do sekcji ~ / .gitconfig:

n = !git --no-pager

Oznacza to, że możesz użyć prefiksu, naby wyłączyć stronicowanie dla dowolnej komendy Git, tj .:

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
Daniel Kullmann
źródło
2

W przypadku szybkiego i brudnego skryptu, który napisałem, zrobiłem to w następujący sposób:

PAGER=cat git diff ...
Roberto Bonvallet
źródło
To nie zadziała, jeśli $GIT_PAGERjest ustawione. git --no-pagerrobi to samo, ale bardziej niezawodnie.
Matthieu Moy,
2

Jak napisano w man git , możesz użyć --no-pagerdowolnego polecenia.

Używam go na:

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

Następnie użyj aliasu, aby uniknąć używania (i zapamiętywania) długich poleceń.

Czy Ma
źródło
2

W przypadku systemu Windows jest to:

git config --global core.pager ""

Spowoduje to wyłączenie stronicowania dla wszystkich elementów, w gittym bardzo irytujących git branch.

Jaredcheeda
źródło
Działa również z Linuksem!
rustysys-dev
2

Jeśli używasz oh-my-zsh, w ~/.oh-my-zsh/lib/misc.zshpliku skomentuj ten wiersz:

env_default 'LESS' '-R'
powolny deszcz
źródło
Hej, myślę, że OP chciał mieć przełącznik wiersza poleceń do jednorazowego użycia z git diff, a nie na stałe rozwiązanie globalne. Nie wiem też, jak dobrze byłoby zmodyfikować kod źródłowy oh-my-zsh, ponieważ później trudno byłoby zaktualizować oh-my-zsh. Lepiej ustaw tę wartość domyślną w pliku .zshrc.
Karri Rasinmäki
1
Dzięki, masz rację. Jeśli używasz oh-my-zsh i potrzebujesz stałego globalnego rozwiązania, możesz dodać unset LESSna końcu .zshrc.
powolny deszcz
1

Domyślnie git używa mniej jako pager. Zwykle wolę więcej, ponieważ wydrukuje pierwszą stronę, a następnie pozwoli ci przewijać zawartość.

Co więcej, zawartość pozostanie w konsoli po zakończeniu. Jest to zwykle wygodne, ponieważ często chcesz coś zrobić z treścią po wyszukaniu (np. Wyślij e-maila do komendatora i powiedz mu, że wprowadził błąd w swoim ostatnim zatwierdzeniu).

Jeśli chcesz następnie przesyłać treści, przewijanie i drukowanie wszystkiego byłoby niewygodne. Dobrą rzeczą jest to, że będziesz mógł połączyć go z rurociągiem i poprowadzić przez wszystko, np.

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

Zasadniczo więcej jest wszystkim, czego kiedykolwiek potrzebujesz, chyba że nie chcesz, aby zawartość pozostała w konsoli po zakończeniu. Aby zamiast tego użyć więcej, wykonaj następujące czynności.

git config --global core.pager 'more'
patrik
źródło
0
git -P diff

Lub --no-pager.

BTW: Aby zachować kolor z cat

git diff --color=always | cat
hyperpallium
źródło
0

Postępuj zgodnie z poniższymi instrukcjami.

  1. Po prostu wpisz vi ~/.gitconfigswój terminal.
  2. Wklej LESS="-F -X $LESS"linię.
  3. Naciśnij :wqi wprowadź.
  4. Uruchom ponownie terminal.
Nitish
źródło