수신과 동시에 Git gc 또는 정리

수신과 동시에 Git gc 또는 정리

두 개의 호스트 A와 B가 있습니다.

A는 Git을 제공하고 B로부터 푸시된 개정을 받습니다.

B는 스스로 당기지 않는 한 밀기만 하고 절대 받지 않습니다.

동시 작업에 대한 두려움이 없기 때문에 B를 GC로 설정하거나 회전을 정리할 수 있습니다. 그러나 A가 GC 또는 정리하는 동안 B가 회전을 A로 푸시할 수 있습니까? 무슨 일이야?

나는 기본적으로 GC나 프룬을 실행할 때 A의 통신을 중단해야 하는지, 아니면 그럴 필요가 없는지 알고 싶습니다.

답변1

힘내 GC매뉴얼 페이지상태:

git gc가 다른 프로세스와 동시에 실행되면 다른 프로세스에서 사용 중이지만 참조를 생성하지 않은 개체를 삭제할 위험이 있습니다. 이로 인해 다른 프로세스가 나중에 삭제된 개체에 대한 참조를 추가하면 다른 프로세스가 실패하거나 저장소가 손상될 수 있습니다. Git에는 이 문제를 크게 완화하는 두 가지 기능이 있습니다.

  1. --prune 날짜보다 최신 수정 시간을 가진 모든 객체는 해당 객체에서 접근할 수 있는 모든 것과 함께 유지됩니다.

  2. 데이터베이스에 객체를 추가하는 대부분의 작업은 객체가 이미 존재하는 경우 #1이 적용되도록 객체의 수정 시간을 업데이트합니다.

그러나 이러한 기능은 완전한 솔루션에 미치지 못하므로 명령을 동시에 실행하는 사용자는 어느 정도 손상 위험(실제로는 낮은 것으로 보임)을 안고 살아야 합니다.

그리고 더 나아가:

--prune=<date>

날짜보다 오래된 느슨한 객체를 정리합니다(기본값은 2주 전이며 구성 변수 gc.pruneExpire로 재정의 가능). --prune=now기간에 관계없이 느슨한 개체를 정리하고 다른 프로세스가 저장소에 동시에 쓰는 경우 손상 위험이 증가합니다. 아래의 "참고"를 참조하세요. --prune은 기본적으로 켜져 있습니다.

그렇습니다. 위험이 있습니다. 그러나 A와 B의 시계가 상당히 동기화되어 있고 저장소에 적용하는 Git 명령이 완료하는 데 2주 이상 걸리지 않으면 동일한 저장소에 동시에 푸시하고 GC하는 위험을 다음과 같이 간주합니다. 허용됩니다.

관련 정보