我想我太粗心了。
我用svn add
命令添加了一堆文件到SVN中,然后我发现还有几个我不需要的文件,于是我用rm
命令将它们删除了。
现在我无法提交,因为缺少这些文件。我尝试过使用svn cleanup
命令,但没有帮助。
目前我的解决方案是手动删除每一个.svn
目录,但感觉这样做不太对。
我想我太粗心了。
我用svn add
命令添加了一堆文件到SVN中,然后我发现还有几个我不需要的文件,于是我用rm
命令将它们删除了。
现在我无法提交,因为缺少这些文件。我尝试过使用svn cleanup
命令,但没有帮助。
目前我的解决方案是手动删除每一个.svn
目录,但感觉这样做不太对。
根据我的理解,您有以下情况:
$ 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
对于每个文件,你应该可以无障碍地进行检查。
$ svn revert <Deleted Folder Name> --depth infinity
这实际上是@Gonzalo Mateo的略微修改版本,解决了我的问题。
svn st | grep '!' | sed 's/!M \(.*\)$/"\1"/' | xargs svn revert --depth infinity
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
- 还原所有列出的文件。svn st
命令的输出可能会随时更改,这将使您的解决方案无效... - Uwe Plonussvn add X
添加了一个文件,但是你还没有提交,然后你决定想要删除这个文件(并且不提交它);那么你应该使用svn revert X
来撤销你的svn add X
命令。这解决了我的问题
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"
现在,sra
即SVN Revert All将使您的生活更轻松。
svn revert
命令撤销添加的文件。 - Linus Kleen