将文件添加到SVN,然后在提交之前删除。

23

我想我太粗心了。

我用svn add命令添加了一堆文件到SVN中,然后我发现还有几个我不需要的文件,于是我用rm命令将它们删除了。

现在我无法提交,因为缺少这些文件。我尝试过使用svn cleanup命令,但没有帮助。

目前我的解决方案是手动删除每一个.svn目录,但感觉这样做不太对。


4
您可以使用svn revert命令撤销添加的文件。 - Linus Kleen
相信我,你并没有疏忽。Svn应该为你处理这个问题,但它并不总是那么聪明。 - trysis
6个回答

39

根据我的理解,您有以下情况:

$ touch foo
$ svn add foo
A         foo
$ rm foo
$ svn ci
svn: Commit failed (details follow):
svn: 'foo' is scheduled for addition, but is missing

为了解决这个问题,请执行以下操作:(感谢 Linus!)

$ svn revert foo
Reverted 'foo'

或者你可以这样做:

$ touch foo
$ svn delete --force foo

对于每个文件,你应该可以无障碍地进行检查。


1
没有意识到这实际上删除了文件本身,而不仅仅是 SVN 跟踪。请注意,这也会从本地目录中删除该文件。 - The Dude

5
如果您添加了一个包含子文件夹和文件的文件夹,然后在提交之前删除了该文件夹,那么您可以按照以下步骤操作。
$ svn revert <Deleted Folder Name> --depth infinity

3

这实际上是@Gonzalo Mateo的略微修改版本,解决了我的问题。

svn st  | grep '!' | sed 's/!M      \(.*\)$/"\1"/' | xargs svn revert --depth infinity

2
如果你有多个目录和多个已删除的文件,以下命令可能会有所帮助:
svn st  | grep '!M' | sed 's/!M      \(.*\)$/"\1"/' | xargs svn revert

我建议先列出需要还原的文件。我们可以通过去掉最后一个管道符实现:svn st | grep '!M' | sed 's/!M \(.*\)$/"\1"/'

逐步解释每个命令:

  • svn st - 列出添加和未正确删除的文件,并标记为 !M
  • grep '!M' - 查找包含 !M 的行
  • sed 's/!M \(.*\)$/"\1"/' - 用于去除带有空格的 !M。它还将对文件名加上引号,因此您不必担心文件名中包含空格。
  • xargs svn revert - 还原所有列出的文件。

您能否详细阐述一下您的答案,并对您提供的解决方案进行更多描述? - abarisone
1
这个问题已经快三年了。如果您能详细说明一下您的答案会更有帮助。请注意,svn st命令的输出可能会随时更改,这将使您的解决方案无效... - Uwe Plonus

1
如果你使用svn add X添加了一个文件,但是你还没有提交,然后你决定想要删除这个文件(并且不提交它);那么你应该使用svn revert X来撤销你的svn add X命令。
这将会“撤销”尚未提交的添加操作。

0

这解决了我的问题

svn st | grep '!' | sed 's/!M \(.*\)$/"\1"/' | xargs svn revert --depth infinity

需要注意的是,上述代码仅适用于最新添加的内容。因此,如果出现错误,请再次运行svn ci,然后再次运行上述代码。重复执行svn ci直到您已还原所有问题。

额外加分: 添加一个别名(这是针对Oh-My-ZSH Zsh Shell)

# SVN revert everything like reset hard alias sra="svn st | grep '!' | sed 's/!M \(.*\)$/"\1"/' | xargs svn revert --depth infinity"

现在,sraSVN Revert All将使您的生活更轻松。


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