Магіт розколов лук на два хунки


34

На запитання SO щодо роздвоєння лушпиння за допомогою магіту, і два наведені рішення - або ставити область (позначити регіон, стадію влучення), або зменшити / виростити всі луки за допомогою +& -. Це не те, що я після цього.

У буфері статусу магіта я хочу розбити частину на дві частини, в точці або принаймні на лініях навколо точки.

Увімкнення цього (вибачте від мого поганого відмінного форматування)

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

У Вхід

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Коли точка знаходиться на смузі.

Мотивації:

  • bazбудучи заявою про налагодження, тому я хотів би відмовитись від комітету foo&, barне позбавляючись від нього.

  • barі bazбути лише частково пов'язаними, що означає, що їх зміни не повинні бути однаковими.

  • barвеликий і bazневеликий, що робить його набагато простіше розділити луску, а не вибратиbar

  • Як і в останньому пункті, скажімо, що комісія з 20 рядків містить один рядок посередині, який не слід ставити. Було б простіше розділити і поставити два верхніх і нижніх частини, ігноруючи середній, ніж використовувати регіон.

  • Вищезазначене може виникати іноді, коли презентація розмежуватиме розділення до і після чогось, що було змінено, і в середині з’явиться щось нецілене. напр

@@ line
- old_foo
+ random stuff
+ new foo

У магіті немає нічого, що може це зробити. Це навіть більше: Дизайн магіту робить це, ймовірно, неможливим для кодування без широкого перероблення магнітного статусу.
Ремі

4
Спасибі, має сенс. На жаль, найкращим, про що я міг подумати, буде деяка автоматизація навколо вибору вперед чи назад від точки, а потім постановки. Також варто зазначити (для людей, які раніше не використовували цю функцію), що ви можете використовувати регіон як на етапі, так і на нестабільність. Наприклад, ви можете поставити велику частину, а потім перейти до поетапної секції та нестабільною лінією посередині. Але погодився з @MrBones, що варіант з роздільною частиною буде простішим, ніж спіткати з вибором.
глюкас

Цікаво, що вибираєте 2 різних не сусідніх регіонів. +1
Nsukami _

1
Особисто я поставив би цілу частину, а потім не поставив у відповідь заяву про налагодження. (Мій гачок, який попередньо здійснив, уловлює постановки заяв про налагодження, тому немає ніякої небезпеки, щоб я його здійснив.)
phils

1
Я не знаю достатньо про Magit, щоб допомогти, але я просто хочу зазначити, що диф-режим Emacs має команду, diff-split-hunkяка робить саме це. IOW ваш запит - це спосіб використання diff-split-hunk(або щось еквівалентне) з буфера magit-status.
Стефан

Відповіді:


17

Як згадувалося в коментарях вище, Magit не підтримує розщеплення ножиць на декілька пар, ніж те, що можливо за допомогою використання git diff -U<n>. Це тому, що Magit посилається на цю команду Git для створення diff. Це не зміниться, Magit завжди буде використовувати різні, які він отримує від Git як є.

(Насправді Magit знімає деякі заголовки, які не дуже важливі для людини, але відновлює їх при застосуванні змін. Але розщеплення шматка далі, ніж те, що -U<n>підтримує, - це зовсім інша історія, це призведе до кролячої нори - є причина, чому Git не дозволяє "дрібніші", вони не зможуть їх застосувати).

У той час як Magit не підтримує відображення менших розміщень, про що тут просять, він підтримує застосування лише частин частини. Коли область активна під час постановки, тоді застосовується лише та частина частини.

Це не дуже допомагає, коли частина, яку не слід ставити, знаходиться прямо в середині тексту, яку слід поставити. Як підказали інші, те, що вам слід зробити в цьому випадку, полягає в тому, щоб поетапно поставити всю частину, а потім знеструмити лінію, яку ви не хочете робити на другому кроці.

Звичайно, це може бути автоматизовано. Єдиний спосіб я бачу, в якому це могло б бути автоматизованим, - це "провести поточну групу, крім регіону. Але я маю деякі сумніви щодо того, як часто це може бути корисним, і я побоююся, що це не буде легко здійснити настільки надійно. І тому я зараз не збираюсь реалізовувати це.


47

Можна розділити ханги з Магітом.

Замість того, щоб просто залишати курсор всередині елемента, виберіть лінії, з яких потрібно перейти, і натисніть s . Буде виставлено лише вибрану частину частини, тоді як решта частини все ще сидить у незазначеній зоні.

Таким чином ви розділили його на два. Я думаю, ви можете використовувати той самий механізм для переміщення частин лусочок у сховище. При використанні k ви просто очистите частину частини.


3
ІМО, це повинна бути прийнята відповідь, оскільки вона задовольняє запит (і я кілька разів знаходив цю відповідь, намагаючись згадати, як це зробити).
chaseadamsio

2
Так, це слід сприймати як відповідь!
copyninja

3

Якщо ви хочете відкинути частини частини, виберіть рядки, які ви хочете відкинути, і натискаючи x .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.