Perintah cabang Git berperilaku seperti 'kurang'

415

Ketika saya menggunakan git branchperintah untuk mendaftar semua cabang, saya melihat output dari git branch | less.

Perintah git branchini seharusnya menampilkan daftar cabang, seperti lshalnya untuk file.

Ini adalah output yang saya dapatkan:

Masukkan deskripsi gambar di sini

Bagaimana cara mendapatkan perilaku default git branch? Apa yang menyebabkan keluaran halaman?

Saya menggunakan ZSH dengan oh_my_zsh(tidak ada untuk Git di sana), dan .gitconfigpenampilan saya seperti ini:

[user]
  email = [email protected]
  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
DenniJensen
sumber

Jawaban:

738

Seperti disebutkan dalam komentar atas jawaban Mark Adelsberger , ini adalah perubahan perilaku default yang diperkenalkan pada Git 2.16 .

Anda dapat mengubah output halaman untuk git branchdinonaktifkan secara default dengan pager.branchpengaturan konfigurasi :

git config --global pager.branch false
Zach Schneider
sumber
128
Itu adalah keputusan aneh dan ganjil untuk membuat default. Saya berharap alat cli unix-y saya untuk berperilaku seperti program sederhana bodoh yang dapat Anda rantai jika Anda mau, tapi saya kira diskusi itu untuk situs lain.
Stragulus
7
@ Stragulus Perhatikan bahwa default baru tidak menghentikan Anda dari merantai git branchdengan sesuatu yang lain. Menggunakan deteksi pipa , Git akan menampilkan daftar cabang ke stdout dalam perintah git branch > branches.txtatau git branch | wc -l.
Rory O'Kane
3
@ RoryO'Kane tetapi dengan pager, saya memiliki tipe tambahan ESC/qsetelah git branchcek sederhana .
mitnk
23
@mitnk Belum tentu. Jika pager lessAnda, Anda dapat menambahkan --no-init --quit-if-one-screenke LESSvariabel lingkungan Anda , yang akan menyebabkan lesshanya menulis ke stdout jika teks dapat dilihat tanpa menggulir. Lihat man lessuntuk lebih jelasnya.
Rory O'Kane
13
Jika Anda ingin menambahkannya ke file config Anda secara manual, itu [pager] branch = false(pada dua baris).
Sam
56

Seperti jawaban lain tunjukkan, Git secara default mem-piping dirinya sendiri ke pager ( lesssecara default) untuk sebagian besar perintah.

Namun, poin penting adalah bahwa ketika variabel lingkungan KURANG tidak disetel, Git menetapkannya ke FRX , dan konsekuensinya adalah bahwa perilaku yang dapat dilihat pengguna sama seperti jika pager tidak digunakan ketika output perintah pendek (yaitu jika Anda hanya memiliki beberapa cabang). Melihat pria lebih sedikit :

-F atau --quit-if-one-screen
Menyebabkan kurang keluar secara otomatis jika seluruh file dapat ditampilkan pada layar pertama.

-R atau --RAW-CONTROL-CHARS
[...] Sequence escape "color" adalah output dalam bentuk "raw".

-X atau --no-init
Menonaktifkan pengiriman string termisialisasi dan deinitialisasi ke terminal. Ini kadang-kadang diinginkan jika string deinitialization melakukan sesuatu yang tidak perlu, seperti membersihkan layar.

Jika Anda mendapatkan perilaku yang Anda uraikan, kemungkinan besar Anda telah $LESSmenetapkan hal lain, dan tidak menyetelnya ( unset LESS) akan menghilangkan masalah sambil menjaga perilaku "pager" untuk hasil yang lama. Atau, Anda dapat mengaktifkan perilaku untuk tetap $LESSapa adanya dengan menambahkan ini ke .gitconfigfile Anda :

[core]
    pager = less -FRX

Jika Anda benar-benar tidak menyukai hal pager, Anda dapat menonaktifkannya secara global atau berdasarkan perintah (lihat jawaban lain)

Matthieu Moy
sumber
40

Bukan untuk berdebat semantik, tetapi perilaku yang Anda dapatkan adalah default. Itu sebabnya Anda mendapatkannya ketika Anda tidak meminta sesuatu yang berbeda. Secara default, branch(dan banyak perintah Git lainnya) menggunakan pager saat mengirim output ke terminal.

Anda dapat mengganti default ini dengan menggunakan --no-pageropsi:

git --no-pager branch

Atau jika Anda mengarahkan output ke file, Git harus mendeteksi bahwa itu tidak menulis ke terminal dan karenanya tidak boleh menggunakan pager. (Di sisi lain, itu menunjukkan kasus penggunaan scripting, dalam hal ini Anda harus mempertimbangkan menggunakan perintah plumbing seperti git for-each-refdalam preferensi git branch.)

Mark Adelsberger
sumber
git --no-pager branchbekerja. Tapi bagaimana ini diatur? Hanya PAGERvariabel lingkungan diatur ke less. Ini bukan perilaku default. Semua perguruan tinggi saya memiliki output sebagai daftar yang dicetak ke terminal.
DenniJensen
Versi git apa yang Anda gunakan? Dan yang mana yang digunakan rekan Anda?
Lasse V. Karlsen
2.16.0! Apakah ini fitur yang diperkenalkan ke git di versi ini?
DenniJensen
Ya itu default sekarang. github.com/git/git/blob/master/Documentation/RelNotes/… Perguruan tinggi saya di sebelah saya menggunakan versi yang sama dan tidak memiliki masalah ini :) thx @mark
DenniJensen
1
Ini adalah jawaban yang paling unggul di sini, sedih karena hanya ada sedikit upvotes, karena saya gulir sedikit untuk menemukan karya besar ini.
codepleb
26

Perilaku Git ini juga semakin menyebalkan bagi saya. Saya mendapatkan daftar tag saya lessketika hanya ingin daftar tag misalnya.

Seseorang dapat mengontrol perilaku ini juga dengan mengubah Git PAGER default menjadi catbukan less. Saya lebih suka menggulir di iTerm daripada di editor. Saya suka menggunakan editor ketika saya mau.

Begitu:

git config --global core.pager cat
ionescu77
sumber
2
Ya ini harus menjadi jawaban yang valid untuk saya
Tura
2
terimakasih atas peringatannya. Saya akui setelah beberapa bulan pemakaian, saya masih menggunakan cat, tapi misalnya saat melakukannya git logmemang mengganggu. Saya hanya merindukan perilaku asli, tetapi tidak punya waktu untuk meningkatkan alur kerja harian saya di pespektif ini.
ionescu77
Anda menang! ... Sempurna!
sdlins
2
Perhatikan bahwa ini akan berlaku juga untuk git log...
bagerard
10

Bagi mereka yang ingin memperbarui mereka ~/.gitconfiguntuk memperbaikinya, akan terlihat seperti ini:

[pager]
   branch = false
Nick
sumber
aneh di sini: pengaturan ini bekerja dan karena beberapa hari tidak lagi, apakah ada perubahan atau Apakah konfigurasi saya tidak diterapkan?
ConquerorsHaki
@ConquerorsHaki Solusi ini berfungsi untuk saya dengan git v2.17.1 Cobalah git config --list --show-originuntuk men-debug pengaturan apa yang / tidak diatur untuk Anda / sistem Anda dan dari mana ( stackoverflow.com/q/12254076/1590950 ).
tidak dapat dibagi
7

Perintah cabang Git berperilaku seperti 'kurang'

Karena Git secara default membuka output dalam pager (setidaknya di Ubuntu). The jawaban yang diterima benar-benar akan menggantikan pager, yang Anda mungkin tidak seperti jika output sangat panjang.

Saya akan merekomendasikan mengganti pager dengan less, sehingga tidak "gulir" output kurang dari ketinggian terminal.

git config --global --replace-all core.pager "less -F -X"
Imran Ahmad
sumber
3

Lakukan hal berikut:

[alias]
  br = !git --no-pager branch
João Tiago
sumber
2

Jawaban yang diterima tampaknya salah. Ada dua masalah:

  1. Perilaku ini sebenarnya berbeda antara bash (dikonfigurasi default) dan zsh. 'Masalah' hanya muncul di bawah zsh.
  2. Solusi yang disarankan akan membuat git branchtidak menggunakan pager selalu, yang tidak akan diinginkan ketika ada banyak output.

Alasan sebenarnya adalah bahwa bash dan zsh memiliki definisi default yang berbeda tentang KURANG: bash tidak mendefinisikan apa-apa, sedangkan zsh mendefinisikannya -R. Ketika saya melakukannya unset LESSdi zsh, semuanya kembali normal ....

The -Rperilaku mungkin masih diinginkan. Jika demikian, Anda dapat menambahkan instruksi berikut ke .zshrc Anda agar semuanya berjalan:

export LESS=-FRX

-F'menyebabkan lebih sedikit untuk keluar secara otomatis jika seluruh file dapat ditampilkan pada layar pertama'. Namun, -Xperlu ditentukan secara bersamaan, jika tidak, output tidak akan ditampilkan ketika ada kurang dari satu layar penuh dari output.

Yongwei Wu
sumber
0

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

GIT_PAGER mengontrol program yang digunakan untuk menampilkan output multi-halaman pada baris perintah. Jika ini tidak disetel, PAGER akan digunakan sebagai mundur.

Untuk mengatasi masalah Anda, Anda dapat menghapus PAGER dan GIT_PAGER di shell Anda.

C-Otto
sumber
1
Unset PAGER( GIT_PAGERadalah unset) masalah masih ada. Apakah ada lokasi saya harus memeriksa env vars ini?
DenniJensen
@ DenniJensen Anda dapat mengatur pager pada perintah like PAGER= git branch(dengan satu spasi setelah dan tidak ada sebelum tanda sama dengan persis seperti yang ditulis). Tidak tahu, apakah itu lebih baik daripada misalnya git branch | cat,.
maaartinus
-1

Saya memiliki masalah yang sama dengan git statusdan git config --global pager.status falsemenyelesaikannya juga.

ad_on_is
sumber