source

Git: 기록 커밋에서 파일을 제거하는 방법?

factcode 2023. 10. 31. 22:56
반응형

Git: 기록 커밋에서 파일을 제거하는 방법?

ID에 대한 커밋이 있습니다.56f06019,예를들면.이 커밋에서 실수로 대용량 파일(50MB)을 커밋했습니다.다른 커밋에서 같은 파일을 올바른 크기(작은)로 추가했습니다.지금은 복제할 때 레포가 너무 무겁습니다.제 레포 크기를 줄이기 위해 레포 히스토리에서 그 큰 파일을 제거하려면 어떻게 해야 합니까?

Pro Git book 9장에는 객체 제거에 대한 부분이 있습니다.

여기에 단계의 개요를 간단히 설명하겠습니다.

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어프로치, 이래로

  • 모든 분기/참조 작업을 한 번에 수행할 수 있습니다.
  • 태그의 이름을 바꿉니다.
  • 파일을 추가한 후 병합 커밋이 여러 번 발생한 경우에도 정상적으로 작동합니다.
  • 파일이 (a) 분기 기록에서 여러 번 추가(재)되거나 removed되어도 정상적으로 작동함
  • 는 관련 없는 새로운 커밋을 만들지 않고, 관련된 트리를 수정하면서 커밋을 복사합니다.이는 서명된 커밋, 커밋 노트 등이 보존됨을 의미합니다.

filter-branch백업도 유지하므로 reflog 및 가비지 컬렉션을 만료하지 않는 한 repo의 크기가 즉시 줄어들지 않습니다.

rm -Rf .git/refs/original       # careful
git gc --aggressive --prune=now # danger

추가 도구를 사용할 수 있습니다.삭제 명령은 저장소에서 과거 커밋 및 태그를 포함한 파일을 완전히 제거합니다.

https://github.com/tj/git-extras/blob/master/Commands.md

저는 윈도우 https://stackoverflow.com/a/8741530/8461756 에서 다음 답변을 사용해 보았습니다.

한 개의 따옴표는 윈도우에서 작동하지 않으며, 두 개의 따옴표가 필요합니다.

팔로잉은 나를 위해 일했습니다.

git filter-branch --force --index-filter "git rm --cached --ignore-unmatch PathRelativeRepositoryRoot/bigfile.csv" -- --all

빅 파일을 제거한 후, GitHub 마스터로 변경 사항을 푸시할 수 있었습니다.

대화형 모드에서 gitbase를 사용해야 합니다. 여기 예를 참조하십시오.GitHub에서 커밋을 제거하려면 어떻게 해야 합니까? 그리고 이전 커밋을 제거하는 방법입니다.

커밋이 HEAD에서 10 커밋을 뺀 경우:

$ git rebase -i HEAD~10

당신의 역사의 판본이 끝나면, 당신은 "새로운" 역사를 추진해야 하고, 당신은 그것을 추가해야 합니다.+강제(푸시 옵션의 refspec 참조):

$ git push origin +master

다른 사용자가 리포지토리를 이미 복제한 경우 기록을 변경했기 때문에 이를 알립니다.

간단한 명령을 사용하여 삭제할 수 있습니다.

 git rm -r -f app/unused.txt 
 git rm -r -f yourfilepath

언급URL : https://stackoverflow.com/questions/8740187/git-how-to-remove-file-from-historical-commit

반응형