Subversion 저장소를 Git 하위 모듈로 사용할 수 있습니까?


154

내 Git 저장소에서 Subversion 저장소를 Git 하위 모듈로 추가하는 방법이 있습니까?

다음과 같은 것 :

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

어디 https://svn.foo.com/svn/projSubversion 저장소를 가리 킵니다.

git-svnSubversion 저장소와 상호 작용할 수 있는 것이 있다는 것을 알고 있습니다 . 그래서 나는 아마도 Subversion 저장소를 체크 아웃 한 git-svn다음 서브 모듈로 사용 하는 방법이 있다고 생각합니다 .

답변:


127

아니요. 최선의 방법은 전용 git 저장소에 svn 저장소의 미러를 설정하는 것입니다.

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin git@example.com:project.git
git push origin master

그런 다음 git 저장소를 원본 프로젝트의 하위 모듈로 추가 할 수 있습니다

cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"

svn : externals와 git 서브 모듈에는 하나의 개념적인 차이점이 있는데, 서브 버전 관점에서 접근 할 경우 넘어 질 수 있습니다. git 서브 모듈은 사용자가 제공 한 수정본에 고정되어 있습니다. "업스트림"이 변경되면 하위 모듈의 참조를 업데이트해야합니다.

따라서 업스트림 서브 버전과 재 동기화 할 때 :

cd /path/to/mysvnclone
git svn rebase
git push

... git 프로젝트는 이전에 커밋 한 원래 버전을 계속 사용합니다. svn HEAD로 업데이트하려면

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"

1
여기에 게시하기 전에이 코드를 사용해 보셨습니까? 자식 모듈은 자식 svn에서 제대로 작동하지 않습니다.
xhan

4
@xhan 예, 동일한 저장소에서 git-svn 및 서브 모듈을 혼합하는 것을 옹호하지 않습니다. git-svn을 사용하는 클론은 svn 저장소의 네이티브 git 클론을 생성하기위한 브리지 일뿐입니다.
richq

죄송합니다. 하위 모듈로 작동하기 위해 두 개의 폴더를 사용하는 것을 찾지 못했습니다. 좋은 트릭.
xhan

좋은 기술. git-svn repo를 푸시하기 전에 서버에서 'git init --bare'단계가 필요하지 않습니까? 나는 이것을해야했다.
Clayton Stanley

아마도 기본값은 아니지만 git 서브 모듈과 마찬가지로 svn : externals를 특정 개정판에 바인딩 할 수 있습니다.
MarcH

8

방금이 과정을 거쳤습니다. rq와 비슷한 것을하고 있지만 약간 다릅니다. 필요한 svn repos의 git 복제본을 호스팅하도록 서버 중 하나를 설정했습니다. 필자의 경우 읽기 전용 버전 만 원하며 서버에 대한 저장소가 필요합니다.

서버에서 다음을 실행합니다.

GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc

이렇게하면 베어 리포지토리가 설정되고 업데이트 할 cron 스크립트가 있습니다.

#!/usr/bin/python

import os, glob

GIT_HOME='/var/www/git'

os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
  if not os.path.isdir(git):
    continue
  os.chdir(os.path.join(GIT_HOME, git))
  if not os.path.isdir('svn/git-svn'):
    #Not a git-svn repo
    continue

  #Pull in svn updates
  os.system('git svn fetch && git gc --quiet')
  #fix-svn-refs.sh makes all the svn branches/tags pullable
  os.system('fix-svn-refs.sh')
  #Update the master branch
  os.system('git fetch . +svn/git-svn:master && git gc --quiet')`

또한 http://www.shatow.net/fix-svn-refs.sh의 fix-svn-refs.sh가 필요합니다 . 이것은 대부분 다음에서 영감을 얻었습니다. http://gsocblog.jsharpe.net/archives/12

git gc여기에 필요한지 잘 모르겠지만 git pull그것 없이는 할 수 없었습니다.

따라서이 모든 후에 rq의 지시에 따라 git 서브 모듈을 사용할 수 있습니다.


커밋 후크로 이것을 할 수도 있다고 생각할 것입니다.
Andres Jaan Tack

6

현재 git-svnsvn : externals를 지원하지 않습니다 . 그러나 도움이되는 두 가지 다른 도구가 있습니다.

  1. 서브 깃

    SubGit 은 서버 측 솔루션으로, Git이 Subversion 저장소에 액세스 할 수 있으며 그 반대도 가능합니다. 자세한 내용 은 문서 를 참조 할 수 있지만 일반적으로 SubGit을 사용하는 것은 매우 쉽습니다.

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    위의 명령은 SVN 프로젝트에서 브랜치 레이아웃을 감지 한 다음 SVN 프로젝트를 미러링 할 준비가 된 비어있는 Git 저장소를 만듭니다. ~ / .subversion 디렉토리의 SVN 자격 증명 캐시에 이미 저장되어 있지 않으면 자격 증명을 요구할 수 있습니다. $GIT_REPO/subgit/authors.txtSVN 작성자 이름을 Git ID에 매핑하도록 조정할 수도 있습니다 .

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    현재 Subversion 저장소가 새로 작성된 Git 저장소에 연결되었습니다. SubGit은 모든 SVN 개정판을 Git commit으로 변환 svn commit하고 Git commit을 SVN 개정판으로 변환합니다 git push.

커미터가 Git 리포지토리를 사용할 수있게하는 것 외에 추가로 필요한 것이 있습니다. git-http-backend 를 살펴보십시오 . 그런 다음 생성 된 Git 리포지토리를 일반적인 하위 모듈로 추가 할 수 있습니다. SubGit은 Bitbucket Server의 추가 기능으로도 제공되며 자세한 내용은 여기를 참조하십시오 . 따라서 git-svn 또는 다른 도구와 같은 외부 도구를 사용할 필요가 없습니다 .

SubGit은 독점 소프트웨어이지만 소규모 기업 (최대 10 명의 커미터), 학술 및 오픈 소스 프로젝트에는 무료입니다.

  1. SmartGit

    SmartGit은 클라이언트 측에서 git-svn 을 대체합니다 . 기능에 대한 자세한 내용은 여기를 참조하십시오 .

    특히 SmartGit은 git 하위 모듈svn : externals를 모두 지원 하므로 리포지토리에서 혼합 할 수 있습니다.

    SmartGit은 독점 소프트웨어이지만 비상업적 용도로는 무료입니다.


subgit( subgit.com/documentation/… )과 smartgit지원 모두 작업 복사본 svn:externals의 명시 적 .gitsvnextmodules파일에 의해 동일한 방식으로를 지원합니다 . 즉,이 소프트웨어를 사용하여 외부를 체크 아웃해야하며 기본 git유틸리티를 사용 하여 github또는 같은 외부 git 허브 서버에서 직접 외부를 체크 아웃 할 수 없습니다 gitlab. 따라서 snv:externals외부 git hub 서버에 관련된 소스 는 여전히 중요한 문제인 이러한 소프트웨어 없이는 관찰 및 다운로드가 불가능합니다.
Andry

4

rq가 말한 것 외에도 다른 방법은 타사의 "외부"프로젝트 ( http://nopugs.com/ext-tutorial )를 사용하는 것인데, 이는 svn 외부 참조의 작동 방식을 더 잘 모방합니다. externals를 사용하면 git 또는 svn 저장소를 추적 할 수 있으며 변경 사항을 해당 저장소로 업스트림으로 푸시하는 것이 더 쉬워 보입니다. 그러나 프로젝트 참여자가 별도의 패키지를 다운로드하여 설치해야합니다.

아직 서브 모듈이나 외부 장치를 사용하지 않았습니다. 그러나 나는 모든 대안에 대해 몇 시간을 읽었으며 외부는 내 요구에 더 잘 맞는 것처럼 보입니다. Jon Loeliger ( http://oreilly.com/catalog/9780596520120 )의 15 장 "Git을 사용한 버전 제어"의 15 장에서 이러한 사용자 정의 방법과 다른 사용자 정의 방법에 대한 훌륭한 토론이 있습니다.


0

이를 지원하기 위해 Piston을 다시 작성하고 있으며, Subvresion repoistory 및 git + git의 기존 Subversion URL을 추가했습니다.

피스톤 Github 리포지토리를 확인하십시오 .

불행히도 출시되지 않은 것 같습니다.


3
당신이 그것을 가장 필요할 때 피스톤은 당신의 얼굴에서 실패 할 것입니다.)), 나는 그것을 권장하지 않습니다. 또한 더 이상 피스톤에 대한 버그 수정이 없습니다.
Henrik

0

글쎄요, git-remote-testsvn그래서 같은 것 같아요

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

작동해야합니다. 그렇습니까?

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