Lệnh nhánh Git hoạt động như 'ít'


415

Khi tôi sử dụng git branchlệnh để liệt kê tất cả các nhánh, tôi thấy đầu ra của git branch | less.

Lệnh git branchnày được cho là hiển thị một danh sách các nhánh, giống như lsđối với các tệp.

Đây là đầu ra tôi nhận được:

Nhập mô tả hình ảnh ở đây

Làm thế nào để tôi có được hành vi mặc định của git branch? Điều gì gây ra đầu ra phân trang?

Tôi đang sử dụng ZSH với oh_my_zsh(không có gì cho Git trong đó) và tôi .gitconfigtrông như thế này:

[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

Câu trả lời:


738

Như đã đề cập trong các bình luận cho câu trả lời của Mark Adelsberger , đây là một thay đổi hành vi mặc định được giới thiệu trong Git 2.16 .

Bạn có thể git branchtắt đầu ra phân trang để sao lưu theo mặc định với pager.branchcài đặt cấu hình :

git config --global pager.branch false

127
Đó là một quyết định kỳ quặc, kỳ quặc để làm cho mặc định. Tôi hy vọng các công cụ clix unix-y của tôi hoạt động giống như các chương trình đơn giản mà bạn có thể xâu chuỗi nếu bạn muốn, nhưng tôi đoán rằng cuộc thảo luận là dành cho một trang web khác.
Stragulus

7
@Stragulus Lưu ý rằng mặc định mới không ngăn bạn kết nối git branchvới thứ khác. Sử dụng phát hiện đường ống , Git sẽ xuất danh sách nhánh thành thiết bị xuất chuẩn trong các lệnh git branch > branches.txthoặc git branch | wc -l.
Rory O'Kane

3
@ RoryO'Kane nhưng với máy nhắn tin, tôi có một loại phụ ESC/qsau một git branchkiểm tra đơn giản .
mitnk

23
@mitnk Không nhất thiết. Nếu máy nhắn tin của bạn là less, bạn có thể thêm --no-init --quit-if-one-screenvào LESSbiến môi trường của mình , điều này sẽ khiến lessbạn chỉ ghi vào thiết bị xuất chuẩn nếu văn bản có thể được xem mà không cần cuộn. Xem man lessđể biết thêm chi tiết.
Rory O'Kane

13
Nếu bạn muốn thêm nó vào tệp cấu hình của mình theo cách thủ công, thì đó là [pager] branch = false(trên hai dòng).
Sam

56

Như các câu trả lời khác đã chỉ ra, Git mặc định tự đặt đường ống vào máy nhắn tin ( lesstheo mặc định) cho hầu hết các lệnh.

Tuy nhiên, một điểm quan trọng là khi biến môi trường LESS không được đặt, Git đặt nó thành FRX và hậu quả là hành vi hiển thị của người dùng giống như khi máy nhắn tin không được sử dụng khi đầu ra của lệnh ngắn (nghĩa là nếu bạn chỉ có vài nhánh). Xem người đàn ông ít hơn :

-F hoặc --quito-if-one-screen
Nguyên nhân ít tự động thoát hơn nếu toàn bộ tập tin có thể được hiển thị trên màn hình đầu tiên.

-R hoặc - RAW-KIỂM SOÁT-CHARS
[...] Các chuỗi thoát "màu" ANSI được xuất ra ở dạng "thô".

-X hoặc --no-init
Tắt gửi chuỗi khởi tạo termcap và khử khử chuỗi đến thiết bị đầu cuối. Điều này đôi khi là mong muốn nếu chuỗi khử khử làm một việc không cần thiết, như xóa màn hình.

Nếu bạn nhận được hành vi mà bạn mô tả, rất có thể bạn đã $LESSđặt thành một thứ khác và bỏ đặt nó ( unset LESS) sẽ thoát khỏi vấn đề trong khi vẫn giữ hành vi "máy nhắn tin" cho đầu ra lâu dài. Ngoài ra, bạn có thể kích hoạt hành vi trong khi vẫn giữ nguyên trạng $LESSbằng cách thêm phần này vào .gitconfigtệp của mình :

[core]
    pager = less -FRX

Nếu bạn thực sự không thích điều máy nhắn tin, bạn có thể tắt nó trên toàn cầu hoặc trên cơ sở mỗi lệnh (xem các câu trả lời khác).


40

Không tranh luận về ngữ nghĩa, nhưng hành vi bạn nhận được mặc định. Đó là lý do tại sao bạn nhận được nó khi bạn không yêu cầu một cái gì đó khác biệt. Theo mặc định, branch(và nhiều lệnh Git khác) sử dụng máy nhắn tin khi gửi đầu ra đến thiết bị đầu cuối.

Bạn có thể ghi đè mặc định này bằng cách sử dụng --no-pagertùy chọn:

git --no-pager branch

Hoặc nếu bạn chuyển hướng đầu ra thành một tệp, Git sẽ phát hiện ra rằng nó không ghi vào thiết bị đầu cuối và vì vậy dù sao cũng không nên sử dụng máy nhắn tin. (Mặt khác, điều đó cho thấy trường hợp sử dụng kịch bản, trong trường hợp đó bạn nên xem xét sử dụng lệnh hệ thống ống nước như git for-each-refưu tiên git branch.)


git --no-pager branchlàm. Nhưng bộ này thế nào? Chỉ có PAGERbiến môi trường được đặt thành less. Đây không phải là hành vi mặc định. Tất cả các trường đại học của tôi có một đầu ra như một danh sách được in ra thiết bị đầu cuối.
DenniJensen

Phiên bản nào của git bạn đang sử dụng? Và cái nào là đồng nghiệp của bạn sử dụng?
Lasse V. Karlsen

2.16.0! Đây có phải là một tính năng được giới thiệu cho git trong phiên bản này?
DenniJensen

Vâng, nó là mặc định bây giờ. github.com/git/git/blob/master/Documentation/RelNotes/ Khăn Trường đại học của tôi bên cạnh tôi sử dụng cùng một phiên bản và không có vấn đề này :) thx @mark
DenniJensen

1
Đây là câu trả lời ưu việt nhất ở đây, thật đáng buồn vì nó có quá ít upvote, vì tôi đã cuộn khá nhiều để tìm kiệt tác này.
codepleb

26

Hành vi Git này cũng ngày càng gây khó chịu cho tôi. Tôi đã nhận được danh sách thẻ của mình lesskhi chỉ muốn liệt kê các thẻ chẳng hạn.

Người ta cũng có thể kiểm soát hành vi này bằng cách thay đổi GAG PAGER mặc định thành catthay vì less. Tôi thà cuộn trong iTerm hơn là trong một trình soạn thảo. Tôi thích sử dụng trình chỉnh sửa khi tôi muốn.

Vì thế:

git config --global core.pager cat

2
Vâng, đây sẽ là một câu trả lời hợp lệ cho tôi
Tura

2
cảm ơn cho những người đứng đầu lên. Tôi thừa nhận sau một vài tháng sử dụng, tôi vẫn đang sử dụng mèo, nhưng ví dụ khi làm điều git logđó thật khó chịu. Tôi chỉ bỏ lỡ hành vi ban đầu, nhưng không có thời gian để cải thiện quy trình làm việc hàng ngày của mình trong vấn đề này.
ionescu77

Bạn thắng! ... Hoàn hảo!
sdlins

2
Lưu ý rằng điều này cũng sẽ áp dụng nó cho git log...
bagerard

10

Đối với những người muốn cập nhật ~/.gitconfigđể sửa lỗi này, nó sẽ giống như thế này:

[pager]
   branch = false

Điều kỳ lạ ở đây: cài đặt này đã hoạt động và vì một số ngày không còn nữa, có gì thay đổi hay cấu hình của tôi không được áp dụng?
Kẻ chinh

7

Lệnh nhánh Git hoạt động như 'ít'

Bởi vì Git theo mặc định sẽ mở đầu ra trong máy nhắn tin (ít nhất là trong Ubuntu). Các câu trả lời được chấp nhận hoàn toàn sẽ thay thế máy nhắn tin, mà bạn có thể không giống như nếu đầu ra của bạn là rất dài.

Tôi khuyên bạn nên thay thế máy nhắn tin bằng less, vì vậy nó không "cuộn" đầu ra nhỏ hơn chiều cao của thiết bị đầu cuối.

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


2

Câu trả lời được chấp nhận có vẻ sai. Có hai vấn đề:

  1. Hành vi thực sự khác nhau giữa bash (z được cấu hình mặc định) và zsh. "Vấn đề" chỉ hiển thị dưới zsh.
  2. Giải pháp được đề xuất sẽ làm cho git branchkhông sử dụng máy nhắn tin luôn, điều này sẽ không được mong muốn khi có nhiều đầu ra.

Lý do thực sự là bash và zsh có các định nghĩa mặc định khác nhau về LESS: bash định nghĩa không có gì, trong khi zsh định nghĩa nó là -R. Khi tôi làm unset LESStrong zsh, mọi thứ trở lại bình thường ....

Các -Rhành vi có thể vẫn được mong muốn. Trong trường hợp đó, bạn có thể thêm hướng dẫn sau vào .zshrc để giữ mọi thứ hoạt động:

export LESS=-FRX

-F'khiến ít hơn tự động thoát nếu toàn bộ tệp có thể được hiển thị trên màn hình đầu tiên'. Tuy nhiên, -Xcần phải được chỉ định đồng thời, nếu không sẽ không có đầu ra nào được hiển thị khi có ít hơn một màn hình đầu ra.


0

https://git-scm.com/book/en/v2/Git-Iternals-En Môi-Biến

GIT_PAGER điều khiển chương trình được sử dụng để hiển thị đầu ra nhiều trang trên dòng lệnh. Nếu điều này không được đặt, PAGER sẽ được sử dụng làm dự phòng.

Để giải quyết vấn đề của bạn, bạn có thể bỏ đặt PAGER và GIT_PAGER trong vỏ của bạn.


1
Vấn đề chưa được đặt PAGER(chưa GIT_PAGERđược đặt) vẫn còn đó. Có vị trí nào tôi phải kiểm tra vars env này không?
DenniJensen

@DenniJensen Bạn có thể đặt máy nhắn tin theo lệnh như thế PAGER= git branch(với một khoảng trắng sau và không có dấu nào trước dấu bằng chính xác như được viết). Không có ý tưởng, cho dù nó tốt hơn ví dụ , git branch | cat.
maaartinus

-1

Tôi cũng gặp vấn đề tương tự git statusvà cũng git config --global pager.status falsegiải quyết được điều đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.