Magit podzielił kawałek na dwie części

34

Na SO jest pytanie o dzielenie kawałków za pomocą magitów, a dwa podane rozwiązania to albo wyodrębnienie regionu (oznaczenie regionu, etap trafienia), albo zmniejszenie / powiększenie wszystkich kawałków za pomocą +& -. Nie o to mi chodzi.

W buforze stanu magita chcę podzielić przystojniak na dwa przystojniaki, w punkcie lub przynajmniej w liniach wokół punktu.

Włączam to (przepraszam za złe formatowanie diff)

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

W

@@ blah blah
- foo
+ bar

@ blah blah
+ baz

Gdy punkt znajduje się na pasku.

Motywacje:

  • bazbędąc instrukcją debugowania, więc chciałbym usunąć ją z zatwierdzenia fooi barbez pozbycia się go.

  • bari bazsą tylko częściowo powiązane, co oznacza, że ​​ich zmiany nie powinny być w tym samym zatwierdzeniu.

  • barjest duży i bazjest mały, dzięki czemu łatwiej jest podzielić przystojniak niż wybraćbar

  • Podobnie jak w ostatnim punkcie, powiedzmy, że zatwierdzenie 20 linii zawiera pojedynczą linię pośrodku, której nie należy ustawiać. Łatwiej byłoby podzielić i wystawić górną i dolną część dwóch przystojniaków, ignorując środkową, niż skorzystać z regionu.

  • Powyższe może pojawić się czasami, gdy prezentacja różnicowa oddzieli przed i po czymś, co zostało zmodyfikowane, i będzie miała coś nieprzydatnego w środku. na przykład

@@ line
- old_foo
+ random stuff
+ new foo
Kałamarnica
źródło
W magit nie ma nic, co mogłoby to zrobić. Co więcej: konstrukcja magit sprawia, że ​​kodowanie prawdopodobnie nie jest możliwe bez znacznego przeprojektowania statusu magit.
Rémi
4
Dzięki, to ma sens. Niestety najlepsze, o czym mogłem pomyśleć, to pewna automatyzacja wokół wybierania do przodu lub do tyłu od punktu, a następnie inscenizacji. Warto również zauważyć (dla osób, które wcześniej nie korzystały z tej funkcji), że możesz użyć regionu zarówno na scenie, jak i na scenie. Na przykład możesz wystawić duży przystojniak, a następnie przejść do odcinka etapowego i rozplanować linię pośrodku. Ale zgodził się z @MrBones, że opcja podzielonego kawałka byłaby łatwiejsza niż majstrowanie przy wyborze.
glucas,
Interesujące jest wybranie 2 odrębnych regionów nieprzylegających. +1
Nsukami _
1
Osobiście wystawiłbym cały przystojniak, a następnie odsłoniłbym instrukcję debugowania. (Mój pre-commit zaczepy hakowe wystawił oświadczenia debugowania, więc nie ma niebezpieczeństwa mi popełnienia jednego.)
phils
1
Nie wiem wystarczająco dużo o Magit, aby pomóc, ale chcę tylko podkreślić, że tryb różnicowy Emacsa ma polecenie, diff-split-hunkktóre właśnie to robi. IOW twoja prośba dotyczy sposobu użycia diff-split-hunk(lub czegoś równoważnego) z bufora statusu magit.
Stefan

Odpowiedzi:

17

Jak wspomniano w komentarzach powyżej, Magit nie obsługuje dzielenia przystojniaka na wiele porcji poza to, co jest możliwe przy użyciu git diff -U<n>. To dlatego, że Magit polega na tym poleceniu Git do tworzenia różnic. To się nie zmieni, Magit zawsze będzie używać różnic, jakie dostaje od Gita w obecnej postaci.

(W rzeczywistości Magit usuwa niektóre nagłówki, które nie są tak naprawdę istotne dla ludzi, ale przywraca je podczas wprowadzania zmian. Ale dzielenie kawałka dalej niż to, co -U<n>obsługuje, to zupełnie inna historia, prowadziłoby to do króliczej nory - jest powód, dla którego Git nie dopuszcza „mniejszych kawałków”, nie byłoby w stanie ich zastosować).

Chociaż Magit nie obsługuje wyświetlania mniejszych kawałków, tak jak tu proszono, obsługuje tylko części fragmentu. Gdy region jest aktywny podczas przemieszczania, stosowana jest tylko ta część przystawki.

To niewiele pomaga, gdy część, która nie powinna być zainscenizowana, znajduje się w samym środku tekstu, który powinien być zainscenizowany. Jak sugerują inni, w tym przypadku powinieneś zrobić scenę całego przystojniaka, a następnie odsłonić linię, której nie chcesz zatwierdzać w drugim kroku.

Można to oczywiście zautomatyzować. Jedyny sposób, w jaki mogę to zautomatyzować, to „wystawienie obecnego przystojniaka z wyjątkiem regionu. Mam jednak wątpliwości co do tego, jak często byłoby to przydatne, i obawiam się, że nie będzie łatwo wdrożyć go tak skutecznie I dlatego obecnie nie zamierzam tego wdrażać.

Tarsjusz
źródło
47

Możesz podzielić porcje za pomocą Magita.

Zamiast pozostawiać kursor wewnątrz przystojniaka, wybierz linie, które chcesz zejść z przystani, i naciśnij s . Wystawiona zostanie tylko wybrana część przystawki, podczas gdy reszta przystawki nadal będzie znajdować się w obszarze niestabilnym.

W ten sposób podzieliłeś go na dwie części. Myślę, że możesz użyć tego samego mechanizmu do przenoszenia części kawałków mięsa do skrytki. Podczas używania k po prostu wyczyścisz część przystojniaka.

Sven Rieke
źródło
3
IMO, to powinna być zaakceptowana odpowiedź, ponieważ spełnia ona prośbę (i znalazłem tę odpowiedź kilka razy, gdy próbuję sobie przypomnieć, jak to zrobić).
chaseadamsio
2
Tak, należy to zaakceptować jako odpowiedź!
copyninja,
3

Jeśli chcesz odrzucić części przystojniaka, wybierz linie w przystani, które chcesz odrzucić, i naciśnij x .

NeilDurant
źródło