'Git diff' ın çağrı cihazı kullanmasını nasıl önleyebilirim?


640

Varsayılan olarak iletilecek bir komut satırı anahtarı git diffve lessçağrı cihazını kullanan diğer komutlar var mı?

Ben kedi için boru olabilir biliyorum, ama bu tüm sözdizimi vurgu kaldırır.

Ben küresel .gitconfig içinde çağrı cihazı tarafından kedi GITPAGER=cat(veya böyle bir şey) için ayarlayabilirsiniz biliyorum ; ama bazen çağrı cihazı istiyorum (farkın büyüklüğüne bağlı olarak).

Ancak, varsa komut satırı anahtarını tercih ederim; ve adam sayfalarından geçerek bir tane bulamıyorum.


16
Not: core.pager 'less -+F -+X'bu seçenekleri kaldırmanın daha yeni bir yolu olacaktır. Bkz aşağıda Cevabımı .
VonC

"az - + F - + X", uzun günlüklerdeki can sıkıcı "... atlama ..." işaretlerini kaldırmak için sihirli bir ayardır. Bu seçenekler için çok teşekkürler, günümü kurtardın!
Guillaume Perrot


lessGit ile ilgili soruya bakın ( lesssürüme bağlı olarak değişir ): unix.stackexchange.com/questions/107315/…
Pierz

Yanıtlar:


690

--no-pagerGit, çağrı cihazı kullanmamasını söyleyecektir. Seçeneği Geçme -Fetmek lessiçin değil sayfa bunu söyleyecektir eğer tek bir ekranda çıktı uyuyor.

Kullanımı:

git --no-pager diff

Yorumlardaki diğer seçenekler şunlardır:

# 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
Teşekkürler, sanırım git - no-pager .bashrc'deki gitc'e takma ad verebilirim, değil mi?
Lakshman Prasad

42
Veya GIT_PAGER veya PAGER ortam değişkenlerini veya core.pagergit config değişkenini kullanın.
Jakub Narębski

74
"Git --no-pager log --format = blah" da olduğu gibi, komutunuzdan önce --add-pager eklemeniz gerektiğini unutmayın.
Ana Betts

6
Ayrıca, terminaliniz daha az çıktıktan sonra ekranı temizlerse, kullanılabilir hale getirmek -Eiçin lessseçeneklerinize eklemek istersiniz -F.
mgalgs

9
--no-pagerBir takma ad eklemek istiyorsanız , komutun önüne bir önek eklemeniz ve bir hatadan kaçınmak için şöyle bir takma ad oluşturmanız gerektiğini unutmayın git config alias.foo '!git --no-pager foo'. Biraz kafa karıştırıcı. Sadece takma ad '--no-pager foo'işe yaramaz.
Jim Stewart

272

Daha önce de belirtildiği gibi, içerik birden fazla ekrandan küçükse, bu seçeneği bırakma -Fseçeneğinden lessçıkmak. Ancak, bunu yaptıktan sonra ekran sıfırlanır ve sonunda içeriği görmezsiniz.

-XOpsiyon böyle bir davranış ortadan kaldırır. Bu nedenle, içerik miktarına bağlı olarak koşullu sayfalamayı etkinleştirmek için aşağıdakileri kullanıyorum:

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

46
Not: git config --global --add core.pager "less -F -X"Git'te kullanmak zorunda kaldım 1.8.0.2, yukarıdaki işe yaramadı.
Dogbert

7
Harika! Ayrıca sadece git ile değil, aynı zamanda tüm programlar export LESS="-RFX"sizin gibi bir şey eklemek .bashrcveya.zshrc
defhlt 19

Bunun için teşekkür ederim; Git'in çıkıştaki ilk satırı keseceği ve ardından bir satır aşağı ve sonra bir satır yukarı çıkmanın doğru satırın 1. satırının en üstte yer almasına neden olacağı şekilde senkronizasyondan çıkacağı bir seçenekle rahatsız oldum, ardından doğru çıktıdan 3. satır gelir. Her neyse, bu seçeneği belirtmek sorunu çözdü. Çok tuhaf.
Tim Harper

Git For Windows kullanıyorsanız (Greenwood Software tarafından daha az kullanılır), ihtiyacınız olan parametre -E'dir (kaynak: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward

1
Evet, cevabımda açıkladığım gibi, özellikle çağrı cihazı başlatılıp çıktıktan sonra ekranın sıfırlanmamasını tercih ederim, özellikle de hepsi tek bir ekrana sığarsa, tam olarak ne işe yarar -X. Eğer hoşunuza gitmiyorsa kullanmayın. Bu şekilde hoşuma gidiyor çünkü bu şekilde geçmiş SH komutları gibi şeylere, komutu tekrar yazmak zorunda kalmadan geçmişimdeki önceki git komutlarının sonucuna bakarak başvurabilirim. Her biri kendi.
ishaaq

169

kullanım

git config --global core.pager cat

tüm depolar için tüm komutlar için bir çağrı cihazından kurtulmak.

Tek bir Git alt komutları için disk belleği pager.<cmd>yerine ayarı kullanarak da devre dışı bırakabilirsiniz core.pagerve ayarlarınızı Git deposu başına değiştirebilirsiniz (atlayın--global ) değiştirebilirsiniz.

Ayrıntılar man git-configiçin bakın ve arayın pager.<cmd>.


Soru, çağrı cihazının nasıl tamamen devre dışı bırakılacağı değil, grep alt komutunda nasıl devre dışı bırakılacağıydı. mtahmed'in yanıtı mükemmel.
TilmanBaumann

9
Bu genişletilmiş açıklama istedi ama bu aradığım şeydi ve en iyi Google sonuçlarından biriydi, bu yüzden teşekkürler @geekQ
Brian F Leighty

70

Belgelerdeki son değişiklikler less("varsayılan seçenekler"FRSX ) .

Bu soru için bu olurdu (git 1.8+)

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

Örneğin, Dirk Bester yorumlarda şunları öneriyor :

export LESS="$LESS -FRXK" 

bu yüzden birlikte diff renkli olsun o Ctrl-Cdan çıkın less.

Wilson F bahseder yorumlarda ve onun sorusuna şu:

yatay kaydırmayı daha az desteklediğinden, satırlar kesildiğinde daha az tek ekrandan çıkmayı devre dışı bırakır, böylece kullanıcı neyin kesildiğini görmek için metni sola kaydırabilir.


Bu değişiklikler " 1.8 için her zaman çağrı cihazını kullangit diff " bölümünde gösterildiği gibi git 1.8.x dosyasında zaten görüldü (yorumlara bakın). Ancak dokümantasyon yeniden düzenlendi ( git 1.8.5 veya 1.9, 4. Çeyrek 2013 için ).

Git komutları tarafından kullanılmak üzere metin görüntüleyici (ör. 'Daha az').
Değer kabuk tarafından yorumlanmalıdır.

Tercih sırası:

  • $GIT_PAGERçevre değişkeni,
  • sonra core.pageryapılandırma,
  • sonra $PAGER,
  • ve sonra derleme zamanında seçilen varsayılan değer (genellikle 'daha az').

Ne zaman LESSortam değişkeni kaldırılır, Git o kümelerini FRSX
(eğer LESSortam değişkeni ayarlanır, Git hiç bunu değiştirmez).

Git'in varsayılan ayarını seçici olarak geçersiz kılmak LESSistiyorsanız, core.pagerörnless -+S .
Bu git komutuyla kabuğa aktarılacak ve bu da son komutu şuna çevirecektir LESS=FRSX less -+S. Ortam, Suzun satırları kesme seçeneğini ayarlama komutunu söyler, ancak komut satırı uzun satırları katlamak için varsayılana sıfırlar.


Yeni belge ifadelerinin arkasındaki neden için taahhüt 97d01f2a'ya bakın :

config: core.pagerbelgeleri yeniden yaz

Metin bahseder core.pagerve GIT_PAGERöncelik genel resmini vermeden. git var(1) belgelerinden daha iyi bir açıklama alın .

Sistem çapında, genel ve depo başına yapılandırma dosyalarına izin vermek için mekanizmanın kullanımı bu belirli değişkenle sınırlı değildir. Paragrafı açıklığa kavuşturmak için kaldırın.

Ortam değişkeninin LESSGit'in varsayılan değerine nasıl ayarlandığını ve değişkenin nasıl özelleştirileceğini açıklayan kısmı yeniden yazın .


Not: taahhüt b327583 ( Matthieu Moymoy , Nisan 2014, git 2.0.x / 2.1, Q3 2014 için) S'yi varsayılan olarak kaldıracaktır:

çağrı cihazı: varsayılan olarak $ LESS 's'

Varsayılan olarak, Git ayarlamak için kullanılan $LESSiçin -FRSXeğer $LESSkullanıcı tarafından ayarlanan değildi. Bayraklar aslında Git için mantıklı ( ve bazen daha az çıkış Git boruları kısa olduğundan ve Git boruları çıkışı renkli çünkü). Bayrak (uzun satırları pirzola), diğer taraftan, Git ilgili ve kullanıcı tercihi meselesidir değildir. Git, kullanıcının varsayılan ayarını değiştirmeye karar vermemelidir .
FRXFXR
SLESS

Daha spesifik olarak, Sbayrak çağrı cihazı içinde güvenilir olmayan kodu inceleyen kullanıcılara zarar verir, çünkü bir yama şöyle görünür:

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

aşağıdakilerle aynı görünür:

-old code;
+new good code;

Eski davranışı tercih eden kullanıcılar $ LESS ortam değişkenini -FRSXaçık olarak ayarlayabilir veya core.pager öğesini ' less -S' olarak ayarlayabilir .

Belgeler şu şekildedir:

Ortam Sseçeneği ayarlamaz, ancak komut satırı uzun satırları kısaltmak için daha az talimat verir.
Benzer şekilde, ayarı core.pageriçin less -+Fdevre dışı bırakacaktır Fseçeneğini "devre dışı bırakma, komut satırından çevre tarafından belirtilen quit if one screenbir" davranış less.
Belirli komutlar için bazı bayraklar özellikle etkinleştirilebilir: örneğin, yalnızca satır kesmeyi etkinleştirmek için ayar pager.blameyapmak .less -Sgit blame


2
Teşekkür ederim teşekkür ederim! AY için uzun satırları keserek gitmeyi bırakmanın bir yolunu arıyordum!
coredumperror

@CoreDumpError notu: sonraki Git (2.0.X veya 2.1) varsayılan olarak satırı kesmeyecek ! Yukarıdaki düzenlenmiş cevabımı görün.
VonC

2
Teşekkürler. Bu daha az ctrl-c çıkma ile renkli fark olsun böylece daha az LESS = "$ LESS -FRXK" istiyorum istiyorum.
Dirk Bester

@DirkBester İlginç bir öneri. Daha fazla görünürlük için cevaba ekledim.
VonC

1
@WilsonF bilmiyorum, ama bu iyi bir soru gibi geliyor: neden burada bırakmak yerine, yorumlarda gömülü bir soru yapmıyorsunuz?
VonC

58

Global yapılandırmada belirli çıkışlar için çağrı cihazlarını da devre dışı bırakabilir / etkinleştirebilirsiniz:

git config --global pager.diff false

Veya core.pager seçeneğini ayarlamak için boş bir dize sağlamanız yeterlidir:

git config --global core.pager ''

Bu benim görüşüme göre catsöylediğiniz gibi ayarlamak daha iyidir .


Git 1.9'da bu benim için işe yaradı ... diğer her şey işe yaramadı.
Jordon Bedwell

Benim için çalışan bugit version 2.5.4 (Apple Git-61)
Ashley Coolman

Diğer komutlar çağrı cihazını tamamen devre dışı git diffbıraktığım için istediğim budur, ancak bu sadece diğer komutlar için çalışırken bırakması için devre dışı bırakılan tek cevaptır
SingleNegationElimination

Bu yazıdan ... Windows / PowerShell'de ayarların altına manuel olarak düzenlemek code "$($env:UserProfile)\.gitconfig"ve eklemek zorunda kaldım . Cevap şu anki powershell oturumumda işe yaradı, ancak ayarı herhangi bir yere kaydetmediği için bir sonraki açılışta etkili oldu. pager = [core]
İade Yok İade Yok

12

Borulama sırasında devre dışı bırakılan renkle ilgili olarak:

--colorRenklendirmenin devre dışı bırakılmasını önlemek için kullanın .

git diff --color | less -R

Veya zorunlu olarak yapılandırın (örneğin .gitconfig içinde):

[color]
        ui = on

git diff | less -R

Renkli olmayan araçlar için şunları kullanın:

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

Ortam değişkenini dışa aktarma LESS=-R(ör. .Bashrc'de) renk desteğini varsayılan olarak "az" olarak açar:

git diff | less


2
Git , çağrı cihazı çağrılırken ayarlanmamışsa, LESSortam değişkenini olarak ayarlayacağını unutmayın FRSX.
tobbez

10

Bu benim için Linux'ta Git 2.1.4 sürümü ile çalıştı:

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

Bu Git catyerine onu kullanır less. herhangi bir sayfalama olmadan ekranın catçıktısını alır diff.


Genellikle, kodun ne yapmak istediği ve başkalarını tanıtmadan sorunu neden çözdüğüne dair bir açıklama içeriyorsa, cevaplar çok daha yararlıdır. (Bu yazı, muhtemelen açıklama yapmadan bir yanıtın silinmesi gerektiğini düşündükleri için en az bir kullanıcı tarafından işaretlendi.)
Nathan Tuggy

3
@NathanTuggy Sorulan soruya cevap verdiğimin oldukça açık olduğunu düşündüm. Görünüşe göre bazı kullanıcılar kısa cevapları eğlence için işaretlemek istiyorlar. Biraz metin ekleyeceğim.
jcoffland

7

Pager.alias ile kendi çağrı cihazı ile difüze etmek için bir takma ad ekleyebilirsiniz, örneğin:

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

Bu, rengi açık tutar ve 'git dc'de çağrıldığında çağrı cihazı olarak' cat 'kullanır.

Ayrıca, şeyler değil yapmak:

  • --no-pagertakma adınızda kullanın . Git (1.8.5.2, Apple Git-48), ortamı değiştirmeye çalıştığınızdan şikayet edecektir.
  • !shveya ile bir kabuk kullanın !git. Bu, yukarıdaki ortam hatasını atlar, ancak çalışma dizininizi (bu komutun amaçları için) üst düzey Git dizinine sıfırlar, bu nedenle zaten bir alt dizinindeyseniz yerel bir dosyaya yapılan başvurular çalışmaz deponuz.

+1 Bu teknik, kesinleştirme sonrasında gezinmek istediğinizde kullanışlıdır git log ancakgit log --oneline . Kullanım pager.log = less -FXR +/^commit.*, özel Kılıf ederken --onelineile seçeneği alias.l1 = log --onelineve pager.l1 = less -FXR.
Claudio

6

Benim bu iri var .gitconfigve iyi çalışıyor gibi görünüyor (hem diff ve gösteri için devre dışı):

[pager]
    diff = false
    show = false

5

Çıktının çok uzun olmadığını bildiğimde, zaman zaman sayfalamayı devre dışı bırakmak istiyorum. Bunun için Git takma adlarını kullanarak düzgün bir numara buldum:

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

Veya [alias]~ / .gitconfig bölümüne aşağıdakileri ekleyin :

n = !git --no-pager

Bu n, herhangi bir Git komutu için disk belleği kapatmak için öneki kullanabileceğiniz anlamına gelir , yani:

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

Yazdığım hızlı ve kirli bir senaryo için bunu şu şekilde yaptım:

PAGER=cat git diff ...

Bu $GIT_PAGERayarlanmışsa çalışmaz . git --no-pageraynısını yapar ama daha güvenilirdir.
Matthieu Moy

2

Man git üzerinde dediği gibi kullanabilirsiniz--no-pager , herhangi bir komutta .

Ben üzerinde kullanın:

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

Sonra uzun komutları kullanmaktan (ve hatırlamaktan) kaçınmak için bir takma ad kullanın.


2

Windows için:

git config --global core.pager ""

Bu, içindeki gitsinir bozucu olan da dahil olmak üzere, her şey için sayfalamayı kapatır git branch.


Linux ile de çalışır!
rustysys-dev

2

Oh-my-zsh kullanıyorsanız, ~/.oh-my-zsh/lib/misc.zshdosyada bu satırı yorumlayın:

env_default 'LESS' '-R'

Hey, OP'nin kalıcı global bir çözümden ziyade git diff ile tek bir zaman kullanmak için bir komut satırı anahtarına sahip olmak istediğini düşünüyorum. Ayrıca, oh-my-zsh kaynak kodunu değiştirmenin ne kadar iyi olacağını bilmiyorum, çünkü oh-my-zsh'yi daha sonra güncellemek zor olacaktır. Bu varsayılan değeri .zshrc dosyanızda daha iyi ayarlayın.
Karri Rasinmäki

1
Teşekkürler, haklısın. Eğer oh-my-zsh kullanın ve kalıcı bir global çözüme ihtiyacınız varsa unset LESS, .zshrc sonuna ekleyebilirsiniz .
yavaş yağmur

1

Varsayılan olarak git, çağrı cihazı olarak daha az kullanır. İlk sayfayı yazdıracağı ve sonra içerikte gezinmenize izin vereceği için normalde daha fazlasını tercih ederim.

Ayrıca, içerik tamamlandığında konsolda kalacaktır. Bu genellikle uygundur, çünkü genellikle aramadan sonra içerikle bir şeyler yapmak istersiniz (örneğin, komitöre e-posta gönderin ve son görevinde bir hata getirdiğini söyleyin).

Daha sonra içeriği yönlendirmek istiyorsanız, her şeyi yazdırmak için kaydırmak uygun olmaz. Daha fazlasıyla iyi olan şey, onu boru hattıyla birleştirebilmeniz ve her şeyden geçmesi, örn.

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

Temel olarak, içeriğin tamamlandığında konsolda kalmasını istemiyorsanız, ihtiyacınız olan tek şey daha fazlasıdır. Bunun yerine daha fazlasını kullanmak için aşağıdaki işlemleri yapın.

git config --global core.pager 'more'

0
git -P diff

Veya --no-pager.

BTW: Rengi kedi ile korumak için

git diff --color=always | cat

0

Aşağıdaki talimatları uygulamanız yeterlidir.

  1. Sadece vi ~/.gitconfigterminalinizi yazın.
  2. LESS="-F -X $LESS"Satırı yapıştır .
  3. Tuşuna basın :wqve girin.
  4. Terminalinizi yeniden başlatın.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.