Programing

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

crosscheck 2020. 6. 10. 08:21
반응형

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


내 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다음 서브 모듈로 사용 하는 방법이 있다고 생각합니다 .


아니요. 최선의 방법은 전용 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"

방금이 과정을 거쳤습니다. 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')`

This also requires fix-svn-refs.sh from http://www.shatow.net/fix-svn-refs.sh This was mostly inspired by: http://gsocblog.jsharpe.net/archives/12

I'm not sure why the git gc is needed here, but I wasn't able to do a git pull without it.

So after all this you can then use git submodule following rq's instructions.


Currently git-svn doesn't support svn:externals. But there are two other tools which can help you:

  1. SubGit

    SubGit is server-side solution, it enables Git access to Subversion repository and vice versa. You may refer to documenation for more details, but in general it is fairly easy to use SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Above command will detect branches layout in the SVN project and then will create empty bare Git repository ready to mirror SVN project. You may be asked for credentials unless those are already stored in the SVN credentials cache at ~/.subversion directory. You can also adjust $GIT_REPO/subgit/authors.txt to map SVN author names to Git identities.

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

    At this moment you have Subversion repository connected to newly created Git repository. SubGit translates SVN revision into Git commit on every svn commit and Git commit into SVN revision on every git push.

Everything you need further is to make Git repository available to committers. Take a look at git-http-backend for that. Then you can add created Git repository as a usual submodule. SubGit is also availale as an add-on for the Bitbucket Server, to find out more check out here. So, there is no need to use any external tools like git-svn or any other.

SubGit is proprietary software but it's free for small companies (up to 10 committers), academic and open-source projects.

  1. SmartGit

    SmartGit replaces git-svn on client-side. More information on its features you may find here.

    In particular SmartGit does support both git submodules and svn:externals, you can mix them in your repository.

    SmartGit is proprietary software but it's free for non-commercial usage.


In addition to what rq said, another method would be to use the third-party "externals" project (http://nopugs.com/ext-tutorial), which better mimics how svn external references work. With externals you can track either git or svn repositories, and it looks easier to push your changes upstream to those repos. However, it requires project members to download and install the separate package.

I haven't used submodules or externals yet; however, I've spent a few hours reading about all alternatives and it looks like externals will be a better fit for my needs. There is an excellent discussion about these and other custom methods in Chapter 15 of "Version Control with Git", by Jon Loeliger (http://oreilly.com/catalog/9780596520120), which I strongly recommend.


Piston is being rewritten to support this, and the converse, plus the existing Subversion URL in a Subvresion repoistory and git+git.

Check out the piston Github repository.

Unfortunately it doesn't seem to have been released.


Well, there is git-remote-testsvn, so I guess something like

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

should work. Does it?

참고URL : https://stackoverflow.com/questions/465042/is-it-possible-to-have-a-subversion-repository-as-a-git-submodule

반응형