Magit divise il pezzo in due pezzi


34

C'è una domanda su SO sulla divisione degli hunk usando magit, e le due soluzioni fornite sono o mettere in scena la regione (segnare una regione, colpire lo stadio), o ridurre / far crescere tutti i pezzi usando +& -. Non è quello che sto cercando.

Nel buffer di stato di magit, voglio dividere un pezzo in due blocchi, nel punto, o almeno nelle linee attorno al punto.

Girando questo (scusa la mia cattiva formattazione diff)

@@ blah blah blah
- foo
+ bar
+ baz
+

In

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Quando il punto è sulla barra.

motivazioni:

  • bazessendo una dichiarazione di debug, quindi mi piacerebbe eliminarlo dal commit di fooe barsenza liberarmene.

  • bared bazessere solo parzialmente correlati, nel senso che i loro cambiamenti non dovrebbero essere nello stesso commit.

  • barè grande ed bazè piccolo, rendendo molto più semplice dividere il pezzo piuttosto che selezionarlobar

  • Simile all'ultimo punto, supponiamo che un commit a 20 righe contenga una riga al centro che non dovrebbe essere messa in scena. Sarebbe più facile dividere e mettere in scena i due hunk superiori e inferiori ignorando quello centrale piuttosto che usare la regione.

  • Quanto sopra può sorgere a volte quando la presentazione diff separerà il prima e il dopo di qualcosa che è stato modificato, e nel mezzo qualcosa di inutile. per esempio

@@ line
- old_foo
+ random stuff
+ new foo

Non c'è niente in Magit che possa fare questo. Ancora di più: il design di magit rende questo probabilmente impossibile da codificare senza una vasta riprogettazione dello stato di magit.
Rémi,

4
Grazie, ha senso. Sfortunatamente il migliore che mi viene in mente sarebbe un po 'di automazione nel selezionare avanti o indietro dal punto e poi mettere in scena. Vale anche la pena notare (per le persone che non hanno mai utilizzato la funzione prima) che è possibile utilizzare la regione sia per il palco che per il palco. Ad esempio, puoi mettere in scena un grosso pezzo, quindi passare alla sezione in scena e aprire una linea al centro. Ma concordato con @MrBones che un'opzione split-hunk sarebbe più semplice che giocherellare con la selezione.
Glucas,

Interessante, selezionando 2 distinzioni regioni non adiacenti. +1
Nsukami _

1
Personalmente metterei in scena l'intero pezzo, e quindi mettere in scena la dichiarazione di debug. (Il mio hook pre-commit cattura dichiarazioni di debug organizzate, quindi non c'è pericolo che io commetta una.)
phils,

1
Non so abbastanza su Magit per aiutare, ma voglio solo sottolineare che la modalità diff di Emacs ha il comando diff-split-hunkche fa proprio questo. IOW la tua richiesta è per un modo di usare diff-split-hunk(o qualcosa di equivalente) dal buffer magit-status.
Stefan,

Risposte:


17

Come menzionato nei commenti sopra, Magit non supporta la suddivisione di un pezzo in più pezzi oltre ciò che è possibile utilizzare git diff -U<n>. Questo perché Magit si affida al comando Git per creare le differenze. Questo non cambierà, Magit userà sempre le differenze che ottiene da Git così com'è.

(In realtà Magit toglie alcune intestazioni che non sono realmente rilevanti per gli umani, ma le ripristina quando si applicano i cambiamenti. Ma suddividere un pezzo oltre ciò che -U<n>supporta è una storia completamente diversa, porterebbe in una tana di coniglio - c'è una ragione per cui Git non consente "hunk più piccoli", non sarebbe in grado di applicarli).

Mentre Magit non supporta la visualizzazione di blocchi più piccoli come richiesto qui, supporta l'applicazione di solo parti di un pezzo. Quando la regione è attiva durante la gestione temporanea, viene applicata solo quella parte del pezzo.

Ciò non aiuta molto quando la parte che non deve essere messa in scena è proprio nel mezzo del testo che dovrebbe essere messa in scena. Come altri hanno suggerito, ciò che dovresti fare in questo caso è mettere in scena l'intero pezzo e quindi mettere in scena la linea che non vuoi impegnare in un secondo passo.

Ciò potrebbe ovviamente essere automatizzato. L'unico modo in cui posso vedere in che modo potrebbe essere automatizzato è "mettere in scena l'attuale pezzo tranne la regione. Ma ho qualche dubbio sulla frequenza con cui ciò sarebbe effettivamente utile e temo che non sarebbe facile implementarlo in modo robusto E quindi al momento non intendo implementarlo.


47

Puoi dividere gli hunk con Magit.

Invece di lasciare il cursore all'interno del pezzo, seleziona le linee che vuoi mettere in scena dal pezzo e premi s . Verrà messa in scena solo la parte selezionata del pezzo, mentre il resto del pezzo si trova ancora nell'area non messa in scena.

In questo modo l'hai diviso in due. Penso che tu possa usare lo stesso meccanismo per spostare parti di pezzi nella scorta. Quando usi k eliminerai solo parte del pezzo.


3
IMO, questa dovrebbe essere la risposta accettata, poiché soddisfa la richiesta (e ho trovato questa risposta alcune volte quando ho provato a ricordare come fare).
Chaseadamsio,

2
Sì, questo dovrebbe essere accettato come risposta!
copyninja,

3

Se vuoi scartare parti di un pezzo, seleziona le linee all'interno del pezzo che vuoi scartare e premi x .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.