2011-11-01 7 views
5

불행히도 우리는 실수로 큰 바이너리 파일을 체크인했습니다. 이제 저 커밋을 버리고 남은 역사를 그대로 갖고 싶습니다. 나는 밀린 역사를 바꾸는 것에 대한 경고를 알고 있지만이 경우 나는 그것을 피할 수 없다.오래된 커밋을 버리십시오 :`git rebase`가 병합 충돌을 일으킴

나는 그것을 ~ 1h 달성하려고 노력했지만 그것을 얻지 못했습니다. 내가 찾은 최고의 명령은

git rebase --interactive --preserve-merges $(EVIL_COMMIT)^ 

악한 하나입니다 커밋 1을 주석 편집기입니다.

불행하게도 git rebase은 병합이 중지되고 병합 충돌을 수동으로 해결하라는 메시지를 표시합니다. 사악한 커밋은 우리의 소프트웨어가 테스트 목적으로 계산할 예제 파일을 추가합니다. 따라서 예제 파일과 충돌하지 않아야합니다.

  1. 어디에서 병합 충돌이 발생했는지 이해할 수 없습니다. 누군가 설명 할 수 있니?
  2. 어떻게 해결할 수 있습니까?

나는 Google과 SO 검색에 많은 시간을 보냈습니다. 일부 스레드는 유사한 주제를 다루지 만 오늘날의 Git 버전에서는 syntax used is not available이 더 이상 필요하지 않습니다. 또는 나에게 도움이되지 못했습니다 (가장 쉬운 방법이기 때문에 위의 한 가지 방법 만 설명했습니다).

+0

가능한 중복 Git 저장소의 내역?] (http://stackoverflow.com/questions/2100907/how-to-remove-delete-a-large-file-from-commit-history-in-git-repository) –

답변

6

나는 filter-branch와 함께 가고 싶어요 :

git filter-branch --prune-empty --index-filter ' 
    git rm --cached --ignore-unmatch path/to/file 
' --all 
+0

이것은 모든 수정본의'path/to/file' 파일, 맞습니까? 내가 아는 한 바이너리를 삭제 한 후에 비워 둘 커미트를 제거하지는 않는다. (실제로는 4 개가있다.) –

+2

'--prune-empty'를 필터 분기 명령에 추가하십시오. –

+1

이 대답에서'$ (EVIL_COMMIT) ^'보다는'HEAD'를 의미한다고 생각합니다. 그렇지 않으면 큰 파일을 소개하기 전의 커밋 만 필터링합니다. –