Добавьте файлы в SVN, затем удалите перед фиксацией - PullRequest
21 голосов
/ 05 августа 2011

Полагаю, я был небрежен.

Я добавил кучу файлов в SVN с svn add, затем я увидел несколько файлов, которые мне не нужны, поэтому я удалил их с помощью rm.

Теперь я больше не могу коммитить, потому что в коммите отсутствуют файлы. Я попытался очистить SVN, но это не помогло.

Теперь я могу вручную удалить каждый каталог .svn, но это кажется неправильным.

Ответы [ 6 ]

38 голосов
/ 05 августа 2011

Насколько я понимаю, у вас есть такая ситуация:

$ 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

Итак, чтобы это исправить, сделайте следующее: (спасибо Линус!)

$ svn revert foo
Reverted 'foo'

или вы можете сделать это:

$ touch foo
$ svn delete --force foo

для каждого файла, и вы сможете зарегистрироваться без проблем.

5 голосов
/ 14 ноября 2013

Если вы добавили папку с подпапками и файлами внутри, то вы удалили папку, прежде чем ее зафиксировать.В этом случае вы можете сделать следующее:

$ svn revert <Deleted Folder Name> --depth infinity
3 голосов
/ 14 сентября 2015

На самом деле это слегка измененная версия @Gonzalo Mateo, которая решила мою проблему.

svn st  | grep '!' | sed 's/!M      \(.*\)$/"\1"/' | xargs svn revert --depth infinity
2 голосов
/ 13 мая 2015

Если у вас есть несколько каталогов с несколькими удаленными файлами, может помочь следующая команда:

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 Это вернет все перечисленные файлы.
1 голос
/ 05 августа 2011

Если вы svn add X файл, но вы не зафиксировали, то позже вы решите, что хотите удалить этот файл (а не зафиксировать его); вам нужно просто вернуть команду svn add X с помощью svn revert X.

Затем он "отменит" еще не совершенное добавление.

0 голосов
/ 29 октября 2015

Это решило мою проблему

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 сделает вашу жизнь проще.

...