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

Svn 是否可以将Subversion存储库作为Git子模块?,svn,git,git-svn,Svn,Git,Git Svn,有没有办法将Subversion存储库作为Git子模块添加到我的Git存储库中 比如: git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project 其中https://svn.foo.com/svn/proj指向Subversion存储库 我知道有gitsvn允许人们与Subversion存储库交互。所以我在想,也许有一种方法可以使用git svn签出Subversion存储库,然后将其用作子模块。不。最

有没有办法将Subversion存储库作为Git子模块添加到我的Git存储库中

比如:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project
其中
https://svn.foo.com/svn/proj
指向Subversion存储库


我知道有
gitsvn
允许人们与Subversion存储库交互。所以我在想,也许有一种方法可以使用
git svn
签出Subversion存储库,然后将其用作子模块。

不。最好的办法是在专用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子模块之间有一个概念上的区别,如果您从subversion的角度来处理这个问题,可能会让您感到困惑。git子模块与您给出的修订版挂钩。如果“上游”更改,则必须更新子模块的引用

因此,当我们与上游subversion重新同步时:

cd /path/to/mysvnclone
git svn rebase
git push
。。。git项目仍将使用我们先前承诺的原始版本。要更新到svn头部,您必须使用

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

活塞正在被重写以支持这一点,反之亦然,再加上Subvresion Repository和git+git中现有的Subversion URL

退房


不幸的是,它似乎没有被发布。

我刚刚经历了这个。我正在做一些类似于rq的事情,但略有不同。 我设置了一台服务器来托管我需要的svn repo的git克隆。在我的例子中,我只想要只读版本,并且需要在服务器上进行裸repo

在我运行的服务器上:

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
这也需要来自的fix-svn-refs.sh 这主要是受到以下因素的启发:

我不确定为什么这里需要
git gc
,但是没有它我就无法进行
git拉取


因此,在所有这些之后,您可以按照rq的指示使用git子模块。

除了rq所说的,另一种方法是使用第三方“externals”项目(),它更好地模拟了svn外部引用的工作方式。使用external,您可以跟踪git或svn存储库,而且将更改推到这些repo的上游看起来更容易。但是,它要求项目成员下载并安装单独的软件包

我还没有使用子模块或外部模块;然而,我已经花了几个小时阅读了所有的备选方案,看起来外部将更适合我的需要。Jon Loeliger()在“使用Git进行版本控制”的第15章中对这些方法和其他自定义方法进行了精彩的讨论,我强烈推荐。

目前Git svn不支持svn:externals。但还有两个其他工具可以帮助您:

  • SubGit是服务器端解决方案,它允许Git访问Subversion存储库,反之亦然。有关更多详细信息,请参阅,但通常使用SubGit相当容易:

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

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    
    此时,您已经将Subversion存储库连接到新创建的Git存储库。SubGit在每次
    SVN提交时将SVN修订转换为Git提交,在每次
    Git推送时将Git提交转换为SVN修订

  • 进一步需要做的就是让提交者可以使用Git存储库。看看这个。然后,您可以添加创建的Git存储库作为一个常用的子模块。 SubGit还可以作为Bitbucket服务器的附加组件使用,以了解更多信息。 因此,不需要使用任何外部工具,如git svn或任何其他工具

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

  • SmartGit在客户端取代git svn。您可以找到有关其功能的更多信息

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

    SmartGit是专有软件,但非商业用途是免费的


  • 嗯,这里有git remote testsvn,所以我猜大概是这样的

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

    应该有用。是吗?

    当你最需要活塞时,它会在你面前失灵;),所以我不建议这样做。此外,活塞不再有任何错误修复。人们甚至会认为您可以将其作为提交挂钩来执行。在将其发布到此处之前,您是否尝试过这些代码?子模块无法在git svn上正常工作。@xhan是的,我不主张在同一个存储库中混合使用git svn和子模块。使用git svn的克隆只是创建svn存储库的本机git克隆的桥梁。抱歉。我没有发现您使用两个文件夹作为子模块。好把戏,好技术。在将git svn repo推到那里之前,您不需要在服务器上执行“git init--bare”步骤吗?我必须这样做。这可能不是默认设置,但您可以像git子模块一样将svn:externals绑定到特定版本。
    subgit
    ()和
    smartgit
    都以相同的方式通过工作副本中的显式
    .gitsvenxtmodules
    文件支持
    svn:externals
    。这意味着您仍然必须使用这些软件来签出外部,并且不能使用basic
    git
    实用程序直接从外部git-hub服务器(如
    github
    gitlab
    )签出这些外部。因此,如果没有这些软件,外部git hub服务器上与
    snv:externals
    相关的源代码将无法观察和下载,这仍然是一个重要问题。