2014-04-11 2 views
0

제 상황은 많은 부피가 큰 JPG가 src 코드 자체보다 훨씬 많은 100s의 MB를 추가하여 repo에 포함 시켰습니다.큰 오래된 git archive blob을 제거하십시오.

나는이 JPG가 파일 크기의 1/20 이하를 소비하도록 최적화했기 때문에, 인식 할 수없는 변화는 없었습니다. 저지른 뒤 뒤로 밀었다.

그러나 로컬 복사본에는 여전히이 디스크 공간이 .git 아카이브에서 사용되었습니다 (내부적으로 모든 파일의 이전 버전이 모두 포함되어 있음). 누구든지 새로운 당기기는 또한이 낭비 된 공간을 얻습니다.

원본 마스터가 Bitbucket입니다. 내가 http://linux.yyz.us/git-howto.html

How to remove local (untracked) files from the current Git working tree?

012을 제안

또는 를 사용하여

http://otomaton.wordpress.com/2012/12/17/saving-disk-space-by-garbage-collecting-in-git-repositories/ 처럼 좋은 가이드에서 알아 내려고 많은 시간을 보냈습니다

아카이브의 특정 커밋에서 이러한 거대한 JPG 파일 만 제거하거나 온라인 Bitbucket 저장소에서 제거하지 못하게하는 방법은 무엇입니까? 물론 우리는 (모든 파일의

  • 현재 버전
  • 최대한
  • 이 보존 개정 내역 & 전 후, 적어도 메타 지식에서이되었다는 커밋 유지하려는 다른 비 때문에 jpg 파일도 영향을 받았습니다.)
  • 200 개 이상의 JPG 파일이 있습니다. 이 작업을 한 번에 할 수 있습니까? 일부 매개 변수에서 * .jpg와 같은 와일드 카드를 사용하거나 for 루프를 사용합니까?

우리가 원하지 않는 큰 JPG 버전의 파일의 repo에는 이전 버전이 없었습니다. 무엇보다도

내가 시도 : 아무것도하기 전에

  • 이, 얼마나 많은 디스크 공간을 사용하여 .git입니까?
du 
72195 ./.git 
  • 찾기 헤비급 모양 : 마지막 큰 덩어리가 포함되어 있는지 무슨 짓을
git verify-pack -v .git/objects/pack/pack-*.idx |sort -k 3 -n |tail -39 
... 
03bcb7d79c1e0a4328420bf00647319465d5d3df blob 2446210 2430913 46915147 
52ea2d848645463e01d3dd143dd8d7fd24019335 blob 2467254 2443333 27573576 
12d63348c0e87f9602d395e694df6a94601c12f7 blob 2506409 2485495 49346060 
645fe7bfaf6ecd0140d144b4c40c19e78f103bd6 blob 2581349 2554398 10567725 
72672204aa3c7aec431cba02b32ac012e52e601d blob 3084793 3041294 13122123 
  • ?
  • 이 특정 파일 이미지/2.JPG (누구의 불필요한 복사본 내가 죽일 희망 중 하나)에 영향을 커밋
git rev-list --objects --all |grep 72672204 
72672204aa3c7aec431cba02b32ac012e52e601d images/2.jpg 
  • 를?
    git log --pretty=oneline --branches -- images/2.jpg 
    98dc75de48a63c2ab9661eb62895ac39ef331aaa MAPSDH-10 #time 30m #comment Grab live copy of Simon's source and push it onto Bitbucket repo; [email protected],2014-04-10_13-55-02 
    3e7f36f0b1a913feaf43547bca4ad3a5a08957a6 MAPSDH-10 #time 30m #comment Grab live copy of Simon's source and push it onto Bitbucket repo; [email protected],2014-04-10_13-31-49 
    
    • 좋아
    다음, 그래서 포함, 전 # 3e7f36f0 커밋 이미지/2.JPG의 복사본을 제거하려고 :
git filter-branch --index-filter 'git rm --cached --ignore-unmatch images/2.jpg' -- 3e7f36f0^.. 
Cannot rewrite branches: You have unstaged changes. 
  • 융합 단지 캐시에서 모두 제거 :
git rm --cached --ignore-unmatch images/2.jpg 
rm 'images/2.jpg' 
  • 을 그러나, 나는 images/2.jpg의 현재 버전은 여전히 ​​REPO에있을 것입니다 희망!

git count-objects -v 
count: 0 
size: 0 
in-pack: 284 
packs: 1 
size-pack: 72101 
prune-packable: 0 
garbage: 0 
size-garbage: 0 
  • 크기 팩 (기원 du 같이 72메가바이트) 여전히 72,101입니다 :
  • 지역 자식 아카이브의 파일 공간 사용량을 계산합니다. 어쨌든 예상대로 3084793 (3MB)을 비우는 것처럼 보이지 않았습니다.
+0

과 같은 bash 매직을 사용하십시오. 'git rm --cached --ignore-unmatch images/2.jpg'가 나타나서 repo에서 'images/2.jpg' 72672204를 커밋 한 후에도 현재 복사본이 있으므로 좋지 않습니다. – Marcos

답변

1

글쎄, 당신은 역사에 이러한 이미지가있어 그리고 당신은 역사를 다시 작성하고 영구적으로 삭제해야합니다.

내가 (역사 포함), 여기가 자식에서 영원히 파일을 제거하는 스크립트를 작성했습니다 :

#!/bin/bash 
git filter-branch -f --prune-empty -d /dev/shm/scratch \ 
    --index-filter "git rm --cached -f --ignore-unmatch $1" \ 
    --tag-name-filter cat -- --all 
rm -rf .git/refs/original/ 
git reflog expire --expire=now --all 
git gc --prune=now 
git gc --aggressive --prune=now 

귀하의 모든 그것으로 파일과 그 후 삭제할 수 있습니다 - 새 파일을 커밋합니다.

더 많은 정보 : http://git-scm.com/book/ch6-4.html

P.S. 와일드 카드를 사용하고 싶다면 for i in *.jpg; do git-rm-forever $i; done

+0

고마워요. 나는 그 사이트도 시도했다. 커밋 # 3e7f36f0 및 그 이미지들/* .jpg 파일들만을 포함하여 이전에 파일들을 지울 수있는 방법이 있습니까? 이게 내가 찾는거야. 이를 위해이 종류의 코드를 수정하려고합니다. 영구히 모든 버전을 지우지 마십시오. – Marcos

+1

예, 아니요, 이것은 유일한 방법은 아닙니다. 'git filter-branch .... '를 수정하여 모든 것이 아닌 정리해야하는 ref 만 필터링 할 수 있습니다. 그러나이 마법은 너무 높은 수준의 마법사를 필요로합니다. 나는 그것을 캐스팅 할 수 없습니다. :) – Arenim

관련 문제