예를 들어 ID 56f06019로 커밋했습니다. 그 커밋에서 실수로 큰 파일 (50Mb)을 커밋했습니다. 다른 커밋에서 동일한 파일을 추가하지만 올바른 크기 (작음)로 추가합니다. 이제 복제가 너무 무거울 때 내 저장소 :( 저장소의 크기를 줄이기 위해 저장소 기록에서 큰 파일을 제거하는 방법은 무엇입니까?
예를 들어 ID 56f06019로 커밋했습니다. 그 커밋에서 실수로 큰 파일 (50Mb)을 커밋했습니다. 다른 커밋에서 동일한 파일을 추가하지만 올바른 크기 (작음)로 추가합니다. 이제 복제가 너무 무거울 때 내 저장소 :( 저장소의 크기를 줄이기 위해 저장소 기록에서 큰 파일을 제거하는 방법은 무엇입니까?
답변:
Pro Git 책의 9 장 에는 Remove Objects 에 대한 섹션이 있습니다 .
여기에서 단계를 간략하게 설명하겠습니다.
git filter-branch --index-filter \
'git rm --cached --ignore-unmatch path/to/mylarge_50mb_file' \
--tag-name-filter cat -- --all
이전에 설명한 리베이스 옵션과 마찬가지로 filter-branch다시 쓰기 작업입니다. 기록을 게시 한 경우 --force새 참조 를 푸시 해야합니다 .
filter-branch접근 방식은보다 훨씬 더 강력 rebase그것 때문에, 접근
filter-branch 백업도 유지하므로 reflog 및 가비지 수집을 만료하지 않는 한 repo의 크기가 즉시 감소하지 않습니다.
rm -Rf .git/refs/original # careful
git gc --aggressive --prune=now # danger
git filter-branch --force --index-filter 'git rm --ignore-unmatch --cached PathTo/MyFile/ToRemove.dll' -- fbf28b005^.. 다음 rm --recursive --force .git/refs/original과 rm --recursive --force .git/logs 다음 나는를 사용 git prune --expire now 하고 git gc --aggressive 이 위에 나열된 정확한 단계보다 나를 위해 더 나은했다. 귀중한 Git Pro 책 링크를 포함 해 주셔서 감사합니다.
git-extras 도구를 사용할 수 있습니다 . 절멸 명령은 완전히 과거의 커밋 및 태그를 포함하여 저장소에서 파일을 제거합니다.
대화 형 모드에서 git rebase 를 수행 해야합니다 . 여기 예제를 참조하십시오. GitHub에서 커밋을 제거하려면 어떻게해야합니까? 그리고 오래된 커밋을 제거하는 방법 .
커밋이 HEAD에서 10 커밋을 뺀 경우 :
$ git rebase -i HEAD~10
히스토리 편집 후에는 "새로운"히스토리를 푸시해야하며, +to force 를 추가해야합니다 ( 푸시 옵션 의 refspec 참조 ).
$ git push origin +master
다른 사람이 이미 저장소를 복제 한 경우 기록을 변경했기 때문에 알려야합니다.
git push --force또는 git push -f(사람들이 분기 푸시 대상을 알 필요가 없음)
git rm경로에서 직접 사용할 수없는 이유 입니다.
Windows https://stackoverflow.com/a/8741530/8461756 에서 다음 답변을 사용해 보았습니다.
작은 따옴표는 창에서 작동하지 않으며 큰 따옴표가 필요합니다.
다음은 나를 위해 일했습니다.
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PathRelativeRepositoryRoot / bigfile.csv"---all
큰 파일을 제거한 후 변경 사항을 github master에 푸시 할 수있었습니다.