Svn 是否可以将Subversion存储库作为Git子模块?
有没有办法将Subversion存储库作为Git子模块添加到我的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存储库,然后将其用作子模块。不。最
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
。这意味着您仍然必须使用这些软件来签出外部,并且不能使用basicgit
实用程序直接从外部git-hub服务器(如github
或gitlab
)签出这些外部。因此,如果没有这些软件,外部git hub服务器上与snv:externals
相关的源代码将无法观察和下载,这仍然是一个重要问题。