2010-06-09 5 views
0

몇 달 전 나는 git 코드 저장소에 릴리스 tarball을 추가하고 커밋했습니다. 몇 가지 커밋이 나중에 파일을 제거하고 제거를 커밋했습니다. 이 하나의 파일은 저장소 전체 크기의 10 배에 가까운 크기 였기 때문에 .git에 해당 파일이 있으면 복제 속도가 크게 느려집니다. 이 시점에서 파일을 추가하고 제거한 커밋 쌍 이후로 수 백개의 커밋이있었습니다.Git : 이전 커밋과 관련된 객체 제거

취소 (추가 및 제거) 된 두 커밋을 제거하고 저장소를 비우지 않고 .git 파일의 복사본을 제거하는 방법이 있습니까? 당신은 git rebase을하고 역사의 밖으로 커밋을 쓸 수

답변

1

덕분에 .. ---이하지만, 그 이후의 모든 커밋의 ID를 변경합니다. 그 방법은 없습니다. 의도적으로 설계된 것입니다.

그래서 tarball을 추가 한 위치가 master ~ 100입니다. git rebase -i master~101master에서 수행하면 커밋 목록을 볼 수 있습니다. 단순히 커밋을 추가하고 제거한 커밋을 꺼내거나 첫 번째 커밋 옆에 취소 커밋을 이동하여 "스쿼시"로 표시 할 수 있습니다. 그러면 git이 둘을 결합하게됩니다. 결과는 null입니다 (단 두 개가 정확하게 취소하지 않을 경우 대처하므로이 방법이 조금 안전합니다).

+0

또 다른 언급 : 리버스 리포지토리를 다른 곳으로 밀어 넣으면 피어 개발자가 어렵게 만듭니다. 그러나 아라크 니드 (Araqnid)가 말했듯이, 주변에는 방법이 없습니다. –

+1

다른 말로하면, 이렇게하면 기록을 다시 씁니다. 실세계 역사와 마찬가지로 Git 역사를 재 작성하려면 글로벌 음모가 필요합니다. 역사와 만난 적이있는 모든 사람들이 함께 공모하여이를 제거해야합니다. 저 처분장에서 뽑은 모든 사람들, 저 처분장에서 끌어 낸 누군가 등등. 그들은 모두 * 그들의 역사를 다시 써야하고, 병합은 더 이상 작동하지 않을 것입니다. –

0

git filter-branch를 살펴보십시오. 이것이 역사를 다시 쓰는 데 가장 좋은 도구입니다. 맨 페이지에는 몇 가지 좋은 예가 있습니다.

다른 사용자가 저장소를 사용하는 경우 최신 커밋을 제외하는 마스터 분기를 얻는 지 확인하십시오. 이제는 temp와 같은 것으로 분기하고 git 페치를 수행해야합니다.

이제 그들은 Gitk를 사용할 수 있습니다. 거대한 파일을 가지고 있던 커밋 이후의 커밋 중 SHA-1이 변경된 것과 정확히 일치해야합니다.

관련 문제