当前位置:  开发笔记 > 编程语言 > 正文

是否可以将Subversion存储库作为Git子模块?

如何解决《是否可以将Subversion存储库作为Git子模块?》经验,为你挑选了3个好方法。

有没有办法在我的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然后将其用作子模块.



1> richq..:

不可以.最好的办法是在专用的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"


@xhan是的,我并不主张在同一个存储库中混合使用git-svn和子模块.使用git-svn的克隆只是创建svn存储库的本机git克隆的桥梁.

2> sherbang..:

我刚刚经历过这个.我正在做类似于rq的事情,但略有不同.我设置了一个服务器来托管我需要的svn repos的git克隆.在我的情况下,我只想要只读版本,并在服务器上需要一个裸仓库.

在我运行的服务器上:

GIT_DIR=.git git init
cd .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子模块.



3> vadishev..:

目前git-svn不支持svn:externals.但是还有另外两种工具可以帮助您:

    SubGit

    SubGit是服务器端解决方案,它使Git能够访问Subversion存储库,反之亦然.您可以参考文档了解更多详细信息,但一般来说使用SubGit相当容易:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    上面的命令将检测SVN项目中的分支布局,然后将创建空的裸Git存储库,准备镜像SVN项目.可能会要求您提供凭据,除非这些凭据已存储在〜/ .subversion目录中的SVN凭据缓存中.您还可以调整$GIT_REPO/subgit/authors.txt以将SVN作者姓名映射到Git身份.

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

    此时,您将Subversion存储库连接到新创建的Git存储库.SubGit将SVN修订版转换为Git提交,svn commit并将每个Git提交转换为SVN修订版git push.

您需要的一切是让Git存储库可供提交者使用.看看git-http-backend.然后,您可以将创建的Git存储库添加为通常的子模块.SubGit也可作为Bitbucket Server的附加组件,以了解更多信息.因此,不需要使用任何外部工具,如git-svn或任何其他工具.

SubGit是专有软件,但对于小公司(最多10个提交者),学术和开源项目是免费的.

    SmartGit

    SmartGit 在客户端替换git-svn.有关其功能的更多信息,请参见此处.

    特别是SmartGit确实支持git子模块svn:externals,您可以将它们混合在您的存储库中.

    SmartGit是专有软件,但它可以免费用于非商业用途.

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有