Git: có thể tạo một vùng được chọn trực tiếp từ bộ đệm tệp không?


14

Với Magit, bạn có thể mở bộ đệm trạng thái magit, nhấn TABđể mở rộng diff (hoặc RETđể đưa ra một bộ đệm khác biệt), đánh dấu các phần của hunk và nhấn shoặc uđể giai đoạn / bỏ qua khu vực. Thực sự tốt đẹp.

Tôi muốn biết nếu nó có thể:

  • chỉnh sửa một tập tin
  • chọn một vùng, hunk hoặc một số hunk ngay bên trong bộ đệm tập tin
  • giai đoạn / bỏ qua khu vực được chọn hoặc hunk quanh điểm

Bạn có vẻ hơi bối rối về hunk so với khu vực. Tôi đã chỉnh sửa cho bạn mô tả về những gì magit làm và câu hỏi của bạn. Tôi có thể không đoán đúng những gì bạn định hỏi, mặc dù.
tarsius

@tarsius Có lẽ tôi bối rối, đối với tôi, một khu vực là những gì tôi vừa chọn bên trong bộ đệm và hunk là khu vực được chọn sẵn sàng để được dàn dựng. Tôi có lầm không?
Nsukami _

2
"Vùng" là một thuật ngữ Emacs, đó là thứ nằm giữa điểm và dấu, tức là "vùng chọn". "Hunk" là một thuật ngữ Git, nó bắt đầu bằng "@@ -1,1 +1,1" và kết thúc ngay trước tiêu đề tiếp theo bắt đầu một hunk mới. Magit làm nổi bật phần hiện tại (có thể là phần hunk) giống như cách Emacs thường làm nổi bật khu vực, do đó có thể góp phần vào sự nhầm lẫn của bạn.
tarsius

1
Trong trạng thái magit hoặc bộ đệm chỉ khác, bạn có thể tạo giai đoạn hiện tại bất kể vị trí bên trong hunk bạn chỉ đơn giản bằng cách nhấn s. Nhưng bạn cũng có thể tạo giai đoạn chỉ là một phần của hunk, bằng cách đánh dấu các phần của nó (giống như cách bạn sẽ làm điều đó trong bộ đệm truy cập tệp) và sau đó là giai đoạn đó.
tarsius

@tarsius chính xác những gì tôi muốn nói, tiếng Anh của tôi không đủ sắc nét.
Nsukami _

Câu trả lời:


11

Không, Magit không hỗ trợ điều đó. Phiên bản tương lai có thể mặc dù. Git-Gutter hiện hỗ trợ nó. Lệnh được đặt tên git-gutter:stage-hunk.


Trong khi điều này không tạo ra một hunk, nó không tạo ra một khu vực.
ocodo

Tôi thấy tốt nhất là tạo ra một ràng buộc để tạo ra một hunk, sau đó một cái khác để nhảy sang hunk tiếp theo, giai đoạn và lặp lại. Cũng có một cách để tạo ra toàn bộ bộ đệm, nhưng tại thời điểm đó, bạn cũng có thể thực hiện nó từ dòng lệnh. Tôi thấy tốt nhất là thực hiện các cam kết ở cấp độ khối với git-gutter + magit. Những thay đổi lớn hơn không phù hợp với máng xối.
Dropogans

1

Như đã đề cập trước đó, git-gutter là một tiện ích mở rộng được thiết kế để hiển thị cho bạn thông tin git trực tiếp trong tệp của bạn và hoạt động từ đó, trong khi magit tập trung vào hoạt động trên các khác biệt.

Tính năng này không được lên kế hoạch cho máng xối bất cứ lúc nào sớm ( https://github.com/syohex/emacs-git-gutter/issues/91 )

Tuy nhiên, đó là thứ mà emacs lisp nên rất giỏi trong việc quét sạch (đi qua những con chó săn trong một khu vực và loại bỏ chúng một thời gian). Tự mình thử điều này gần như là vấn đề, vấn đề duy nhất là git-máng xối bắt đầu một quá trình nền sau khi bạn thực hiện một cú hunk và không đợi nó kết thúc, vì vậy tôi đã phải thêm một chút phép thuật hack để xử lý việc này.

Các chức năng lisp emacs sau đây nên làm những gì bạn muốn. Bạn có thể muốn liên kết nó với một số khóa.

(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)))))

LƯU Ý: Điều này không thể tách rời những người đi săn, những người này hoàn toàn được dàn dựng hoặc hoàn toàn không được dàn dựng. Tuy nhiên, máng xối có xu hướng có những khối tương đối nhỏ, đó chính là lý do tại sao tôi thực hiện tính năng này.
Att Righ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.