Làm cách nào để ngăn 'git diff' sử dụng máy nhắn tin?


640

Có một chuyển đổi dòng lệnh để chuyển đến git diffvà các lệnh khác sử dụng lessmáy nhắn tin theo mặc định?

Tôi biết tôi có thể chuyển nó thành mèo, nhưng điều đó loại bỏ tất cả các cú pháp tô sáng.

Tôi biết tôi có thể đặt máy nhắn tin trong .gitconfig toàn cầu thành cat theo GITPAGER=cat(hoặc đại loại như thế); nhưng đôi khi tôi muốn có máy nhắn tin (tùy thuộc vào kích thước của diff).

Nhưng, tôi thích chuyển đổi dòng lệnh hơn nếu có; và tôi không thể tìm thấy một, đi qua các trang người đàn ông.


16
Lưu ý: core.pager 'less -+F -+X'sẽ là một cách gần đây hơn để loại bỏ các tùy chọn đó. Xem câu trả lời của tôi dưới đây .
VonC

"less - + F - + X" là cài đặt kỳ diệu để loại bỏ các dấu "... bỏ qua ..." khó chịu trong các bản ghi dài. Cảm ơn rất nhiều cho những lựa chọn đó, bạn đã lưu lại ngày của tôi!
Guillaume Perrot


Xem câu hỏi liên quan về việc sử dụng lessvới git (nó thay đổi tùy theo lessphiên bản): unix.stackexchange.com/questions/107315/ mẹo
Pierz

Câu trả lời:


691

--no-pagerđể Git sẽ bảo nó không sử dụng máy nhắn tin. Đi qua các tùy chọn -Fđể lesssẽ cho nó để không trang nếu phù hợp đầu ra trong một màn hình duy nhất.

Sử dụng:

git --no-pager diff

Các tùy chọn khác từ các ý kiến ​​bao gồm:

# 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
Cảm ơn, tôi đoán tôi có thể bí danh git --no-pager để gitc trong .bashrc, phải không?
Lakshman Prasad

42
Hoặc sử dụng biến môi trường GIT_PAGER hoặc PAGER hoặc core.pagerbiến cấu hình git.
Jakub Narębski

74
Hãy nhớ rằng bạn phải thêm --add-pager trước lệnh của bạn, như trong "git --no-pager log --format = blah"
Ana Betts

6
Ngoài ra, nếu thiết bị đầu cuối của bạn xóa màn hình sau khi thoát ít hơn, bạn sẽ muốn thêm -Evào lesstùy chọn của mình để -Fcó thể sử dụng được.
mgasms

9
Lưu ý rằng nếu bạn muốn đưa --no-pagervào một bí danh, bạn phải thêm tiền tố vào lệnh đó và để tránh lỗi, bạn phải tạo một bí danh như thế này : git config alias.foo '!git --no-pager foo'. Hơi khó hiểu. Đơn giản chỉ là răng cưa để '--no-pager foo'không làm việc.
Jim Stewart

272

Như một câu trả lời trước đã đề cập, việc chuyển -Ftùy chọn để lesskhiến nó thoát ra nếu nội dung nhỏ hơn một màn hình. Tuy nhiên, sau khi làm như vậy, màn hình được đặt lại và cuối cùng bạn không thấy nội dung.

Các -Xtùy chọn không đi với hành vi đó. Vì vậy, tôi sử dụng cách sau để kích hoạt phân trang có điều kiện dựa trên số lượng nội dung:

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

46
Lưu ý: Tôi đã phải sử dụng git config --global --add core.pager "less -F -X"trong git 1.8.0.2, một ở trên không hoạt động.
Dogbert

7
Tuyệt quá! Ngoài ra để làm cho nó cư xử như vậy không chỉ với git nhưng tất cả các chương trình thêm một cái gì đó như export LESS="-RFX"để bạn .bashrchay.zshrc
defhlt

Cảm ơn vì điều này; Tôi đã bị quấy rầy bởi một tùy chọn trong đó git sẽ cắt dòng đầu tiên từ đầu ra, và sau đó không đồng bộ hóa để đi xuống một dòng và sau đó lên một dòng sẽ khiến dòng thứ nhất của dòng chính xác chiếm hàng đầu, theo sau là dòng thứ 3 từ đầu ra chính xác. Dù sao, chỉ định tùy chọn này đã giải quyết vấn đề đó. Thật kỳ quái.
Tim Harper

Nếu sử dụng Git cho Windows (được sử dụng ít hơn bởi Greenwood Software), tham số bạn cần là -E (nguồn: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward

1
Vâng, như tôi đã giải thích trong câu trả lời của mình, tôi thích màn hình không được thiết lập lại trước và sau khi máy nhắn tin bắt đầu và thoát, đặc biệt nếu tất cả chỉ nằm trong một màn hình, đó chính xác là những gì -X. Đừng sử dụng nó nếu bạn không thích điều đó. Tôi thích nó bởi vì theo cách này tôi có thể đề cập đến những thứ như git SHA bằng cách xem kết quả của các lệnh git trước đó trong lịch sử của tôi mà không phải gõ lại lệnh. Mỗi người của anh ấy / cô ấy.
ishaaq

169

Sử dụng

git config --global core.pager cat

để thoát khỏi một máy nhắn tin cho tất cả các lệnh cho tất cả các kho lưu trữ.

Bạn cũng có thể vô hiệu hóa phân trang cho các tiểu đơn vị Git bằng cách sử dụng pager.<cmd>cài đặt thay vì core.pagervà bạn có thể thay đổi cài đặt của mình trên mỗi kho lưu trữ Git (bỏ qua --global).

Xem man git-configvà tìm kiếm pager.<cmd>để biết chi tiết.


Câu hỏi không phải là làm thế nào để vô hiệu hóa máy nhắn tin hoàn toàn mà là làm thế nào để vô hiệu hóa nó cho tiểu ban grep. câu trả lời của mtahmed là hoàn hảo.
TilmanBaumann

9
Đây có thể là những gì giải thích mở rộng đã hỏi nhưng đây là những gì tôi đang tìm kiếm và nó là một trong những kết quả hàng đầu của Google vì vậy cảm ơn @geekQ
Brian F Leighty

70

Những thay đổi gần đây trong tài liệu đề cập đến một cách khác để loại bỏ tùy chọn mặc định cho less("tùy chọn mặc định" FRSX).

Đối với câu hỏi này, đây sẽ là (git 1.8+)

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

Ví dụ, Dirk Bester gợi ý trong các bình luận :

export LESS="$LESS -FRXK" 

để tôi có được màu khác với Ctrl-Cthoát khỏi less.

Wilson F đề cập trong các ý kiến và trong câu hỏi của mình rằng:

ít hỗ trợ cuộn ngang, do đó, khi các dòng bị cắt nhỏ, ít vô hiệu hóa thoát khỏi màn hình để người dùng vẫn có thể cuộn văn bản sang trái để xem những gì đã bị cắt.


Những sửa đổi đó đã được hiển thị trong git 1.8.x, như được minh họa trong " Luôn sử dụng máy nhắn tin chogit diff " (xem các bình luận). Nhưng tài liệu vừa được điều chỉnh lại ( đối với git 1.8.5 hoặc 1.9, Q4 2013 ).

Trình xem văn bản để sử dụng bởi các lệnh Git (ví dụ: 'less').
Giá trị có nghĩa là được giải thích bởi shell.

Thứ tự ưu tiên là:

  • các $GIT_PAGERbiến môi trường,
  • sau đó core.pagercấu hình,
  • sau đó $PAGER,
  • và sau đó mặc định được chọn tại thời gian biên dịch (thường là 'ít hơn').

Khi LESSbiến môi trường không được đặt, Git đặt nó thành FRSX
(nếu LESSbiến môi trường được đặt, Git hoàn toàn không thay đổi).

Nếu bạn muốn ghi đè có chọn lọc cài đặt mặc định của Git LESS, bạn có thể đặt core.pagerthành ví dụless -+S .
Điều này sẽ được chuyển đến shell bởi Git, nó sẽ dịch lệnh cuối cùng sang LESS=FRSX less -+S. Môi trường ra lệnh để đặt Stùy chọn cắt các dòng dài nhưng dòng lệnh đặt lại thành mặc định để gấp các dòng dài.


Xem cam kết 97d01f2a để biết lý do đằng sau từ ngữ tài liệu mới:

cấu hình: viết lại core.pagertài liệu

Các văn bản đề cập core.pagerGIT_PAGERkhông đưa ra bức tranh tổng thể về quyền ưu tiên. Mượn mô tả tốt hơn từ tài liệu git var(1) .

Việc sử dụng cơ chế để cho phép các tệp cấu hình trên toàn hệ thống, toàn cầu và trên mỗi kho lưu trữ không bị giới hạn đối với biến cụ thể này. Loại bỏ nó để làm rõ đoạn văn.

Viết lại phần giải thích cách biến môi trường LESSđược đặt thành giá trị mặc định của Git và cách tùy chỉnh có chọn lọc.


Lưu ý: cam kết b327583 ( Matthieu Moymoy , tháng 4 năm 2014, đối với git 2.0.x / 2.1, quý 3 năm 2014) sẽ xóa S theo mặc định:

máy nhắn tin: xóa 'S' khỏi $ LESS theo mặc định

Theo mặc định, Git được sử dụng để đặt $LESSthành -FRSXnếu $LESSkhông được người dùng đặt.
Các FRXcờ thực sự có ý nghĩa đối với Git ( FXvì đôi khi các ống Git đầu ra ít hơn là ngắn và Rvì các ống Git có màu đầu ra).
Mặt khác, Scờ (chặt các dòng dài) không liên quan đến Git và là vấn đề ưu tiên của người dùng. Git không nên quyết định cho người dùng thay đổi LESSmặc định .

Cụ thể hơn, Scờ gây hại cho người dùng xem lại mã không tin cậy trong máy nhắn tin, vì một bản vá trông như:

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

sẽ xuất hiện giống hệt như:

-old code;
+new good code;

Người dùng thích hành vi cũ vẫn có thể đặt biến môi trường $ LESS thành -FRSXrõ ràng hoặc đặt core.pager thành ' less -S'.

Tài liệu sẽ đọc:

Môi trường không đặt Stùy chọn nhưng dòng lệnh thực hiện, hướng dẫn ít hơn để cắt ngắn các dòng dài.
Tương tự như vậy, việc thiết core.pagerđể less -+Fsẽ tắt Ftùy chọn định bởi môi trường từ dòng lệnh, việc tắt các " quit if one screen" hành vi của less.
Người ta có thể kích hoạt cụ thể một số cờ cho các lệnh cụ thể: ví dụ: cài đặt pager.blameđể chỉ less -Scho phép cắt ngắn dòng git blame.


2
Cảm ơn cảm ơn! Tôi đã tìm kiếm một cách để khiến git ngừng cắt hàng dài cho THÁNG!
coredumperror

@CoreDumpError lưu ý: Git tiếp theo (2.0.X hoặc 2.1) sẽ không cắt dòng theo mặc định ! Xem câu trả lời chỉnh sửa của tôi ở trên.
VonC

2
Cảm ơn. Điều này cho tôi biết rằng tôi muốn xuất LESS = "$ LESS -FRXK" để tôi có được màu khác với ctrl-c thoát khỏi ít hơn.
Dirk Bester

@DirkBester Gợi ý thú vị. Tôi đã đưa nó vào câu trả lời để dễ nhìn hơn.
VonC

1
@WilsonF Tôi không biết, nhưng đó có vẻ là một câu hỏi hay: tại sao không biến nó thành một câu hỏi thay vì để nó ở đây, bị chôn vùi trong các bình luận?
VonC

58

Bạn cũng có thể tắt / bật máy nhắn tin cho các đầu ra cụ thể trong cấu hình toàn cầu:

git config --global pager.diff false

Hoặc để đặt tùy chọn core.pager, chỉ cần cung cấp một chuỗi trống:

git config --global core.pager ''

Điều này theo ý kiến ​​của tôi tốt hơn là đặt nó catnhư bạn nói.


Đây là những gì làm việc cho tôi trên Git 1.9 ... mọi thứ khác đều không hoạt động.
Jordon Bedwell

Đây là cái đã làm việc cho tôigit version 2.5.4 (Apple Git-61)
Ashley Coolman

Đây là những gì tôi muốn vì các lệnh khác vô hiệu hóa hoàn toàn máy nhắn tin, nhưng đây là câu trả lời duy nhất chỉ vô hiệu hóa git difftrong khi để nó hoạt động cho các lệnh khác
SingleNegationElimination 9/12/17

khi viết bài này ... trên Windows / PowerShell, tôi phải chỉnh sửa code "$($env:UserProfile)\.gitconfig"và thêm thủ công pager = trong phần [core]cài đặt. Câu trả lời đã có hiệu quả cho phiên quyền hạn hiện tại của tôi nhưng dường như không lưu cài đặt ở bất cứ đâu nên nó có hiệu quả trong lần ra mắt tiếp theo.
Không hoàn lại tiền Không trả lại

12

Về màu sắc bị vô hiệu hóa khi đường ống:

Sử dụng --colorđể tránh màu đó bị vô hiệu hóa.

git diff --color | less -R

Hoặc định cấu hình bắt buộc (ví dụ: .gitconfig):

[color]
        ui = on

git diff | less -R

Đối với các công cụ không màu, sau đó sử dụng:

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

Xuất biến môi trường LESS=-R(ví dụ: .bashrc) bật hỗ trợ màu theo mặc định trong "less":

git diff | less


2
Lưu ý rằng git sẽ đặt LESSbiến môi trường thành FRSXkhi gọi máy nhắn tin, nếu nó không được đặt.
tobbez

10

Điều này làm việc với tôi với phiên bản Git 2.1.4 trên Linux:

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

Điều này làm cho Git sử dụng catthay vì less. catchỉ cần bỏ đầu ra của diffmàn hình mà không cần phân trang.


Nói chung, câu trả lời sẽ hữu ích hơn nhiều nếu chúng bao gồm một lời giải thích về những gì mã được dự định làm và tại sao điều đó giải quyết vấn đề mà không giới thiệu người khác. (Bài đăng này đã được ít nhất một người dùng gắn cờ, có lẽ vì họ nghĩ rằng một câu trả lời mà không cần giải thích nên bị xóa.)
Nathan Tuggy

3
@NathanTuggy Tôi nghĩ khá rõ rằng tôi đang trả lời câu hỏi. Có vẻ như một số người dùng thích chạy xung quanh đánh dấu các câu trả lời ngắn cho vui. Tôi sẽ thêm một số văn bản.
jcoffland

7

Bạn có thể thêm một bí danh để tìm khác biệt với máy nhắn tin của riêng mình với pager.alias, như vậy:

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

Điều này sẽ giữ màu và sử dụng 'cat' làm máy nhắn tin khi được gọi ở 'git dc'.

Ngoài ra, những điều không nên làm:

  • sử dụng --no-pagertrong bí danh của bạn. Git (1.8.5.2, Apple Git-48) sẽ phàn nàn rằng bạn đang cố gắng sửa đổi môi trường.
  • sử dụng vỏ có !shhoặc !git. Điều này sẽ bỏ qua lỗi môi trường, ở trên, nhưng nó sẽ đặt lại thư mục làm việc của bạn (cho mục đích của lệnh này) vào thư mục Git cấp cao nhất, vì vậy mọi tham chiếu đến tệp cục bộ sẽ không hoạt động nếu bạn đã ở trong thư mục con của kho lưu trữ của bạn.

+1 Kỹ thuật này hữu ích khi bạn muốn điều hướng bằng cam kết sau git lognhưng không git log --oneline. Sử dụng pager.log = less -FXR +/^commit.*, trong khi đặc biệt vỏ --onelinetùy chọn với alias.l1 = log --onelinepager.l1 = less -FXR.
Claudio

6

Tôi có hunk này trong tôi .gitconfigvà nó dường như hoạt động tốt (bị vô hiệu hóa cho cả diff và show):

[pager]
    diff = false
    show = false

5

Tôi thích vô hiệu hóa phân trang theo thời gian, khi tôi biết đầu ra không dài lắm. Đối với điều này, tôi tìm thấy một thủ thuật gọn gàng bằng cách sử dụng bí danh Git:

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

Hoặc thêm phần sau vào [alias]phần của ~ / .gitconfig:

n = !git --no-pager

Điều này có nghĩa là bạn có thể sử dụng tiền tố nđể tắt phân trang cho bất kỳ lệnh Git nào, tức là:

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

Đối với một kịch bản nhanh và bẩn tôi đã viết, tôi đã làm theo cách này:

PAGER=cat git diff ...

Điều này sẽ không hoạt động nếu $GIT_PAGERđược thiết lập. git --no-pagerlàm như vậy nhưng đáng tin cậy hơn.
Matthieu Moy

2

Như nó nói trên man git , bạn có thể sử dụng--no-pager trên bất kỳ lệnh nào.

Tôi sử dụng nó trên:

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

Sau đó sử dụng một bí danh để tránh sử dụng (và ghi nhớ) các lệnh dài.


2

Đối với Windows, đó là:

git config --global core.pager ""

Điều này sẽ tắt phân trang cho tất cả mọi thứ trong đó git, bao gồm cả siêu khó chịu trong git branch.


Hoạt động với Linux quá!
Rustysys-dev

2

Nếu bạn sử dụng oh-my-zsh, trong ~/.oh-my-zsh/lib/misc.zshtệp, hãy nhận xét dòng này:

env_default 'LESS' '-R'

Này, tôi nghĩ OP muốn có một công tắc dòng lệnh để sử dụng một lần duy nhất với git diff, thay vì một giải pháp toàn cầu vĩnh viễn. Ngoài ra, tôi không biết việc sửa đổi mã nguồn oh-my-zsh sẽ tốt như thế nào, vì sau này rất khó để cập nhật oh-my-zsh. Tốt hơn nên đặt giá trị mặc định đó trên tệp .zshrc của bạn.
Karri Rasinmäki

1
Cảm ơn, bạn đã đúng. Nếu sử dụng oh-my-zsh và cần một giải pháp toàn cầu vĩnh viễn, có thể thêm unset LESSvào cuối .zshrc.
mưa chậm

1

Theo mặc định, git sử dụng ít hơn như máy nhắn tin. Tôi thường thích nhiều hơn, vì nó sẽ in trang đầu tiên và sau đó cho phép bạn cuộn qua nội dung.

Hơn nữa, nội dung sẽ vẫn còn trong bảng điều khiển khi hoàn thành. Điều này thường thuận tiện, vì bạn thường muốn làm một cái gì đó với nội dung sau khi tra cứu (ví dụ: gửi email cho người giao dịch và nói với anh ta rằng anh ta đã giới thiệu một lỗi trong cam kết cuối cùng của mình).

Nếu sau đó bạn muốn nội dung ống, sẽ bất tiện khi cuộn để in mọi thứ. Điều tốt với nhiều hơn là bạn sẽ có thể kết hợp nó với đường ống và nó sẽ dẫn qua mọi thứ, ví dụ.

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

Về cơ bản nhiều hơn là tất cả những gì bạn cần, trừ khi bạn không muốn nội dung vẫn ở trong bảng điều khiển khi hoàn tất. Để sử dụng nhiều hơn thay vào đó, làm như dưới đây.

git config --global core.pager 'more'

0
git -P diff

Hoặc --no-pager.

BTW: Để giữ màu với mèo

git diff --color=always | cat

0

Chỉ cần làm theo hướng dẫn dưới đây.

  1. Chỉ cần gõ vi ~/.gitconfigvào thiết bị đầu cuối của bạn.
  2. Dán LESS="-F -X $LESS"dòng.
  3. Nhấn :wqvà nhập.
  4. Khởi động lại thiết bị đầu cuối của bạn.
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.