Git + LaTeX-Workflow

270

Ich schreibe ein sehr langes Dokument in LaTeX. Ich habe meinen Arbeitscomputer und meinen Laptop und arbeite an beiden. Ich muss alle Dateien zwischen den beiden Computern synchronisieren und möchte auch einen Revisionsverlauf führen. Ich habe git als mein DVCS gewählt und ich hoste mein Repository auf meinem Server. Ich benutze auch Kile + Okular, um die Bearbeitung durchzuführen. Kile hat kein integriertes Git-Plugin. Ich arbeite auch mit niemandem an diesem Text zusammen. Ich denke auch darüber nach, ein anderes privates Repository auf Codaset zu setzen, wenn mein Server aus irgendeinem Grund nicht zugänglich ist.

Was ist in diesem Fall die empfohlene Workflow-Praxis? Wie kann eine Verzweigung in dieses Arbeitsschema eingepasst werden? Gibt es eine Möglichkeit, zwei Versionen derselben Datei zu vergleichen? Was ist mit einem Stash?

Ivan
quelle

Antworten:

389

Änderungen an Ihrem LaTeX-Workflow:

Der erste Schritt zur effizienten Verwaltung eines Git + Latex-Workflows besteht darin, einige Änderungen an Ihren LaTeX-Gewohnheiten vorzunehmen.

  • Für den Anfang schreibt jeden Satz in einer separaten Zeile . Git wurde in den Versionskontroll-Quellcode geschrieben, wobei jede Zeile unterschiedlich ist und einen bestimmten Zweck hat. Wenn Sie Dokumente in LaTeX schreiben, denken Sie häufig in Absätzen und schreiben es als frei fließendes Dokument. In git werden Änderungen an einem einzelnen Wort in einem Absatz jedoch als Änderung am gesamten Absatz aufgezeichnet.

    Eine Lösung ist die Verwendung git diff --color-words( siehe meine Antwort auf eine ähnliche Frage, in der ich ein Beispiel zeige). Ich muss jedoch betonen, dass das Aufteilen in separate Zeilen eine viel bessere Option ist (ich habe es nur beiläufig in dieser Antwort erwähnt), da ich festgestellt habe, dass es zu sehr minimalen Zusammenführungskonflikten führt.

  • Wenn Sie sich das Code-Diff ansehen müssen, verwenden Sie das native Diff von git. Um den Unterschied zwischen zwei beliebigen Commits (Versionen) zu erkennen, können Sie dies mit dem shas jedes Commits tun . Weitere Details und auch diese Frage finden Sie in der Dokumentation

    Wenn Sie sich jedoch den Unterschied Ihrer formatierten Ausgabe ansehen müssen , verwenden Sie latexdiffein hervorragendes Dienstprogramm (in Perl geschrieben), das zwei Latexdateien verwendet und eine ordentlich unterschiedliche Ausgabe im PDF-Format wie folgt erzeugt ( Bildquelle ):

    Sie können gitund latexdiff(plus, latexpandfalls erforderlich) in einem einzigen Befehl mit git-latexdiff kombinieren (z. B. git latexdiff HEAD^um den Unterschied zwischen Ihrem Arbeitsbaum und dem vorletzten Commit anzuzeigen).

  • Wenn Sie ein langes Dokument in Latex schreiben, würde ich empfehlen , verschiedene Kapitel in ihre eigenen Dateien aufzuteilen und sie mit dem \include{file}Befehl in der Hauptdatei aufzurufen . Auf diese Weise können Sie einen lokalisierten Teil Ihrer Arbeit leichter bearbeiten und die Versionskontrolle vereinfachen, da Sie wissen, welche Änderungen an den einzelnen Kapiteln vorgenommen wurden, anstatt sie aus den Protokollen eines großen Kapitels herausfinden zu müssen Datei.

Git effizient nutzen:

  • Verwenden Sie Zweige! . Es gibt vielleicht keinen besseren Rat, den ich geben kann. Ich habe festgestellt, dass Zweige sehr hilfreich sind, um "verschiedene Ideen" für den Text oder für "verschiedene Zustände" der Arbeit zu verfolgen. Der masterZweig sollte Ihr Hauptwerk sein, in seinem aktuellsten Zustand "Bereit zur Veröffentlichung", dh wenn es von allen Zweigen einen gibt, auf den Sie Ihren Namen setzen möchten, sollte es der Hauptzweig sein.

    Branchen sind auch sehr hilfreich, wenn Sie ein Doktorand sind. Wie jeder Student bestätigen wird, muss der Berater zahlreiche Korrekturen vornehmen, mit denen Sie größtenteils nicht einverstanden sind. Es ist jedoch zu erwarten, dass Sie sie vorerst zumindest ändern, auch wenn sie später nach Diskussionen zurückgesetzt werden. In solchen Fällen können Sie also einen neuen Zweig erstellen advisorund Änderungen an dessen Geschmack vornehmen, während Sie gleichzeitig Ihren eigenen Entwicklungszweig pflegen. Sie können dann die beiden zusammenführen und auswählen, was Sie benötigen.

  • Ich würde auch vorschlagen, jeden Abschnitt in einen anderen Zweig aufzuteilen und nur den Abschnitt zu fokussieren, der dem Zweig entspricht, in dem Sie sich befinden. Spawnen Sie einen Zweig, wenn Sie einen neuen Abschnitt erstellen, oder Dummy-Abschnitte, wenn Sie Ihr erstes Commit durchführen (Ihre Wahl, wirklich). Widerstehen Sie dem Drang, einen anderen Abschnitt (z. B. 3) zu bearbeiten, wenn Sie sich nicht in dessen Zweig befinden. Wenn Sie etwas bearbeiten müssen, schreiben Sie dieses fest und checken Sie das andere aus, bevor Sie verzweigen. Ich finde das sehr hilfreich, weil es die Geschichte des Abschnitts in einem eigenen Zweig hält und Ihnen auf einen Blick (vom Baum) sagt, wie alt ein Abschnitt ist. Vielleicht haben Sie Abschnitt 3 um Material erweitert, das an Abschnitt 5 angepasst werden muss ... Natürlich werden diese höchstwahrscheinlich bei einer sorgfältigen Lektüre beobachtet, aber ich finde es hilfreich, dies auf einen Blick zu sehen, damit ich es kann Schalthebel, wenn ich '

    Hier ist ein Beispiel für meine Zweige und Zusammenführungen aus einem kürzlich erschienenen Artikel (ich verwende SourceTree unter OS X und Git über die Befehlszeile unter Linux). Sie werden wahrscheinlich feststellen, dass ich nicht der häufigste Committer der Welt bin und auch nicht immer nützliche Kommentare hinterlasse, aber das ist kein Grund für Sie, diesen guten Gewohnheiten nicht zu folgen. Die wichtigste Botschaft zum Mitnehmen ist, dass die Arbeit in Filialen hilfreich ist. Meine Gedanken, Ideen und Entwicklungen verlaufen nicht linear, aber ich kann sie über Zweige verfolgen und zusammenführen, wenn ich zufrieden bin (ich hatte auch andere Zweige, die nirgendwohin führten und später gelöscht wurden). Ich kann Commits auch "markieren", wenn sie etwas bedeuten (z. B. erste Einreichungen in Zeitschriften / überarbeitete Einreichungen / etc.) Hier habe ich es mit "Version 1" markiert, wo sich der Entwurf ab sofort befindet. Der Baum repräsentiert eine Woche '

    Geben Sie hier die Bildbeschreibung ein

  • Eine weitere nützliche Aufgabe wäre es, dokumentenweite Änderungen (z. B. Änderungen \alphaan \betaüberall) selbst vorzunehmen . Auf diese Weise können Sie Änderungen rückgängig machen, ohne etwas anderes zurücksetzen zu müssen (es gibt Möglichkeiten, dies mit git zu tun, aber hey, wenn Sie dies vermeiden können, warum dann nicht?). Gleiches gilt für Ergänzungen der Präambel.

  • Verwenden Sie ein Remote-Repo und übertragen Sie Ihre Änderungen regelmäßig nach oben. Bei kostenlosen Dienstanbietern wie github und bitbucket (letzteres ermöglicht es Ihnen sogar, private Repos mit einem kostenlosen Konto zu erstellen) gibt es keinen Grund, diese nicht zu verwenden, wenn Sie mit git / mercurial arbeiten. Betrachten Sie es zumindest als sekundäres Backup (ich hoffe, Sie haben ein primäres!) Für Ihre Latexdateien und als einen Dienst, mit dem Sie die Bearbeitung von der Stelle aus fortsetzen können, an der Sie auf einem anderen Computer abgereist sind.

A B C D
quelle
6
@Diego: Anfangs war es etwas gewöhnungsbedürftig, weil dein Verstand es nur ununterbrochen lesen möchte. Es ist jedoch tatsächlich einfacher, weil ich (und die meisten Leute) mir die ordentliche Latexausgabe ansehen, um festzustellen, ob Sätze sinnvoll sind, und um sie zu prüfen. Die Verwendung dieser Unterbrechungen hat keine Auswirkungen auf die Ausgabe und erleichtert das Differenzieren erheblich. Sie können die Latexausgabe auch mit der Quelldatei verknüpfen. Wenn Sie also einen Fehler oder einen Tippfehler entdecken, müssen Sie nur darauf klicken, und Sie gelangen direkt zum entsprechenden Punkt in der Quelle.
Abcd
1
Ich verwende einen ähnlichen Ansatz, aber wie geht man mit Zahlen oder anderen Binärdateien um, kann Git auch damit umgehen oder gibt es einen anderen Ansatz für Dateien, die ohne Versionsverfolgung in Repo enthalten sein sollten?
Liborw
6
Dies sind nützliche Tipps, außer einem, den ich nicht sehe: eine Verzweigung pro Abschnitt. Sie können Änderungen leicht pro Datei anzeigen. Warum sollten Sie also die Komplexität des Workflows erhöhen, indem Sie eine zusätzliche Trennungsebene hinzufügen? git [log|show|add] some_file.texAlle Arbeiten, hier muss keine konstante Verzweigungsumschaltung hinzugefügt werden. Sie können weiterhin jede Datei einzeln festschreiben, wenn Sie möchten.
Rubenvb
1
@rubenvb Wenn Sie jeden Abschnitt in verschiedene Dateien aufteilen, dann ja. Normalerweise arbeite ich (und viele Leute in akademischen Kreisen) mit nur einer einzigen Tex-Datei pro Artikel. Einzelne Dateien sind sinnvoll für Bücher / Abschlussarbeiten, bei denen jedes Kapitel einen erheblichen Materialblock enthält. Natürlich waren dies nur Vorschläge ... jeder sollte Tipps auswählen und ablehnen, je nachdem, was zu seinem Workflow passt :)
abcd
2
@yoda ah ich verstehe. Ja, dann macht das Sinn. Ich neige sowieso dazu, mehrere Tex-Dateien in Zeitschriften zu erzwingen ;-).
Rubenvb
12

Ich habe auch einen ähnlichen Workflow. Obwohl jeweils an einem Zweig gearbeitet wird, finde ich es vorteilhaft, separate Zweige für verschiedene Arbeitszustände zu haben. Stellen Sie sich zum Beispiel vor, Sie senden Ihrem Berater einen guten Entwurf Ihres Papiers. Dann bekommst du eine verrückte Idee! Sie möchten anfangen, einige Kernkonzepte zu ändern, einige wichtige Abschnitte zu überarbeiten usw. usw. Sie verzweigen sich also und beginnen zu arbeiten. Ihre Hauptniederlassung befindet sich immer in einem "freisetzbaren" Zustand (oder so nah wie in diesem Moment). Während Ihre andere Niederlassung verrückt ist und einige drastische Änderungen aufweist, ist die Hauptniederlassung immer freigebbar, bereit zu gehen (oder bereit, Ihre zu zeigen, wenn ein anderer Verlag sehen möchte, was Sie haben, oder wenn Sie ein Student sind, der an einer Konferenz teilnimmt Berater). Wenn Ihr Doktorvater den Entwurf als erstes am Morgen sehen möchte,

Nehmen wir an, Ihre Hauptniederlassung hat den "freigebbaren" Status Ihrer Arbeit. Sie möchten es jetzt an mehrere von Experten begutachtete Zeitschriften senden, die jeweils unterschiedliche Formatierungsanforderungen für denselben Inhalt haben, und Sie erwarten, dass sie mit verschiedenen kleinen Kritikpunkten zurückkommen, wie Sie das Papier bearbeiten können, um es ihren Lesern usw. anzupassen. Sie können problemlos einen Zweig für jedes Journal erstellen, journalspezifische Änderungen vornehmen, senden und nach Erhalt des Feedbacks die Änderungen für jeden einzelnen Zweig vornehmen.

Ich habe auch Dropbox und Git verwendet, um das oben beschriebene System zu erstellen. Sie können ein Bare-Bones-Repository in Ihrem Dropbox-Ordner erstellen. Sie können dann von jedem Computer auf Ihre Dropbox drücken / ziehen, um an allen Enden auf dem neuesten Stand zu bleiben. Dieses System funktioniert normalerweise nur, wenn die Anzahl der Mitarbeiter gering ist, da die Möglichkeit einer Beschädigung besteht, wenn gleichzeitig versucht wird, auf das Dropbox-Repo zuzugreifen.

Sie können technisch auch nur EIN Repository im Dropbox-Ordner belassen und Ihre gesamte Arbeit von dort aus erledigen. Ich würde jedoch davon abraten, da die Leute erwähnt haben, dass Dropbox Probleme beim Synchronisieren von Dateien hat, die sich ständig ändern (gits interne Dateien).

Diego
quelle
3
Beachten Sie nur, dass das gleichzeitige Einreichen eines Papiers zur Begutachtung bei mehreren Zeitschriften / Konferenzen normalerweise nicht als ethisch angesehen wird!
Supernormal
7

Ich habe versucht, dies als Bash-Funktion zu implementieren. Ich habe es in meine aufgenommen ~/.bashrc, um es immer verfügbar zu machen.

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; 
}

Beachten Sie, dass diese Funktion latexdiffinstalliert sein muss (und sich im Pfad befindet). Es ist auch wichtig, dass es findet pdflatexund okular.

Die erste ist meine bevorzugte Methode zur Verarbeitung von LaTeX, sodass Sie auch darauf zugreifen können latex. Der zweite ist mein PDF-Reader. Ich nehme an, Sie möchten ihn evinceunter gnome oder einer anderen Lösung verwenden.

Dies ist eine schnelle Version, die für ein einzelnes Dokument erstellt wurde. Dies liegt daran, dass Sie mit git viel Zeit und Mühe verlieren, ein LaTeX-Dokument mit mehreren Dateien zu verfolgen. Sie können git diese Aufgabe auch ausführen lassen, aber wenn Sie möchten, können Sie sie auch weiterhin verwenden\include

Rafareino
quelle
Beachten Sie, dass LaTeX-Referenzen nicht in generierte Visualisierungen passen. Und auch, dass die generierte Datei am Ende der Funktion gelöscht wird. Wie gesagt es ist eine schnelle Version.
Rafareino
1
Der Vorschlag für Verwendung latexdiff als gif Helfer genannt ist vollständiger in dieser Antwort auf Verwendung latexdiffmit git
juandesant
Was meinst du mit "gif helper", @juandesant?
Rafareino
1
Sorry, @Rafareino, ich meinte "Git-Helfer": Ein Git-Helfer ist ein Tool, das von Git für einige Operationen aufgerufen werden kann. In diesem Fall können Sie das latexdiffBefehlszeilentool nur mit verwenden git diff, wenn Sie es richtig konfigurieren.
Juandesant
3

Eine andere Möglichkeit ist die Verwendung von Authorea , einer Art Github für wissenschaftliche Arbeiten. Jeder Artikel in Authorea ist ein Git-Repo. Und das von Ihnen erstellte LaTeX wird in HTML5 gerendert (sowie in PDF, wenn Sie kompilieren).

Alberto Pepe
quelle
Dies ist ein altertümlicher Thread, und die Idee ist, alles vor Ort zu hosten. Authorea ist cool, aber nicht das, wonach ich gesucht habe.
Ivan
5
Sie sollten klarstellen, dass Sie ein Authorea-Mitbegründer sind
Joelb