힘내 : 파일 버퍼에서 선택한 영역을 직접 스테이징 할 수 있습니까?


14

Magit 사용하면 magit 상태 버퍼를 눌러 열 수 있습니다 TAB은 diff를 확장 (또는 RET별도의 DIFF 버퍼를 불러옵니다), 큰 덩어리와 언론의 마크 부품 s또는 u단계로 / unstage 지역을. 정말 좋아요

가능한지 알고 싶습니다.

  • 파일을 편집하다
  • 파일 버퍼 내에서 영역, 덩어리 또는 여러 덩어리를 선택하십시오.
  • 선택한 영역 또는 덩어리 주변을 스테이지 / 언 스테이지

덩크 대 지역에 대해 약간 혼란스러워하는 것 같습니다. magit이하는 일과 질문에 대한 설명을 편집했습니다. 그래도 당신이 물어보고 싶은 것을 정확하게 추측하지 못했을 수도 있습니다.
— tarsius

@tarsius 어쩌면 내가 혼란 스러울 수도 있습니다. 저는 버퍼 내에서 방금 선택한 영역이고 덩어리는 준비가 된 선택된 영역입니다. 내가 잘못?
— Nsukami _

2
"지역"은 이맥스 용어로, 포인트와 마크 사이에있는 "선택"입니다. "청크"는 Git 용어로, 예를 들어 "@ -1,1 +1,1"로 시작하고 다음 번 호 직전에 끝나서 새로운 덩어리를 시작합니다. Magit은 Emacs가 일반적으로 해당 지역을 강조 표시하는 것과 같은 방식으로 현재 섹션 (행크 섹션 일 수 있음)을 강조 표시하므로 혼동에 기여했을 수 있습니다.
— tarsius

1
Magit 상태 또는 diff-only 버퍼에서을 누르기 만하면 덩크 내부의 위치에 관계없이 현재 덩크를 스테이징 할 수 있습니다 s. 그러나 파일 방문 버퍼에서와 같은 방식으로 부분을 표시하여 덩어리의 일부만 준비한 다음 단계를 수행 할 수도 있습니다.
— tarsius

@tarsius 정확히 무슨 뜻인지, 내 영어는 충분하지 않습니다.
— Nsukami _

답변:


11

아니요, Magit은이를 지원하지 않습니다. 그래도 향후 버전은 가능합니다. Git-Gutter 는 현재이를 지원합니다. 명령 이름은 git-gutter:stage-hunk입니다.


이것은 덩어리를 준비하지만 영역을 준비하지는 않습니다.
— ocodo

덩어리를 스테이징하기 위해 바인딩을 작성하고 다음 덩어리를 스테핑하고 반복하기 위해 바인딩을 작성하는 것이 가장 좋습니다. 전체 버퍼를 스테이징하는 방법도 있지만이 시점에서 명령 행에서 버퍼를 수행 할 수도 있습니다. git-gutter + magit을 사용하여 블록 수준에서 커밋하는 것이 가장 좋습니다. 더 큰 변경은 git-gutter에 적합하지 않습니다.
— Droogans

1

앞에서 언급했듯이 git-gutter 는 파일에 직접 git 정보를 표시하고 거기에서 작동하도록 설계된 확장 프로그램으로, magit는 diff에서 작동하는 데 중점을 둡니다.

이 기능은 곧 git gutter 용으로 계획되지 않았습니다 ( https://github.com/syohex/emacs-git-gutter/issues/91 )

그러나 이맥스 리스프는 닦아내는 데 매우 능숙해야합니다 (지역의 덩어리를 통과하여 시간을 내야합니다). 이것을 직접 시도하는 것은 거의 그렇습니다. 유일한 문제는 덩어리를 준비한 후 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 December
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.