Bagaimana cara mencegah 'git diff' menggunakan pager?

640

Apakah ada saklar baris perintah untuk lewat git diffdan perintah lain yang menggunakan lesspager secara default?

Saya tahu saya bisa menyalurkannya ke cat, tetapi itu menghilangkan semua penyorotan sintaksis.

Saya tahu saya dapat mengatur pager di global. Gitconfig menjadi cat oleh GITPAGER=cat(atau sesuatu seperti itu); tapi saya ingin pager kadang-kadang (tergantung pada ukuran diff).

Tapi, saya lebih suka saklar baris perintah jika ada; dan saya tidak dapat menemukannya, menelusuri halaman manual.

Lakshman Prasad
sumber
16
Catatan: core.pager 'less -+F -+X'akan menjadi cara yang lebih baru untuk menghapus opsi-opsi itu. Lihat jawaban saya di bawah ini .
VonC
"less - + F - + X" adalah pengaturan ajaib untuk menghapus marker "... skipping ..." dalam log yang panjang. Terima kasih banyak untuk opsi-opsi itu, Anda menghemat hari saya!
Guillaume Perrot
terkait: stackoverflow.com/questions/12352049/...
Trevor Boyd Smith
Lihat pertanyaan terkait tentang penggunaan lessdengan git (bervariasi tergantung pada lessversi): unix.stackexchange.com/questions/107315/…
Pierz

Jawaban:

691

--no-pageruntuk Git akan mengatakannya untuk tidak menggunakan pager. Melewati opsi -Funtuk lessakan memberitahukannya ke halaman tidak jika output cocok dalam satu layar.

Pemakaian:

git --no-pager diff

Pilihan lain dari komentar meliputi:

# 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
sumber
3
Terima kasih, saya kira saya bisa alias git --no-pager ke gitc di .bashrc, kan?
Lakshman Prasad
42
Atau gunakan variabel lingkungan GIT_PAGER atau PAGER, atau core.pagervariabel git config.
Jakub Narębski
74
Ingatlah bahwa Anda harus menambahkan --add-pager sebelum perintah Anda, seperti pada "git --no-pager log --format = blah"
Ana Betts
6
Juga, jika terminal Anda membersihkan layar setelah keluar lebih sedikit, Anda ingin menambahkan opsi -EAnda lessagar -Fdapat digunakan.
mgalgs
9
Catatan bahwa jika Anda ingin memasukkan --no-pagerdalam alias, Anda harus awalan perintah dengan itu, dan untuk menghindari kesalahan, Anda harus membuat sebuah alias seperti ini: git config alias.foo '!git --no-pager foo'. Agak membingungkan. Cukup aliasing untuk '--no-pager foo'tidak akan berhasil.
Jim Stewart
272

Seperti jawaban sebelumnya yang disebutkan, meneruskan -Fopsi untuk lessmembuatnya berhenti jika konten kurang dari satu layar. Namun, setelah melakukannya, layar diatur ulang, dan Anda akhirnya tidak melihat konten.

The -Xpilihan tidak jauh dengan perilaku itu. Jadi, saya menggunakan yang berikut ini untuk mengaktifkan paging bersyarat berdasarkan jumlah konten:

git config --global --replace-all core.pager "less -F -X"
ishaaq
sumber
46
Catatan: Saya harus menggunakan git config --global --add core.pager "less -F -X"git 1.8.0.2, yang di atas tidak berfungsi.
Dogbert
7
Bagus! Juga untuk membuatnya berperilaku tidak hanya dengan git tetapi semua program menambahkan sesuatu seperti export LESS="-RFX"ke .bashrcatau.zshrc
defhlt
Terima kasih untuk ini; Saya telah diganggu oleh opsi di mana git akan memotong baris pertama dari output, dan kemudian keluar dari sinkronisasi sehingga turun satu baris dan kemudian naik satu baris akan menyebabkan baris 1 yang benar menempati bagian atas, diikuti oleh baris ke-3 dari output yang benar. Bagaimanapun, menentukan opsi ini menyelesaikan masalah itu. Sangat aneh.
Tim Harper
Jika menggunakan Git Untuk Windows (yang menggunakan lebih sedikit dibangun oleh Greenwood Software), parameter yang Anda butuhkan adalah -E (sumber: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward
1
Ya, seperti yang saya jelaskan dalam jawaban saya, saya lebih suka layar tidak diatur ulang sebelum dan setelah pager dimulai dan keluar, terutama jika semuanya cocok dalam satu layar, yang persis seperti apa -X. Jangan menggunakannya jika Anda tidak suka itu. Saya suka karena cara ini saya bisa merujuk ke hal-hal seperti git SHA dengan melihat hasil dari perintah git sebelumnya dalam sejarah saya tanpa harus mengetikkan perintah lagi. Masing-masing untuk dirinya sendiri.
ishaaq
169

Menggunakan

git config --global core.pager cat

untuk menghilangkan pager untuk semua perintah untuk semua repositori.

Anda juga dapat menonaktifkan paging untuk sub-perintah Git tunggal dengan menggunakan pager.<cmd>pengaturan alih-alih core.pager, dan Anda dapat mengubah pengaturan Anda per repositori Git (menghilangkan --global).

Lihat man git-configdan cari pager.<cmd>detailnya.

geekQ
sumber
Pertanyaannya bukan bagaimana cara menonaktifkan pager sama sekali tetapi bagaimana menonaktifkannya untuk perintah sub grep. Jawaban mtahmed sempurna.
TilmanBaumann
9
Ini mungkin apa yang diminta penjelasan panjang lebar tetapi ini adalah apa yang saya cari dan itu adalah salah satu hasil Google teratas jadi terima kasih @geekQ
Brian F Leighty
70

Perubahan terbaru dalam dokumentasi menyebutkan cara berbeda untuk menghapus opsi default untuk less("opsi default" menjadi FRSX).

Untuk pertanyaan ini, ini akan menjadi (git 1.8+)

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

Misalnya, Dirk Bester menyarankan di komentar :

export LESS="$LESS -FRXK" 

sehingga saya mendapatkan diff berwarna dengan Ctrl-Ckeluar dari less.

Wilson F menyebutkan dalam komentar dan dalam pertanyaannya bahwa:

kurang mendukung pengguliran horizontal, jadi ketika garis-garis dipotong, lebih sedikit penonaktifan berhenti-jika-satu-layar sehingga pengguna masih dapat menggulir teks ke kiri untuk melihat apa yang terpotong.


Modifikasi itu sudah terlihat di git 1.8.x, seperti yang diilustrasikan dalam " Selalu gunakan pager untukgit diff " (lihat komentar). Tetapi dokumentasinya baru saja ditulis ulang ( untuk git 1.8.5 atau 1.9, Q4 2013 ).

Penampil teks untuk digunakan oleh perintah Git (misalnya, 'kurang').
Nilai ini dimaksudkan untuk ditafsirkan oleh shell.

Urutan preferensi adalah:

  • yang $GIT_PAGERvariabel lingkungan,
  • lalu core.pagerkonfigurasi,
  • lalu $PAGER,
  • dan kemudian default dipilih pada waktu kompilasi (biasanya 'kurang').

Ketika LESSvariabel lingkungan tidak disetel, Git mengaturnya FRSX
(jika LESSvariabel lingkungan disetel, Git tidak mengubahnya sama sekali).

Jika Anda ingin secara selektif menimpa pengaturan default Git untuk LESS, Anda dapat mengatur core.pagerke misless -+S .
Ini akan diteruskan ke shell oleh Git, yang akan menerjemahkan perintah terakhir ke LESS=FRSX less -+S. Lingkungan memberi tahu perintah untuk mengatur Sopsi untuk memotong garis panjang tetapi baris perintah mengatur ulang ke default untuk melipat garis panjang.


Lihat komit 97d01f2a untuk alasan di balik kata-kata dokumentasi baru:

config: menulis ulang core.pagerdokumentasi

Teks menyebutkan core.pagerdan GIT_PAGERtanpa memberikan gambaran keseluruhan tentang prioritas. Pinjam deskripsi yang lebih baik dari git var(1) dokumentasi.

Penggunaan mekanisme untuk memungkinkan file konfigurasi sistem, global, dan per-repositori tidak terbatas pada variabel khusus ini. Hapus itu untuk memperjelas paragraf.

Tulis ulang bagian yang menjelaskan bagaimana variabel lingkungan LESSdiatur ke nilai default Git, dan bagaimana menyesuaikannya secara selektif.


Catatan: commit b327583 ( Matthieu Moymoy , April 2014, untuk git 2.0.x / 2.1, Q3 2014) akan menghapus S secara default:

pager: hapus 'S' dari $ KURANG secara default

Secara default, Git digunakan untuk mengatur $LESSke -FRSXjika $LESStidak diatur oleh pengguna.
The FRXbendera sebenarnya masuk akal untuk Git ( Fdan Xkarena kadang-kadang output Git pipa kurang pendek, dan Rkarena pipa Git berwarna output).
The Sflag (memotong garis panjang), di sisi lain, tidak berhubungan dengan Git dan merupakan masalah preferensi pengguna. Git seharusnya tidak memutuskan untuk pengguna untuk mengubah LESSdefault .

Lebih khusus lagi, Sflag membahayakan pengguna yang meninjau kode yang tidak dipercaya dalam pager, karena sebuah tambalan terlihat seperti:

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

akan tampak identik dengan:

-old code;
+new good code;

Pengguna yang lebih suka perilaku lama masih dapat mengatur variabel lingkungan $ KURANG untuk -FRSXsecara eksplisit, atau mengatur core.pager ke ' less -S'.

Dokumentasi akan berbunyi:

Lingkungan tidak mengatur Sopsi tetapi baris perintah tidak, menginstruksikan lebih sedikit untuk memotong garis panjang.
Demikian pula, pengaturan core.pageruntuk less -+Fakan menonaktifkan Fopsi yang ditentukan oleh lingkungan dari baris perintah, menonaktifkan " quit if one screen" perilaku less.
Seseorang dapat secara khusus mengaktifkan beberapa flag untuk perintah tertentu: misalnya, pengaturan pager.blameuntuk less -Smengaktifkan pemotongan baris hanya untuk git blame.

VONC
sumber
2
Terima kasih terima kasih! Saya telah mencari cara untuk membuat git berhenti memotong antrean panjang untuk BULAN!
coredumperror
@CoreDumpError note: Git berikutnya (2.0.X atau 2.1) tidak akan memotong baris secara default ! Lihat jawaban saya yang diedit di atas.
VonC
2
Terima kasih. Ini biarkan saya mencari tahu bahwa saya ingin ekspor KURANG = "$ KURANG -FRXK" sehingga saya mendapatkan warna yang berbeda dengan ctrl-c berhenti dari kurang.
Dirk Bester
@DirkBester Saran yang menarik. Saya telah memasukkannya dalam jawaban untuk lebih banyak visibilitas.
VonC
1
@ WillsonF Saya tidak tahu, tapi itu terdengar seperti pertanyaan yang bagus: mengapa tidak mengajukan pertanyaan daripada meninggalkannya di sini, terkubur dalam komentar?
VonC
58

Anda dapat menonaktifkan / mengaktifkan pager untuk output spesifik dalam konfigurasi global juga:

git config --global pager.diff false

Atau untuk mengatur opsi core.pager, cukup berikan string kosong:

git config --global core.pager ''

Ini lebih baik menurut saya daripada mengaturnya catseperti yang Anda katakan.

mtahmed
sumber
Inilah yang bekerja untuk saya di Git 1.9 ... semuanya tidak berfungsi.
Jordon Bedwell
Ini adalah yang bekerja untuk sayagit version 2.5.4 (Apple Git-61)
Ashley Coolman
Ini yang saya inginkan karena perintah lain menonaktifkan pager sepenuhnya, tetapi ini adalah satu-satunya jawaban yang menonaktifkan hanya untuk git diffsementara membiarkannya bekerja untuk perintah lain
SingleNegationElimination
pada tulisan ini ... pada Windows / PowerShell saya harus mengedit code "$($env:UserProfile)\.gitconfig"dan menambahkan secara manual di pager = bawah [core]pengaturan. Jawabannya bekerja untuk sesi powerhell saya saat ini tetapi sepertinya tidak menyimpan pengaturan di mana pun sehingga efektif pada peluncuran berikutnya.
Tanpa Pengembalian Uang Tanpa Pengembalian
12

Mengenai warna yang dinonaktifkan saat pemipaan:

Gunakan --coloruntuk menghindari pewarnaan yang dinonaktifkan.

git diff --color | less -R

Atau konfigurasikan dengan paksa (dalam mis. Gitconfig):

[color]
        ui = on

git diff | less -R

Untuk alat non-warna, kemudian gunakan:

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

Mengekspor variabel lingkungan LESS=-R(misalnya .bashrc) mengaktifkan dukungan warna secara default di "less":

git diff | less

StellarVortex
sumber
2
Perhatikan bahwa git akan mengatur LESSvariabel lingkungan FRSXketika memanggil pager, jika tidak disetel.
tobbez
10

Ini bekerja untuk saya dengan Git versi 2.1.4 di Linux:

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

Ini menjadikan Git catsebagai gantinya less. cathanya membuang output diffke layar tanpa paging apa pun.

jcoffland
sumber
Secara umum, jawaban akan jauh lebih membantu jika mereka menyertakan penjelasan tentang apa yang dimaksudkan untuk dilakukan oleh kode, dan mengapa hal itu menyelesaikan masalah tanpa memperkenalkan orang lain. (Posting ini ditandai oleh setidaknya satu pengguna, mungkin karena mereka pikir jawaban tanpa penjelasan harus dihapus.)
Nathan Tuggy
3
@ NathanTuggy saya pikir cukup jelas bahwa saya menjawab pertanyaan yang diajukan. Sepertinya beberapa pengguna suka mencari jawaban pendek untuk bersenang-senang. Saya akan menambahkan beberapa teks.
jcoffland
7

Anda dapat menambahkan alias ke diff dengan pagernya sendiri dengan pager.alias, seperti:

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

Ini akan menjaga warna dan menggunakan 'cat' sebagai pager ketika dipanggil di 'git dc'.

Juga, hal - hal yang tidak boleh dilakukan:

  • gunakan --no-pagerdi alias Anda. Git (1.8.5.2, Apple Git-48) akan mengeluh bahwa Anda mencoba memodifikasi lingkungan.
  • gunakan shell dengan !shatau !git. Ini akan mem-bypass kesalahan lingkungan, di atas, tetapi itu akan mengatur ulang direktori kerja Anda (untuk keperluan perintah ini) ke direktori Git tingkat atas, sehingga setiap referensi ke file lokal tidak akan berfungsi jika Anda sudah berada di subdirektori dari repositori Anda.
Joseph Cheek
sumber
+1 Teknik ini berguna saat Anda ingin menavigasi dengan komit setelah git logtetapi tidak git log --oneline. Gunakan pager.log = less -FXR +/^commit.*, sementara khusus-casing --onelineopsi dengan alias.l1 = log --onelinedan pager.l1 = less -FXR.
Claudio
6

Saya memiliki bingkah ini di saya .gitconfigdan tampaknya berfungsi dengan baik (dinonaktifkan untuk kedua diff dan acara):

[pager]
    diff = false
    show = false
sekmo
sumber
5

Saya suka menonaktifkan paging dari waktu ke waktu, ketika saya tahu outputnya tidak terlalu lama. Untuk ini, saya menemukan trik rapi menggunakan alias Git:

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

Atau tambahkan berikut ini ke [alias]bagian ~ / .gitconfig:

n = !git --no-pager

Ini berarti bahwa Anda dapat menggunakan awalan nuntuk mematikan paging untuk perintah Git, yaitu:

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
sumber
2

Untuk skrip cepat dan kotor yang saya tulis, saya melakukannya dengan cara ini:

PAGER=cat git diff ...
Roberto Bonvallet
sumber
Ini tidak akan berfungsi jika $GIT_PAGERdiatur. git --no-pagermelakukan hal yang sama tetapi lebih andal.
Matthieu Moy
2

Seperti yang tertulis di man git , Anda dapat menggunakan --no-pagerperintah apa saja.

Saya menggunakannya di:

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

Kemudian gunakan alias untuk menghindari penggunaan (dan mengingat) perintah panjang.

Apakah Ma
sumber
2

Untuk Windows itu adalah:

git config --global core.pager ""

Ini akan mematikan halaman untuk semua yang ada di gitdalamnya, termasuk halaman yang sangat menjengkelkan git branch.

Jaredcheeda
sumber
Bekerja dengan Linux juga!
rustysys-dev
2

Jika Anda menggunakan oh-my-zsh, di dalam ~/.oh-my-zsh/lib/misc.zshfile, beri komentar pada baris ini:

env_default 'LESS' '-R'
hujan lambat
sumber
Hei, saya pikir OP ingin memiliki saklar baris perintah untuk menggunakan waktu tunggal dengan git diff, daripada solusi global permanen. Juga, saya tidak tahu seberapa baik memodifikasi kode sumber oh-my-zsh, karena akan sulit untuk memperbarui oh-my-zsh nanti. Lebih baik mengatur nilai default pada file .zshrc Anda.
Karri Rasinmäki
1
Terima kasih, kamu benar. Jika menggunakan oh-my-zsh dan membutuhkan solusi global permanen, dapat menambahkan unset LESSdi akhir .zshrc.
hujan lambat
1

Secara default git menggunakan lebih sedikit menggunakan pager. Saya biasanya lebih suka, karena akan mencetak halaman pertama dan kemudian memungkinkan Anda untuk menelusuri konten.

Selanjutnya, konten akan tetap berada di konsol setelah selesai. Ini biasanya nyaman, karena Anda sering ingin melakukan sesuatu dengan konten setelah pencarian (mis. Kirim email ke komiter dan katakan padanya dia memperkenalkan bug dalam komit terakhirnya).

Jika Anda kemudian ingin mem-pipe konten, akan tidak nyaman untuk menggulir untuk mencetak semuanya. Hal yang baik dengan lebih banyak adalah Anda akan dapat menggabungkannya dengan pipa dan akan menyalurkan melalui segalanya, misalnya.

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

Pada dasarnya lebih banyak yang Anda butuhkan, kecuali Anda tidak ingin konten tetap berada di konsol ketika selesai. Untuk menggunakan lebih banyak, lakukan seperti di bawah ini.

git config --global core.pager 'more'
patrik
sumber
0
git -P diff

Atau --no-pager.

BTW: Untuk mempertahankan warna dengan kucing

git diff --color=always | cat
hyperpallium
sumber
0

Cukup ikuti instruksi di bawah ini.

  1. Ketikkan saja vi ~/.gitconfigterminal Anda.
  2. Tempelkan LESS="-F -X $LESS"garis.
  3. Tekan :wqdan masuk.
  4. Mulai ulang terminal Anda.
Nitish
sumber