질문 : 버전 제어 하에서 IPython 노트북 사용
IPython 노트북을 버전 관리하에 유지하기위한 좋은 전략은 무엇입니까?
노트북 형식은 버전 관리에 매우 적합합니다. 노트북과 출력을 버전 관리하려는 경우이 방식이 매우 잘 작동합니다. 특히 영화와 플롯의 경우 큰 이진 얼룩이 될 수있는 셀 출력 (일명 "빌드 제품")을 제외하고 입력 만 버전 제어하려는 경우 성가심이 발생합니다. 특히 다음과 같은 좋은 워크 플로를 찾으려고합니다.
- 출력 포함 또는 제외 중에서 선택할 수 있습니다.
- 원하지 않는 경우 실수로 출력을 커밋하는 것을 방지합니다.
- 로컬 버전으로 출력을 유지할 수 있습니다.
- 버전 제어 시스템을 사용하여 입력이 변경된시기를 볼 수 있습니다 (즉, 입력 만 제어하고 로컬 파일에 출력이있는 경우 입력이 변경되었는지 확인하고 싶습니다 (커밋 필요). 버전 제어 상태 명령을 사용하면 로컬 파일에 출력이 있으므로 항상 차이를 등록합니다.)
- 업데이트 된 깨끗한 노트북에서 작업 노트북 (출력 포함)을 업데이트 할 수 있습니다. (최신 정보)
언급했듯이 출력을 포함하도록 선택하면 (예를 들어 nbviewer를 사용할 때 바람직 함) 모든 것이 정상입니다. 문제는 출력을 버전 제어하고 싶지 않을 때입니다. 노트북의 출력을 제거하기위한 몇 가지 도구와 스크립트가 있지만 자주 다음 문제가 발생합니다.
아래에서 논의 할 몇 가지 옵션을 고려했지만 아직 좋은 포괄적 인 솔루션을 찾지 못했습니다. 전체 솔루션은 IPython에 대한 일부 변경이 필요하거나 간단한 외부 스크립트에 의존 할 수 있습니다. 현재 mercurial을 사용하고 있지만 git 에서도 작동하는 솔루션을 원합니다. 이상적인 솔루션은 버전 제어 불가지론입니다.
이 문제는 여러 번 논의되었지만 사용자 관점에서 명확하거나 명확한 해결책은 없습니다. 이 질문에 대한 답은 확실한 전략을 제공해야합니다. 최신 (심지어 개발) 버전의 IPython 또는 쉽게 설치할 수있는 확장이 필요하면 괜찮습니다.
업데이트 : 나는 Gregory Crosswhite의 제안을 사용하여 저장 할 때마다 .clean
버전을 선택적으로 저장하는 수정 된 노트북 버전을 가지고 놀았습니다. 이것은 대부분의 제약 조건을 충족하지만 다음은 해결되지 않은 상태로 남습니다.
- 노트북이 실행 중일 때
Cell/All Output/Clear
메뉴 옵션을 사용하여 출력을 제거 할 수 있습니다. - 출력을 제거하지만 노트북 인터페이스를 사용하는 것과 동일한 출력을 생성하지 않는 스크립트 nbstripout.py 와 같이 출력을 제거하기위한 스크립트가 있습니다. 이것은 결국 ipython / nbconvert 리포지토리에 포함되었지만 변경 사항이 이제 ipython / ipython에 포함되어 있음을 나타내며 종료되었지만 해당 기능은 아직 포함되지 않은 것 같습니다. (업데이트) 즉, Gregory Crosswhite의 솔루션 은 ipython / nbconvert 를 호출하지 않고도이 작업을 수행하는 것이 매우 쉽다는 것을 보여 주므로이 접근 방식은 제대로 연결될 수 있다면 가능할 것입니다. (하지만 각 버전 제어 시스템에 연결 , 좋은 생각이 아닌 것 같습니다. 이것은 어떻게 든 노트북 메커니즘에 연결되어야합니다.)
- 977 : 노트북 기능 요청 (열기) .
- 1280 : 저장시 모두 지우기 옵션 (열기) . ( 이 토론에서 이어 집니다.)
- 3295 : 자동으로 내 보낸 노트북 : 명시 적으로 표시된 셀만 내 보냅니다 (닫힘) . 확장 11에 의해 해결됨 writeandexecute 매직 추가 (Merged) .
- 1621 : "모든 출력 지우기"(병합)에서 In [] 프롬프트 번호를 지 웁니다 . ( 2519 (병합) 참조)
- 1563 : clear_output 개선 (병합) .
- 3065 : 노트북의 비교 가능성 (닫힘) .
- 3291 : 저장할 때 출력 셀을 건너 뛰는 옵션을 추가합니다. (휴관일) . 이것은 매우 관련이있는 것처럼 보이지만 "깨끗한 / 얼룩"필터를 사용하라는 제안으로 마감되었습니다. git diff를 실행하기 전에 출력을 제거하려면 무엇을 사용할 수 있습니까? 답변되지 않은 것 같습니다.
- 3312 : WIP : 노트북 저장 후크 (닫힘) .
- 3747 : ipynb-> ipynb 변환기 (닫힘) . 이것은 4175 에서 리베이스됩니다.
- 4175 : nbconvert : Jinjaless 내보내기 기반 (병합) .
- 142 : 입력이 제공되지 않으면 nbstripout에서 STDIN을 사용합니다 (개방) .
답변
다음은 git에 대한 내 솔루션입니다. 평상시처럼 추가하고 커밋 (및 비교) 할 수 있습니다. 이러한 작업은 작업 트리를 변경하지 않으며 동시에 노트북을 (재) 실행해도 git 히스토리가 변경되지 않습니다.
이것은 아마도 다른 VCS에 적용될 수 있지만 귀하의 요구 사항 (적어도 VSC 불가 지성)을 충족시키지 못한다는 것을 알고 있습니다. 그래도 나에게 완벽하고 특별히 훌륭한 것은 아니지만 많은 사람들이 이미 사용하고 있지만 인터넷 검색을 통해 구현하는 방법에 대한 명확한 지침을 찾지 못했습니다. 따라서 다른 사람들에게 유용 할 수 있습니다.
- 이 내용이 있는 파일을 어딘가에 저장합니다 (다음의 경우
~/bin/ipynb_output_filter.py
라고 가정하겠습니다). - 실행 가능하게 만드십시오 (
chmod +x ~/bin/ipynb_output_filter.py
) - 다음 내용으로
~/.gitattributes
파일을 만듭니다.*.ipynb filter=dropoutput_ipynb
- 다음 명령을 실행하십시오.
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
'프로그래밍 언어 > Python' 카테고리의 다른 글
virtualenv 환경에서 Python 3 사용하기 (0) | 2022.03.26 |
---|---|
객체에 Python 속성이 있는지 확인하는 방법 (0) | 2022.02.01 |
Python에서 날짜 범위 반복 하는 방법 (0) | 2022.01.17 |
Python의 알파벳 범위 (0) | 2022.01.17 |
Python 파일의 일반적인 헤더 형식 (0) | 2022.01.17 |