2012-07-09 3 views
7

우리는 중앙 자식 저장소 (gforge)를 실행하여 모든 사람들이 끌어 당깁니다. 불행히도, 일부 부적합한 동료들은 10-100Mb 크기의 jar 파일을 저장소에 넣는 것이 좋은 생각이라고 판단했습니다. 결과적으로 우리가 사용하는 서버의 디스크 공간이 부족해졌습니다.큰 커밋을 git에서 제거하십시오.

우리는 너무 늦었고 대부분의 사람들이 새로운 거대한 repo를 당길 때 이것을 깨달았습니다. 문제가 푸시되지 않았다면 rebase를 수행하여 커다란 커밋을 잘라내 고 고칠 수 있지만 이제는 모든 사람이 그걸 꺼 냈습니다. 커밋을 제거하는 최선의 방법은 무엇입니까? (또는 대용량 파일을 제거한 다음) 이 아니고이 모두가 레포를 당기거나 푸시하려고 할 때 혼란을 야기 할 수 있습니까?

스크립트에 대한 작은 REPO 있어야하는데,하지만 지금

답변

6

확인이 밖으로 https://help.github.com/articles/remove-sensitive-data :-(크기 약 700M입니다. 여기에 그들은 당신의 Git 저장소에서 민감한 데이터를 제거하는 방법에 대한 쓰기하지만 당신은 아주 잘 사용할 수 있어요 커밋에서 대용량 파일을 제거하는 그것.

+1

이전에이 가이드를 완료했지만 커밋을 휴지통으로 처리 한 후에는 어떻게됩니까? 사람들은 이미 몬스터 커밋을 꺼냈다. 일어날 가능성이있는 것은 누군가가 로컬 커밋을 한 다음 밀어 넣으면 병합이 필요하다는 것을 신음하므로 병합하고 밀어 내고 괴물 커밋이 다시 돌아올 것입니다. 어떻게하면 이런 일이 발생하지 않도록 할 수 있습니까? (묻는 모든 사람에게 전자 메일을 보내면 작동하지 않을 수 있습니다!) – agentgonzo

+0

원하지 않는 파일을 제거한 후에는 항상 .gitignore 파일에 추가하는 것이 좋습니다. 그렇게하면 Git이 파일 추적을 중단하고 다시 밀어 넣을 수 없게됩니다. –

+0

Sanhka, 그것들이 밀려나는 것을 막지는 않습니다 - 그것들이 커밋되는 것을 방지합니다. 그들이 이미 저지른 것처럼, 밀어 넣으면 다시 되돌릴 수 있습니다. – agentgonzo

8

혼란을 피할 수있는 가장 쉬운 방법은 서버에 더 많은 디스크를 제공하는 것입니다.

이 힘든 일입니다. 파일을 제거하면 역사에서 제거 요구도 이 명령은 git filter-branch으로 만 수행 할 수 있습니다. 예 : wo 자민련은 역사에서 <file>을 제거 :

git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file>' \ 
--prune-empty --tag-name-filter cat -- --all 

문제는이 SHA1은 새로운 지점 버전이나 위험 심각한 두통으로 재설정 할 필요가 팀에있는 모든 사람을 의미 해시를 다시 작성합니다. 아무도 작업을 진행하지 않고 모두 토픽 브랜치를 사용하면 괜찮습니다. 좀 더 중앙 집중화되고 팀 규모가 크거나 작업 중 많은 사람들이 작업 디렉토리를 더럽 히면 많은 혼란과 불협화음없이이를 수행 할 방법이 없습니다. 당신은 모든 사람들이 제대로 일하는 데 꽤 많은 시간을 할애 할 수 있습니다. 그것은 쓰여진 것, git filter-branch는 아마 제일 해결책이다. 진행중인 중요한 작업을 잃어 버리거나 잃어 버릴 경우에 대비해 계획을 세우고 팀이이를 이해하고 로컬 저장소를 백업해야합니다.

한 가지 가능한 계획은 다음과 같습니다

  1. 진행중인 업무, git diff > ~/my_wip 같은 패치를 생성하기 위해 팀을 가져옵니다.
  2. 커밋되었지만 공유되지 않은 작업에 대한 패치를 생성하도록 팀을 만드십시오. git format-patch <branch>
  3. 실행 . 이 상황이 발생하는 동안 팀이 당기지 않는 것을 확인하십시오.
  4. git fetch && git reset --hard origin/<branch> 팀에 문제를 제기하거나 저장소를 새로 복제 해달라고 요청하십시오.
  5. git am <patch>으로 이전에 커밋 된 작업을 적용하십시오.
  6. 진행중인 업무에 git apply으로 신청하십시오. git apply ~/my_wip.
+0

서버에서 더 많은 디스크 공간을 확보하는 것이 이상적인 솔루션은 아닙니다. 집에서 일하는 사람들은 광대역 연결을 통해 수백 MB를 가져와야 할 때 여전히 수백 MB를 가져와야하기 때문입니다. 나는 필터 - 브랜치 (branch)를 수행하고 "당신의 물건은 실패 할 것이다 - 로컬 변경을 숨기고 패치로 내 보낸 다음 로컬 repo를 삭제 한 다음 다시 불러 오기"- 대량 메일을 보낸다. – agentgonzo

+0

그래, 나는 비슷한 문제를 꼼짝 못하게했다. 몇 달 전에. 당신의 아이디어는 제 동료가 패치에 대해 조금 신경 쓰지 않았다는 것을 제외하고는 제가 한 짓보다 다소 정확합니다. 나는 그들을 위해 그것을 끝내었다. 오후가 걸렸어. 나는 당신의 계획을 통합하기위한 해답을 편집했고, 나중에 누군가가 우연히 발견 할 경우를 대비해 몇 가지 명령을 추가했습니다. – Christopher

4

다른 답변 외에도 향후 거대한 jar 파일에 대한 선결제 보호 기능을 사용자를 금지하는 미리 수신 후크 형식으로 추가하는 것이 좋습니다 (또는 " 비 관리자 사용자 "라고 함)가 매우 큰 파일 또는 *.jar이라는 파일을 푸시하지 못하도록합니다.

"임시 분기에서 작업 내용을 저장하고 다시 설정하고 끌어서 다시 적용 할 수없는 특정 사용자 때문에 특정 커밋 ID를 금지하는 것을 포함하여 이전에 이런 종류의 작업을 수행했습니다. 일, 마이너스 거대한 파일 ".

사전 수신 후크는 다소 흥미로운 컨텍스트에서 실행됩니다. 파일이 실제로 업로드되었으므로 참조 (일반적으로 분기 헤드)가 실제로 변경되지 않은 것입니다. 브랜치 헤드가 변경되는 것을 막을 수는 있지만 gc'ed가 될 때까지 디스크 공간과 네트워크 대역폭을 계속 사용하게됩니다.

0

filter-branch를 사용하십시오! 여기

git filter-branch -f --prune-empty -- --all 
+0

'--index-filter'는 본질적으로'--tree-filter'와 같지만 더 빠릅니다. –

-1

GForge의 사람 :

git filter-branch --tree-filter 'find . -name "*.jar" -exec rm {} \;' 

은 그럼 그냥 그들에 모든 파일이없는 모든 커밋을 제거. 비록이 주로 자식 문제이다 생각 나는 두 가지를 제공하고 싶습니다 :

  1. Starting in GForge 6.3, 사이트 관리자는 너무 많은 디스크를 사용하는 프로젝트뿐만 아니라 과거와 고아 프로젝트를 식별 할 수 있습니다. 이렇게하면 전체 디스크 상황을 피하는 데 도움이 될 수 있습니다. 특히 별도의 팀과 프로젝트가 많이있는 경우 특히 그렇습니다.
  2. GForge에서 쉽게 수행 할 수있는 git 후크 (일반적으로 SCM 후크)를 구현합니다. 사이트 관리자는 원하는 수의 후크 명령을 구성 할 수 있으며 프로젝트 수준의 사람들은 프로젝트에 사용할 후크를 선택할 수 있습니다. 파일의 특정 유형 (또는 크기)을 방지하는 후크를 추가하면이 기능에 적합합니다.
관련 문제