Łączenie magit z cofaniem drzewa w celu łatwej nawigacji po historii

16

Kocham undo-tree(zrzut ekranu poniżej). To pozwala w łatwy sposób do poruszania się różnymi wersjami pliku (górnym oknie), pozwalając na ruch użytkownika wokół drzewa historii pliku, w osobnym oknie (na dole okna) za pomocą prostych przycisków, takich jak n, pi C-b, a C-fdo przełącznika całej potomków samo rodzic.

W szczególności automatycznie undo-treeaktualizuje bufor przechowujący plik o odpowiednią wersję na podstawie zaznaczenia w widoku drzewa.

Oczywiście magitjest fenomenalny dla git i byłoby zadziwiające, gdyby miał podobną zdolność, tj. Pozwalanie użytkownikom interaktywnie nawigować w historii git pliku, jednocześnie aktualizując bufor automatycznie przechowujący plik.

Czy jest to w ogóle możliwe magitdzisiaj?

wprowadź opis zdjęcia tutaj

Amelio Vazquez-Reina
źródło
Nie wiem, czy jest to możliwe z magit, ale spójrz na github.com/pidu/git-timemachine
clemera 10.10.2015
Nie jestem pewien, ale myślę, że undo-treeużywa drzewa (jest w nazwie :-p), podczas gdy historia Gita to ukierunkowany wykres acykliczny . To może być nietrywialne.
suvayu
2
Magit obsługuje coś takiego, ale obecnie zmieniam sposób włączania tej funkcji. Kiedy skończę, opublikuję odpowiedź.
tarsius

Odpowiedzi:

7

Magit niedawno uzyskał wsparcie dla czegoś takiego, ale ta funkcja jest nieco szorstka na brzegach i należy ją wyraźnie włączyć.


Podobna funkcja istniała od dłuższego czasu - kiedy przechodzisz od jednego zatwierdzenia do drugiego w buforze dziennika, a innym oknem w tej samej ramce jest bufor rewizji repozytorium, wówczas bufor ten jest odświeżany, aby pokazać to zatwierdzenie zamiast cokolwiek zatwierdzić poprzednio pokazywał.

Do niedawna bufor rewizji był tworzony przy pierwszym przejściu z jednego zatwierdzenia do drugiego. Zmieniłem to zachowanie, a teraz bufor wersji jest zawsze aktualizowany . Jeśli żadne okno w tej samej ramce nie wyświetla tego bufora, wówczas poruszanie się po dzienniku nie będzie już powodować wyświetlania bufora w jakimś nowym oknie lub istniejącym oknie, które poprzednio wyświetlało inny bufor.

Więc teraz musisz nacisnąć SPCraz, aby wyświetlić bufor wersji. Dopiero wtedy zacznie się aktualizować, gdy będziesz poruszać się po buforze dziennika.

Jeśli nie chcesz, aby bufor wersji był aktualizowany, wykonaj następujące czynności:

(remove-hook 'magit-section-movement-hook
             'magit-log-maybe-update-revision-buffer)

Jeśli z drugiej strony chcesz również aktualizować bufor wersji podczas poruszania się w buforze stanu, użyj tego:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-revision-buffer)

Możliwe jest teraz automatyczne aktualizowanie bufora obiektów blob w podobny sposób. Najpierw dodaj to:

(add-hook 'magit-section-movement-hook
          'magit-log-maybe-update-blob-buffer)

A może także:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-blob-buffer)

Następnie w buforze dziennika (lub statusu) naciśnij, RETaby wyświetlić lub zaktualizować bufor wersji, a także przełączyć się na ten bufor. Przejdź do interesującego Cię pliku i naciśnij RETponownie. Znajdujesz się teraz w buforze odwiedzającym obiekty blob, który jest podobny do bufora odwiedzającego pliki, z tym wyjątkiem, że nie odwiedza on pliku w działającym drzewie, ale plik taki jak w jakimś zatwierdzeniu.

Wróć do bufora dziennika (lub statusu) i przejdź do innego zatwierdzenia. Bufor obiektów blob jest aktualizowany.


Zauważ, że wyświetlenie innego obiektu blob nie powoduje ponownego użycia istniejącego bufora obiektów blob. Zamiast tego tworzy nowy bufor, który odwiedza ten obiekt blob, a następnie wyświetla ten bufor w oknie, w którym wcześniej był wyświetlany inny bufor obiektu blob. Ten drugi bufor nie jest usuwany, co niestety oznacza, że ​​całkiem sporo buforów może się zgromadzić w krótkim czasie. Który byłby jedną z tych szorstkich krawędzi, o których wspominałem wcześniej. Naciśnięcie qw buforze obiektów blob powoduje jego usunięcie, dzięki czemu można wyczyścić, przechodząc do okna, które było używane do wyświetlania różnych buforów obiektów blob, i naciskać, qaż wszystkie bufory zostaną usunięte.

Ponadto możliwe jest przejście do następnego lub poprzedniego obiektu blob z poziomu bufora obiektów blob za pomocą pi n. Zakładam, że w większości przypadków zaczynasz od ostatniego obiektu blob, a następnie przechodzisz wstecz do starszych obiektów blob za pomocą p. Jeśli to zrobisz, a następnie zechcesz przejść w innym kierunku, polecam użyć qdo zabicia bieżącego bufora, a tym samym przejścia do poprzedniego bufora, tj. Następnego obiektu blob.

Pamiętaj też, że nie musisz najpierw odwiedzać wersji, aby móc odwiedzić obiekt blob. Możesz także użyć M-x magit-find-file RET <revision> RET <file> RETbezpośrednio, ale wydaje mi się to mniej wygodne.

Tarsjusz
źródło
Dziękuję Tarsius. Pracuję z magit 20151014.231(najnowszym, o ile mogę powiedzieć). Próbowałem wykonać kroki opisane powyżej. Poszedłem do magit-log-buffer-filektórego pozwala mi poruszać się rewizje w górę iw dół n, a pjednak po naciśnięciu SPClub RETna jednej z nich pojawia się:Symbol's value as variable is void: magit-blame-mode
Amelio Vazquez-Reina
Prawdopodobnie dodane magit-blame-maybe-update-revision-bufferdo magit-section-movement-hookprzez pomyłkę.
Tarsius