바이너리 팽창을 제거하고 나머지 기록을 유지할 수 있습니다. Git을 사용하면 이전 커밋을 재정렬하고 '스쿼시'할 수 있으므로 큰 바이너리 파일을 추가하고 제거하는 커밋 만 결합 할 수 있습니다. 추가가 모두 한 커밋에서 수행되고 다른 커밋에서 제거되면 각 파일을 처리하는 것보다 훨씬 쉽습니다.
$ git log --stat # list all commits and commit messages
바이너리 파일을 추가 및 삭제하는 커밋을 검색하고 해당 SHA1 (예 : 2bcdef
및)을 기록 3cdef3
합니다.
그런 다음 리포지토리의 기록을 편집하려면 rebase -i
바이너리를 추가 한 커밋의 부모부터 시작하여 대화 형 옵션과 함께 command를 사용 합니다. $ EDITOR가 시작되고 2bcdef
다음으로 시작하는 커밋 목록이 표시됩니다 .
$ git rebase -i 2bcdef^ # generate a pick list of all commits starting with 2bcdef
# Rebasing zzzzzz onto yyyyyyy
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
pick 2bcdef Add binary files and other edits
pick xxxxxx Another change
.
.
pick 3cdef3 Remove binary files; link to them as external resources
.
.
squash 3cdef3
두 번째 줄로 삽입 pick 3cdef3
하고 목록에서 말하는 줄을 제거하십시오 . 이제 rebase
바이너리를 추가하고 삭제하는 커밋을 하나의 커밋으로 결합 하는 대화 형 작업 목록 이 있습니다. 그런 다음 완료하도록 지시하면 모든 후속 커밋을 순서대로 다시 적용합니다.
$ git rebase --continue
1 ~ 2 분 정도 걸립니다.
이제 바이너리가 더 이상 들어 오거나 나가지 않는 저장소가 있습니다. 그러나 기본적으로 Git은 변경 사항이 가비지 수집되기 전에 30 일 동안 유지되므로 마음을 바꿀 수 있기 때문에 여전히 공간을 차지합니다. 지금 제거하려면 다음을 수행하십시오.
$ git reflog expire --expire=1.minute refs/heads/master
#all deletions up to 1 minute ago available to be garbage-collected
$ git fsck --unreachable # lists all the blobs(files) that will be garbage-collected
$ git prune
$ git gc
이제 부풀음을 제거했지만 나머지 기록은 유지했습니다.