ChangJoo-Park / what-to-do

앞으로 해야할 일 또는 생각하는 걸 보관하기 위함
6 stars 0 forks source link

Git filter-branch 정리 #16

Open ChangJoo-Park opened 6 years ago

ChangJoo-Park commented 6 years ago

4-1 git filter branch 사용법 git 진행하면서 실수로 큰 파일을 업로드하여 commit을 하는 경우가 있는데, 이 때, git에서 완전히 삭제하려고 할 때, 참고하시면 됩니다.

외부 라이브러리 또는 플러그인을 사용하는 경우(이후 의존성이라 지칭) 바이너리 혹은 소스코드를 프로젝트 디렉터리 안에서 관리하게 됩니다. git을 사용하는 경우 내려받은 외부 의존성들의 바이너리, 소스코드는 .gitignore 파일에 추가해서 git 이 추적하지 않도록 해야합니다.

실수 혹은 의도치 않게 git으로 관리하는 파일이 된 경우 파일을 삭제하더라도 히스토리에 남게 됩니다. 만약 용량이 큰 바이너리 파일이 히스토리에 추가된 경우 소스코드 저장소에 따라 push 를 할 수 없는 경우가 생깁니다.

filter-branch 기능을 사용하면 커밋에서 특정 파일을 지울 수 있습니다. 모든 커밋을 추적하여 사용자가 지정한 작업을 할 수 있습니다.

git으로 관리하고 있는 프로젝트에서 아래 명령어로 작업합니다.

$ git filter-branch --tree-filter 'rm -rf 삭제할 파일 또는 디렉터리' HEAD $ 는 터미널 표시입니다.

여기서는 HEAD를 타겟으로 하여 모든 커밋에서 삭제할 파일 또는 디렉터리를 찾아 지웁니다. 작업이 완료되면 모든 히스토리에서 제거됩니다.

모든 브랜치까지 포함하여 정리하려면 --all 옵션을 이용해 동일한 작업을 할 수 있습니다.

특정 커밋 구간을 지정하려면 HEAD 대신 시작해시..마지막해시 으로 변경할 수 있습니다.

예 : 18ca709..c673b40

18ca709..HEAD 면 18ca709 부터 가장 최근 커밋까지 동일한 작업을 합니다.

filter-branch는 속도가 매우 느립니다. 대안으로 BFG Repo-Cleaner가 있습니다.

filter-branch와 동일한 기능을 하지만 여러 옵션들을 제공해 다양하게 사용할 수 있을 것으로 보입니다.

참고 : https://git-scm.com/book/ko/v1/Git-%EB%8F%84%EA%B5%AC-%ED%9E%88%EC%8A%A4%ED%86%A0%EB%A6%AC-%EB%8B%A8%EC%9E%A5%ED%95%98%EA%B8%B0#filter-branch%EB%8A%94-%ED%8F%AC%ED%81%AC%EB%A0%88%EC%9D%B8