IT이야기

새 분기를 체크아웃할 때 *.pyc 파일 및 비어 있는 디렉토리를 자동으로 제거합니다.

cyworld 2021. 9. 21. 20:02
반응형

새 분기를 체크아웃할 때 *.pyc 파일 및 비어 있는 디렉토리를 자동으로 제거합니다.


여기 git과 python을 사용할 때 흥미로운 상황이 있습니다. 다른 상황에서도 마찬가지입니다.

/foo/ 폴더로 git repo를 만든다고 가정해 봅시다. 그 폴더에 /foo/program.py를 넣었습니다. program.py를 실행하면 program.pyc가 생성됩니다. .gitignore 파일에 *.pyc가 있으므로 git은 이를 추적하지 않습니다.

이제 다른 분기인 dev를 만든다고 가정해 보겠습니다. 이 dev 분기에서 /foo/ 폴더를 완전히 제거합니다.

이제 마스터 브랜치로 다시 전환하면 /foo/가 다시 나타납니다. program.py를 실행하면 program.pyc 파일이 다시 나타납니다. 모든 것이 잘됩니다.

내 dev 분기로 다시 전환합니다. /foo/ 디렉토리가 사라져야 합니다. dev 브랜치가 아닌 마스터 브랜치에만 존재합니다. 그러나 여전히 존재합니다. 왜요? 무시된 program.pyc 파일은 분기를 전환할 때 폴더가 삭제되는 것을 방지하기 때문입니다.

이 문제에 대한 해결책은 분기를 전환하기 전에 모든 *.pyc 파일을 재귀적으로 삭제하는 것입니다. 이 명령으로 쉽게 할 수 있습니다.

find . -name "*.pyc" -exec rm '{}' ';'

문제는 지점을 변경할 때마다 이 작업을 수행해야 한다는 것을 기억해야 하는 것이 성가시다는 것입니다. 이 명령에 대한 별칭을 만들 수 있지만 분기를 변경할 때마다 입력해야 한다는 것을 기억해야 합니다. git-branch의 별칭을 만들 수도 있지만 그것도 좋지 않습니다. git branch 명령은 분기를 변경하는 것 외에 다른 작업을 수행하며 사용할 때마다 모든 pyc 파일을 삭제하고 싶지 않습니다. 젠장, 파이썬이 아닌 리포지토리에서도 사용할 수 있습니다. 그러면 어떻게 될까요?

분기를 변경할 때만 실행되는 git hook을 설정하는 방법이 있습니까? 아니면 분기를 전환할 때마다 모든 *.pyc 파일이 지워지도록 설정하는 다른 방법이 있습니까?


post-checkout.git/hooks/post-checkout에 배치 후크가 있습니다. git 버전에 따라 이름이 .sample이거나 실행이 불가능한 샘플이 있을 수 있습니다. 간략한 설명: 이전 HEAD, 새 HEAD 및 분기가 변경된 경우 1이고 단순히 파일 체크아웃인 경우 0인 플래그의 세 가지 매개변수를 가져옵니다. 자세한 내용은 man githooks를 참조하십시오! 필요한 작업을 수행하고 거기에 넣을 수 있는 셸 스크립트를 작성할 수 있어야 합니다.

편집: 체크아웃이 비어 있는 디렉토리를 자동으로 정리하도록 이 사전 체크아웃을 수행하려고 한다는 것을 알고 있습니다. 그러나 사전 체크아웃 후크가 없으므로 스크립트를 사용하여 디렉토리도 제거해야 합니다.

또 다른 참고 사항: 별칭은 gitconfig의 일부이며 저장소에 로컬일 수 있습니다(~/.gitconfig가 아니라 .git/config에 있음). 별칭으로 이 작업을 수행하기로 선택한 경우(git-branch가 아닌 git-checkout의 경우) 파이썬 관련 저장소에만 쉽게 넣을 수 있습니다. 또한 이 경우 이 목적을 위해 특별히 별칭을 만듭니다(예: 체크아웃 정리를 위한 cc). pyc 파일을 정리하고 싶지 않다면 체크아웃(또는 다른 별칭 형식)을 사용할 수 있습니다.


댓글에 묻힌 Apreche의 좋은 솔루션을 복사하고 업데이트하기만 하면 됩니다.

이 쉘 스크립트를 파일에 저장 /path/to/repo/.git/hooks/post-checkout하고 실행 가능하게 만드십시오.

#! /bin/sh

# Start from the repository root.
cd ./$(git rev-parse --show-cdup)

# Delete .pyc files and empty directories.
find . -name "*.pyc" -delete
find . -type d -empty -delete

또 다른 옵션은 이것을 git 문제로 해결하지 않고 Python 문제로 해결하는 것입니다. PYTHONDONTWRITEBYTECODE환경 변수를 사용하여 Python이 처음부터 .pyc 파일을 작성하지 못하도록 할 수 있습니다 . 그러면 분기를 전환할 때 정리할 것이 없습니다.


내 솔루션은 git과 더 호환됩니다 . Git은 체크아웃으로 파일이 삭제된 enpty 디렉토리만 제거합니다. 전체 워크카피 트리를 검색하지 않습니다. 이는 Python 버전 등으로 다양한 테스트를 위한 tox 패키지의 가상 환경과 같이 무시되는 트리가 매우 큰 큰 저장소 또는 저장소에 유용합니다 .

내 첫 번째 구현은 원칙을 매우 명확하게 설명합니다 . 버전 제어 하에 있는 파일 과 관련된 pyc 파일만 정리됩니다. 효율성과 원치 않는 부작용 때문입니다.

#!/bin/bash
# A hook that removes orphan "*.pyc" files for "*.py" beeing deleted.
# It doesn not clean anything e.g. for .py files deleted manually.
oldrev="$1"
newrev="$2"
# ignored param: branchcheckout="$3"

for x in $(git diff --name-only --diff-filter=DR $oldrev..$newrev | grep "\.py$")
do
    if test -a ${x}c && ! test -a ${x}; then
        rm ${x}c
    fi
done

post-checkout후크는 전체 트리를 검색하지 않고, 정확히 파일이 자식 체크 아웃에 의해 삭제 된있는 알려진 얻을 수 있도록 세 가지 유용한 매개 변수를받을 수 있습니다.

질문을 읽은 후 후크 코드를 Python으로 다시 작성하고 빈 디렉토리에 대한 요구 사항에 따라 확장했습니다.

내 완전한 짧은 소스 코드 (Python)https://gist.github.com/hynekcer/476a593a3fc584278b87#file-post-checkout-py
있습니다.

문서 문자열:

"""
A hook to git that removes orphan files "*.pyc" and "*.pyo" for "*.py"
beeing deleted or renamed by git checkout. It also removes their empty parent
directories.
Nothing is cleaned for .py files deleted manually or by "git rm" etc.
Place it to "my_local_repository/.git/hooks/post-checkout" and make it executable
"""
  • The problem with *.pyc files is not important for Python 3, because *.pyc files in __pycache__ can not be executed without the related *.py* file in its parent directory.

  • No change directory is necessary, because hooks are started everytimes in the root of the repository.

  • Cache directories for compiled code __pycache__ are cleaned completely, because they are never important (don't take part in any binary distribution) and also for high efficiency because deleting by parts __pycache__/some_name.*.pyc could be slow.

ReferenceURL : https://stackoverflow.com/questions/1504724/automatically-remove-pyc-files-and-otherwise-empty-directories-when-i-check-ou

반응형