하나의 폴더를 하나의 Subversion 저장소에서 다른 저장소로 어떻게 이동합니까?


156

Subversion 저장소에 "project"라는 "docs"폴더가 있습니다. 실제로 "project_docs"라는 별도의 Subversion 저장소에 보관해야한다는 결론에 도달했습니다.

"docs"폴더 ( 및 모든 개정판 )를 "project_docs"저장소 로 이동하고 싶습니다 . 이것을 할 수있는 방법이 있습니까?

답변:


183

작업 사본이 아닌 저장소 자체에 액세스 한 경우 현재 저장소를 덤프하고 문서 폴더에 대한 정보 만 포함하도록 필터링 한 후 다른 저장소로로드 할 수 있어야합니다.

다음과 같이 될 것입니다 :

svnadmin dump /svn/old_repos > ./repository.dump
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./repository.dump > ./docs_only.dump
svnadmin load /svn/new_repos < ./docs_only.dump

저장소에 액세스하지 않으면 개정 히스토리를 유지할 수 없으며 파일을 새 저장소에 복사하고 커미트하도록 설정해야합니다.


1
좋은 예입니다. 내가 링크 한 문서에 명시된 바와 같이,이 솔루션은 "빈"이 없도록 모든 개정의 번호를 다시 매 깁니다. 문서 수정본을 다른 곳에서 참조 할 경우 명심해야 할 사항입니다.
Adam Bellaire

1
빈 리비전을 제거하여 대상 리포지토리에 많은 빈 리비전을 추가하지 않도록 제안했습니다.로드에 대해 모르는 사람은 혼란 스럽습니다. --preserve-revprops는 기본로드 중 하나를 사용하는 대신 커밋 메시지를 유지합니다.
사무엘

11
답변 해주셔서 감사합니다. 누구나 알아야 할 경우 하나 이상의 폴더가 필요한 경우 포함 목록에서 폴더 사이에 공백을 두십시오. 전의. ... FOLDERONE FOLDERTWO 포함
로빈 로빈슨

6
커밋 메시지와 이슈 트래킹 도구가이를 참조 할 수 있기 때문에 개정 번호를 다시 매기는 것은 좋지 않은 생각 일 것입니다.
Wim Coenen

5
이것은 나를 위해 일했습니다. 저는 Windows 사용자 (Visual SVN Server)이고 누군가에게 도움이된다면 첫 번째 명령은 다음과 같습니다."C:\Program Files (x86)\VisualSVN Server\bin\svnadmin" dump c:\Repositories\MyRepository > c:\Temp\MyReository.dump
Chris

30

svndumpfilter에는 심각한 결함이 있습니다. 파일 또는 경로가 필터링중인 경로에서 필터링중인 경로로 복사 된 경우 svndumpfilter는 기록을 채울 수 없으며 작업이 실패합니다.

이 문제가 발생하면 svndumpfilter2 를 사용할 수 있습니다 .


4
다음은 svndumpfilter2에 대한 더 나은 링크입니다. svn.tartarus.org/sgt/svn-tools/svndumpfilter2
bmaupin

이 경우 목록에 필요한 경로를 추가하고 ... 가능한 한 구체적으로 ... 가져온 후 프로젝트에서 해당 항목을 제거 할 수 있습니다.
제임스 가우 론

6

이것은 SVN 문서에서 설명합니다. ... 에서 리포지토리 유지 관리 섹션을 확인하십시오 svndumpfilter. 여기에는 중앙 리포지토리에서 프로젝트를 덤프하여 새로운 별도 리포지토리로 옮기는 방법이 구체적으로 설명되어 있습니다.


2

나는 당신이 그것을 원격으로 할 수 있다고 믿지 않습니다 (즉, 로컬 사본없이). 그러나 이것은 작동해야합니다 : svn export원래 서버의 폴더와 svn add새 저장소로 의 폴더 .

처럼:

$ svn checkout svn://example.net/newrepo .
$ svn export svn://example.com/oldrepo/mydir ./mydir
$ svn add ./mydir; svn commit

편집 : D' oh, 이것은 역사를 떨어 뜨립니다. 사무엘이 묘사svnadmin 한대로 사용하십시오 .


3
그러나 리포지토리 자체에 액세스하지 않으면 개정을 유지할 수 없습니다. 작업 사본 만 가질 수 있다면 이것이 최선의 방법입니다.
사무엘

2

나중에 참조 할 수 있도록 :

SVN 문서는 다음과 같이 명확하게보고합니다.

최상위 레벨 디렉토리를 제거하기 위해 덤프 파일을 수동으로 편집하려는 경우 편집기가 줄 끝 문자를 기본 형식 (예 : \ r \ n에서 \ n)으로 자동 변환하도록 설정되어 있지 않은지 확인하십시오. 콘텐츠가 메타 데이터에 동의하지 않기 때문입니다. 이것은 덤프 파일을 쓸모 없게 만듭니다.

sed 또는 Vim을 사용하여 최상위 디렉토리를 대체하십시오. 그러나이 디렉토리 이름은 프로젝트 파일에도 포함되어 있습니다 !!!! 이로 인해 SVN로드 체크섬 오류가 발생합니다.

따라서이 작업을 수행 할 때는 경로 이름 만 sed로 문자열을 바꾸지 마십시오.

“노드 경로 : old_path”를“노드 경로 : new_path”로 대체하십시오. 자세한 내용은 SVN 서적 5 장“리포지토리 관리”를 참조하십시오.


1

허용 된 답변을 사용하려고했지만 거대한 저장소가 있었고 작은 디렉토리를 내보내고 싶었고 전체 저장소를 덤프 할 여유가 없었습니다.

따라서 디렉토리가 변경된 곳의 개정판 만 내보냈습니다 (내 보낸 디렉토리가 저장소의 다른 위치에 대한 참조가있는 경우 작동하지 않을 수 있음).

svn log URL_to_docs | awk '/^r/{gsub(/^r/,"",$1);print $1}' > revisions.txt
#tac for revisions in reverse (oldest revision first)
tac revisions.txt | while read line; do svnadmin dump /svn/old_repo -r$line >> ./docs_revisions.dump ; done

#You don't have to filter if you commited only files in your directory docs in your exported revisions
svndumpfilter include path/to/docs --drop-empty-revs --renumber-revs --preserve-revprops < ./docs_revisions.dump > ./docs_only.dump

svnadmin load /svn/new_repos < ./docs_only.dump

리포지토리 URL ( URL_to_docs), 서버의 위치 ( /svn/old_repo) 및 리포지토리 ( path/to/docs)의 문서 경로를 바꿔야합니다.

docs_only.dump새 저장소에서 문서 디렉토리의 위치를 ​​변경하려는 경우 쉽게 편집 할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.