2014-09-15 9 views
4

여러 개의 GIT 저장소가있는 폴더에있는 모든 중복 개체를 하드 링크하는 방법이 있습니까?중복 된 Git 포크 서버에

설명 : 회사 서버 (Linux Machine)에서 git 서버를 호스팅하고 있습니다. 아이디어는 모든 사용자가 푸시 액세스 권한이없는 주된 표준 리포지토리를 갖는 것입니다. 그러나 모든 사용자가 표준 리포지토리를 생성합니다 (사용자의 홈 디렉터리에 정식으로 복제하여 실제로 하드 링크를 만듭니다).

/표준/리포 /디바이스 1/리포 (처음 복제 할 때/표준/환매 약정에-하드 링크 된 객체) /디바이스 1/리포는 (처음 복제 할 때/표준/환매 약정에 하드 링크 된 객체)

이 모두 정상적으로 작동합니다.

디바이스 1 : 문제는 경우가 발생 거대한 서버에 자신의 포크에 커밋 밀어 (/ DEV1/환매 약정) 디바이스 1 : 는 자신의 로컬 시스템에 자신의 변경을하고 자신의 포크에 그것을 밀어 것을 꺼냅니다 서버 (/ DEV2/환매 약정)

이 내 서버를 먹고

(지금 같은 '거대한'파일이 서버의 개발자 포크 양쪽에있는, 자동으로 하드 링크를 작성하지 않습니다) 우주 같은 미친!

서버 공간이 저장되고 로컬 컴퓨터의 hi fork에서 복제 될 때 각 개발자가 모든 데이터를 가져올 수 있도록 두 포크 또는 정식 버전간에 복제되는 개체간에 하드 링크를 만드는 방법은 무엇입니까?

+0

클론의'.git/objects' 디렉토리를 정규형에 심볼릭 링크 할 수 있는지 궁금합니다. 어쩌면 실험으로 더미 레포에서 시도해 볼까요? –

+0

그건 내가 원하는 것이 아닙니다. 어떤 지점에서든 canonical의 개체 폴더는 사용자 포크의 개체 폴더와 다릅니다. 사용자 포크에는 정식의 모든 개체와 자신의 개체가 포함됩니다. –

+1

canonical repo에 사용자 객체를 저장해도 아무런 해가 없습니다. 표준을 가리키는 심판이없는 한, 표준에 "보이지"않을 것입니다. –

답변

2

마지막으로 나는 저를 위해 작동하는 해결책을 찾아 냈습니다! (생산 테스트하지! P) :

shared-objects-database.git/ 
foo.git/ 
    objects/info/alternate (will have ../../shared-objects-database.git/objects) 
bar.git/ 
    objects/info/alternate (will have ../../shared-objects-database.git/objects) 
baz.git/ 
    objects/info/alternate (will have ../../shared-objects-database.git/objects) 

모든 포크해야합니다 및 해당 개체/정보/대체 파일의 항목이 제공하는

감사를 내가하기로 결정 것을 this post이있다 오브젝트 데이터베이스 저장소에 대한 상대 경로.

동일한 이름의 저장소가있는 다른 사용자의 개체 및 참조를 저장할 수 있기 때문에 개체 데이터베이스를 저장소로 만드는 것이 중요합니다.

단계 : 1. 자식 초기화 --bare 공유 객체 database.git 2. 다음 코드의 라인 (포스트를 받게되며 통해) 어떤 포크에 푸시가 때마다 하나 또는으로는 를 실행 실행할 cronjob

for r in list-of-forks 
     do 
    (
cd "$r" && 
     git push ../shared-objects-database.git "refs/*:refs/remotes/$r/*" && 
echo ../../shared-objects-database.git/objects >objects/info/alternates 
# to be save I add the "fat" objects to alternates every time 
     ) 
done 

다음 "git gc"에서 이미 대체물에있는 모든 포크는 삭제됩니다.

git repack -adl도 옵션입니다!

이렇게하면 서버의 각 포크에서 동일한 데이터를 푸는 두 사용자가 개체를 공유 할 수 있도록 공간을 절약 할 수 있습니다.

gc.pruneExpire 변수를 공유 오브젝트 데이터베이스에서 never까지 설정해야합니다. 그냥 안전 해!

간혹 개체를 잘라 내려면 모든 포크를 원격으로 가져 와서 공유, 가져 오기, 잘라 내기! 힘내라 나머지는 할 것이다!

생각하십니까? 제안?