簡體   English   中英

如何使用尋呼機進行長 git add --patch 大塊頭?

[英]How do I use a pager for long git add --patch hunks?

當我使用git add --patch交互式添加diff git add --patch ,有時會得到比屏幕長的塊,但無法使用less來翻頁。

這對我來說很奇怪,因為我已經設置了:

[core]
      pager = less -FRX --tabs=4

[pager]

  diff = diff-highlight | less -FRX --tabs=4

interactive.diffFilter=通過less傳輸也無助於分頁。

我需要做什么才能讓git add--patch使用less以便我可以使用鍵盤來導航超過一個屏幕的任何輸出?

你不能。 這是Unix 管道模型的本質。

使用尋呼機的 Git 命令可以與任何通用stdin尋呼機一起工作的原因是因為這種模型。 此類 git 命令將其輸出寫入stdout 尋呼機從stdin讀取其輸入。 前者的stdout通過管道傳送到后者的stdin 正是這種管道模型的簡單性使尋呼機具有通用性,並允許 git 允許您選擇自己的尋呼機,只要它使用此模型即可。

那么為什么git add -p (或git add -i )不能像git diffgit log呢?

因為一次只能有一個交互式應用程序。

git diffgit log不是交互式的。 git add -p和尋呼機交互式的。

管道模型的性質意味着一次只能控制一個應用程序,並且需要控制一個交互式應用程序。 為了讓尋呼機獲得對終端的控制(以便它可以顯示提示並響應您的輸入), git add -p必須釋放控制權。 一旦發生,就無法收回。

這樣看:將有兩個命令行提示試圖與您交互:一個用於git add -p ,另一個用於尋呼機。 他們將如何協調? 它必須是這樣的:

  1. git add -p將一個大塊寫入stdout ,以及大塊結束 (EOH) 標記而不是通常的文件結束 (EOF) 標記。
  2. git add -p然后將終端的控制權交給管道另一端的任何應用程序。
  3. 尋呼機將接收大塊,並控制終端顯示大塊的片段及其命令提示。
  4. 尋呼機的行為與通常一樣,但有很大的不同。 通常它會看到一個 EOF 標記,所以當你說你已經完成( quit命令)時,它會退出。 但是 EOH 制造商告訴尋呼機,“不要退出。當用戶完成后,將控制權交還給上游應用程序。不要退出。等待。”
  5. 因此,當您使用各種尋呼機命令仔細閱讀大塊時,您可以使用其quit命令告訴它您已經像往常一樣完成了。
  6. 但是現在尋呼機沒有退出,而是以某種方式將終端控制權交還給git add
  7. git add的終端提示然后將替換尋呼機的...
  8. ...現在我們回到第 1 步。繼續重復直到 EOF。

如您所見,這不僅是一種糟糕的用戶體驗(使用尋呼機的quit命令在每個大塊上返回git add ),它還會完全破壞Unix 管道模型的強大功能和美感

出於同樣的原因, git add -p不能使用diff-so-fancy

git -p具有類似尋呼機行為的唯一方法是內置一個,或者定義一個“Git Pager API”,然后我們等待人們編寫使用該 API 的尋呼機。 這是插件模型,它與管道模型非常不同。 這也意味着緊密集成: git add -p命令和 pager 命令必須組合在一起,並在每個命令提示符下可用。

使用終端應用程序的分頁

我發現在終端窗口中向上滾動很容易。 我的鍵盤命令允許我逐行或逐頁移動。

使用git add -psplit命令

你有沒有考慮過使用git add -psplit命令來分解大塊頭? 無論如何,我發現較小的帥哥更容易推理!

作為一種解決方法,您可以設置EDITOR=less並使用e ( edit ) 在大塊頭上運行less 但是,這種解決方法有一些缺點。 可以通過以下方式避免這些:

EDITOR="EDITOR='$EDITOR' bash -c 'set -m; less -K \"\$1\"' --" git add -p
  • 重置EDITOR調用之前less允許使用標准vless來調用編輯器。

  • less-K選項允許使用 Control-C 退出less ,告訴 Git 不要暫存大塊。 q退出less將導致大塊被上演。

  • set -m創建一個單獨的進程組,阻止 Control-C 冒泡並殺死 Git 進程。

還有一些工具,例如 Magit,為交互式登台提供了更好的界面

根據AtnNn 的回答,我想出了以下別名:

ap = !"VISUAL=\"VISUAL='$VISUAL' bash -c 'set -m; less -K -+F \\\"\\$1\\\"' --\" git add -p \"$@\" #"
  • eless分頁大塊
    • ^C退出並重復交互菜單
    • q顯示顯示的內容
    • v編輯顯示的內容

我正在做一個 PR 來在git本身中解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM