Git: apakah mungkin untuk mem-stage wilayah yang dipilih langsung dari buffer file?

14

Dengan Magit Anda dapat membuka buffer status magit, tekan TABuntuk membuka diff (atau RETuntuk memunculkan buffer diff yang terpisah), tandai bagian-bagian dari sebongkah dan tekan satau uuntuk panggung / unstage wilayah tersebut. Benar-benar bagus.

Saya ingin tahu apakah mungkin untuk:

  • edit file
  • pilih wilayah, sebongkah atau beberapa bakhil tepat di dalam buffer file
  • panggung / unstage wilayah yang dipilih atau hunk around point
Nsukami _
sumber
Anda tampaknya sedikit bingung tentang bingkah vs wilayah. Saya telah mengedit deskripsi apa yang dilakukan magit dan pertanyaan Anda. Saya mungkin tidak menebak dengan benar apa yang ingin Anda tanyakan.
tarsius
@tarsius Mungkin saya bingung, bagi saya suatu daerah adalah apa yang baru saja saya pilih di dalam buffer, dan bingkah adalah wilayah yang dipilih siap untuk dipentaskan. Apakah aku salah?
Nsukami _
2
"Wilayah" adalah istilah Emacs, itu adalah titik di antara titik dan tanda, yaitu "pemilihan". "Hunk" adalah istilah Git, dimulai dengan mis. "@@ -1,1 +1,1" "dan berakhir tepat sebelum tajuk berikutnya yang memulai hunk baru. Magit menyoroti bagian saat ini (yang mungkin merupakan bagian hunk) banyak dengan cara yang sama seperti Emacs umumnya menyoroti wilayah tersebut, sehingga mungkin telah berkontribusi pada kebingungan Anda.
tarsius
1
Dalam status magit atau penyangga diff-only, Anda dapat mengatur hunk saat ini di mana pun di dalam hunk Anda cukup dengan menekan s. Tetapi Anda juga dapat mem-stage sebagian dari hunk, dengan menandai bagian-bagiannya (dengan cara yang sama Anda akan melakukannya dalam buffer kunjungan file) dan kemudian stage saja.
tarsius
@tarsius persis apa yang saya maksud, bahasa Inggris saya tidak cukup tajam.
Nsukami _

Jawaban:

11

Tidak, Magit tidak mendukung itu. Versi masa depan mungkin. Git-Talang mendukungnya sekarang. Perintah itu bernama git-gutter:stage-hunk.

tarsius
sumber
Meskipun ini memunculkan sebongkah, itu tidak membuat suatu daerah.
ocodo
Saya menemukan yang terbaik untuk membuat ikatan ke panggung sebongkah, lalu yang lain untuk melompat ke sebongkah berikutnya, panggung, dan ulangi. Ada juga cara untuk mengatur seluruh buffer, tetapi pada saat itu Anda mungkin melakukannya dari baris perintah. Saya menemukan yang terbaik untuk membuat komit di tingkat blok dengan git-talang + magit. Perubahan yang lebih besar tidak cocok untuk git-talang.
Droogans
1

Seperti yang disebutkan sebelumnya, git-gutter adalah ekstensi yang dirancang untuk menunjukkan kepada Anda informasi git secara langsung di file Anda, dan beroperasi dari sana, sementara magit berfokus pada operasi di diffs.

Fitur ini tidak direncanakan untuk git gutter dalam waktu dekat ( https://github.com/syohex/emacs-git-gutter/issues/91 )

Namun itu adalah hal yang emacs lisp harus sangat baik dalam memusnahkan (melewati orang-orang bakhil di suatu daerah dan mengatur waktu mereka). Mencoba ini sendiri, ini hampir terjadi, satu-satunya masalah adalah git-talang memulai proses latar belakang setelah Anda tahap hunk dan tidak menunggu sampai selesai, jadi saya harus menambahkan sedikit sihir hack untuk menangani ini.

Fungsi emacs lisp berikut harus melakukan apa yang Anda inginkan. Anda mungkin ingin mengikatnya ke beberapa tombol.

(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)))))
Att Righ
sumber
CATATAN: Ini tidak dapat membagi bakhil, bakhil baik sepenuhnya dipentaskan atau tidak dipentaskan sama sekali. Namun git-talang cenderung memiliki bakhil yang relatif kecil, itulah sebabnya saya menerapkan fitur ini.
Att Righ