2016-08-09 6 views

답변

6

git gcgit repack -ad; git prune 사이에 어떤 차이가 있습니까?

기본적으로 git gc은 관리 작업이 무엇이 필요한지에 대해 매우 보수적입니다. 예를 들어, 저장소의 느슨한 개체 수가 특정 임계 값을 초과하지 않으면 (gc.auto 변수를 통해 구성 가능) git repack을 실행하지 않습니다. 또한 git gcgit repackgit prune보다 많은 작업을 실행합니다.

예인 경우 git gc (또는 그 반대)으로 수행 할 수있는 추가 단계는 무엇입니까?documentation, git gc 실행에 따르면

:

  • git-prune
  • git-reflog
  • git-repack
  • git-rerere

더 많은 사양

  • pack-refs --all --prune
  • reflog expire --all
  • repack -d -l
  • prune --expire
  • worktree prune --expire
  • rerere gc
  • : ifically는 source code of gc.c (lines 338-343)1 보면 우리는 가장에서 다음 명령을 를 호출하는 것을 볼 수있다

(lines 121-126)의 수에 따라, 대신 (lines 203-212)-A 옵션을 repack을 실행할 수 있습니다 :

* If there are too many loose objects, but not too many 
* packs, we run "repack -d -l". If there are too many packs, 
* we run "repack -A -d -l". Otherwise we tell the caller 
* there is no need. 
if (too_many_packs()) 
    add_repack_all_option(); 
else if (!too_many_loose_objects()) 
    return 0; 

공지 사항을 line 211-212 of the need_for_gc function에 저장소에 충분한 느슨한 객체가없는 경우 있음, gc이 전혀 실행되지 않습니다.

더욱 documentation에 명확히한다 : 너무 많은 느슨한 개체 또는 저장소에 너무 많은 팩이있는 경우

객실 청소가 필요합니다. 느슨한 오브젝트의 수가 gc.auto 구성 변수의 값인 을 초과하는 경우, 오브젝트가 모두 git repack -d -l을 사용하는 단일 팩으로 결합됩니다. gc.auto 값을 0으로 설정하면 느슨한 물체의 자동 포장이 비활성화됩니다. (a .keep 파일 표시 제외) 팩의 수 gc.autoPackLimit의 값을 초과하면

다음 기존 팩 는 git repack -A의 옵션을 사용하여 단일 패키지로 통합된다.

보시다시피, git gc은 저장소의 상태에 따라 올바른 작업을 수행하기 위해 노력합니다.

공간 최적화 또는 안전성과 관련하여 어느 것이 더 좋습니까?안전하고 너무 많은 자원을 낭비하지 않고 - 일반적으로

그것은 좋은 모양 저장소를 유지하기 위해 필요한 최소한의 작업을 할 것이기 때문에 단순히 git gc --auto를 실행하는 것이 좋습니다.

그러나 gc.auto 구성 변수를 0으로 설정하여이 동작을 비활성화하지 않는 한 특정 명령에 따라 가비지 수집이 이미 자동으로 트리거 될 수 있습니다. documentation에서

:

이 옵션을 어떤 가사가 필요한지 여부를 git gc 검사와
--auto; 그렇지 않으면 작업을 수행하지 않고 종료됩니다. 일부 자식 명령은 많은 느슨한 개체를 만들 수있는 작업을 수행 한 후에 git gc --auto을 실행합니다.

그러므로 대부분의 저장소의 경우 이미 git gc을 명시 적으로 실행하지 않아도됩니다. 왜냐하면이 저장소가 이미 사용자를 위해 관리되기 때문입니다. 2016년 8월 8일 이루어 커밋의 a0a1831로서


.

1

git help gc 몇 가지 힌트 ...

옵션 구성 변수 gc.rerereresolved

가 이전에 해결 충돌 병합의 긴 기록이 보존되는 표시가 포함되어 있습니다.

선택적 구성 변수 gc.rerereunresolved는 해결되지 않은 충돌 된 병합 레코드의 보관 기간을 나타냅니다.

나는 당신이 오직 git repack -ad; git prune 일을 수행한다고 생각하지 않습니다.