2017-01-31 2 views
11

나는 많은 (2000 +) 예를 들어, 커밋 많은와 자식 저장소를 "그러나 저장소의 시작으로.이전 git 기록을 삭제하는 방법은 무엇입니까? 에서 (예를 들어) 시작 로그 기록에서 모든 커밋 커밋을 삭제 "F -</p> <pre><code> l-- m -- n / a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- k x -- y -- z </code></pre> <p>내가 이전 로그 기록을 절단 할 :

어떻게 만드시겠습니까?

+0

['rebase'] (https://git-scm.com/docs/git-rebase)는 히스토리를 변경하는 도구입니다. – Maroun

+2

해결하려는 문제는 무엇입니까? –

답변

20

일부 기록을 잃지 않기 위해서; 먼저 저장소의 복사본을 가져와야합니다 :). 여기에 우리가 간다 : (<f> 당신이 커밋 새로운 루트하려는 커밋 (F)의 샤하다)

git checkout --orphan temp <f>  # checkout to the status of the git repo at commit f; creating a branch named "temp" 
git commit -m "new root commit"  # create a new commit that is to be the new root commit 
git rebase --onto temp <f> master # now rebase the part of history from <f> to master onthe temp branch 
git branch -D temp     # we don't need the temp branch anymore 

당신은 당신이 같은 잘린 역사를 갖고 싶어 원격이있는 경우; git push -f을 사용할 수 있습니다. 경고 이것은 위험한 명령입니다. 이것을 가볍게 사용하지 마십시오! 마지막 버전의 코드가 여전히 동일하게 유지되고 싶다면, git diff origin/master을 실행할 수 있습니다. 변경 사항은 표시되지 않아야합니다 (기록 만 변경 되었기 때문에 파일 내용은 변경되지 않음).

git push -f 

다음 두 명령은 옵션입니다. git repo를 양호한 상태로 유지합니다.

git prune --progress     # delete all the objects w/o references 
git gc --aggressive     # aggressively collect garbage; may take a lot of time on large repos 
+0

내가 필요한 것은 들리지만, 세 번째 단계를 실행할 때마다 (git rebase ...) 충돌이 발생합니다. 정상입니까? – user3475757

+0

아니요, 정상적으로 보이지 않습니다. 세 번째 단계에서' '부분을 포함 시켰습니까 (즉, temp 브랜치를 작성한 것과 동일한 커밋)? –

8

당신의 문제에 대한 해결 방안은 --shallow-since 옵션을 사용 git clone에 의해 제공됩니다. f 이후 커밋 수가 적고 카운트에 문제가없는 경우 --depth 옵션을 사용할 수 있습니다.

두 번째 옵션 (--depth)은 지정된 분기 만 복제합니다. 추가 분기가 필요한 경우 원본 repo를 리모컨으로 추가하고 git fetch을 사용하여 검색 할 수 있습니다.

결과가 만족 스러우면 이전 저장소를 제거하고 새 저장소의 이름을 바꿉니다. 이전 리포지토리가 원격 저장소 인 경우 제거한 다음 다시 만들고 새 저장소에서 해당 저장소로 푸시합니다.

이 방법은 크기와 속도의 이점이 있습니다. 새로운 저장소에는 원하는 커밋 만 포함되어 있으므로 이전 개체를 제거하려면 git prune 또는 git gc을 실행할 필요가 없습니다 (해당 개체가 없으므로).

+2

좋은 대안. +1 –

+0

기록을 보관하고 싶지만 리모컨에만 보관하려면 마지막 단계를 수행하지 마십시오. 내 응용 프로그램의 경우 이것은 가장 좋은 구성입니다. 필자는 필자가 필요로할만한 이벤트가 발생했을 때 리모컨에서 비 대한 기록을 가지고 있지만 로컬 복제본과 업데이트는 빠르며 많은 디스크 공간을 차지하지 않습니다. – Liam