2014-10-24 1 views
1

저장소가 너무 커져서 사용할 수 없게되었습니다. 기본적으로 저장소는 2GB 이상이며 복제하는 데 너무 오래 걸립니다. 이제는 축소하고 싶지만 여전히 특정 이전 버전으로 돌아갈 수 있습니다. 축소하면 기록을 다시 작성해야하므로 잘 처리됩니다. 클론을 가진 사람은 새로운 repo 복제본의 새 지점 맨 위에/cherrypick/copyfiles를 리베이스해야합니다.git 저장소 히스토리를 충돌없이 자동으로 스쿼시하는 방법. 축소하려면?

  • 이 저장소에는 바이너리 파일이 있지만 필요로합니다 (소프트웨어를 실행하기위한 필수 리소스라고 생각합니다). 그래서 필터 커밋이나 BFG을 사용하여 커다란 바이너리 파일을 제거 할 수 없습니다. 과거의 커밋으로 되돌릴 때 필요하기 때문에.
  • 이전의/이미 병합 된 브랜치 (예 : 브랜치 기능)에 대해서는 신경 쓰지 않지만, 특정 커밋에 대해서는 신경 쓰지 않습니다. (이전 릴리스 브랜치의 예 머리)
  • ~ 오래된 커밋, 나는 현재 충돌을 병합 (기본 rebase/cherrypick에서 발생할 수있는 것처럼)하는 방법을 모르고 있으므로 충돌을 일으키지 않거나 자동으로 해결할 수있는 충돌 만 생성하는 해결책을 찾고 있습니다.
  • 현재의 모든 브랜치를 보존하고 싶으므로 복제를 진행중인 사람들은 리베이스/복사 변경을 할 수 있습니다.
  • 내 새로운 커밋 사이의 관련 내역을 이전의 repo의 내역과 일치 시키려합니다 (커밋이 부숴 진 것처럼). 현재 브랜치의 히스토리는 오래된 스쿼시 된 커밋 중 하나에서 시작합니다.

필자는 불필요한 오래된 저장소 기록 스쿼시라고 생각합니다. 지금까지 내가 할 수있는 일은 가능한 일이었습니다 (약간의 단계를 놓친 경우에도 여전히 생각하고있는 것이 확실하지 않습니다).

  • 복제본 기존의 미러를 미러링합니다.
  • 보관하려는 오래된 커밋에서 고아 분기를 만듭니다. 이렇게하면 부모가 필요없는 커밋이 만들어지고 그 안에 필요한 모든 파일이 만들어집니다.
  • 어떻게 든 이전 레포 역사를 재현하려면 링크 => 어떻게? 병합/리베이스/리셋 + 고아 커밋?
  • CherryPick 현재 분기의 커밋 목록 (간격을 사용하여)을 첫 번째 발산 커밋의 부모를 부숴 버린 최신 커밋에 적용 => 체리 선택 커밋 간격을 적용 할 커밋을 자동으로 찾는 방법? 충돌없이 작동할까요?
  • 태그를 새 트리로 이동하십시오. 이전 트리를 제거하십시오. 자식 쓰레기 수집.

충돌없이 실현할 수 있습니까? 어떤 종류의 경우에도이 작업을 할 수 있습니까? (git commit tree는 꽤 복잡 할 수 있습니다)? 안전하고 자동으로 스쿼시 기록에 더 좋은 해결책이 있습니까?

이런 유형의 유지 관리 작업은 장기간 실행되는 프로젝트에서 발생하는 것으로 보이므로 다른 큰 프로젝트가 이미 일부 유형의 솔루션을 사용하고 있다고 가정합니다. 하지만 내가 알고있는 init (또는 다른 명령)을 git하는 옵션이있을 수 있다고 생각합니다.이 유스 케이스에 대한 이전 버전의 Repo를 새로 만들 수 있습니까?

업데이트 : 여기 솔루션의 시작을 찾았습니다. https://wincent.com/wiki/Editing,_amending,_or_squashing_the_root_commit_in_a_Git_repository 전 역사에 여러 번 이렇게하고 싶습니다. 완전히 자동으로 (즉, 충돌없이) ...이 얕은 복제라고

git clone --depth depth 

:

+0

실제로 기록을 축소하겠습니까? 만약 당신이 큰 바이너리 파일을 가지고 있다면, 그것은 커밋 자체가 아닌, 공간을 차지하는 것이다. 큰 오브젝트에 대한 BLOB 크기를 덤프하고 2GB 중에서 차지하는 비율을 확인하면 어떤 개선 효과를 얻을 수 있는지 알 수 있습니다. –

+0

커밋이 부셔지면이 커밋에서 참조 된 바이너리 파일은 더 이상 사용되지 않으며 가비지 수집 될 수 있습니다 ... 생각합니다. 블롭 크기 팁 덕분에 확인하는 것이 좋습니다. – Asmodehn

답변

1

당신은 REPO의 단지 일부를 복제 할 수 있습니다.

큰 레포를 다루는 다른 전략을 제공하기 전에 얼마 전에 post on the Atlassian blog이었습니다.

+0

큰 복제 저장소를 "읽기 전용"으로 설정하려는 경우에만 얕은 복제본을 유용하게 사용할 수 있습니다. 그렇지 않으면 실제 repo를 더 작게 만들려면 다른 방법이 필요합니다. 로컬 클론뿐 아니라 – Asmodehn

0

Git 얕은 클론은 하나의 대답이지만 얕은 클론을 사용하면 푸시 할 수 없습니다. 이 FF 푸시 아니므로

는 지금까지 스쿼시 관련 스쿼시는 게시되지 않은 역사에 대한 좋은,이 링크는 http://www.awanitech.com/git-squash.html

푸시 후 다른 지점에 최선을 다하고해야 할 모든 스쿼시 유용 할 수 있습니다. 이러한 스쿼시는 저장소 크기에 영향을 미치지 않습니다.

강제 푸시 (기록 다시 쓰기)를 수행 할 준비가 되었다면; 그러면 필터 분기를 수행하고 크기를 줄일 수 있습니다.

잘못된 버전이 완전히 다른 지점에 있다면, git 번들을 만들어 요약 된 저장소로 만들 수있다. ,

1)에서 당신이 고아 분기를 만들 checkout --orphan을, 새로운 루트를 사용하려는 커밋 :

+0

내 저장소가 비공개이며 모든 사용자에게 리베이스 (rebase)를 알릴 수 있으므로 문제가되지 않습니다. 하지만 나중에 사용하지 않는 바이너리 BLOB가 가비지 수집 될 수 있도록 커밋 된 것을 제거하고 싶습니다. – Asmodehn

+0

당신이 저장소 로컬에 말했듯이, 기존의 자식 저장소를 백업하십시오. 첨부 된 링크에 설명 된 방법을 사용하여 스쿼시. 다른 폴더로 이동하여 원래 프로젝트에서 복제본을 만들면 원하지 않는 커밋이 발생하지 않습니다.(당연히 다른 클론을 만드는 것은 밀기와 비슷합니다.) – forvaidya

+0

제 질문의 첫 번째 부분을 해결해 주셔서 감사합니다. 그것은 오래된 역사를 압축하는 것입니다. 하지만 난 여전히 어떻게 든 충돌없이 상단에 최근의 역사를 연결해야합니다 ... – Asmodehn

1

확인은 시행 착오의 몇 일 후, 그래서 여기에 내가 최선을 찾을 수있는 솔루션입니다 이 버전에서는 변경된 파일을 커밋합니다.

2) 유지하려는 각 커밋 C에 대해 checkout은 C를, 이전 커밋 B에 reset은 각각 새로운 커밋을 만들기 위해 커밋하고 B는 부모로 만듭니다. (덕분에 forvaidya 링크에 대해)

3) 이제 기존 분기를 보관 한 마지막 커밋에 다시 링크해야합니다. 이전 기록에서 커밋을 찾습니다. 여기에서 직접 부모 (또는 부모) 중 하나가있는 모든 커밋을 나열하십시오. 그런 다음 새 git replace --graft을 사용하여 이전 상위를 새 커밋으로 바꿀 수 있습니다.

그러나 이것에 대한 간단한 스크립트를 작성하는 것이 매우 유용 할 것입니다 ... 만약 내가 그것을한다면 여기에 게시 할 것입니다.

경고 : 단계 3)은 git 2.X를 사용하는 경우에만 작동합니다. 1.X git 클라이언트는 커밋 그래프에서 변경 사항을 볼 수 없습니다.

+0

이 실제로 귀하의 레포 축소? –

+0

그렇습니다. 그러나 내가 예상했던 것보다 작다. .. 나의 레포는 전에 2.0GB이었다. 1.1GB의 나무. 이 작업이 완료된 후 1.6GB로 변경되었습니다. 대부분의 이미지 파일은 2MB 이상이지만 저장소에서 일어난 일에 대해 자세히 알지 못합니다. 내 사용자 중 일부는 창문에 있으며 자식 2.1을 사용할 수 없으므로 기존 마스터 분기의 팁에서 새 저장소를 만들어야합니다. – Asmodehn