Добавете файлове към 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