여러 SVN 저장소를 하나로 결합
이전 질문 ( 하나의 SVN 리포지토리 또는 여러 개? )에 대한 답변을 고려한 후 보유한 4 개 정도의 리포지토리를 하나로 통합하기로 결정했습니다. 이것은 물론 질문으로 이어집니다. 이를 수행하는 가장 좋은 방법은 무엇입니까?
둘 다에 대한 버전 기록을 유지하는 두 개 이상의 저장소를 결합하는 방법이 있습니까?
편집 : 또한 svnadmin 명령 인 AFAIK에 대한 액세스를 제공하지 않는 Assembla.com을 사용하고 있음을 지적해야합니다 .
또 다른 편집 : 이것이 중요합니까? svnadmin이 URL에서 작동하면 문제가되지 않습니다.
편집 : 아 글쎄, 내가 입력하는 동안 질문 편집이 이루어졌습니다. 이것은에 대한 대답입니다
둘 다에 대한 버전 기록을 유지하는 두 개 이상의 저장소를 결합하는 방법이 있습니까?
그것을 가정
기존 저장소에는 다음과 같은 구조가 있습니다.
- 저장소 루트
- 가지
- 태그
- 트렁크
다음과 같은 구조를 원합니다.
- 저장소 루트
- projectA
- 가지
- 태그
- 트렁크
- projectB
- 가지
- 태그
- 트렁크
- projectA
그런 다음 각 프로젝트 저장소에 대해 다음을 수행하십시오.
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 dump 및 svnadmin load 사용 .
하나는 HEAD 개정판이 100이고 다른 하나는 HEAD 개정판 150이있는 저장소가 필요하다고 가정 해 봅시다.
첫 번째 저장소를 덤프하고 새 저장소에로드합니다. 결국 첫 번째 저장소의 전체 내용이 개정 0에서 개정 150까지입니다.
그런 다음 두 번째 저장소를 덤프하고 새 저장소에로드합니다. 전체 기록과 함께로드되고 변경되는 유일한 것은 실제 개정 번호입니다. 두 번째 저장소의 기록은 개정판 151에서 개정판 250까지 새 저장소에 표시됩니다.
두 저장소의 전체 기록은 보존 자이며 두 번째로 가져온 저장소의 개정 번호 만 변경됩니다.
물론 두 개 이상의 저장소에도 동일하게 적용됩니다.
편집 : 편집하는 동안 게시 했으므로 메모를 보지 못했습니다 ...
svnadmin에 대한 액세스 권한이 없으면 어렵지만 실행 가능합니다. 리포지토리 A와 B가 있고이를 리포지토리 C로 병합하려고한다고 가정 해 보겠습니다. 다음은이를 수행하기 위해 사용해야하는 단계입니다.
저장소 A의 개정 1을 하드 디스크로 확인하십시오.
C 리포지토리의 루트에 Repository_A라는 디렉터리를 만들고이를 로컬 하드 디스크로 확인합니다.
.svn 파일을 제외한 A에서 체크 아웃 한 파일을 Repository_A 폴더의 C 체크 아웃으로 복사합니다.
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
'program story' 카테고리의 다른 글
뷰 사이의 가변 간격으로 UIStackView를 어떻게 만들 수 있습니까? (0) | 2020.12.12 |
---|---|
모든 Java 바이트가 서명된다는 사실을 해결하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.12 |
순수한 C로 RAII를 구현합니까? (0) | 2020.12.12 |
GROUP BY 및 COUNT (DISTINCT)를 사용하는 LINQ to SQL (0) | 2020.12.12 |
관계형 데이터베이스에서 "튜플"이라는 용어는 무엇을 의미합니까? (0) | 2020.12.12 |