2010-06-17 5 views
29

우리는 SVN의 한 디렉토리에 여러 공유 프로젝트, 솔루션 파일 등을 포함하는 큰 코드베이스를 가지고 있습니다. 우리는 Mercurial로 마이그레이션 중입니다. 이 기회를 빌어 우리의 코드를 여러 리포지토리로 재구성하여 분기를위한 복제를 간소화합니다. 이미 역사를 보존하면서 SVN에서 Mercurial로 repo를 성공적으로 변환했습니다. 내 질문 : 어떻게 그들의 모든 역사를 보존하면서 별도의 저장소로 모든 프로젝트를 깰거야? 여기 여러 개의 하위 프로젝트로 큰 repo 분할 및 기록 (Mercurial)

은 우리의 단일 저장소 (OurPlatform)는 현재와 같은 모습의 예입니다

/OurPlatform 
---- Core 
---- Core.Tests 
---- Database 
---- Database.Tests 
---- CMS 
---- CMS.Tests 
---- Product1.Domain 
---- Product1.Stresstester 
---- Product1.Web 
---- Product1.Web.Tests 
---- Product2.Domain 
---- Product2.Stresstester 
---- Product2.Web 
---- Product2.Web.Tests 
==== Product1.sln 
==== Product2.sln 

사람들의 모든 솔루션 파일을 제외하고 VS 프로젝트를 포함하는 폴더입니다. Product1.sln과 Product2.sln은 모두 다른 프로젝트를 모두 참조합니다. 이상적으로, 나는 각 폴더를 가져 와서 별도의 Hg repos로 바꾸고, 각 프로젝트에 대해 새로운 repos를 추가하고 싶다. (그들은 부모 repos처럼 행동 할 것이다.) 그런 다음 Product1에서 작업 할 사람은 Product1.sln과 ReferenceAssemblies, Core, Core.Tests, Database, Database.Tests, CMS 및 CMS.Tests에 대한 subrepo 참조가 포함 된 Product1 저장소를 복제합니다.

그래서 프로젝트 디렉토리에서 hg init를 실행하면됩니다. 그러나 역사를 보존하면서 그것을 할 수 있습니까? 아니면 이것을 정리하는 더 좋은 방법이 있습니까?

편집 :::: Ry4an의 대답에

감사합니다, 나는 나의 목표를 달성 할 수 있었다. 나는 내가 다른 사람들을 위해 어떻게했는지에 대해 나누고 싶었다.

우리는 많은 프로젝트가 있었기 때문에 작은 bash 스크립트를 작성하여 파일 맵을 생성하고 실제로 최종 변환을 수행하는 최종 bat 스크립트를 작성했습니다. 대답에서 완전히 명확하지 않은 점은 convert 명령을 각 파일 맵에 대해 한 번씩 실행하여 각 프로젝트에 대해 별도의 저장소를 생성해야한다는 것입니다. 이 스크립트는 이전에 변환 한 svn 작업 복사본 위의 디렉토리에 저장됩니다. 필자는 파일 구조가 가장 최신의 hg repos를 원했던 것과 일치하므로 작업 복사본을 사용했습니다.

#!/bin/bash 

# this requires you to be in: /path/to/svn/working/copy/, and issue: ../filemaplister.sh ./ 

for filename in * 
do 
    extension=${filename##*.} #$filename|awk -F . '{print $NF}' 
    if [ "$extension" == "sln" -o "$extension" == "suo" -o "$extension" == "vsmdi" ]; then 
    base=${filename%.*} 
    echo "#$base.filemap" >> "$base.filemap" 
    echo "include $filename" >> "$base.filemap" 
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $base.filemap ../hg-datesort-converted ../hg-separated/$base > $base.convert.output.txt" >> "MASTERGO.convert.bat" 
    else 
    echo "#$filename.filemap" >> "$filename.filemap" 
    echo "include $filename" >> "$filename.filemap" 
    echo "rename $filename ." >> "$filename.filemap" 
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $filename.filemap ../hg-datesort-converted ../hg-separated/$filename > $filename.convert.output.txt" >> "MASTERGO.convert.bat" 
    fi 
done; 

mv *.filemap ../hg-conversion-filemaps/ 
mv *.convert.bat ../hg-conversion-filemaps/ 

이 스크립트는 SVN 작업 복사본에있는 모든 파일에보고, 종류에 따라 새로운 filemap 파일을 생성하거나 또는 기존에 추가합니다. if는 정말로 다른 시각적 인 스튜디오 파일을 잡아서 별도의 repo에 배치합니다. 이것은 bash (내 경우에는 cygwin)에서 실행하기위한 것이지만 실제 변환 명령을 실행하는 것은 Windows에서 포크/프로세스 문제로 인해 TortoiseHg와 함께 제공되는 hg 버전을 통해 수행됩니다 (gah, 나도 알아 ...).

따라서 변환 된 hg repo를보고 제공된 파일 맵을 사용하여 별도의 repos를 만드는 MASTERGO.convert.bat 파일을 실행합니다. 완료되면 각 솔루션의 폴더/저장소뿐만 아니라 각 프로젝트의 폴더/repo가 ​​들어있는 hg-separated 폴더가 있습니다. 그런 다음 모든 프로젝트를 수동으로 솔루션 저장소에 복제하고 .hgsub 파일에 복제본을 추가해야합니다. 커밋 한 후 .hgsubstate 파일이 만들어지고 이동하도록 설정되었습니다! 위의 예와

내 .hgsub 파일은 "제품 1"에 대한 다음과 같습니다 : I는 중앙 서버에 이들의 repos를 전송하면

Product1.Domain = /absolute/path/to/Product1.Domain 
Product1.Stresstester = /absolute/path/to/Product1.Stresstester 
Product1.Web = /absolute/path/to/Product1.Web 
Product1.Web.Tests = /absolute/path/to/Product1.Web.Tests 

, 내가 수동으로 URL을로 경로를 변경 수 있습니다 .

또한 모든 OurPlatform svn repo와 유사하지는 않습니다. 이제 모든 것이 분리되어 있기 때문입니다.

다시 한번 감사드립니다!

답변

28

이것은 절대 수행 할 수 있습니다. hg convert 명령을 사용하는 것이 좋습니다. 여기에 프로세스의 내가 사용하는 것 :

  1. 는 SVN의 소스 유형과 HG의 이명 령 유형 hg convert을 사용하여 단일 HG 저장소에 모든 것을 변환
  2. (이미이 단계를 수행 한 것 같은데) 소스 유형 hg 및 이명 령 유형 hg 및 단계에서 생성 된 수은의 repo되는 소스와 hg convert--filemap 옵션
  3. 실행 hg convert에 사용할 filemap 파일의 컬렉션을 만들 - 당신이 만든 filemaps의 각을 위해 그것을 할 2 단계에서. 당신의 filemaps이 같을 것이다 당신의 예에 따라서

    The filemap is a file that allows filtering and remapping of files and 
    directories. Comment lines start with '#'. Each line can contain one of 
    the following directives: 
    
        include path/to/file 
    
        exclude path/to/file 
    
        rename from/file to/file 
    

    :

filemap 구문은 여기에 hg help convert 출력에 표시되지만,이 요점이다

# this is Core.filemap 
include Core 
rename Core . 

주 당신 경우 그 외 모든 것을 배제한다는 의미가 포함됩니다. 또한 이름 바꾸기 선은 점으로 끝나고 모든 것을 한 단계 위로 이동시킵니다.

# this is Core.Tests 
include Core.Tests 
rename Core.Tests . 

등등.

새로운 저장소 각각에 대해 분할 된 저장소를 만든 후에는 1 단계에서 만든 모든 것이 모두 포함 된 초기 저장소를 삭제하고 .hgsub 파일에서 서브 저장소 구성을 설정할 수 있습니다.

+0

감사합니다. 이것은 완벽했습니다. – Andrew

+5

그래도 작동하지 않으면 파일이 표시 될 수 있도록 새 저장소에서 'hg update'를 호출해야합니다. 나는이 부분을 놓쳤다 ... – bsk

+0

새로운 repo는 히스토리를 가지고 있지만'hg update'가 될 때까지는 작업 디렉토리에 복사본이 없다. –

관련 문제