287 votes

git + workflow LaTeX

Je suis en train d'écrire un très long document en LaTeX. J'ai mon ordinateur de travail et sur mon portable, et je travaille sur les deux. J'ai besoin de garder tous les fichiers synchronisés entre les deux ordinateurs, et les tiens aussi à garder une révision de l'histoire. J'ai choisi git comme mon DVCS, et je suis l'hébergement de mon référentiel sur mon toujours sur le serveur. Je suis également utiliser Kile + Okular pour faire le montage. Kile ne pas intégrer un plugin git. Je suis également à ne pas collaborer avec n'importe qui sur ce texte. Je pense aussi à mettre un autre repository privé sur codaset, si mon serveur pour une raison quelconque n'est pas accessible.

Qu'est-ce que le recommandé de flux de travail pratique dans ce cas? Comment peut-ramification être intégrée dans ce schéma de fonctionnement? Est-il un moyen de comparer deux versions d'un même fichier? Que penser de l'utilisation d'une cachette?

416voto

r.m. Points 25280

Des modifications à votre LaTeX de flux de travail:

La première étape dans la gestion efficace d'un git+latex de flux de travail est de faire quelques changements à votre LaTeX habitudes.

  • Pour commencer, écrire chaque phrase sur une ligne distincte. Git a été écrit pour le contrôle de version de code source, où chaque ligne est différente et a un but spécifique. Lorsque vous écrivez des documents en LaTeX, vous pensez souvent en termes de paragraphes et de l'écrire comme une libre circulation de documents. Cependant, dans git, le changement d'un seul mot dans un paragraphe enregistré comme une modification de l'ensemble du paragraphe.

    Une solution est d'utiliser git diff --color-words (voir ma réponse à une question similaire, je montre un exemple). Cependant, je dois souligner que la division en lignes distinctes est une bien meilleure option (j'ai seulement mentionné en passant dans la réponse), comme je l'ai trouvé très minimes conflits de fusion.

  • Si vous avez besoin de regarder le code diff, l'utilisation de git natif de diff. Pour voir la différence entre les deux arbitraire s'engage (versions), vous pouvez le faire avec l' shas de chacun des commits. Voir la documentation pour plus de détails et aussi cette question

    D'autre part, si vous avez besoin de regarder la diff de votre sortie mise en forme, utilisez latexdiff qui est un excellent utilitaire (écrit en perl) qui prend deux fichiers latex et produit de un pur comparable de sortie en pdf comme ceci (source de l'image):

  • Si vous êtes à l'écriture d'un long document en latex, je vous suggère de fractionnement des différents chapitres dans leurs propres fichiers et de les appeler dans le fichier principal à l'aide de l' \include{file} commande. De cette façon, il est plus facile pour vous de modifier une partie localisée de votre travail, et il est aussi plus facile pour le contrôle de version, comme vous le savez quelles modifications ont été apportées à chaque chapitre, au lieu d'avoir à le comprendre, à partir des journaux d'un gros fichier.

À l'aide de git de manière efficace:

  • Utiliser les branches!. Il est peut-être pas de meilleur conseil que je puisse donner. J'ai trouvé les branches très utile pour garder la trace des "idées différentes" pour le texte ou pour "les différents états" de l'œuvre. L' master de la branche devrait être votre principal organe de travail, dans sa version la plus actuelle de "prêt à publier" l'état c'est à dire, si de toutes les branches, si il y en a un que vous êtes prêt à mettre votre nom, ça doit être la branche master.

    Les Branches sont également extrêmement utile si vous êtes un étudiant de troisième cycle. Comme tout étudiant diplômé pourra en témoigner, le conseiller est tenu d'avoir de nombreuses corrections, dont la plupart vous n'êtes pas d'accord avec. Pourtant, vous l'avez peut-être prévu au moins de les changer pour le moment, même si elles sont revenues plus tard, après des discussions. Dans de tels cas, vous pouvez créer une nouvelle branche advisor et de faire des changements à leur goût, dans le même temps, le maintien de votre propre branche de développement. Vous pouvez fusionner les deux et cerise choisir ce dont vous avez besoin.

  • Je vous suggère aussi de fractionnement de chaque section dans une autre branche et de se concentrer seulement dans la section correspondant à la branche sur laquelle vous vous trouvez. Frayer une branche lorsque vous créez une nouvelle section ou factices sections lorsque vous effectuez votre premier commit (de votre choix, vraiment). Résister à l'envie de modifier une section différente (par exemple, 3) lorsque vous n'êtes pas sur sa branche. Si vous avez besoin de modifier, engagent celui-ci et ensuite la caisse de l'autre, avant de s'orienter. Je trouve cela très utile, car il conserve l'historique de l'article dans sa propre branche et aussi vous indique en un coup d'œil (de l'arbre) quel est l'âge de section est. Peut-être que vous avez ajouté du matériel de l'article 3 qui nécessite des réglages à l'article 5... bien sûr, ce sera, selon toute probabilité, être observé au cours d'une lecture attentive, mais je trouve qu'il est utile de voir cela d'un coup d'oeil afin que je puisse changer de vitesse si je suis s'ennuyer d'une section.

    Voici un exemple de mes branches et se confond à partir d'une étude récente (j'utilise SourceTree sur OS X et git en ligne de commande sur Linux). Vous remarquerez probablement que je ne suis pas du monde les plus fréquentes committer, ni puis-je laisser des commentaires utiles de tous les temps, mais c'est pas une raison pour vous de ne pas suivre ces bonnes habitudes. Le principal message à retenir est que le travail dans les branches est utile. Mes pensées, mes idées et le développement se poursuit de façon non linéaire, mais je peux garder une trace d'eux par l'intermédiaire de succursales et de les fusionner lorsque je suis satisfait (j'ai aussi eu d'autres branches qui ont mené nulle part, qui ont ensuite été supprimés). Je peux aussi "tag" s'engage s'ils veulent dire quelque chose (par exemple, les premières présentations de revues/révisé de présentations/etc.). Ici, j'ai marqué "version 1", qui est l'endroit où le projet est dès maintenant. L'arbre représente une semaine de travail.

    enter image description here

  • Une autre chose utile à faire serait de faire un document à l'échelle des changements tels que l'évolution \alpha de \beta partout) s'engage sur leur propre. De cette façon, vous pouvez revenir à des modifications sans avoir à restaurer quelque chose d'autre avec elle (il ya des façons que vous pouvez faire cela à l'aide de git, mais bon, si vous pouvez l'éviter, alors pourquoi pas?). Il en va de même pour les ajouts dans le préambule.

  • L'utilisation d'une distance de pensions et de pousser vos modifications en amont régulièrement. Avec gratuit des prestataires de services comme github et bitbucket (ce dernier vous permet même de créer privés de repos avec un compte gratuit), il n'y a pas de raison de ne pas être à l'aide de ces si vous êtes travailler avec git/mercurial. À tout le moins, de le considérer comme une sauvegarde secondaire (j'espère que vous avez une première!) pour vos fichiers latex et un service qui vous permet de continuer à l'éditer à partir de là où vous vous étiez sur une autre machine.

13voto

Diego Points 2433

J'ai un flux de production similaire. Même si une branche est en cours d'élaboration à l'heure, je trouve qu'il est avantageux d'avoir des branches séparées pour les différents états de travail. Imaginez, par exemple, l'envoi d'un bon brouillon de votre papier à votre conseiller. Ensuite, vous obtenez une idée folle! Vous voulez commencer le changement de certains concepts de base, de travail de certaines grandes sections, etc. etc. Si vous branche et de commencer à travailler. Votre branche master est toujours dans un "détachable" de l'état (ou aussi près que vous êtes en ce moment). Donc, même si votre autre branche est fou et a certains changements radicaux, si un autre éditeur veut voir ce que vous avez, ou si vous êtes un étudiant de se soumettre à une conférence, la branche master est toujours détachable, prêt à aller (ou prêt à montrer votre conseiller). Si votre thèse de Doctorat conseiller veut voir le projet de la première chose le matin, oui, vous pouvez stash/scène/validez vos changements en cours, utilisez les balises ou de recherche à travers le journal, mais pourquoi ne pas garder les branches distinctes?!

Disons que votre branche master a la "détachable" de l'état de votre travail. Vous voulez maintenant de le soumettre à plusieurs revues examinées par les pairs, chacune ayant différentes exigences de mise en forme pour le même contenu et vous vous attendez à eux de revenir avec plusieurs petites critiques sur la façon dont vous pouvez modifier le document pour l'adapter à leurs lecteurs, etc. Vous pouvez facilement créer une branche pour chaque journal, journal des modifications spécifiques, soumettre, et lorsque vous recevez des commentaires à faire les changements sur chaque branche distincte.

J'ai également utilisé Dropbox et git pour créer le système que vous décrivez ci-dessus. Vous pouvez créer un nu-os référentiel dans votre dossier dropbox. Vous pouvez ensuite pousser/tirer à partir d'ordinateur à votre dropbox pour rester à jour sur toutes les extrémités. Ce système ne fonctionne que lorsque le nombre de collaborateurs sont de petite taille car il y a une possibilité de corruption si les gens essaient de pousser à la dropbox pensions de titres en même temps.

Vous pourriez techniquement aussi garder UN référentiel à l'intérieur du dossier dropbox et faire tout votre travail à partir de là. Je ne conseille pas ce cependant, comme les gens l'ont mentionné que dropbox a quelques problèmes de synchronisation des fichiers qui sont en constante évolution (gits fichiers internes).

8voto

Rafareino Points 157

J'ai essayé de mettre en œuvre la présente comme une fonction bash, je l'ai inclus dans mon ~/.bashrc qu'il soit toujours disponible.

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

Notez que cette fonction a besoin de latexdiff pour être installée (et d'être trouvé sur le chemin). Il est également important pour elle de trouver pdflatex et okular.

La première est ma préférée moyen de processus de LaTeX, de sorte que vous pouvez chage à latex . Le second est mon lecteur de PDF, je supose que vous souhaitez utiliser evince sous gnome, ou une autre solution.

C'est une version rapide, avec un document unique dans l'esprit, et c'est parce qu'avec git, vous allez perdre beaucoup de temps et d'efforts de suivi multi fichier de document LaTeX. Vous pouvez laisser git effectuer cette tâche, mais si vous le souhaitez, vous pouvez aussi continuer à utiliser \include

3voto

Alberto Pepe Points 21

Une autre option consiste à utiliser Authorea qui est une sorte de Github pour articles scientifiques. Chaque article dans Authorea est un repo Git. Et le LaTeX vous composez obtient rendu au HTML5 (ainsi que PDF, lors de la compilation).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X