flujo de trabajo git + LaTeX

Resuelto Ivan asked hace 13 años • 4 respuestas

Estoy escribiendo un documento muy largo en LaTeX. Tengo mi computadora de trabajo y mi computadora portátil, y trabajo en ambas. Necesito mantener todos los archivos sincronizados entre las dos computadoras y también me gustaría mantener un historial de revisiones. Elegí git como mi DVCS y estoy alojando mi repositorio en mi servidor. También estoy usando Kile + Okular para hacer la edición. Kile no tiene un complemento git integrado. Tampoco estoy colaborando con nadie en este texto. También estoy pensando en poner otro repositorio privado en codaset, si por algún motivo no se puede acceder a mi servidor.

¿Cuál es la práctica de flujo de trabajo recomendada en este caso? ¿Cómo se pueden incorporar ramificaciones en este esquema de trabajo? ¿Existe alguna forma de comparar dos versiones del mismo archivo? ¿Qué tal si usamos un alijo?

Ivan avatar May 31 '11 21:05 Ivan
Aceptado

Cambios en su flujo de trabajo LaTeX:

El primer paso para administrar eficientemente un flujo de trabajo de Git+LaTeX es realizar algunos cambios en sus hábitos de LaTeX.

  • Para empezar, escribe cada oración en una línea separada . Git fue escrito en código fuente de control de versiones, donde cada línea es distinta y tiene un propósito específico. Cuando escribes documentos en LaTeX, a menudo piensas en términos de párrafos y los escribes como un documento fluido. Sin embargo, en git, los cambios en una sola palabra de un párrafo se registran como un cambio en todo el párrafo.

    Una solución es usar git diff --color-words(vea mi respuesta a una pregunta similar ¿ Cómo usar Mercurial para el control de versiones de documentos de texto? donde muestro un ejemplo). Sin embargo, debo enfatizar que dividir en líneas separadas es una opción mucho mejor (solo lo mencioné de pasada en esa respuesta), ya que descubrí que genera conflictos de fusión mínimos.

  • Si necesita ver la diferencia del código, use la diferencia nativa de Git. Para ver la diferencia entre dos confirmaciones (versiones) arbitrarias, puede hacerlo con las shas de cada una de las confirmaciones. Consulte la documentación para obtener más detalles y también para mostrar qué archivos han cambiado entre dos revisiones .

    Por otro lado, si necesita ver la diferencia de su salida formateada , use latexdiffla cual es una excelente utilidad (escrita en Perl) que toma dos archivos latex y produce una salida clara y diferenciada en pdf como esta ( fuente de la imagen ):

    Puede combinar gity latexdiff(más latexpandsi es necesario) en un solo comando usando git-latexdiff (por ejemplo, git latexdiff HEAD^para ver la diferencia entre su árbol de trabajo y el penúltimo compromiso).

  • Si está escribiendo un documento extenso en LaTeX, le sugiero dividir los diferentes capítulos en sus propios archivos y llamarlos en el archivo principal usando el \include{file}comando. De esta manera, le resultará más fácil editar una parte localizada de su trabajo y también será más sencillo controlar las versiones, ya que sabrá qué cambios se han realizado en cada capítulo, en lugar de tener que averiguarlo a partir de los registros de un gran capítulo. archivo.

Usando Git eficientemente:

  • ¡Usa ramas! . Quizás no haya mejor consejo que pueda dar. He descubierto que las ramas son muy útiles para realizar un seguimiento de "diferentes ideas" para el texto o para "diferentes estados" del trabajo. La masterrama debe ser su cuerpo principal de trabajo, en su estado más actual "listo para publicar", es decir, si de todas las ramas, si hay una en la que está dispuesto a ponerle su nombre, debe ser la rama maestra.

    Las sucursales también son extremadamente útiles si eres un estudiante de posgrado. Como atestiguará cualquier estudiante de posgrado, es probable que el asesor haga numerosas correcciones, con la mayoría de las cuales usted no está de acuerdo. Sin embargo, se podría esperar que al menos los cambie por el momento, incluso si se revierten más adelante después de las discusiones. Entonces, en tales casos, podría crear una nueva rama advisory realizar cambios a su gusto, manteniendo al mismo tiempo su propia rama de desarrollo. Luego puedes fusionar los dos y elegir lo que necesites.

  • También sugeriría dividir cada sección en una rama diferente y centrarse solo en la sección correspondiente a la rama en la que se encuentra. Genera una rama cuando creas una nueva sección o secciones ficticias cuando realizas tu confirmación inicial (tu elección, en realidad). Resista la tentación de editar una sección diferente (digamos, 3) cuando no esté en su rama. Si necesita editar, confirme este y luego verifique el otro antes de bifurcarse. Esto me parece muy útil porque mantiene el historial de la sección en su propia rama y también te dice de un vistazo (desde el árbol) la antigüedad de alguna sección. Quizás haya agregado material a la sección 3 que requiera ajustes en la sección 5... Por supuesto, esto, con toda probabilidad, se observará durante una lectura cuidadosa, pero me resulta útil verlo de un vistazo para poder cambiar de tema. si me estoy aburriendo de una sección.

    Aquí hay un ejemplo de mis ramas y fusiones de un artículo reciente (uso SourceTree en OS X y Git desde la línea de comandos en Linux). Probablemente notarás que no soy el cometedor más frecuente del mundo ni dejo comentarios útiles todo el tiempo, pero esa no es razón para que no sigas esos buenos hábitos. El mensaje principal es que trabajar en sucursales es útil. Mis pensamientos, ideas y desarrollo proceden de forma no lineal, pero puedo realizar un seguimiento de ellos a través de ramas y fusionarlos cuando estoy satisfecho (también tenía otras ramas que no conducían a ninguna parte y que luego fueron eliminadas). También puedo "etiquetar" confirmaciones si significan algo (por ejemplo, envíos iniciales a revistas/envíos revisados/etc.). Aquí lo he etiquetado como "versión 1", que es donde se encuentra el borrador a partir de ahora. El árbol representa el trabajo de una semana.

  • Otra cosa útil sería realizar cambios en todo el documento (como cambiar \alphaa \betatodas partes) por sí solos. De esa manera, puedes revertir los cambios sin tener que revertir algo más junto con ellos (hay maneras de hacerlo usando git, pero bueno, si puedes evitarlo, ¿por qué no?). Lo mismo se aplica a las adiciones al preámbulo.

  • Utilice un repositorio remoto y envíe sus cambios periódicamente. Con proveedores de servicios gratuitos como GitHub y Bitbucket (ambos te permiten crear repositorios privados con una cuenta gratuita), no hay razón para no usarlos si estás trabajando con Git/Mercurial. Como mínimo, considérelo como una copia de seguridad secundaria (¡espero que tenga una principal!) para sus archivos LaTeX y un servicio que le permite continuar editando desde donde lo dejó en una máquina diferente.

abcd avatar May 31 '2011 16:05 abcd

También tengo un flujo de trabajo similar. Aunque se trabaja en una rama a la vez, encuentro beneficioso tener ramas separadas para diferentes estados de trabajo. Por ejemplo, imagine enviar un buen borrador de su artículo a su asesor. ¡Entonces se te ocurre una idea loca! Quieres empezar a cambiar algunos conceptos básicos, volver a trabajar en algunas secciones importantes, etc., etc. Así que te bifurcas y empiezas a trabajar. Su rama maestra siempre está en un estado "liberable" (o tan cerca como usted está en ese momento). Entonces, mientras su otra rama está loca y tiene algunos cambios drásticos, si otro editor quiere ver lo que tiene, o si es un estudiante que se presenta a una conferencia, la rama maestra siempre se puede publicar, está lista para funcionar (o lista para mostrar su tutor). Si su asesor de doctorado quiere ver el borrador a primera hora de la mañana, sí, puede guardar/programar/confirmar sus cambios actuales, usar etiquetas o buscar en el registro, pero ¿por qué no mantener ramas separadas?

Digamos que su rama maestra tiene el estado "liberable" de su trabajo. Ahora desea enviarlo a varias revistas revisadas por pares, cada una con diferentes requisitos de formato para el mismo contenido y espera que regresen con varias pequeñas críticas diferentes sobre cómo puede editar el artículo para adaptarlo a sus lectores, etc. Puede crear fácilmente una rama para cada revista, realizar cambios específicos de la revista, enviarlos y, cuando reciba los comentarios, realizar los cambios en cada rama por separado.

También utilicé Dropbox y git para crear el sistema que describe anteriormente. Puede crear un repositorio básico en su carpeta de Dropbox. Luego puedes enviar/tirar desde cualquier computadora a tu Dropbox para mantenerte actualizado en todos los aspectos. Este sistema generalmente solo funciona cuando el número de colaboradores es pequeño, ya que existe la posibilidad de corrupción si las personas intentan acceder al repositorio de Dropbox al mismo tiempo.

Técnicamente, también podrías mantener UN repositorio dentro de la carpeta de Dropbox y hacer todo tu trabajo desde allí. Sin embargo, desaconsejaría esto, ya que la gente ha mencionado que Dropbox tiene algunos problemas para sincronizar archivos que cambian constantemente (archivos internos de gits).

Diego avatar May 31 '2011 14:05 Diego

Intenté implementar esto como una función bash, lo incluí en mi ~/.bashrcpara que esté siempre 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; 
}

Tenga en cuenta que esta función debe latexdiffinstalarse (y encontrarse en la ruta). También es importante que encuentre pdflatexy okular.

La primera es mi forma preferidalatex de procesar LaTeX, por lo que también puedes cambiarla . El segundo es mi lector de PDF, supongo que querrás usarlo evinceen gnome o alguna otra solución.

Esta es una versión rápida, hecha con un solo documento en mente, y eso se debe a que con git, perderá mucho tiempo y esfuerzo rastreando un documento LaTeX de varios archivos. También puedes dejar que git haga esta tarea, pero si quieres, también puedes continuar usando\include

Rafareino avatar Jun 02 '2012 00:06 Rafareino