병렬

2017-09-16 1 views
1

우리 회사의 이눔 할은 ClearCase에서 우리의 소스 코드를 마이그레이션하기로 결정했습니다, 자식의 역사, 방울과 나무 개체 만들기, 즉 큰 :-)병렬

의 그은 ClearCase와 자식이 completly 다른 소스 코드 관리 시스템을 알고 . 그러나 개발자는 전체 기록을 포함하는 SCM을 하나만 갖게됩니다. 자식에 우리의 ClearCase 역사를 가져

내의 동료 발견 다음 도구 :

불행히도 우리의 코드는 이상 46000 개 소스 코드 파일과 역사를 가지고 https://github.com/charleso/git-cc 가져올 수는 10 년 이상이다.

이 도구를 분석 한 결과 제 생각에는 두 가지 병목 현상이 있습니다. 첫 번째는 clearcae 서버에서 파일을 가져 오는 것입니다. 여러 스레드에서이를 수행하면 쉽게 해결할 수 있습니다. 두 번째는 git-cc 자체의 워크 플로입니다.

  1. 가 파일과 그룹을의 변경 집합을 작성 cleartool의 lshistory를 통해 마스터 브랜치의 역사를 가져 COMIT의
  2. CC 서버에서 파일 (들)의 지정된 버전을 가져 오기 및 디렉토리를
  3. 자식 작업에 복사 추가.
  4. 자식 내가 낮은 수준의 자식 명령을 사용하여 다중 스레드를 사용하여 개선 할 수 있다고 생각
  5. 선택 다음 그룹을 커밋하고 다시 3으로

를 시작합니다.

각 comit-group은 서버에서 변경 사항을 쿼리하고 git 데이터베이스 내에 blob 객체를 생성하므로 여러 스레드에서 여러 그룹에 대해 실행할 수 있습니다. 추가 이제 막 생성 된 BLOB 객체에서 git 내역을 만드는 스레드가 하나 있습니다.

지금 내 질문이 너에게 의미가 있습니까? 아니면 내가 순진하다고 생각합니까?

git 잠금 메커니즘을 잊어 버렸습니까?

다른 아이디어가 있습니까?

+0

일반적으로 가져 오기에는 [git-fast-import] (https://git-scm.com/docs/git-fast-import)를 사용하십시오. 그것이 여러 개의 CPU를 사용하는지는 모르지만 (아마도 모든 데이터를 단일 바이너리 스트림으로 가져옴에 따라), 적어도 여분의 IO를 수행하지는 않습니다. – max630

+0

@ max630 안녕하세요 max630, 답장을 보내 주셔서 감사합니다. 여분의 I/O를 피하는 것이 좋은 지적입니다. 나는 그것을 평가할 것이다. – jungnick

답변

0

Git repo의 동일한 분기에서 커밋을 가져 오기 위해 여러 스레드를 사용하는 것은 위험합니다 (사용자가 배치 할 때 재생할 수있는 패치 인 'BLOB 객체'를 만들지 않는 한).

다른 분기의 커밋에 여러 스레드를 사용할 수 있습니다. 각 분기 가져 오기에 대해 서로 다른 repo를 만든 다음 해당 repo를 하나의 공통 repo로 가져와 git replace or grafts으로 다시 연결할 수 있습니다.

기억하십시오 : 각 Git repo는 구성 요소이므로 거대한 ClearCase Vob에 여러 구성 요소 (파일 그룹)가 포함되어있는 경우 거대한 Git repo를 만들지 말고 여러 Git repo에서 분리하는 것이 가장 좋습니다.
"ClearCase to Git migration"에서 자세히 설명합니다.

+0

안녕하세요, VonC, 답장을 보내 주셔서 감사합니다. BLOB 객체를 병렬로 생성하는 것이 왜 위험해야하는지 잘 모르겠습니다. 커밋을 병렬로 가져 오는 것은 분명 위험합니다.이 때문에 Blob 객체에서 내 기록을 빌드하는 전용 스레드를 하나 사용하고 싶습니다. 결국에는 내 클리어 케이스 기록을 읽고 누가 매달린 물방울 개체와 내 역사를 구축하기위한 전용 스레드를 만드는 n 스레드가 있습니다. 다른 팀은 VOB 구조를 여러 개의 작은 리포지토리로 마이그레이션하려는 방법에 대해 평가합니다. 현재 서브 모듈과 서브 트리를 평가합니다 – jungnick

+0

@jungnick 서브 모듈과 서브 트리의 차이점은 https://stackoverflow.com/a/31770147/6309에서 설명합니다. 그리고 하위 트리 예제를 https://stackoverflow.com/a/24709789/6309에서 제공하십시오. 나는 역사에서 고정 된 지점을 참조 할 수 있기 때문에 하위 모듈을 선호하므로 부모 레포를 알려진 상태로 복제 할 수 있습니다. – VonC