Polecenie Git Branch zachowuje się jak „mniej”


415

Kiedy używam git branchpolecenia do wyświetlenia wszystkich gałęzi, widzę wynik działania git branch | less.

Polecenie git branchpowinno wyświetlać listę rozgałęzień, podobnie jak lsrobi to dla plików.

To jest wynik, który otrzymuję:

Wpisz opis zdjęcia tutaj

Jak uzyskać domyślne zachowanie git branch? Co powoduje wydruk stronicowany?

Używam ZSH z oh_my_zsh(nic dla Git tam), a moje .gitconfigwygląda następująco:

[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

Odpowiedzi:


737

Jak wspomniano w komentarzach do odpowiedzi Marka Adelsbergera , była to domyślna zmiana zachowania wprowadzona w Git 2.16 .

git branchDomyślnie można wyłączyć stronicowane wyjście w celu wycofania za pomocą ustawienia pager.branchkonfiguracji :

git config --global pager.branch false

127
To jest dziwna, dziwna decyzja, by podjąć się domyślnie. Oczekuję, że moje narzędzia unix-y cli będą zachowywać się jak głupie proste programy, które możesz połączyć, jeśli chcesz, ale myślę, że dyskusja dotyczy innej strony.
Stragulus

7
@ Tragulus Zauważ, że nowa wartość domyślna nie powstrzymuje cię od łączenia się git branchz czymś innym. Korzystając z detekcji potoku , Git wyświetli listę rozgałęzień na standardowe wyjście w poleceniach git branch > branches.txtlub git branch | wc -l.
Rory O'Kane

3
@ RoryO'Kane, ale z pageriem mam dodatkowy typ ESC/qpo prostym git branchsprawdzeniu.
mitnk

23
@mitnk Niekoniecznie. Jeśli twój pager jest less, możesz dodać --no-init --quit-if-one-screendo LESSzmiennej środowiskowej, co spowoduje, że lesspo prostu napisz na standardowe wyjście, jeśli tekst można wyświetlić bez przewijania. Zobacz man lesspo więcej szczegółów.
Rory O'Kane

13
Jeśli chcesz dodać go ręcznie do pliku konfiguracyjnego, jest on [pager] branch = false(w dwóch wierszach).
Sam

56

Jak zauważyły ​​inne odpowiedzi, lessdla większości poleceń Git domyślnie instaluje się w pagerach ( domyślnie).

Ważną kwestią jest jednak to, że gdy zmienna środowiskowa LESS nie jest ustawiona, Git ustawia ją na FRX , a konsekwencją jest to, że widoczne dla użytkownika zachowanie jest takie samo, jakby pager nie był używany, gdy wynik polecenia był krótki (tj. jeśli masz tylko kilka oddziałów). Zobacz człowieka mniej :

-F lub --quit-if-one-screen
Powoduje, że less automatycznie kończy działanie, jeśli cały plik można wyświetlić na pierwszym ekranie.

-R lub --RAW-CONTROL-CHARS
[...] Sekwencje specjalne ANSI „kolorowe” są wyprowadzane w postaci „surowej”.

-X lub --no-init
Wyłącza wysyłanie do terminala ciągów inicjalizacji i deinicjalizacji termcap. Jest to czasem pożądane, jeśli ciąg deinicjalizacji robi coś niepotrzebnego, na przykład wyczyszczenie ekranu.

Jeśli dostaniesz opisywane zachowanie, najprawdopodobniej wybrałeś $LESScoś innego, a rozbrojenie go ( unset LESS) pozbyłoby się problemu, zachowując zachowanie „pager” dla długich wyników. Alternatywnie możesz aktywować zachowanie dla zachowania bez zmian, $LESSdodając to do .gitconfigpliku:

[core]
    pager = less -FRX

Jeśli naprawdę nie lubisz pagerów, możesz je dezaktywować globalnie lub na polecenie (zobacz inne odpowiedzi).


40

Nie kłóć się z semantyką, ale zachowanie, które dostajesz, jest domyślne. Dlatego dostajesz to, kiedy nie prosisz o coś innego. Domyślnie branch(i wiele innych poleceń Git) używa pager podczas wysyłania danych wyjściowych do terminala.

Możesz zastąpić to ustawienie domyślne, używając --no-pageropcji:

git --no-pager branch

Lub jeśli przekierujesz dane wyjściowe do pliku, Git powinien wykryć, że nie zapisuje do terminala, a więc i tak nie powinien używać pagera. (Z drugiej strony sugeruje to przypadek użycia skryptu, w którym to przypadku należy rozważyć użycie polecenia hydraulicznego, tak jak git for-each-refprzed git branch.)


git --no-pager branchPracuje. Ale jak to się dzieje? Tylko PAGERzmienna środowiskowa jest ustawiona na less. To nie jest zachowanie domyślne. Wszystkie moje uczelnie mają dane wyjściowe w postaci listy wydrukowanej na terminalu.
DenniJensen

Jakiej wersji git używasz? A z którego korzystają Twoi koledzy?
Lasse V. Karlsen

2.16.0! Czy jest to funkcja wprowadzona do git w tej wersji?
DenniJensen

Tak, teraz jest domyślnie. github.com/git/git/blob/master/Documentation/RelNotes/... Mój college obok mnie używa tej samej wersji i nie ma tego problemu :) thx @mark
DenniJensen

1
To jest najlepsza odpowiedź tutaj, smutna, że ​​ma tak mało pozytywnych opinii, ponieważ przewinęłam całkiem sporo, aby znaleźć to arcydzieło.
codepleb

25

To zachowanie Gita również było dla mnie coraz bardziej irytujące. Mam listę znaczników, lessgdy chcę na przykład wyświetlić listę znaczników.

Można kontrolować to zachowanie, zmieniając domyślny GIT PAGER na catzamiast less. Wolę przewijać w iTerm niż w edytorze. Lubię korzystać z edytora, kiedy chcę.

Więc:

git config --global core.pager cat

1
Tak, to powinna być dla mnie prawidłowa odpowiedź
Tura

2
dzięki za heads-up. Przyznaję, że po kilku miesiącach użytkowania nadal używam kota, ale na przykład git logdenerwuje mnie to. Po prostu tęsknię za pierwotnym zachowaniem, ale nie miałem czasu na poprawę mojego codziennego przepływu pracy w tej perspektywie.
ionescu77

Wygrywasz! ... Idealnie!
sdlins

2
Pamiętaj, że to dotyczy również git log...
bagerard

10

Dla tych, którzy chcą zaktualizować, ~/.gitconfigaby to naprawić, wyglądałoby to tak:

[pager]
   branch = false

dziwna rzecz tutaj: to ustawienie działało i od kilku dni już nie jest, nic się nie zmieniło lub czy moja konfiguracja po prostu nie jest stosowana?
Zdobywcy

7

Polecenie Git Branch zachowuje się jak „mniej”

Ponieważ Git domyślnie otwiera wyjście w pager (przynajmniej w Ubuntu). Odpowiedź akceptowana będzie całkowicie zastąpić pager, który nie lubić , jeśli wyjście jest bardzo długa.

Poleciłbym zastąpienie pagera less, aby nie „przewijał” wyników mniejszych niż wysokość terminala.

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


2

Przyjęta odpowiedź wydaje się błędna. Istnieją dwa problemy:

  1. Zachowanie jest w rzeczywistości różne (domyślnie skonfigurowane) bash i zsh. „Problem” pojawia się tylko w Zsh.
  2. Sugerowane rozwiązanie sprawi, że git branchnie będzie zawsze korzystał z pagera, co nie będzie pożądane przy dużej wydajności.

Prawdziwym powodem jest to, że bash i zsh mają różne domyślne definicje dotyczące LESS: bash nic nie definiuje, podczas gdy zsh to definiuje -R. Kiedy robię unset LESSw Zsh, wszystko wraca do normy ...

-RProblem może nadal pożądany. W takim przypadku możesz dodać następującą instrukcję do pliku .zshrc, aby wszystko działało:

export LESS=-FRX

-F„powoduje, że less automatycznie kończy pracę, jeśli cały plik można wyświetlić na pierwszym ekranie”. Należy jednak -Xpodać jednocześnie, w przeciwnym razie dane wyjściowe nie będą wyświetlane, gdy wynik będzie mniejszy niż wynik.


0

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

GIT_PAGER steruje programem wyświetlającym wielostronicowe dane wyjściowe w wierszu poleceń. Jeśli ta opcja nie jest ustawiona, PAGER zostanie użyty jako rezerwowy.

Aby rozwiązać problem, możesz wyłączyć PAGER i GIT_PAGER w swojej powłoce.


1
Rozbrojony PAGER( GIT_PAGERbył wyłączony) problem jest nadal. Czy jest jakieś miejsce, w którym muszę sprawdzić to środowisko env?
DenniJensen

@DenniJensen Możesz ustawić pager na komendzie jak PAGER= git branch(z jedną spacją za znakiem i bez znaku równości dokładnie tak, jak napisano). Nie mam pojęcia, czy jest to lepsze niż np git branch | cat.
maaartinus

-1

Miałem ten sam problem git statusi też go git config --global pager.status falserozwiązuję.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.