Jak mogę otworzyć plik z innej gałęzi git?

35

Chciałbym otworzyć plik z innej gałęzi w bieżącym repozytorium git. Widziałem to SO pytanie , ale sugestie dotyczące połączenia go z Vimem są kłopotliwe (ręcznie potokuj do Vima, otwórz standardowe wejście, ustaw typ pliku itp.). Czy istnieje prostszy sposób, który zachowuje wyróżnianie składni, ustawienia rodzaju pliku itp.?

Jeśli to pomaga:

  • Mam zbiegłego wtyczki zainstalowanej (chociaż rzadko używany).
  • Nie muszę go modyfikować.

Plik może być plikiem dla aktualnie otwartego bufora lub innym.

muru
źródło

Odpowiedzi:

49

Możesz użyć :Gedit/ :Gsplit/ :Gvsplit/ ... z formularzem{revision}:{filename}

:Gedit branch:/foo/bar.c

Uwaga: Jeśli plik jest taki sam jak w bieżącym pliku można skrócić polecenie tak: :Gsplit branch:%.

Często zdarza się, że preferuje się różnicę w bieżącym pliku niż otwarcie pliku w innej gałęzi. Możesz to zrobić za pośrednictwem :Gdiff {branch}.

Aby uzyskać więcej pomocy, zobacz:

:h fugitive-:Gedit
:h fugitive-revision
:h fugitive-:Gdiff
:h c_%

Możesz także sprawdzić odcinki Vimcasts w serii Fugitive .

Peter Rincker
źródło
Piękny! Ciekawe: co się stanie, jeśli zmodyfikuję tak otwarty plik?
muru
1
@muru Zauważysz, że bufor jest otwarty w buforze tylko do odczytu (prawdopodobnie zauważysz [RO]w wierszu stanu).
Peter Rincker
tak, jest tam.
muru
fugitivepotrzebuje ścieżki z katalogu głównego repozytorium. Odpowiedź już to obejmuje, ale błędnie założyłem, że zbieg mógł zrozumieć, kiedy znajdujemy się w określonym podkatalogu repozytorium.
Paschalis
niesamowite .. pierwszy raz używam zbiegów .. mimo że miałem go zainstalowany przez długi czas :)
alpha_989
14

Jest to nieco szersze niż to, o co poprosił OP, ale dla osób, które nie chcą używać wtyczek i być może innych systemów kontroli wersji, ten mały fragment kodu działa dość dobrze:

:new
:r! git show branch:file
:1d

Tworzy nowe okno i pokazuje tam plik, wczytując dane wyjściowe polecenia do nowego bufora. Działa to oczywiście z każdym zewnętrznym poleceniem, nie tylko z git.

Przykład dla bzr (gdzie w składni REV można określić gałąź):

:new
:r! bzr cat -r REV file
:1d

Przykład dla hg (nie jestem pewien co do gałęzi w hg; nie używaj go wystarczająco)

:new
:r! hg cat -r REV file
:1d

Przykład dla svn (

:new
:r! svn cat file@REV
:1d

Prawdopodobnie nadal chciałbyś ustawić typ pliku, aby uzyskać podświetlanie składni, tak jak w postach SO, ale przynajmniej nie musisz bałagać się pipingiem.

Po otwarciu możesz zapisać go pod nową nazwą za pomocą :w filenamelub :saveas filename, ponieważ Vim nie będzie miał jeszcze nazwy pliku. Jeśli nie chcesz móc go edytować, możesz także wrzucić a :setlocal readonlyi / lub :setlocal nomodifiable.

-Edycja: automatyczny typ pliku

To trochę więcej pracy, ale możesz poprosić Vima, aby odgadł typ pliku

:filetype detect

Ale ponieważ Vim nie ma jeszcze nazwy, nie zawsze działa to dobrze (na przykład ściągnąłem kod C i zgadłem filtype=conf.

Możemy nadać mu nazwę poprzez zapisanie, ale nie chcemy nadpisywać istniejącego pliku. Możemy również ustawić nazwę pliku (dzięki @PeterRincker!), Ale znowu nie chcemy ryzykować kolizji. Ponieważ istnieje małe prawdopodobieństwo, że istnieje plik, który jest jednocześnie nazwą gałęzi i nazwą pliku, połączymy je dowolnym separatorem

:exe "silent file " . "branch" . "-" . "file"
:filetype detect

Gdzie "file" jest zastąpione rzeczywistą nazwą pliku i "branch"nazwą oddziału

Oczywiście w tym momencie prawie piszemy wtyczkę ;-)

Zrzucając to wszystko razem, tutaj jest to funkcja specyficzna dla git, którą możesz zostawić w vimrc:

function! GitFile(branch,file)
    new
    exe "silent r! git show " . a:branch . ":" . a:file
    1d
    exe "silent file " . a:branch . "-" . a:file
    filetype detect
    setlocal readonly     "don't allow saving
    setlocal nomodified   "allow easy quitting without saving
    setlocal nomodifiable "don't allow modification
endfunction

które można zawinąć bezpośrednio w polecenie lub np call GitFile("whateverBranch","myfile.c"). Otrzymasz nowe okno z buforem o nazwiewhateverBranch-myfile.c

John O'M.
źródło
Czy mogę uzyskać automatyczne wykrywanie typu pliku, składni itp. Za pomocą tej metody?
muru
Niestety nie bez dodatkowej pracy; Zaktualizowałem post
John O'M.
1
Polecam użycie metody wtyczki z posta @ PeterRinkera, jeśli możesz. Powinien zrobić wiele miłych rzeczy, które chcesz. Chciałem przede wszystkim pokazać, że nie trzeba opuszczać edytora ani zajmować się problemami związanymi z przesyłaniem potoków, aby uzyskać dane, i wiem, że są ludzie, którzy nie znoszą używania wtyczek.
John O'M.
1
Właśnie dodałem trochę, aby móc wykryć typ pliku. Nie jest to już coś, co chciałbyś pisać w locie, ale może działać jako łatwy dodatek do .vimrc. Korzystanie z określonej wtyczki prawdopodobnie nadal będzie działać lepiej.
John O'M.
Być może warto rozważyć użycie :filenazwy pliku zamiast pliku tymczasowego. Zobacz:h :file
Peter Rincker,