프로그래밍 언어/Python

버전 제어 하에서 IPython 노트북 사용

Rateye 2022. 2. 1. 14:17
728x90
반응형
질문 : 버전 제어 하에서 IPython 노트북 사용

IPython 노트북을 버전 관리하에 유지하기위한 좋은 전략은 무엇입니까?

노트북 형식은 버전 관리에 매우 적합합니다. 노트북과 출력을 버전 관리하려는 경우이 방식이 매우 잘 작동합니다. 특히 영화와 플롯의 경우 큰 이진 얼룩이 될 수있는 셀 출력 (일명 "빌드 제품")을 제외하고 입력 만 버전 제어하려는 경우 성가심이 발생합니다. 특히 다음과 같은 좋은 워크 플로를 찾으려고합니다.

  • 출력 포함 또는 제외 중에서 선택할 수 있습니다.
  • 원하지 않는 경우 실수로 출력을 커밋하는 것을 방지합니다.
  • 로컬 버전으로 출력을 유지할 수 있습니다.
  • 버전 제어 시스템을 사용하여 입력이 변경된시기를 볼 수 있습니다 (즉, 입력 만 제어하고 로컬 파일에 출력이있는 경우 입력이 변경되었는지 확인하고 싶습니다 (커밋 필요). 버전 제어 상태 명령을 사용하면 로컬 파일에 출력이 있으므로 항상 차이를 등록합니다.)
  • 업데이트 된 깨끗한 노트북에서 작업 노트북 (출력 포함)을 업데이트 할 수 있습니다. (최신 정보)

언급했듯이 출력을 포함하도록 선택하면 (예를 들어 nbviewer를 사용할 때 바람직 함) 모든 것이 정상입니다. 문제는 출력을 버전 제어하고 싶지 않을 때입니다. 노트북의 출력을 제거하기위한 몇 가지 도구와 스크립트가 있지만 자주 다음 문제가 발생합니다.

아래에서 논의 할 몇 가지 옵션을 고려했지만 아직 좋은 포괄적 인 솔루션을 찾지 못했습니다. 전체 솔루션은 IPython에 대한 일부 변경이 필요하거나 간단한 외부 스크립트에 의존 할 수 있습니다. 현재 mercurial을 사용하고 있지만 git 에서도 작동하는 솔루션을 원합니다. 이상적인 솔루션은 버전 제어 불가지론입니다.

이 문제는 여러 번 논의되었지만 사용자 관점에서 명확하거나 명확한 해결책은 없습니다. 이 질문에 대한 답은 확실한 전략을 제공해야합니다. 최신 (심지어 개발) 버전의 IPython 또는 쉽게 설치할 수있는 확장이 필요하면 괜찮습니다.

업데이트 : 나는 Gregory Crosswhite의 제안을 사용하여 저장 할 때마다 .clean 버전을 선택적으로 저장하는 수정 된 노트북 버전을 가지고 놀았습니다. 이것은 대부분의 제약 조건을 충족하지만 다음은 해결되지 않은 상태로 남습니다.

  • 노트북이 실행 중일 때 Cell/All Output/Clear 메뉴 옵션을 사용하여 출력을 제거 할 수 있습니다.
  • 출력을 제거하지만 노트북 인터페이스를 사용하는 것과 동일한 출력을 생성하지 않는 스크립트 nbstripout.py 와 같이 출력을 제거하기위한 스크립트가 있습니다. 이것은 결국 ipython / nbconvert 리포지토리에 포함되었지만 변경 사항이 이제 ipython / ipython에 포함되어 있음을 나타내며 종료되었지만 해당 기능은 아직 포함되지 않은 것 같습니다. (업데이트) 즉, Gregory Crosswhite의 솔루션 은 ipython / nbconvert 를 호출하지 않고도이 작업을 수행하는 것이 매우 쉽다는 것을 보여 주므로이 접근 방식은 제대로 연결될 수 있다면 가능할 것입니다. (하지만 각 버전 제어 시스템에 연결 , 좋은 생각이 아닌 것 같습니다. 이것은 어떻게 든 노트북 메커니즘에 연결되어야합니다.)
답변

다음은 git에 대한 내 솔루션입니다. 평상시처럼 추가하고 커밋 (및 비교) 할 수 있습니다. 이러한 작업은 작업 트리를 변경하지 않으며 동시에 노트북을 (재) 실행해도 git 히스토리가 변경되지 않습니다.

이것은 아마도 다른 VCS에 적용될 수 있지만 귀하의 요구 사항 (적어도 VSC 불가 지성)을 충족시키지 못한다는 것을 알고 있습니다. 그래도 나에게 완벽하고 특별히 훌륭한 것은 아니지만 많은 사람들이 이미 사용하고 있지만 인터넷 검색을 통해 구현하는 방법에 대한 명확한 지침을 찾지 못했습니다. 따라서 다른 사람들에게 유용 할 수 있습니다.

  1. 이 내용이 있는 파일을 어딘가에 저장합니다 (다음의 경우 ~/bin/ipynb_output_filter.py 라고 가정하겠습니다).
  2. 실행 가능하게 만드십시오 ( chmod +x ~/bin/ipynb_output_filter.py )
  3. 다음 내용으로 ~/.gitattributes 파일을 만듭니다.
    *.ipynb filter=dropoutput_ipynb
  4. 다음 명령을 실행하십시오.
    git config --global core.attributesfile ~/.gitattributes git config --global filter.dropoutput_ipynb.clean ~/bin/ipynb_output_filter.py git config --global filter.dropoutput_ipynb.smudge cat

 

 

제한 사항 :

  • git에서만 작동합니다.
  • git에서 somebranch git checkout otherbranch; git checkout somebranch , 일반적으로 작업 트리가 변경되지 않을 것으로 예상합니다. 대신 여기에서 소스가 두 분기간에 다른 노트북의 출력 및 셀 번호가 손실됩니다.
  • 일반적으로 출력은 Gregory의 솔루션과 마찬가지로 전혀 버전이 지정되지 않습니다. 체크 아웃과 관련된 모든 작업을 수행 할 때마다 버리지 않기 위해 별도의 파일에 저장하여 접근 방식을 변경할 수 있습니다 (하지만 위 코드가 실행될 때 커밋 ID를 알 수 없습니다!). 버전 관리 (하지만 최소한 git diff notebook_file.ipynb 가 base64 쓰레기로부터 자유로울 수는 git commit notebook_file.ipynb
  • 즉, 일부 출력이 포함 된 풀 코드 (즉,이 접근 방식을 사용하지 않는 다른 사람이 커밋)를 수행하면 출력이 정상적으로 체크 아웃됩니다. 로컬에서 생성 된 출력 만 손실됩니다.

내 솔루션은 개인적으로 생성 된 항목을 버전으로 유지하는 것을 좋아하지 않는다는 사실을 반영합니다. 출력과 관련된 병합을 수행하면 출력 이나 생산성 또는 둘 다 무효화 될 가능성이 거의 보장됩니다.

편집하다:

  • 내가 제안한대로 솔루션을 채택하면 (즉, 전 세계적으로) 버전 출력 을 원하는 일부 git repo의 경우 문제가 발생합니다. 따라서 특정 git 저장소에 대한 출력 필터링 을 비활성화 하려면 **. ipynb filter =를 사용하여 .git / info / attributes 파일을 내부에 생성하면됩니다.

 

**. ipynb 필터 =

내용으로. 분명히 같은 방식으로 반대의 작업을 수행 할 수 있습니다. 특정 저장소에 대해서만 필터링을 활성화합니다.

  • 코드는 이제 자체 git repo에서 유지됩니다.
  • 위의 지침으로 인해 ImportErrors가 발생하면 스크립트 경로 앞에 "ipython"을 추가해보십시오.

 

git config --global filter.dropoutput_ipynb.clean ipython ~/bin/ipynb_output_filter.py

편집 : 2016 년 5 월 (2017 년 2 월 업데이트 됨) : 내 스크립트에 대한 몇 가지 대안이 있습니다. 완성도를 위해 여기에 제가 아는 목록이 있습니다 : nbstripout ( 기타 변형 ), nbstrip ,jq .

출처 : https://stackoverflow.com/questions/18734739/using-ipython-notebooks-under-version-control
728x90
반응형