เวิร์กโฟลว์ git + LaTeX


270

ฉันกำลังเขียนเอกสารที่ยาวมากใน LaTeX ฉันมีคอมพิวเตอร์ที่ทำงานและแล็ปท็อปของฉันและฉันทำงานกับพวกเขาทั้งสอง ฉันต้องการเก็บไฟล์ทั้งหมดที่ซิงโครไนซ์ระหว่างคอมพิวเตอร์สองเครื่องและต้องการเก็บประวัติการแก้ไข ฉันเลือกคอมไพล์เป็น DVCS ของฉันและฉันกำลังโฮสต์ที่เก็บของฉันบนเซิร์ฟเวอร์ของฉัน ฉันยังใช้ Kile + Okular เพื่อทำการแก้ไข Kile ไม่มีปลั๊กอิน git ในตัว ฉันยังไม่ได้ร่วมมือกับใครในข้อความนี้ ฉันยังคิดที่จะวางที่เก็บข้อมูลส่วนตัวอีกชุดไว้ใน codaset ถ้าเซิร์ฟเวอร์ของฉันด้วยเหตุผลบางอย่างไม่สามารถเข้าถึงได้

ขั้นตอนการปฏิบัติงานที่แนะนำในกรณีนี้คืออะไร? การแตกแขนงสามารถติดตั้งในรูปแบบการทำงานนี้ได้อย่างไร มีวิธีเปรียบเทียบไฟล์เดียวกันสองเวอร์ชันหรือไม่ สิ่งที่เกี่ยวกับการใช้ที่ซ่อน?

คำตอบ:


390

การเปลี่ยนแปลงเวิร์กโฟลว์ LaTeX ของคุณ:

ขั้นตอนแรกในการจัดการเวิร์กโฟลว์ git + latex อย่างมีประสิทธิภาพคือการเปลี่ยนแปลงนิสัย LaTeX ของคุณเล็กน้อย

  • สำหรับการเริ่มเขียนแต่ละประโยคในบรรทัดที่แยกต่างหาก Git เขียนไปยังซอร์สโค้ดควบคุมเวอร์ชันซึ่งแต่ละบรรทัดนั้นแตกต่างกันและมีวัตถุประสงค์เฉพาะ เมื่อคุณเขียนเอกสารใน LaTeX คุณมักคิดในแง่ของย่อหน้าและเขียนเป็นเอกสารต่อเนื่องฟรี อย่างไรก็ตามใน git การเปลี่ยนแปลงคำเดียวในย่อหน้าจะถูกบันทึกเป็นการเปลี่ยนแปลงในทั้งย่อหน้า

    ทางออกหนึ่งคือการใช้git diff --color-words( ดูคำตอบของคำถามที่คล้ายกันที่ฉันแสดงตัวอย่าง) อย่างไรก็ตามฉันต้องเน้นว่าการแยกออกเป็นเส้นแยกเป็นตัวเลือกที่ดีกว่ามาก (ฉันแค่กล่าวถึงเมื่อผ่านคำตอบนั้น) เนื่องจากฉันพบว่ามันจะทำให้เกิดความขัดแย้งผสานน้อยมาก

  • ถ้าคุณต้องการดูรหัสต่าง ๆ ให้ใช้ diff ของพื้นเมือง git หากต้องการดูความแตกต่างระหว่างการผูกพัน (เวอร์ชัน) โดยพลการสองรายการคุณสามารถทำได้ด้วยการshaมอบหมายของแต่ละข้อ ดูเอกสารประกอบสำหรับรายละเอียดเพิ่มเติมและคำถามนี้

    ในทางกลับกันถ้าคุณต้องการที่จะดูที่ความแตกต่างของคุณส่งออกรูปแบบการใช้งานlatexdiffที่เป็นสาธารณูปโภคที่ดีเยี่ยม (เขียนใน Perl) ที่ใช้ไฟล์น้ำยางสองและผลิตเอาท์พุท diffed เรียบร้อยใน pdf เช่น (ซึ่งที่มาของภาพ ):

    คุณสามารถรวมgitและlatexdiff(บวกlatexpandถ้าจำเป็น) ในคำสั่งเดียวโดยใช้git-latexdiff (เช่นgit latexdiff HEAD^เพื่อดูความแตกต่างระหว่าง worktree ของคุณและการคอมมิทสุดท้าย แต่อย่างใดอย่างหนึ่ง)

  • หากคุณกำลังเขียนเอกสารยาวเป็นลาเท็กซ์ฉันขอแนะนำให้แบ่งบทต่าง ๆ เป็นไฟล์ของตนเองและเรียกพวกเขาในไฟล์หลักโดยใช้\include{file}คำสั่ง วิธีนี้จะง่ายกว่าสำหรับคุณในการแก้ไขส่วนที่แปลเป็นภาษาท้องถิ่นของคุณและยังง่ายต่อการควบคุมเวอร์ชันเนื่องจากคุณรู้ว่ามีการเปลี่ยนแปลงอะไรบ้างในแต่ละบท ไฟล์.

การใช้คอมไพล์อย่างมีประสิทธิภาพ:

  • ใช้สาขา! . อาจไม่มีคำแนะนำที่ดีกว่าที่ฉันสามารถให้ได้ ฉันพบว่าสาขาต่าง ๆ มีประโยชน์มากในการติดตาม "แนวคิดที่แตกต่าง" สำหรับข้อความหรือสำหรับ "รัฐที่แตกต่าง" ของงาน masterสาขาควรจะเป็นตัวหลักของการทำงานในปัจจุบันมากที่สุด "พร้อมที่จะเผยแพร่" คือรัฐถ้าทุกสาขาถ้ามีคนที่คุณยินดีที่จะใส่ชื่อของคุณที่มันควรจะเป็นสาขาต้นแบบ

    สาขามีประโยชน์อย่างมากหากคุณเป็นนักศึกษาระดับบัณฑิตศึกษา ในขณะที่นักเรียนระดับปริญญาตรีคนใดคนหนึ่งจะได้รับการรับรองที่ปรึกษาจะต้องมีการแก้ไขมากมายซึ่งส่วนใหญ่คุณไม่เห็นด้วย ทว่าคุณอาจถูกคาดหวังให้เปลี่ยนแปลงอย่างน้อยก็ในเวลานั้นแม้ว่าพวกเขาจะถูกหวนกลับภายหลังหลังจากการสนทนา ดังนั้นในกรณีดังกล่าวคุณสามารถสร้างสาขาใหม่advisorและทำการเปลี่ยนแปลงตามความชอบของพวกเขาในเวลาเดียวกันรักษาสาขาการพัฒนาของคุณเอง จากนั้นคุณสามารถรวมสองและเชอร์รี่เลือกสิ่งที่คุณต้องการ

  • ฉันขอแนะนำให้แบ่งแต่ละส่วนออกเป็นสาขาต่าง ๆ และโฟกัสเฉพาะส่วนที่สอดคล้องกับสาขาที่คุณเปิดอยู่ วางไข่ที่สาขาเมื่อคุณสร้างส่วนใหม่หรือส่วนจำลองเมื่อคุณทำการยืนยันครั้งแรก (ตัวเลือกของคุณจริง ๆ ) ต่อต้านความอยากที่จะแก้ไขหัวข้ออื่น (เช่น 3) เมื่อคุณไม่ได้อยู่ในสาขา หากคุณต้องการแก้ไขให้คอมมิชชันชิ้นนี้ก่อนจากนั้นทำการเช็คเอ้าท์ก่อนทำการแยกสาขา ฉันพบว่าสิ่งนี้มีประโยชน์มากเพราะช่วยเก็บประวัติของแผนกไว้ในสาขาของตัวเองและยังบอกคุณได้อย่างรวดเร็ว (จากต้นไม้) ส่วนเก่า ๆ บางทีคุณอาจเพิ่มเนื้อหาลงในส่วนที่ 3 ซึ่งต้องมีการปรับแต่งในส่วนที่ 5 ... แน่นอนว่าสิ่งเหล่านี้จะเป็นไปได้ที่จะสังเกตได้ในระหว่างการอ่านอย่างระมัดระวัง แต่ฉันคิดว่ามันมีประโยชน์ที่จะเห็นสิ่งนี้ในทันที เปลี่ยนเกียร์ถ้าฉัน

    นี่คือตัวอย่างของสาขาของฉันและผสานจากเอกสารล่าสุด (ฉันใช้ SourceTree บน OS X และ git จากบรรทัดคำสั่งบน Linux) คุณอาจสังเกตเห็นว่าฉันไม่ใช่คนที่พูดจาบ่อยที่สุดและไม่ได้แสดงความคิดเห็นที่เป็นประโยชน์ตลอดเวลา แต่นั่นก็เป็นเหตุผลที่คุณไม่ต้องทำตามนิสัยที่ดีเหล่านั้น ข้อความที่นำกลับไปใช้หลักคือการทำงานในสาขามีประโยชน์ ความคิดความคิดและการพัฒนาของฉันดำเนินไปอย่างไม่เป็นเส้นตรง แต่ฉันสามารถติดตามพวกเขาผ่านสาขาและรวมเข้าด้วยกันเมื่อฉันพอใจ (ฉันยังมีสาขาอื่น ๆ ฉันยังสามารถ "แท็ก" ได้หากพวกเขาหมายถึงบางสิ่ง (เช่นการส่งเริ่มต้นไปยังวารสาร / การแก้ไขที่ส่งมา / ฯลฯ ) ที่นี่ฉันติดแท็กเป็น "รุ่น 1" ซึ่งเป็นที่ที่ร่างเป็นตอนนี้ ต้นไม้แสดงถึงสัปดาห์ '

    ป้อนคำอธิบายรูปภาพที่นี่

  • สิ่งที่มีประโยชน์อีกอย่างที่ต้องทำคือทำการเปลี่ยนแปลงเอกสารให้กว้าง (เช่นเปลี่ยน\alphaเป็น\betaทุกที่) กระทำด้วยตนเอง ด้วยวิธีนี้คุณสามารถย้อนกลับการเปลี่ยนแปลงโดยไม่ต้องย้อนกลับอย่างอื่นไปพร้อม ๆ กับมัน (มีวิธีที่คุณสามารถทำได้โดยใช้คอมไพล์ แต่เฮ้ถ้าคุณสามารถหลีกเลี่ยงได้แล้วทำไมล่ะ?) เช่นเดียวกันสำหรับส่วนเพิ่มเติมของคำนำ

  • ใช้ repo ระยะไกลและผลักดันการเปลี่ยนแปลงของคุณเป็นประจำ ด้วยผู้ให้บริการฟรีเช่น github และ bitbucket (หลังช่วยให้คุณสามารถสร้าง repos ส่วนตัวด้วยบัญชีฟรี) ไม่มีเหตุผลที่จะไม่ใช้สิ่งเหล่านี้หากคุณทำงานกับ git / mercurial อย่างน้อยที่สุดให้พิจารณาว่าเป็นข้อมูลสำรองลำดับที่สอง (ฉันหวังว่าคุณจะมีไฟล์หลัก!) สำหรับไฟล์ลาเท็กซ์ของคุณและบริการที่ช่วยให้คุณสามารถแก้ไขต่อจากที่ที่คุณทิ้งไว้ในเครื่องอื่นได้


6
@Diego: ตอนแรกมันเริ่มชินแล้วเพราะจิตใจของคุณแค่อยากอ่านมันต่อเนื่อง อย่างไรก็ตามจริง ๆ แล้วมันง่ายขึ้นเพราะฉัน (และคนส่วนใหญ่) ดูผลลัพธ์น้ำยางเรียบร้อยเพื่อดูว่าประโยคที่เหมาะสมและหลักฐานอ่าน การใช้ตัวแบ่งเหล่านี้ไม่มีผลกับเอาต์พุตและทำให้การกระจายง่ายขึ้นมาก นอกจากนี้คุณสามารถเชื่อมโยงเอาท์พุทลาเท็กซ์กับไฟล์ต้นฉบับได้ดังนั้นหากคุณพบข้อผิดพลาดหรือการพิมพ์ผิดสิ่งที่คุณต้องทำก็คือคลิกที่มันแล้วมันจะพาคุณไปยังจุดที่สอดคล้องกันในแหล่งที่มา
abcd

1
ฉันใช้วิธีการที่คล้ายกัน แต่คุณจะจัดการกับตัวเลขหรือไฟล์ไบนารีอื่น ๆ ได้อย่างไรสามารถคอมไพล์จัดการได้เช่นกันหรือมีวิธีอื่นสำหรับไฟล์ที่ควรรวมอยู่ใน repo โดยไม่มีการติดตามเวอร์ชัน?
liborw

6
เหล่านี้เป็นเคล็ดลับที่มีประโยชน์ยกเว้นที่ฉันไม่เห็นการใช้งาน: สาขาต่อส่วน คุณสามารถเห็นการเปลี่ยนแปลงแบบต่อไฟล์ได้อย่างง่ายดายดังนั้นทำไมจึงเพิ่มความซับซ้อนของเวิร์กโฟลว์ด้วยการเพิ่มเลเยอร์การแยกพิเศษ git [log|show|add] some_file.texงานทั้งหมดไม่จำเป็นต้องเพิ่มการสลับสาขาคงที่ที่นี่ คุณยังคงสามารถส่งไฟล์แต่ละไฟล์ด้วยตนเองหากคุณต้องการ
rubenvb

1
@rubenvb หากคุณแบ่งแต่ละส่วนออกเป็นไฟล์ต่าง ๆ ให้เลือก ฉันมักจะ (และผู้คนจำนวนมากในแวดวงวิชาการ) ทำงานกับไฟล์เท็กซัสเดียวต่อบทความ ไฟล์ส่วนบุคคลเหมาะสมสำหรับหนังสือ / วิทยานิพนธ์ซึ่งแต่ละบทมีเนื้อหามากมาย แน่นอนว่าสิ่งเหล่านี้เป็นเพียงคำแนะนำ ... แต่ละคนควรจะรับและปฏิเสธเคล็ดลับตามสิ่งที่เหมาะสมกับขั้นตอนการทำงานของพวกเขา :)
ABCD

2
@yoda อาฉันเห็น ใช่แล้วที่เหมาะสม ฉันมักจะบังคับให้มีไฟล์ tex หลายไฟล์ในวารสาร any- ;-)
rubenvb

12

ฉันมีเวิร์กโฟลว์ที่คล้ายกันเช่นกัน แม้ว่าจะมีสาขาหนึ่งกำลังดำเนินการอยู่ในช่วงเวลาหนึ่ง แต่ฉันคิดว่ามันเป็นประโยชน์ที่จะมีสาขาแยกสำหรับสถานะการทำงานที่แตกต่างกัน ตัวอย่างเช่นลองนึกภาพการส่งแบบร่างคร่าว ๆ ที่ดีให้กับที่ปรึกษาของคุณ จากนั้นคุณจะได้รับความคิดที่บ้า! คุณต้องการเริ่มเปลี่ยนแนวคิดหลักบางส่วนทำงานซ้ำบางส่วนที่สำคัญ ฯลฯ เพื่อให้คุณแยกออกและเริ่มทำงาน สาขาหลักของคุณอยู่ในสถานะ "releasable" เสมอ (หรือใกล้เคียงกับที่คุณอยู่ในขณะนั้น) ดังนั้นในขณะที่สาขาอื่นของคุณบ้าและมีการเปลี่ยนแปลงที่รุนแรงหากผู้เผยแพร่รายอื่นต้องการเห็นสิ่งที่คุณมีหรือคุณเป็นนักเรียนที่ส่งไปยังการประชุมสาขาหลักจะ releasable อยู่เสมอพร้อมที่จะไป (หรือพร้อมที่จะแสดง ที่ปรึกษา). หากอาจารย์ที่ปรึกษาระดับปริญญาเอกของคุณต้องการเห็นร่างสิ่งแรกในตอนเช้า

ให้บอกว่าสาขาหลักของคุณมีสถานะ "releasable" งานของคุณ ตอนนี้คุณต้องการส่งไปยังวารสารที่ผ่านการตรวจสอบโดยเพื่อนแต่ละคนมีข้อกำหนดด้านการจัดรูปแบบที่แตกต่างกันสำหรับเนื้อหาเดียวกันและคุณคาดหวังให้พวกเขากลับมาพร้อมคำวิจารณ์เล็ก ๆ ที่แตกต่างกันหลายประการเกี่ยวกับวิธีแก้ไขบทความ คุณสามารถสร้างสาขาสำหรับแต่ละวารสารทำการเปลี่ยนแปลงเฉพาะวารสารส่งและเมื่อคุณได้รับข้อเสนอแนะทำการเปลี่ยนแปลงในแต่ละสาขาแยก

ฉันยังใช้ Dropbox และ git เพื่อสร้างระบบที่คุณอธิบายไว้ข้างต้น คุณสามารถสร้างที่เก็บกระดูกเปล่าในโฟลเดอร์ดรอปบ็อกซ์ของคุณ จากนั้นคุณสามารถกด / ดึงจากคอมพิวเตอร์เครื่องใดเครื่องหนึ่งไปยังดรอปบ็อกซ์ของคุณเพื่อรับข้อมูลล่าสุดอยู่เสมอ ระบบนี้จะใช้งานได้ก็ต่อเมื่อจำนวนผู้ทำงานร่วมกันมีขนาดเล็กเนื่องจากมีความเป็นไปได้ที่จะเกิดความเสียหายหากผู้คนพยายามที่จะส่งไปยัง Dropbox repo ในเวลาเดียวกัน

ในทางเทคนิคคุณสามารถเก็บที่เก็บหนึ่งอันไว้ในโฟลเดอร์ดรอปบ็อกซ์และทำงานทั้งหมดของคุณได้จากตรงนั้น ฉันจะไม่สนับสนุนสิ่งนี้เนื่องจากผู้คนกล่าวว่าดรอปบ็อกซ์มีปัญหาในการซิงโครไนซ์ไฟล์ที่มีการเปลี่ยนแปลงอยู่ตลอดเวลา (gits ไฟล์ภายใน)


3
เพียงแค่ทราบว่าการส่งรายงานเพื่อการตรวจสอบจากเพื่อนสู่วารสาร / การประชุมหลายครั้งในเวลาเดียวกันนั้นมักจะไม่ถือว่าเป็นเรื่องจริยธรรม!
Supernormal

7

ฉันพยายามใช้สิ่งนี้เป็นฟังก์ชั่นทุบตีฉันได้รวมมันไว้ในของฉัน~/.bashrcเพื่อให้สามารถใช้งานได้ตลอดเวลา

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

โปรดทราบว่าlatexdiffจะต้องติดตั้งฟังก์ชั่นนี้(และพบได้ในเส้นทาง) ยังเป็นสิ่งสำคัญเพื่อให้การหาและpdflatexokular

วิธีแรกคือวิธีที่ฉันชอบในการประมวลผล LaTeX ดังนั้นคุณจึงสามารถเปลี่ยนมันได้latexเช่นกัน อย่างที่สองคือโปรแกรมอ่าน PDF ของฉันฉันคิดว่าคุณจะต้องใช้evinceภายใต้คำพังเพยหรือโซลูชันอื่น ๆ

นี่เป็นรุ่นด่วนที่สร้างด้วยเอกสารเดียวในใจและนั่นเป็นเพราะด้วย git คุณจะเสียเวลาและความพยายามในการติดตามเอกสาร LaTeX หลายไฟล์ คุณสามารถให้คอมไพล์ทำงานนี้ได้เช่นกัน แต่ถ้าต้องการคุณสามารถใช้งานต่อไปได้\include


โปรดทราบว่าการอ้างอิง LaTeX จะไม่สอดคล้องกับการสร้างภาพข้อมูล และไฟล์ที่สร้างขึ้นจะถูกลบในตอนท้ายของฟังก์ชั่น อย่างที่ฉันบอกไปแล้วว่ามันเป็นเวอร์ชั่นที่รวดเร็ว
Rafareino

1
ข้อเสนอสำหรับการใช้ latexdiff ที่เรียกว่า gif helper นั้นสมบูรณ์กว่าในคำตอบของการใช้latexdiffกับ git
juandesant

คุณหมายถึงอะไรโดย "gif helper" @juandesant?
Rafareino

1
ขออภัย @Rafareino ฉันหมายถึง "git helper": git helper เป็นเครื่องมือที่สามารถเรียกใช้โดย git สำหรับการดำเนินการบางอย่าง ในกรณีนี้คุณสามารถใช้latexdiffเครื่องมือบรรทัดคำสั่งโดยใช้git diffหากคุณกำหนดค่าอย่างถูกต้อง
juansesant

3

อีกทางเลือกหนึ่งคือใช้Authoreaซึ่งเป็น Github บางประเภทสำหรับงานวิจัย ทุกบทความใน Authorea เป็น repo Git และ LaTeX ที่คุณเรียบเรียงนั้นได้รับการเรนเดอร์ไปเป็น HTML5 (เช่นเดียวกับ PDF เมื่อคุณคอมไพล์)


นี่คือหัวข้อเก่าแก่และความคิดคือการโฮสต์ทุกอย่างในสถานที่ Authorea เจ๋ง แต่ไม่ใช่ในสิ่งที่ฉันมองหา
Ivan

5
คุณควรทำให้ชัดเจนว่าคุณเป็นผู้ร่วมก่อตั้ง
Authorea

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.