git 저장소에서 사용하지 않는 객체를 제거하는 방법은 무엇입니까?
실수로 최신 커밋을 사용하여 거대한 바이너리 파일을 Git 저장소에 추가, 커밋 및 푸시했습니다.
Git에서 해당 커밋에 대해 생성 된 / 만든 객체를 제거하여 .git
디렉터리가 다시 정상적인 크기로 축소되도록하려면 어떻게해야합니까?
편집 : 답변 해 주셔서 감사합니다. 몇 가지 해결책을 시도했습니다. 작동하지 않았습니다. 예를 들어 GitHub의 파일이 기록에서 파일을 제거했지만 .git
디렉터리 크기는 줄어들지 않았습니다.
$ BADFILES=$(find test_data -type f -exec echo -n "'{}' " \;)
$ git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $BADFILES" HEAD
Rewrite 14ed3f41474f0a2f624a440e5a106c2768edb67b (66/66)
rm 'test_data/images/001.jpg'
[...snip...]
rm 'test_data/images/281.jpg'
Ref 'refs/heads/master' was rewritten
$ git log -p # looks nice
$ rm -rf .git/refs/original/
$ git reflog expire --all
$ git gc --aggressive --prune
Counting objects: 625, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (598/598), done.
Writing objects: 100% (625/625), done.
Total 625 (delta 351), reused 0 (delta 0)
$ du -hs .git
174M .git
$ # still 175 MB :-(
나는 이것을 다른 곳에서 대답했고, 자랑스럽기 때문에 여기에 복사 할 것입니다!
... 더 이상 고민하지 않고 추가 설정 변수가 나올 때까지 모든 git 쓰레기를 제거 할 수 있도록 보장하는이 유용한 스크립트 인 git-gc-all을 소개하겠습니다.
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 \
-c gc.rerereresolved=0 -c gc.rerereunresolved=0 \
-c gc.pruneExpire=now gc "$@"
--aggressive 옵션이 도움이 될 수 있습니다.
참고 : 이렇게하면 참조되지 않은 모든 항목이 제거되므로 나중에 일부 항목을 유지하기로 결정한 경우 나에게 울지 마세요!
먼저 이와 같은 것을 실행해야 할 수도 있습니다. 오 이런, 자식은 복잡합니다!
git remote rm origin
rm -rf .git/refs/original/ .git/refs/remotes/ .git/*_HEAD .git/logs/
git for-each-ref --format="%(refname)" refs/original/ |
xargs -n1 --no-run-if-empty git update-ref -d
이 모든 것을 스크립트에 넣습니다.
http://sam.nipl.net/b/git-gc-all-ferocious
귀하의 git reflog expire --all
잘못입니다. 만료 시간 (기본값 : 90 일)보다 오래된 reflog 항목을 제거합니다. 사용 git reflog expire --all --expire=now
.
비슷한 질문에 대한 나의 대답 은 저장소에서 사용하지 않는 객체를 실제로 제거하는 문제를 다룹니다.
1) git repo에서 파일을 제거하십시오 (파일 시스템이 아닙니다).
git rm --cached path/to/file
2) 다음을 사용하여 repo를 축소합니다.
git gc
,또는
git gc --aggressive
- 또는
git prune
또는이 질문에서 제안 된 위의 조합 : git 저장소 크기 줄이기
This guide on removing sensitive data can apply, using the same method. You'll be rewriting history to remove that file from every revision it was present in. This is destructive and will cause repo conflicts with any other checkouts, so warn any collaborators first.
If you want to keep the binary available in the repo for other people, then there's no real way to do what you want. It's pretty much all or none.
The key for me turned out to be running git repack -A -d -f
and then git gc
to reduce the size of the single git pack I had.
Hy!
Git only receives objects it actually needs when cloning repositories (if I understand it correctly)
So you can amend the last commit removing the file added by mistake, then push your changes to the remote repository (with -f option to overwrite the old commit on the server too)
Then when you make a new clone of that repo, it's .git directory should be as small as before the big file(s) committed.
Optionally if you want to remove the unnecessary files from the server too, you can delete the repository on the server and push your newly cloned copy (that has the full history)
git filter-branch --index-filter 'git rm --cached --ignore-unmatch Filename' --prune-empty -- --all
Remember to change Filename
for the one you want to remove from the repository.
See "Removing Objects" in the Pro Git book:
http://git-scm.com/book/en/Git-Internals-Maintenance-and-Data-Recovery#Removing-Objects
Update: see also BFG repo cleaner: http://rtyley.github.io/bfg-repo-cleaner/
참고URL : https://stackoverflow.com/questions/3797907/how-to-remove-unused-objects-from-a-git-repository
'developer tip' 카테고리의 다른 글
SQL Server는 where 표현식에서 대소 문자를 무시합니다 (0) | 2020.10.09 |
---|---|
iTunes Connect에서 앱 삭제 (0) | 2020.10.09 |
토스트 LENGTH_LONG 및 LENGTH_SHORT의 기간은 얼마입니까? (0) | 2020.10.09 |
C 구조체의 ":"(콜론)-무슨 뜻입니까? (0) | 2020.10.08 |
부트 스트랩 열 높이를 100 % 행 높이로 만드는 방법은 무엇입니까? (0) | 2020.10.08 |