program story

여러 SVN 저장소를 하나로 결합

inputbox 2020. 12. 12. 10:42
반응형

여러 SVN 저장소를 하나로 결합


이전 질문 ( 하나의 SVN 리포지토리 또는 여러 개? )에 대한 답변을 고려한 후 보유한 4 개 정도의 리포지토리를 하나로 통합하기로 결정했습니다. 이것은 물론 질문으로 이어집니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?

둘 다에 대한 버전 기록을 유지하는 두 개 이상의 저장소를 결합하는 방법이 있습니까?

편집 : 또한 svnadmin 명령 인 AFAIK에 대한 액세스를 제공하지 않는 Assembla.com을 사용하고 있음을 지적해야합니다 .

또 다른 편집 : 이것이 중요합니까? svnadmin이 URL에서 작동하면 문제가되지 않습니다.


편집 : 아 글쎄, 내가 입력하는 동안 질문 편집이 이루어졌습니다. 이것은에 대한 대답입니다

둘 다에 대한 버전 기록을 유지하는 두 개 이상의 저장소를 결합하는 방법이 있습니까?


그것을 가정

기존 저장소에는 다음과 같은 구조가 있습니다.

  • 저장소 루트
    • 가지
    • 태그
    • 트렁크

다음과 같은 구조를 원합니다.

  • 저장소 루트
    • projectA
      • 가지
      • 태그
      • 트렁크
    • projectB
      • 가지
      • 태그
      • 트렁크

그런 다음 각 프로젝트 저장소에 대해 다음을 수행하십시오.

svnadmin dump > project<n>.dmp

그런 다음 각 덤프 파일에 대해 다음을 수행하십시오.

svn mkdir "<repo url>/project<n>"
svnadmin load --parent-dir "project<n>" <filesystem path to repos>

더 복잡한 조작이 가능하지만 가장 간단하고 간단합니다. 덤프 동안 소스 저장소 구조를 변경 / 부하의 조합을 통해 위험하지만 행할 svnadmin dump, svndumpfilter손으로 편집 또는 추가 텍스트 필터 및svnadmin load


제 3 자 제공 업체와의 거래

  • svnadmin dump각 리포지토리에 대한 파일을 요청 합니다. 공급자는 기꺼이해야한다 /이 제공 할 수 - 그것은 이다 당신의 코드!
  • SVN 저장소를 로컬로 만듭니다.
  • 덤프 파일에 대해 위에 나열된 조치를 수행하십시오.
  • 선호하는 클라이언트의 저장소 구조가 올바른지 확인하십시오.
  • 결합 된 리포지토리에 대한 덤프 파일을 만듭니다.
  • 공급자에게이 덤프 파일에서 새 저장소를 채우도록 요청하십시오.

YMMV : 이것은 합리적인 접근 방식 인 것 같지만 저는 이와 같은 제 3 자 제공 업체와 일한 적이 없습니다.


Subversion 1.7을 사용하면 이제 원격으로 덤프를 수행 할 수 있습니다. 즉, 로컬 파일 시스템 및 svnadmin dump명령에 액세스 할 수 없습니다 .

를 사용 svnrdump하여 원격 저장소의 전체 덤프를 가져올 수 있습니다 . 구문 세부 사항은 문서를 참조하십시오.

서버는 1.7을 실행할 필요가없고 클라이언트 만 실행해야합니다.

http://svnbook.red-bean.com/en/1.7/svn.ref.svnrdump.c.dump.html


예, svnadmin dumpsvnadmin load 사용 .

하나는 HEAD 개정판이 100이고 다른 하나는 HEAD 개정판 150이있는 저장소가 필요하다고 가정 해 봅시다.

첫 번째 저장소를 덤프하고 새 저장소에로드합니다. 결국 첫 번째 저장소의 전체 내용이 개정 0에서 개정 150까지입니다.

그런 다음 두 번째 저장소를 덤프하고 새 저장소에로드합니다. 전체 기록과 함께로드되고 변경되는 유일한 것은 실제 개정 번호입니다. 두 번째 저장소의 기록은 개정판 151에서 개정판 250까지 새 저장소에 표시됩니다.

두 저장소의 전체 기록은 보존 자이며 두 번째로 가져온 저장소의 개정 번호 만 변경됩니다.

물론 두 개 이상의 저장소에도 동일하게 적용됩니다.

편집 : 편집하는 동안 게시 했으므로 메모를 보지 못했습니다 ...


svnadmin에 대한 액세스 권한이 없으면 어렵지만 실행 가능합니다. 리포지토리 A와 B가 있고이를 리포지토리 C로 병합하려고한다고 가정 해 보겠습니다. 다음은이를 수행하기 위해 사용해야하는 단계입니다.

  1. 저장소 A의 개정 1을 하드 디스크로 확인하십시오.

  2. C 리포지토리의 루트에 Repository_A라는 디렉터리를 만들고이를 로컬 하드 디스크로 확인합니다.

  3. .svn 파일을 제외한 A에서 체크 아웃 한 파일을 Repository_A 폴더의 C 체크 아웃으로 복사합니다.

  4. C에서 커밋을 수행합니다.

저장소 A의 작업 복사본을 개정 2로 업데이트하고 3 단계와 4 단계를 수행하고 헤드에 도달 할 때까지 각 연속 개정판을 반복합니다.

이제 B도 똑같이하십시오.

이것은 기본적으로 svnadmin을 요구하지 않고 @Davide Gualano가 제안한 것과 동일합니다. 수정이 많지 않은 경우 수동으로 수행 할 수있는 간단한 스크립트를 작성할 수 있습니다.


다음 단계에 따라 하나의 저장소에 많은 덤프 파일을로드 할 수 있습니다.

저장소 루트 :

 projectA
    branches 
    tags
    trunk
 projectB
    branches
    tags
    trunk

먼저 다음과 같이 저장소 루트에 디렉터리 (프로젝트 A, 프로젝트 B)를 만들어야합니다.

$ svn mkdir -m "Initial project root" \
file:///var/svn/repository_root/Project_A\
file:///var/svn/repository_root/Project_B\
file:///var/svn/repository_root/Project_C\

Revision 1 committed.

그 후에 덤프 파일을로드 할 수 있습니다.

매개 변수 사용 --parent-dir DIRECTORY

$ svnadmin load /var/svn/repository_root --parent-dir Project_A < file-dump-PRJA.dump
$ svnadmin load /var/svn/repository_root --parent-dir Project_B < file-dump-PRJB.dump

이렇게하면 덤프 된 저장소가 많이 포함 된 저장소를 갖게됩니다.


이 질문에 대한 다른 답변을 통해 아래 스크립트를 만들 수있었습니다. 사례에 맞게 REPOS 맵을 조정하십시오. 또한 태그와 분기를 새 분기 및 트렁크로 직접 이동하는 대신 "사전 집계"디렉토리로 이동할 수 있습니다.

#!/bin/bash

NEWREPO=$(pwd)/newrepo
NEWREPOCO="${NEWREPO}_co"
DUMPS=repodumps
REV="0:HEAD"
REPOROOT=/data/svn/2.2.1/repositories/
TOOLDIR=/opt/svn/2.2.1/bin/
PATH=${PATH}:${TOOLDIR}

# Old Repository mapping 
declare -A REPOS=( 
    [BlaEntityBeans]='(
        [newname]="EntityBeans"
    )'
    [OldServletRepoServlet]='(
        [newname]="SpreadsheetImportServlet"
    )'
    [ExperimentalMappingXML]='(
        [newname]="SpreadsheetMappingXML"
    )'
    [NewImportProcess]='(
        [newname]="SpreadsheetImportProcess"
    )'    
)

dump() {
    rm -fr ${DUMPS}
    mkdir ${DUMPS}
    for repo in "${!REPOS[@]}"
    do
        local dumpfile=${DUMPS}/${repo}.dmp
    echo "Dumpimg Repo ${repo} to ${dumpfile}"
        svnadmin dump -r ${REV} ${REPOROOT}/${repo} > ${dumpfile}
    done
}

loadRepos() {
    # new big repo
    rm -fr ${NEWREPO}
    svnadmin create ${NEWREPO}
    svn mkdir file:///${NEWREPO}/trunk -m ""
    svn mkdir file:///${NEWREPO}/branches -m ""
    svn mkdir file:///${NEWREPO}/tags -m ""

    # add the old projects as modules
    for currentname in "${!REPOS[@]}"
    do  
        declare -A repo=${REPOS[$currentname]}
        local newname=${repo[newname]}
        echo "Loading repo ${currentname} soon to be ${newname}"
        dumpfile=${DUMPS}/${currentname}.dmp

        # import the current repo into a trmporary root position
        svn mkdir file:///${NEWREPO}/${currentname} -m "Made module ${currentname}"
        svnadmin load --parent-dir ${currentname} ${NEWREPO} < ${dumpfile}

        # now move stuff arround
        # first rename to new repo
        svn move file:///${NEWREPO}/${currentname} file:///${NEWREPO}/${newname} -m "Moved ${currentname} to ${newname}"
        # now move trunk, branches and tags
        for vc in {trunk,branches,tags}
        do
            echo "Moving the current content of $vc into ${NEWREPO}/${vc}/${newname}"
            svn move file:///${NEWREPO}/${newname}/${vc} file:///${NEWREPO}/${vc}/${newname} -m "Done by $0"
        done
    svn rm  file:///${NEWREPO}/${newname} -m "Removed old ${newname}"
    done
}

dump
loadRepos

참고URL : https://stackoverflow.com/questions/267256/combining-multiple-svn-repositories-into-one

반응형