你如何移除文件夹的Subversion控制?

267

我有一个文件夹,c:\websites\test,它包含从不再存在的存储库中检出的文件夹和文件。如何让Subversion停止跟踪该文件夹及其任何子文件夹和文件?

我知道我可以简单地删除.svn文件夹,但有很多层级的子文件夹。


1
如果您正在使用TortoiseSVN,我写了一篇博客文章,展示了最快的方法。我的帖子有逐步说明和图片。该帖子可在http://www.ecofic.com/about/blog/disconnecting-folder-from-svn上找到。 - Chad Campbell
请参考我的答案,它已经帮助了很多人。https://dev59.com/_m445IYBdhLWcg3wXZS9#12399419 - Ajit Vaze
第一个链接坏了。一般的经验法则是:无论如何都要避免使用SVN。顺便说一下,现在是2023年。 - user5248982
29个回答

262

此外,如果您正在使用TortoiseSVN,则只需将其导出到当前的工作副本位置,它将删除.svn文件夹和文件。

http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-export.html#tsvn-dug-export-unversion

Subversion 1.7的更新答案:
在Subversion 1.7中,工作副本已经被广泛地改版。现在只有一个位于工作副本基础的.svn文件夹。如果您正在使用1.7版本,则只需删除.svn文件夹及其内容即可轻松解决问题(无论是使用TortoiseSVN还是命令行工具都可以)。


8
链接现在是404。新链接:http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-export.html#tsvn-dug-export-unversion导出覆盖当前似乎只是一种特殊情况,仅在您选择保留未加入版本控制的文件时才删除 .svn 文件。 - lilbyrdie
成功删除后,只需正常重新启动SVN服务器即可恢复文件夹图标。 - 3ehrang
服务器与乌龟文件夹图标无关。但如果它们没有更新,您可以尝试终止 TSVNCache 进程。它应该会自动重新启动。 - crashmstr
1
在我的情况下,我连同 .svn 文件夹一起删除了 git 文件夹。 - Aftab Ahmed Kalhoro

158
在Linux上,这将起作用:
  find . -iname ".svn" -print0 | xargs -0 rm -r

2
在运行命令之前,请确保进入正确的目录,例如: cd mySVNdirectoryWhereToRemoveTheSubfolders - Camaleo
1
我得到了rm:缺少操作数。 - Winter

120

尝试使用svn export

你应该能够像这样做:

svn export /path/to/old/working/copy /path/to/plain/code

然后只需删除旧的工作副本。

TortoiseSVN还具有导出功能,其行为方式相同。


5
感谢您提供一条在命令行下有效的答案。 :) 对于使用终端的人来说非常方便。 - epochwolf
18
如果我理解正确,这个命令只会导出当前由Subversion控制的文件。因此,如果某些文件或文件夹尚未被添加到Subversion中或已从Subversion控制中删除,则在导出时将丢失这些文件。 - Chris
@Chris,是的,你说得对。这只会导出有版本的文件。这对于导出代码并留下派生工件等方面非常有用,但可能不是每个工作的正确工具。 - pkaeding
5
值得一提的是,即使SVN服务器已经不存在,这种方法仍然有效;如果你尝试使用VisualSVN或者Tortoise SVN导出,它似乎会试图联系服务器,但是上述命令行版本对于我来说在SVN服务器不运行的情况下也可以工作。 - Dave
我收到一个错误:svn: E000002: 无法统计 '/.classpath':没有这样的文件或目录 - IgorGanapolsky

35

如果你使用的是Windows系统,可以在该文件夹中搜索.svn,并将它们全部列出来。按下Ctrl+ A会选择所有这些文件,并按下删除键会移除所有“烦人”的Subversion内容。


确实有点烦人;-) 我只需要清理一下,然后把它放回一个新的代码库。 - Brian Boatright
2
这也是删除最顽固的前端扩展文件夹的绝佳方法! - Brian Boatright
下载并使用Everything Search实用程序来快速查找和删除.svn文件夹 :)http://www.voidtools.com/仅限Windows操作系统! - endo64
对于那些找不到 .svn 文件夹的人,它是一个隐藏文件夹,所以请确保在您的文件资源管理器中显示隐藏项目。 - JanWillem Huising

25

在Linux上,命令为:

svn delete --keep-local file_name

22

我发现你甚至不需要复制到临时位置。你可以执行

svn export --force .

同时 .svn 文件将会被原地删除,其他文件将保持原样。非常方便且不易混乱。


4
我不知道它是什么,但由于某些原因它对我没有起作用。 - Aries
1
这个命令只适用于工作副本,而不是其中的一个文件夹。也许是同一种变体...? - user234736
2
如果安装的Subversion版本为1.7,而仓库是1.6,则此方法无法正常工作。但是,在导出之前可以运行"svn upgrade"命令,这样就可以解决问题了。 - Peter Mortensen

11

在Linux中没有子shell来删除.svn文件夹:

find . -name .svn -exec rm -r -f {} +

rm = remove
-r = recursive (folders)
-f = force, avoids a lot of "a your sure you want to delete file XY".

10

对于我的情况,这些答案都不令人满意。我使用的是subversion 1.8版本,我的工作副本只有一个.svn文件夹位于根目录下。然而,我想从工作副本中删除一些分支。

无论我做了什么,每当我运行“更新”时,它都会恢复那些文件并把它们全部带回来。我不想从仓库中删除它们,只是想从我的电脑上删除它们——但我需要保持其余的工作副本不变(因此不能只删除.svn文件夹)。

解决方案是:svn update --set-depth exclude <dir>

这是一个客户端“更新”,可以排除特定目录。在svnbook.com的手册中可以找到它的相关信息。简而言之,它描述如下:

从Subversion 1.6开始,你可以采取不同的方法。首先,完全检出该目录。 然后在你不关心的一个子目录上运行 svn update --set-depth exclude。

对于TortoiseSVN,您也可以通过右键单击不需要的文件夹,然后单击“更新到修订版本...”,并将“更新深度”设置为Exclude来执行相同的操作,如下面的屏幕截图所示:

enter image description here


但是,您不能删除工作副本根文件夹。 - JaBe

8

对我来说它很有效:

find directory_to_delete/ -type d -name '*.svn' | xargs rm -rf

这是一个非常简单的解决方案,但却像魔法一样有效。 - IgorGanapolsky
@IgorGanapolsky 我很高兴。我的解决方案对你有所帮助。 - Manikandan S
只要没有人运行 mkdir -p ';echo Hi Johnny;/.svn',那么 find 的 {} 调用应该仍然有效。 - Never Sleep Again

7
使用svn export命令:
cd c:\websites\test
svn export c:\websites\test_copy

所有在版本控制下的文件都将被导出。请仔细检查,确保没有遗漏任何东西。


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