Przepływ pracy git + LaTeX

270

Piszę bardzo długi dokument w LaTeX. Mam komputer i laptop i pracuję na nich obu. Muszę zachować synchronizację wszystkich plików między dwoma komputerami, a także chcę zachować historię zmian. Jako DVCS wybrałem git i hostuję swoje repozytorium na moim serwerze. Używam również Kile + Okular do edycji. Kile nie ma zintegrowanej wtyczki git. Nie współpracuję też z nikim przy tym tekście. Zastanawiam się także nad umieszczeniem innego prywatnego repozytorium w codaset, jeśli mój serwer z jakiegoś powodu nie jest dostępny.

Jaka jest zalecana praktyka przepływu pracy w tym przypadku? Jak można zastosować rozgałęzienia w tym schemacie roboczym? Czy istnieje sposób na porównanie dwóch wersji tego samego pliku? Co z używaniem skrytki?

Ivan
źródło

Odpowiedzi:

390

Zmiany w przepływie pracy LaTeX:

Pierwszym krokiem do skutecznego zarządzania przepływem pracy git + lateks jest wprowadzenie kilku zmian w nawykach LaTeX.

  • Na początek napisz każde zdanie w osobnej linii . Git został napisany w kodzie źródłowym kontroli wersji, gdzie każda linia jest odrębna i ma określony cel. Pisząc dokumenty w LaTeX, często myślisz w kategoriach akapitów i piszesz je jako swobodny dokument. Jednak w git zmiany jednego słowa w akapicie są rejestrowane jako zmiany całego akapitu.

    Jednym z rozwiązań jest użycie git diff --color-words( zobacz moją odpowiedź na podobne pytanie, na której pokazuję przykład). Muszę jednak podkreślić, że podział na osobne linie jest znacznie lepszą opcją (wspomniałem o tym tylko w tej odpowiedzi), ponieważ odkryłem, że powoduje to bardzo minimalne konflikty scalania.

  • Jeśli chcesz spojrzeć na różnicę kodu, użyj natywnego mechanizmu różnicowego git. Aby zobaczyć różnicę między dwoma dowolnymi zatwierdzeniami (wersjami), możesz to zrobić za pomocą shas każdego z zatwierdzeń. Zobacz dokumentację, aby uzyskać więcej szczegółów, a także to pytanie

    Z drugiej strony, jeśli chcesz spojrzeć na różnicę sformatowanego wyjścia , skorzystaj latexdiffz doskonałego narzędzia (napisanego w perlu), które pobiera dwa pliki lateksu i tworzy schludne zróżnicowane wyjście w formacie pdf, takie jak to ( źródło obrazu ):

    Możesz łączyć giti latexdiff(plus, latexpandjeśli to konieczne) w jednym poleceniu, używając git-latexdiff (np. git latexdiff HEAD^Aby zobaczyć różnicę między twoim drzewem roboczym a zatwierdzeniem przedostatnim).

  • Jeśli piszesz długi dokument w lateksie, sugeruję podzielenie różnych rozdziałów na własne pliki i wywołanie ich w pliku głównym za pomocą \include{file}polecenia. W ten sposób łatwiej jest edytować zlokalizowaną część pracy, a także łatwiej jest kontrolować wersję, ponieważ wiesz, jakie zmiany zostały wprowadzone w każdym rozdziale, zamiast musieć to rozróżniać z dzienników jednego dużego plik.

Wydajne korzystanie z git:

  • Użyj oddziałów! . Nie ma chyba lepszej rady, której mógłbym udzielić. Uważam, że gałęzie są bardzo pomocne w śledzeniu „różnych pomysłów” na tekst lub „różnych stanów” pracy. masterOddział powinien być główny korpus dzieła, w jego najbardziej aktualne „gotowy do opublikowania”, czyli państwa, jeżeli ze wszystkich oddziałów, jeśli istnieje jeden, że jesteś gotów, aby umieścić na nim swoje imię, powinien być oddział mistrz.

    Oddziały są również niezwykle pomocne, jeśli jesteś studentem. Jak potwierdzi każdy student, doradca musi wprowadzić liczne poprawki, z którymi większość się nie zgadza. Jednak na razie można się spodziewać, że przynajmniej je zmieni, nawet jeśli zostaną cofnięte później po dyskusjach. W takich przypadkach można utworzyć nową gałąź advisori wprowadzić zmiany w jej upodobaniach, zachowując jednocześnie własną gałąź rozwoju. Następnie możesz połączyć dwa elementy i wybrać to, czego potrzebujesz.

  • Sugeruję również podzielenie każdej sekcji na inną gałąź i skoncentrowanie się tylko na sekcji odpowiadającej gałęzi, na której jesteś. Odradzaj gałąź, gdy tworzysz nową sekcję, lub sekcje zastępcze, kiedy dokonujesz początkowego zatwierdzenia (naprawdę twój wybór). Oprzyj się pokusie edycji innej sekcji (powiedzmy 3), gdy nie jesteś w jej gałęzi. Jeśli musisz edytować, zatwierdź ten, a następnie sprawdź drugi przed rozgałęzieniem. Uważam to za bardzo pomocne, ponieważ utrzymuje historię sekcji we własnej gałęzi, a także pokazuje na pierwszy rzut oka (z drzewa), ile lat ma pewna sekcja. Być może dodałeś materiał do sekcji 3, który wymaga ulepszenia do sekcji 5 ... Oczywiście, najprawdopodobniej zostaną one zaobserwowane podczas uważnego czytania, ale uważam, że pomocne jest zobaczenie tego na pierwszy rzut oka, dzięki czemu mogę zmienić bieg, jeśli ja ”

    Oto przykład moich rozgałęzień i scalenia z ostatniego artykułu (używam SourceTree na OS X i git z wiersza poleceń na Linuksie). Prawdopodobnie zauważysz, że nie jestem najczęstszym sprawcą na świecie i nie zostawiam użytecznych komentarzy przez cały czas, ale to nie jest powód, dla którego nie przestrzegasz tych dobrych nawyków. Główna wiadomość na wynos jest taka, że ​​praca w oddziałach jest pomocna. Moje myśli, pomysły i rozwój przebiegają nieliniowo, ale mogę je śledzić za pośrednictwem gałęzi i łączyć je, gdy jestem zadowolony (miałem też inne gałęzie, które nigdzie nie zostały usunięte). Mogę również „tagować” zatwierdzenia, jeśli coś znaczą (np. Wstępne przesłanie do czasopism / poprawione zgłoszenie itp.). Tutaj oznaczyłem ją jako „wersję 1”, czyli tam, gdzie jest teraz wersja robocza. Drzewo reprezentuje tydzień

    wprowadź opis zdjęcia tutaj

  • Inną przydatną rzeczą byłoby samodzielne wprowadzanie zmian \alphaw \betacałym dokumencie (np. Zmiana wszędzie). W ten sposób możesz cofnąć zmiany bez konieczności cofania wraz z tym czegoś innego (istnieją sposoby, które możesz to zrobić za pomocą git, ale hej, jeśli możesz tego uniknąć, to czemu nie?). To samo dotyczy dodatków do preambuły.

  • Użyj zdalnego repozytorium i regularnie pchaj zmiany w górę. Dzięki dostawcom bezpłatnych usług, takim jak github i bitbucket (ten ostatni pozwala nawet na tworzenie prywatnych repozytoriów za pomocą bezpłatnego konta), nie ma powodu, aby z nich nie korzystać, jeśli pracujesz z git / mercurial. Przynajmniej rozważ to jako dodatkową kopię zapasową (mam nadzieję, że masz podstawową!) Dla plików lateksowych i usługę, która pozwala kontynuować edycję od miejsca, w którym pozostawiłeś na innym komputerze.

abcd
źródło
6
@Diego: Na początku trochę się przyzwyczaiłem, ponieważ twój umysł chce po prostu czytać w sposób ciągły. Jest to jednak w rzeczywistości łatwiejsze, ponieważ ja (i większość osób) patrzę na czysty efekt lateksu, aby sprawdzić, czy zdania mają sens, i aby je przeczytać. Korzystanie z tych przerw nie ma wpływu na wynik i znacznie ułatwia różnicowanie. Możesz także połączyć wyjście lateksu z plikiem źródłowym, więc jeśli zauważysz błąd lub literówkę, wszystko, co musisz zrobić, to kliknąć na niego, a zabierze Cię do odpowiedniego punktu w źródle.
abcd
1
Używam podobnego podejścia, ale w jaki sposób radzisz sobie z liczbami lub innymi plikami binarnymi, czy git może je obsłużyć, czy też istnieje inne podejście do plików, które powinny być uwzględnione w repo bez śledzenia wersji?
liborw
6
Są to przydatne wskazówki, z wyjątkiem tych, których nie widzę zastosowania: gałąź na sekcję. Możesz łatwo zobaczyć zmiany dla poszczególnych plików, więc po co zwiększać złożoność przepływu pracy, dodając dodatkową warstwę oddzielania? git [log|show|add] some_file.texwszystkie prace, nie trzeba tutaj dodawać stałego przełączania gałęzi. Jeśli chcesz, możesz nadal zatwierdzać każdy plik osobno.
rubenvb
1
@rubenvb Jeśli dzielisz każdą sekcję na różne pliki, to tak. Zwykle (i wiele osób w kręgach akademickich) pracuję tylko z jednym plikiem tex na artykuł. Poszczególne pliki mają sens w przypadku książek / prac, w których każdy rozdział zawiera znaczną część materiału. Oczywiście były to tylko sugestie ... każdy powinien wybierać i odrzucać wskazówki zgodnie z tym, co odpowiada ich przepływowi pracy :)
abcd
2
@yoda ah widzę. Tak, to ma sens. W każdym razie mam tendencję do wymuszania wielu plików tekstowych w dziennikach ;-).
rubenvb 27.09.13
12

Mam również podobny przepływ pracy. Chociaż pracuje się nad jedną gałęzią naraz, uważam za korzystne posiadanie osobnych gałęzi dla różnych stanów pracy. Wyobraź sobie na przykład, że wyślesz dobry doradca do swojego szkicu. Masz szalony pomysł! Chcesz zacząć zmieniać niektóre podstawowe koncepcje, przerabiać niektóre główne sekcje itp. Itd. Więc rozgałęziasz się i zaczynasz działać. Twoja gałąź główna jest zawsze w stanie „do zwolnienia” (lub tak blisko, jak jesteś w tym momencie). Tak więc, podczas gdy twój drugi oddział jest szalony i ma drastyczne zmiany, jeśli inny wydawca chce zobaczyć, co masz, lub jesteś studentem zgłaszającym się na konferencję, główny oddział jest zawsze dostępny, gotowy do pracy (lub gotowy, aby pokazać doradca). Jeśli twój doktorant chce zobaczyć projekt z samego rana,

Powiedzmy, że twoja główna gałąź ma „dający się zwolnić” stan twojej pracy. Teraz chcesz przesłać go do kilku recenzowanych czasopism, z których każdy ma inne wymagania dotyczące formatowania tej samej treści i oczekujesz, że wrócą z kilkoma różnymi drobnymi krytykami dotyczącymi tego, jak możesz edytować artykuł tak, aby pasował do ich czytelników itp. Możesz łatwo utworzyć gałąź dla każdego dziennika, wprowadzić zmiany specyficzne dla dziennika, przesłać, a po otrzymaniu opinii dokonać zmian w każdym oddzielnym oddziale.

Użyłem również Dropbox i git do stworzenia opisanego powyżej systemu. Możesz utworzyć repozytorium bez systemu operacyjnego w folderze Dropbox. Następnie możesz pchać / ciągnąć z dowolnego komputera do skrzynki odbiorczej, aby być na bieżąco na wszystkich końcach. Ten system zwykle działa tylko wtedy, gdy liczba współpracowników jest niewielka, ponieważ istnieje możliwość uszkodzenia, jeśli ludzie będą próbowali jednocześnie wypchnąć repozytorium Dropbox.

Technicznie możesz po prostu przechowywać JEDNE repozytorium w folderze dropbox i wykonywać całą pracę stamtąd. Odradzałbym to jednak, ponieważ ludzie wspominali, że Dropbox ma pewne problemy z synchronizacją plików, które ciągle się zmieniają (dostaje pliki wewnętrzne).

Diego
źródło
3
Pamiętaj tylko, że przedłożenie artykułu do recenzji przez kilka czasopism / konferencji w tym samym czasie zwykle nie jest uważane za etyczne!
Supernormal
7

Próbowałem zaimplementować to jako funkcję bash, zawarłem to w mojej, ~/.bashrcaby zawsze była dostępna.

function git-latexdiff {    
    if [[ $# != 2 ]];    
    then      
        printf "\tusage: git-latexdiff <file> <back-revision>  \n";    
    elif [[ $2 -lt 0 ]];     
    then     
        printf "\t<Back-revision> must be positive\n";   
    else      
        dire=$(dirname $PWD/$1);      
        based=$(git rev-parse --show-toplevel);      
        git show HEAD~$2:$(echo $dire| sed 's!'$(echo $based)'/!!')/$1 > $1_diff.tmp;      
        latexdiff $1 $1_diff.tmp > $1_diff.tex;      
        pdflatex $1_diff.tex;     
        okular $1_diff.pdf;      
        rm $1_diff*;   
    fi; 
}

Zauważ, że ta funkcja musi latexdiffzostać zainstalowana (i znajdować się na ścieżce). Ważne jest również, aby znaleźć pdflatexi okular.

Pierwszy to mój preferowany sposób przetwarzania LaTeX, więc możesz go również wybrać latex. Drugi to mój czytnik PDF, przypuszczam, że będziesz chciał użyć go evincepod gnome lub innym rozwiązaniem.

Jest to szybka wersja, stworzona z myślą o jednym dokumencie, a to dlatego, że dzięki git stracisz dużo czasu i wysiłku na śledzenie wieloplikowego dokumentu LaTeX. Możesz pozwolić gitowi wykonać to zadanie, ale jeśli chcesz, możesz także kontynuować korzystanie\include

Rafareino
źródło
Pamiętaj, że odniesienia LaTeX nie zmieszczą się w generowanych wizualizacjach. A także, że wygenerowany plik jest usuwany na końcu funkcji. Jak powiedziałem, jest to szybka wersja.
Rafareino
1
Propozycja użycia latexdiff zwanego pomocnikiem gif jest bardziej kompletna w tej odpowiedzi na Korzystanie latexdiffz git
juandesant
Co rozumiesz przez „gif helper”, @juandesant?
Rafareino
1
Niestety, @Rafareino, miałem na myśli „git helper”: git helper to narzędzie, które może być wywoływane przez git dla niektórych operacji. W takim przypadku możesz użyć latexdiffnarzędzia wiersza polecenia, używając tylko git diff, jeśli skonfigurujesz go poprawnie.
juandesant
3

Inną opcją jest użycie Authorei, która jest pewnego rodzaju Githubem w pracach naukowych. Każdy artykuł w Authorea jest repozytorium Git. A skomponowany LaTeX jest renderowany do HTML5 (a także PDF, kiedy kompilujesz).

Alberto Pepe
źródło
To jest starodawny wątek, a pomysł polega na hostowaniu wszystkiego w lokalu. Authorea jest spoko, ale nie to, czego szukałem.
Ivan
5
Wyjaśnij, że jesteś współzałożycielem
Authorei