Git:選択した領域をファイルバッファーから直接ステージングすることは可能ですか?


14

Magitを使用すると、magitステータスバッファーを開き、を押しTABてdiffを展開(またはRET別のdiffバッファーを表示)し、ハンクの一部にマークを付け、sまたはuを押して領域をステージング/ステージング解除できます。すごくいい。

私はそれが可能かどうか知りたい:

  • ファイルを編集する
  • ファイルバッファー内の領域、ハンク、またはいくつかのハンクを選択します
  • 選択した領域またはハンクポイントのステージング/ステージング解除

ハンクと地域について少し混乱しているように見えます。magitの機能と質問の説明を編集しました。しかし、あなたが何を尋ねようとしていたのかを正しく推測できなかったかもしれません。
タジウス

@tarsius多分私は混乱しています。私にとって、リージョンはバッファー内で選択したばかりのものであり、ハンクはステージされる準備ができている選択されたリージョンです。私が間違っている?
Nsukami _

2
「領域」はEmacsの用語で、ポイントとマークの間にあるもの、つまり「選択」です。「ハンク」はGitの用語で、たとえば「@@ -1,1 +1,1」で始まり、新しいハンクを開始する次の見出しの直前で終了します。Magitは、Emacsが一般的にリージョンをハイライトするのと同じように、現在のセクション(ハンクセクションである可能性があります)をハイライトします。
タルシウス

1
magitステータスまたはdiffのみのバッファでは、を押すだけで、ハンク内のどこにいても現在のハンクをステージングできますs。ただし、ハンクの一部をマークして(ファイル訪問バッファーで行うのと同じ方法で)ハンクの一部だけをステージングしてから、それだけをステージングすることもできます。
タルシウス

@tarsius正確に言うと、私の英語は十分にシャープではありません。
Nsukami _

回答:


11

いいえ、Magitはそれをサポートしていません。ただし、将来のバージョンでは可能性があります。Git-Gutterは現在サポートしています。コマンドの名前はgit-gutter:stage-hunkです。


これはハンクをステージングしますが、リージョンはステージングしません。
オコド

バインドを作成してハンクをステージングし、別のバインドを作成して次のハンクにジャンプし、ステージングして、繰り返すことをお勧めします。バッファ全体をステージングする方法もありますが、その時点でコマンドラインから実行することもできます。git-gutter + magitを使用してブロックレベルでコミットするのが最善であると思います。大きな変更はgit-gutterには適していません。
-Droogans

1

前述のように、git-gutterはファイル内のgit情報を直接表示するために設計された拡張機能であり、そこから操作しますが、magitは差分の操作に焦点を当てています。

この機能は、すぐにgit gutterで使用される予定はありません(https://github.com/syohex/emacs-git-gutter/issues/91

しかし、emacs lispがワイプアップに非常に優れているはずです(ある領域の塊を調べて、それらを段階的にステージングします)。これを自分で試してみると、ほとんどの場合がそうでした。唯一の問題は、ハンクをステージングした後、バックグラウンドプロセスを開始するgit-gutterであり、それが完了するのを待たなかったため、これに対処するために少しハックな魔法を追加する必要がありました。

次のemacs lisp関数は、あなたが望むことをするはずです。いくつかのキーにバインドすることもできます。

(defun my-git-stage-region ()
  (interactive)
  (let ((git-gutter:ask-p nil)
        (start (region-beginning))
        (end (region-end)))
    (save-excursion
      (goto-char start)
      (git-gutter:next-hunk 1)
      (while (< (point) end)
        (git-gutter:stage-hunk)
        ;; This is a hack to wait for git-gutter to finish
        ;; updating information (git-gutter kicks
        ;; of a process to update the diff information
        ;; and does not block)
        (while (get-buffer (git-gutter:diff-process-buffer (git-gutter:base-file)))
          (sit-for 0.05))
        (git-gutter:next-hunk 1)))))

注:これは、ハンクを分割できません。ハンクは完全にステージングされるか、まったくステージングされません。ただし、git-gutterには比較的小さな塊がある傾向があるため、この機能を実装したのはまさにそのためです。
Att Righ 16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.