Subversion 저장소를 Git 하위 모듈로 사용할 수 있습니까?
내 Git 저장소에서 Subversion 저장소를 Git 하위 모듈로 추가하는 방법이 있습니까?
다음과 같은 것 :
git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project
어디 https://svn.foo.com/svn/proj
Subversion 저장소를 가리 킵니다.
git-svn
Subversion 저장소와 상호 작용할 수 있는 것이 있다는 것을 알고 있습니다 . 그래서 나는 아마도 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:
-
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 everygit 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.
-
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?
'Programing' 카테고리의 다른 글
Apache를 Node.js로 바꿀 수 있습니까? (0) | 2020.06.10 |
---|---|
솔루션 파일을 "항상"체크 아웃하지 못하도록 Visual Studio를 중지하는 방법은 무엇입니까? (0) | 2020.06.10 |
실제로 존재하는 파일을 제거 할 수 없음-치명적 : pathspec… 파일과 일치하지 않습니다 (0) | 2020.06.10 |
Rails 4-Gem :: LoadError : 데이터베이스 어댑터에 대해 'mysql2'를 지정했지만 gem이로드되지 않았습니다 (0) | 2020.06.10 |
언제 Flask.g을 사용해야합니까? (0) | 2020.06.10 |