如何将现有的Intellij IDEA项目从SVN切换到Git SVN

22

我目前有一些现有的Intellij IDEA项目与SVN仓库相关联。我考虑将这些项目切换到使用Git SVN,因为我发现当我没有连接到SVN仓库时,需要有一个本地版本控制系统。

由于Intellij IDEA不提供Git SVN桥接,因此我从命令行运行以下命令来将SVN仓库克隆到Git中:

git svn clone --stdlayout --username myuser http://svnrepo/myproject -A authors.txt myproject
在克隆 SVN 仓库后,我使用 Intellij IDEA 打开基于 Git 的项目。此时,Intellij IDEA 报告缺少版本控制目录。我发现 Intellij IDEA 仍然记得旧的 SVN 配置。由于项目现在包含 .git 目录而不是 .svn 目录,Intellij IDEA 很困惑,并且它不知道如何连接任何仓库。
对我来说唯一有效的解决方法是执行以下步骤:
- 在 SVN 仓库中创建一个全新的项目(空项目)。 - 执行 "git svn clone"。 - 使用 Intellij 创建该项目。 - 此时,Intellij IDEA 检测到 .git 目录并提示我是否将新创建的文件添加到 Git 中。 - 将所有东西从基于 SVN 的项目复制到基于 Git 的项目中。
也就是说,在这个 Intellij IDEA 项目上,我不能在一台机器上运行 Git,同时在另一台机器上使用 SVN。两台机器都必须使用 Git,否则 Intellij IDEA 将无法提交到版本控制仓库。我可以使用所有机器上的 Git,这对我来说没问题。但是,我正在尝试找到一种方法,以便不必为我所有现有的 SVN 项目创建全新的基于 Git 的项目。这很繁琐,因为我有相当多的 SVN 项目需要现在使用 Git 运行。
那么,有没有更好的解决方案可以让我使用 Intellij IDEA 将 SVN 项目切换到 Git 呢?
谢谢。
5个回答

51

您可以从文件|设置|版本控制中为当前项目选择版本控制系统。该设置存储在项目文件之一(.idea/vcs.xml)中,因此,如果不将该文件提交到版本控制中,您可以在不同的计算机上使用不同的版本控制系统。


谢谢。我添加了Git,而且我保留了vcs.xml中的SVN设置。这似乎允许我在一台机器上使用Git,在另一台机器上使用SVN。 - limc
在Android Studio 1.2.2中,没有“设置|项目设置”选项。我能够通过删除“设置|版本控制”下的<Project> Subversion条目来删除SVN。这将其更改为<Project> <none>,然后菜单项VCS |启用版本控制集成就可用了。我使用它来启用Git。这也更改了.idea/vcs.xml文件。 - Kenneth Evans
现在没有“项目设置”了,所有设置都在同一个对话框中。但是答案仍然有效。 - Michael Piefel

7
Esko Luontola的回答已经过时了。接口进行了一些更改,我不确定从哪个版本开始。当前版本是2022.1。此设置现在位于“文件”->“设置”->“版本控制”->“目录映射”下。 “enter

4

在版本控制设置对话框中,您可以使用 VCS 下拉菜单


1
对于基于文件的项目,您可以设置一个“smudge”过滤器。
在.git/info/attributes(或.gitattributes)中添加以下行:
/*.ipr   filter=vcs

然后运行以下命令(我将本地脚本存储在~/bin中,但您可以将其放在任何位置):

git config --global filter.vcs.smudge /path/to/filter-vcs-git
git config --global filter.vcs.clean /path/to/filter-vcs-svn

我的filter-vcs-git(使用Git修改vcsDirectoryMappings中的mapping行):

#!/bin/bash
sed 's/vcs="svn"/vcs="Git"/'

我的 filter-vcs-svn(清理 vcsDirectoryMappings mapping 行以使用 svn):

#!/bin/bash
sed 's/vcs="Git"/vcs="svn"/'

这仅适用于带有sed的*NIX系统。但是,您也应该能够在Windows上安装sed并编写一个.bat脚本来执行与上面的shell脚本相同的操作。 过滤器只需从stdin获取文件进行过滤,然后将过滤后的文件输出到stdout。
下次检出.ipr文件时,它将被过滤以使用git,当您添加它(git add *.ipr)时,它将被清理,以便提交的文件使用svn。这似乎可以与所有git工具(如git diff)干净地工作,这些工具被设计为认为该行未更改。

1

顺便说一下,您可以在IntelliJ Idea中使用内建的Git支持。将SubGit安装到您的Subversion仓库中,并像往常一样使用已创建的Git仓库,即完全不需要git-svn。

SubGit在服务器端工作,可以在每次更新时同步Subversion和Git仓库。


我真的很想使用SubGit(我不介意为此付费),但我们的代码库和许多其他仓库一样,是一个具有许多奇怪之处的旧代码库,SubGit 无法处理它(例如,外部旧提交记录,过去的奇怪分支策略等)。其中一些已在近年来得到解决,但很多问题无法解决或没有成本上的合理性去解决。 - Quartz
根据我们的经验,与旧且丑陋的Subversion存储库有关的事情总是存在的,无论是通过转储/加载周期修复它,还是在将其导入Git时删除一些旧版本。请随时通过support@subgit.com与我们联系,并描述您的Subversion存储库及其所有丑陋之处 :) 我们将尝试为您的特定情况提供可能的解决方案;我们还可以更改我们计划在不久的将来实施的功能的优先级。 - vadishev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接