Добавьте файлы в SVN, затем удалите перед фиксацией

Наверное, я был неосторожен.

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

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

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


person Eric    schedule 05.08.2011    source источник
comment
Вы можете svn revert добавить файлы.   -  person Linus Kleen    schedule 05.08.2011
comment
Поверьте, вы не были беспечны. Svn действительно должен позаботиться об этом за вас, но это не всегда так умно.   -  person trysis    schedule 25.09.2015


Ответы (6)


Я так понимаю у вас такая ситуация:

$ 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

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

person patrickmdnet    schedule 05.08.2011
comment
Не понял, что это фактически удалило сам файл, а не только отслеживание SVN. Имейте в виду, что при этом файл также удаляется из локального каталога. - person The Dude; 26.06.2015

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

$ svn revert <Deleted Folder Name> --depth infinity
person Son Tran    schedule 14.11.2013

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

svn st  | grep '!' | sed 's/!M      \(.*\)$/"\1"/' | xargs svn revert --depth infinity
person linvenuza    schedule 14.09.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 Это вернет все файлы в списке.
person Gonzalo Mateo    schedule 13.05.2015
comment
Не могли бы вы уточнить свой ответ, добавив немного больше описания решения, которое вы предоставляете? - person abarisone; 13.05.2015
comment
Этому вопросу почти три года. Также было бы полезно уточнить ваш ответ немного подробнее. Также обратите внимание, что вывод svn st может измениться без предварительного уведомления, что сделает ваше решение бесполезным... - person Uwe Plonus; 13.05.2015

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

Затем он «отменит» еще не зафиксированное добавление.

person Edwin Buck    schedule 05.08.2011

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

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

person Ahmad Awais    schedule 29.10.2015