2010-01-24 4 views
4

큰 파일 세트 (50GB)를 가지고 있으며 멀리 떨어진 곳에 두 개의 호스트가 있으며 몇개의 Git 저장소에 두어 각각 미러 repo가되도록하고 싶습니다 다른쪽에있는 레포의 하지만 파일이 이미 양면에 있기 때문에 오랜 시간 (50-60 시간)이 소요되고 불필요하기 때문에 네트워크를 통해 파일을 전송하고 싶지 않습니다.미러 생성 객체를 전송하지 않고 Git 저장소

내 생각은 각면에 힘내 레포를 만들고 각면의 모든 파일을 로컬 레포에 추가 한 다음 다른 파일에 자식을 끌어 당기는 것이 었습니다. Git은 파일 (객체)이 동일하고 전송하지 않는다는 것을 알기에 충분히 똑똑 할 것이라고 생각했습니다. 그러나 작은 샘플에서는 (대부분 "Unpacking objects"단계에서) 당기기를 수행하는 데 오랜 시간이 걸리고 둘 사이의 네트워크 연결이 최대가되기 때문에 이것이 나타나지 않습니다. 그래서 그것은 Git 객체를 불필요하게 전송하고있는 것처럼 보입니다.

아무도 실제로 파일을 전송하지 않고이를 수행하는 방법에 대한 아이디어가 있습니까?

감사합니다.

답변

1

대용량 파일의 내용이 동일하기 때문에 재미있을 것입니다. (양쪽 다 가정합니다) 양쪽 끝에 같은 오브젝트 파일을 만들어야합니다.

내 로컬 시스템의 두 repos에서 테스트를 수행하면 다른 저장소에있는 동일한 파일의 SHA ID가 동일 함을 알 수 있습니다.

실제 파일의 SHA id가 두 저장소에서 모두 동일한 지 확인하십시오. 그들이 그렇다면, 어쨌든 왜 전송 될 수 있는지를 알아 내야합니다. 그렇지 않다면 왜 안되는지 알아야합니다.

+0

예, 동일합니다. 각 측면에 파일을 추가 한 후 파일을 포함하는 git 트리에서 git ls-tree를 수행했습니다.이 작업을 수행하는 올바른 방법이라고 가정합니다. SHA id는 양쪽에 blob에 대해 d88cbbbe54e7cd688d399f4e2b4f8195fcf2c4a7 \t입니다. –

0

나는 sneakernet (well, carnet)을 사용했다 : 로컬 하류 git 나무 중 하나를 가져 와서 모든 것을 DVD로 구워 라. 원격 쪽에서 DVD를 디스크에 복사하십시오. 그런 다음 필요한 경우 .git/config의 [remote "origin"] config 섹션을 편집하여 저장소가 계속 업스트림에 도달 할 수있게합니다.

+0

나는 그것을 할 것이지만, 다른 호스트는 나라의 반대편에있다. 게다가 7 개의 DVD를 굽고 거기에 누군가에게 우편으로 보내고 DVD를 복사하게하는 데는 최소한 48 시간이 걸리지 만 시간을 많이 절약하지는 못합니다. –

0

git 또는 Http 프로토콜을 사용하고 있습니까?

힘이 slow when using the http protocol입니다. 유일한 옵션이 http이고 DVCS가 필요한 경우 Mercurial을 시도 할 수 있습니다. 두 개의 원격 폴더를 동기화하기 만하면 모두가 당신이 Beyond Compare

+0

내 네트워크 업로드 속도가 느리므로 속도가 느립니다 (2Mbps). Git이 아니고 HTTP를 사용하지 않기 때문입니다. –

+0

그 경우에는 Beyond Compare를 살펴볼 것입니다.Beyond Compare는 실제로 두 파일을 열지 않고 두 파일의 다양한 속성을 검사하여 변경 여부를 결정할 수 있습니다. 그게 당신을 위해 작동하지 않는다면, 나는 knittl의 대답은 자리에 있어야한다고 생각합니다. 어떻게 든, git은 두 파일이 같은 파일 구조를 가지게된다는 것을 알기를 기대합니다. 서로의 거울은 단순한 것처럼 보입니다. 나는 그것이 작동하도록 만들어 졌다고 생각 하겠지만 나무, 얼룩 등을 수동으로 조정해야합니다. –

1

을 살펴 수 있다면

당신은 동일하게 커밋이 필요합니다. 트리 ID가 같더라도 커밋 ID가 다를 수 있습니다.

은 (초기)를 만들어 한쪽에 커밋 : 지금 생각할 수있는

은 다음과 같다. 그 해쉬를 주목하라. .git/objects/ 폴더에서 해시를 찾으십시오. 파일을 다른 PC에 복사하십시오. 다른 PC에 동일한 ID를 가진 트리가 있다면 제대로 작동합니다.

+0

이것은 작동하는 것 같습니다! 그러나 .git/refs/heads/master 파일을 편집하여 상대방의 커밋 ID를 포함해야합니다. 그러나 목표는 다른 하나의 미러 (백업)가 될 수있는 2 repos로 끝나는 것입니다. 그래서 저는 첫 번째면에서 일을하고 변화를 가져오고 싶습니다. 따라서 첫 번째면에 다른 파일을 추가 한 다음 끌어 오기를 수행하면 새 파일이 전송 될 것으로 예상되므로 'git reset --hard'명령을 수행합니다. 그렇게하면 작동하는 것 같습니다. 이제는 파일을 첫 번째 측면에 추가 할 때마다 'git reset --hard'명령을 실행해야합니다. –

+0

'git reset --hard'가 이상하게 들립니다. git는 처음으로 그것을 원할 수도 있지만 매번? 정확한 오류 메시지를 알려주시겠습니까? – knittl