仅从工作副本中删除文件,而不从代码仓库中删除

7

由于我在网上找不到以上问题的答案,所以我自己想出了解决办法。这是一个手动的过程,但我没有找到其他标准的解决方案。下面是解决办法:

假设您要从目录work中删除文件test.txt。如果您通过以下命令强制删除test.txt:

rm -rf test.txt

那么在work目录(或任何父目录)的下一次svn up时,该文件将被恢复。所以诀窍是也要从.svn/entries文件中删除它。因此,只删除工作副本中的test.txt的完整命令序列如下:

cd work
rm -rf test.txt
svn st     #it shows ! sign beside test.txt which means that 
       #in the next **svn up** it will be restored
chmod u+w .svn/entries
vi .svn/entries
#delete the lines associated with test.txt
#you need to delete the following 3 lines from .svn/entries
#test.txt
#file
#^L
svn st #it doesn't report test.txt anymore

1
那只适用于您当前的结帐。如果您将其再次检出到另一个文件夹,则该检出将包含该文件及其关联的元数据。 - Sameer Singh
2个回答

8

lallafa提出了一种名为sparse directories的好方法reports:

svn update --set-depth exclude <folder-to-delete>
  • 好用
  • 易于操作
  • 适用于文件

如果:

  • 我猜这不会帮助你避免检查你拥有的大量数据(虽然你可以尝试this)。
  • 不能在切换的目录上工作(可能需要一些工作,未经测试)。
  • 对于大型目录来说,不是一个很好的选择。 od_m3说,在一个190 GB的工作副本上,使用svn 1.6这种方法需要1小时,但在svn 1.7上需要超过50小时。 这是在2011年。

source添加:

如果您稍后想再次使用该目录,则可以执行以下操作

svn update --set-depth=infinity <folder-to-delete>

我希望知道如何列出已经“排除”了的目录,因为st不会显示它们。:D


这是来自同一来源,作者名为'Mike5'(或jed / jeds)的另一种方法,适用于目录:

对于每个您想避免更新的目录,请执行以下操作:

svn switch --ignore-ancestry http://dummy/exists/but/empty_folder some_folder
  • some_folder替换为您想要忽略的文件夹。
  • 还要将http://dummy/exists/but/empty_folder替换为存储库中的现有路径,该路径是空目录,永远不会被更新或删除 - 假定为此目的创建和专用。

通过这样做,您将实现:

  • 切换目录后,工作副本不再更新
  • 实际存储库没有更改

您将无法实现以下内容:

  • 对文件的任何更改
  • 该目录不会消失/从文件列表中删除
  • 除非您使用--depth为'immediates'进行了检出,否则无法摆脱最初检出这些目录(未经测试)。首先执行此操作,然后继续检出(未经测试)。
  • 我猜您无法摆脱下载已经拥有的GB级数据(未经测试)。

在专用的空目录上使用svn propset svn:ignore "*" empty_folder也是一个好主意,这样就不会有人提交任何东西到其中。


稀疏目录在隐藏未使用的分支方面非常好。我喜欢使用整个工作树进行检出。 svnbook指出,您可以使用svn info查看目录的检出深度。但是,我无法找到获取排除目录列表的方法。 - Piotr Siupa
这个方法对我已经不起作用了。我有一个checkout,我想隐藏目录,但上述方法不起作用。"svn up"会再次检查所有内容,"svn st"会将删除的文件报告为丢失。 - peschü

-5

这应该很简单:

svn delete test.txt
svn ci -m 'Delete test.txt.'

4
这样做不会从存储库中删除,恰恰相反,这与操作者的意愿完全相反。 - n611x007
2
OP 不想从代码库中删除文件,而这正是该命令所执行的操作。 - arleslie

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