git + LaTeX 워크 플로우


270

LaTeX에서 매우 긴 문서를 작성하고 있습니다. 나는 업무용 컴퓨터와 랩톱을 가지고 있으며 둘 다 작업합니다. 두 컴퓨터간에 모든 파일을 동기화 된 상태로 유지하고 수정 기록을 유지하고 싶습니다. DVCS로 git을 선택했고 서버에서 저장소를 호스팅하고 있습니다. 또한 Kile + Okular를 사용하여 편집을 수행하고 있습니다. Kile에는 통합 된 git 플러그인이 없습니다. 나는 또한이 텍스트에 대해 다른 사람과 공동 작업하지 않습니다. 어떤 이유로 내 서버에 액세스 할 수없는 경우 다른 개인 저장소를 코다 셋에 배치하는 것에 대해서도 생각하고 있습니다.

이 경우 권장되는 워크 플로 방법은 무엇입니까? 이 작업 계획에 분기를 어떻게 맞출 수 있습니까? 동일한 파일의 두 버전을 비교할 수있는 방법이 있습니까? 숨김을 사용하는 것은 어떻습니까?

답변:


390

LaTeX 워크 플로우 변경 :

git + latex 워크 플로우를 효율적으로 관리하기위한 첫 번째 단계는 LaTeX 습관을 약간 변경하는 것입니다.

  • 우선 각 문장을 별도의 줄에 쓰십시오 . Git은 버전 제어 소스 코드로 작성되었으며, 각 라인은 고유하고 특정 목적을 가지고 있습니다. LaTeX로 문서를 작성할 때 종종 단락의 관점에서 생각하고 자유롭게 흐르는 문서로 작성합니다. 그러나 git에서 단락의 단일 단어에 대한 변경 사항은 전체 단락에 대한 변경 사항으로 기록됩니다.

    한 가지 해결책은 사용하는 것입니다 git diff --color-words( 예를 보여주는 유사한 질문에 대한 답변 참조 ). 그러나 별도의 줄로 나누는 것이 훨씬 더 나은 옵션이라는 점을 강조해야합니다. 병합 충돌을 최소화하는 것으로 나타났습니다.

  • 코드 diff를 살펴 보려면 git의 기본 diff를 사용하십시오. 두 개의 임의 커밋 (버전)의 차이점을 확인하려면 sha각 커밋 의 s를 사용하면됩니다. 자세한 내용 과이 질문설명서 를 참조하십시오

    다른 한편으로, 당신이 당신의 형식화 된 출력 의 차이점을보고 싶다면 , latexdiff이것은 두 가지 라텍스 파일을 가져 와서 pdf로 깔끔한 diffed 출력을 생성하는 훌륭한 유틸리티 (perl로 작성)를 사용하십시오 ( 이미지 소스 ) :

    git-latexdiff를 사용하여 하나의 명령으로 gitlatexdiff( latexpand필요한 경우 플러스) 결합 할 수 있습니다 (예 : 작업 트리git latexdiff HEAD^ 와 마지막 커밋 사이의 차이를 보려는 경우).

  • 라텍스로 긴 문서를 작성하는 경우 다른 챕터를 자신의 파일로 분할 하고 \include{file}명령을 사용하여 기본 파일에서 호출하는 것이 좋습니다 . 이런 방식으로 작업의 현지화 된 부분을 편집하는 것이 더 쉬우 며, 큰 장의 로그에서 파악하지 않고 각 장의 변경 사항을 알기 때문에 버전 관리가 더 쉽습니다. 파일.

git을 효율적으로 사용 :

  • 가지를 사용하십시오! . 내가 줄 수있는 더 좋은 조언은 없을 것입니다. 나는 브랜치가 작품의 "다른 아이디어"나 텍스트의 "다른 아이디어"를 추적하는데 매우 도움이된다는 것을 알게되었다. master분기, 경우 모든 지점의, 상태, 즉 "를 게시 할 준비가"당신이 그것에 당신의 이름을 넣어 의향이 있다고 존재하는 경우, 그것은 마스터 지점해야 가장 전류, 작품의 주요 신체해야합니다.

    당신이 대학원생이라면 지점도 매우 도움이됩니다. 모든 대학원생이 증명 하듯이, 고문은 많은 수정을해야하는데, 대부분 귀하가 동의하지 않습니다. 그러나 나중에 토론 후에 되돌려 놓더라도 당분간 변경해야 할 수도 있습니다 . 따라서 이러한 경우 새 브랜치 advisor를 만들고 자신의 개발 브랜치를 유지하면서 원하는대로 변경할 수 있습니다 . 그런 다음 두 가지와 체리 선택을 병합하여 필요한 것을 선택할 수 있습니다.

  • 또한 각 섹션을 다른 브랜치로 나누고 현재 브랜치에 해당하는 섹션에만 집중하는 것이 좋습니다. 새로운 커밋을 만들 때 브랜치를 생성하거나 초기 커밋을 할 때 더미 섹션을 만듭니다 (실제로 선택). 지점에 없을 때 다른 섹션 (예 : 3)을 편집해야한다는 충동에 저항하십시오. 편집 해야하는 경우이 것을 커밋 한 다음 분기하기 전에 다른 것을 체크 아웃하십시오. 섹션의 히스토리를 자체 분기에 유지하고 (섹션에서) 일부 섹션의 나이를 한눈에 알 수 있기 때문에 이것이 매우 유용합니다. 어쩌면 당신은 섹션 5에 섹션 5를 조정 해야하는 자료를 추가했을 것입니다 ... 물론, 이것들은 모든 경우에주의 깊게 읽는 동안 관찰 될 것이지만, 이것을 한눈에 보는 것이 도움이 될 수 있습니다. 내가 변속 기어

    다음은 내 지점의 예이며 최근 논문에서 병합합니다 (OS X에서는 SourceTree를 사용하고 Linux에서는 명령 줄에서 git을 사용합니다). 당신은 아마 내가 세계에서 가장 빈번한 커미터가 아니거나 항상 유용한 의견을 남기지 않는다는 것을 알 것입니다. 그러나 이것이 좋은 습관을 따르지 않는 이유는 아닙니다. 주요 테이크 아웃 메시지는 지점에서 일하는 것이 도움이된다는 것입니다. 내 생각, 아이디어 및 개발은 비선형으로 진행되지만 지점을 통해 추적하고 추적하면 만족할 때 병합 할 수 있습니다 (나중에 삭제 된 다른 지점도있었습니다). 커밋에 의미가있는 경우 커밋에 "태그"를 붙일 수도 있습니다 (예 : 저널에 초기 제출, 수정 된 제출 등). 여기에 "버전 1"이라는 태그가 붙어 있습니다. 현재 버전은 초안입니다. 나무는 일주일을 나타냅니다

    여기에 이미지 설명을 입력하십시오

  • 또 다른 유용한 작업은 문서 전체를 변경 (예 : 모든 곳 으로 변경) \alpha하여 \beta커밋하는 것입니다. 그렇게하면 다른 것과 함께 롤백하지 않고도 변경 사항을 되돌릴 수 있습니다 (git를 사용 하여이 작업을 수행 할 수있는 방법이 있지만 피할 수 있다면 어떨까요?). 프리앰블에 추가 할 때도 마찬가지입니다.

  • 원격 저장소를 사용하고 정기적으로 변경 사항을 업스트림으로 푸시하십시오. github 및 bitbucket과 같은 무료 서비스 제공 업체 (후자는 무료 계정으로 개인 저장소를 만들 수 있음)를 사용하여 git / mercurial로 작업하는 경우 이들을 사용하지 않을 이유가 없습니다. 최소한 라텍스 파일과 다른 컴퓨터에서 남은 곳에서 계속 편집 할 수있는 서비스에 대한 보조 백업 (기본 백업이 있기를 바랍니다)으로 고려하십시오.


6
@Diego : 처음에는 조금 익숙해 졌는데, 당신의 마음은 계속해서 그것을 읽고 싶어하기 때문입니다. 그러나 나는 (그리고 대부분의 사람들이) 깔끔한 라텍스 출력을 보면서 문장이 의미가 있는지 확인하고 문장을 읽을 있기 때문에 실제로 더 쉽습니다 . 이러한 구분을 사용하면 출력에 영향을 미치지 않으며 확산이 훨씬 쉬워집니다. 또한 라텍스 출력을 소스 파일에 연결할 수 있으므로 오류나 오타가 발견되면 클릭 만하면 소스의 해당 지점으로 바로 이동합니다.
abcd

1
비슷한 접근 방식을 사용하지만 Figure 또는 기타 이진 파일을 어떻게 처리합니까? git도 처리 할 수 ​​있습니까? 아니면 버전 추적없이 repo에 포함되어야하는 파일에 대한 다른 접근 방법이 있습니까?
liborw

6
이것들은 내가 사용하지 않는 것을 제외하고 편리한 팁입니다 : 섹션 당 분기. 파일별로 변경 사항을 쉽게 볼 수 있으므로 추가 분리 계층을 추가하여 워크 플로 복잡성을 증가시키는 이유는 무엇입니까? git [log|show|add] some_file.tex모든 작업, 여기에 일정한 분기 스위칭을 추가 할 필요가 없습니다. 원하는 경우 각 파일을 계속 커밋 할 수 있습니다.
rubenvb

1
@rubenvb 각 섹션을 다른 파일로 분할하는 경우에는 그렇습니다. 나는 보통 (그리고 학계의 많은 사람들이) 기사당 하나의 tex 파일로만 작업합니다. 개별 파일은 각 장마다 상당한 양의 자료가있는 책 / 논문에 적합합니다. 물론, 이러한는 제안했다 ... 각각의 하나는 선택하고 워크 플로우를 :) 맞는 내용에 따라 팁 거부해야
ABCD

2
@yoda 아 알겠습니다. 그렇습니다. 어쨌든 저널에 여러 개의 tex 파일을 강제하는 경향이 있습니다. ;-).
rubenvb

12

비슷한 워크 플로도 있습니다. 한 번에 하나의 지점을 작업하고 있지만 각기 다른 작업 상태에 대해 별도의 지점을 갖는 것이 유리합니다. 예를 들어, 좋은 초안을 고문에게 보내는 것을 상상해보십시오. 그럼, 당신은 미친 아이디어를 얻을! 일부 핵심 개념을 변경하고 일부 주요 섹션 등을 다시 작업하려고합니다. 따라서 분기하고 작업을 시작합니다. 마스터 브랜치는 항상 "릴리스 가능"상태에 있습니다 (또는 그 시점과 거의 비슷합니다). 따라서 다른 지점이 미쳤고 급격한 변화가 있지만 다른 게시자가 자신이 가지고있는 것을 보거나 회의에 제출하는 학생 인 경우 마스터 지점은 항상 릴리스 가능하고 갈 준비가되었습니다 (또는 조언자). 박사 조언자가 아침에 먼저 초안을보고 싶다면

마스터 브랜치가 작업의 "릴리스 가능"상태를 가지고 있다고 가정하겠습니다. 이제는 동일한 내용에 대해 서로 다른 형식 요구 사항이있는 여러 동료 검토 저널에 제출하려고하며 독자 등을 위해 논문을 편집하는 방법에 대한 여러 가지 작은 비판이 나올 것으로 기대합니다. 각 저널에 대한 브랜치를 쉽게 작성하고, 저널 특정 변경 사항을 작성하고, 제출하고, 피드백을받을 때 각 개별 브랜치에서 변경 사항을 작성할 수 있습니다.

또한 Dropbox와 git을 사용하여 위에서 설명한 시스템을 만들었습니다. 보관 용 폴더에 베어 본 리포지토리를 만들 수 있습니다. 그런 다음 두 컴퓨터 중 하나에서 보관함에 푸시 / 풀을하여 모든 끝에서 최신 상태를 유지할 수 있습니다. 사람들이 보관 용 저장소에 동시에 푸시하려고하면 손상 될 수 있으므로이 시스템은 일반적으로 공동 작업자 수가 적은 경우에만 작동합니다.

기술적으로 하나의 저장소를 dropbox 폴더 안에 유지하고 거기에서 모든 작업을 수행 할 수 있습니다. 그러나 사람들이 dropbox에 지속적으로 변경되는 파일 (gits internal files)을 동기화하는 데 문제가 있다고 언급 했으므로 이것을 권장하지 않습니다.


3
동료 검토를 위해 논문을 동시에 여러 저널 / 컨퍼런스에 제출하는 것은 일반적으로 윤리적 인 것으로 간주되지 않습니다!
Supernormal

7

나는 이것을 bash 함수로 구현하려고 시도했지만 ~/.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설치 해야 하며 경로에 있어야합니다. 그것을 찾을하는 것도 중요 pdflatex하고 okular.

첫 번째는 LaTeX를 처리하는 데 선호되는 방법이므로이를 처리 할 수 latex있습니다. 두 번째는 내 PDF 리더 evince입니다. 그놈이나 다른 솔루션 에서 사용하고 싶을 것 입니다.

이것은 하나의 문서를 염두에두고 만든 빠른 버전이며, git을 사용하면 다중 파일 LaTeX 문서를 추적하는 데 많은 시간과 노력을 잃게됩니다. git 이이 작업을 수행하도록 할 수도 있지만 원하는 경우 계속 사용할 수도 있습니다\include


LaTeX 참조는 생성 된 시각화에 맞지 않습니다. 또한 생성 된 파일은 기능 종료시 삭제됩니다. 내가 말했듯이 그것은 빠른 버전입니다.
Rafareino 2016 년

1
latexdiff GIF 파일 도우미이라 사용하기위한 제안이 더 완료 사용에 대답 latexdiff자식과
juandesant

"juan helpant", @juandesant은 무슨 뜻인가요?
Rafareino

1
죄송합니다, @Rafareino, 저는 "git helper"를 의미했습니다 : git helper는 일부 작업을 위해 git이 호출 할 수있는 도구입니다. 이 경우 latexdiff명령 줄 도구를 git diff올바르게 구성한 경우을 사용하여 명령 줄 도구를 사용할 수 있습니다 .
juandesant 2016 년

3

또 다른 옵션은 과학 논문에 일종의 Github 인 Authorea 를 사용 하는 것입니다. Authorea의 모든 기사는 Git 저장소입니다. 그리고 작성하는 LaTeX는 HTML5 (컴파일 할 때 PDF)로 렌더링됩니다.


이것은 오래된 스레드이며 아이디어는 모든 것을 구내에서 호스팅하는 것입니다. Authorea는 멋지지만 내가 찾고있는 것은 아닙니다.
Ivan

5
당신은 Authorea 공동 설립자임을 분명히해야합니다
joelb

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.