우리는 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와 유사하지는 않습니다. 이제 모든 것이 분리되어 있기 때문입니다.
다시 한번 감사드립니다!
감사합니다. 이것은 완벽했습니다. – Andrew
그래도 작동하지 않으면 파일이 표시 될 수 있도록 새 저장소에서 'hg update'를 호출해야합니다. 나는이 부분을 놓쳤다 ... – bsk
새로운 repo는 히스토리를 가지고 있지만'hg update'가 될 때까지는 작업 디렉토리에 복사본이 없다. –