2009-08-20 5 views
2

длинный рассказ короткий, ошибка была сделана, и теперь у меня есть как минимум сто файлов на протяжении десятков папок, которые нужно удалить из моего репозитория.SVN: установить все файлы с "!" на "D"?

В настоящее время все они обозначены как «!». в svn status и я хотел бы удалить их без ввода вручную svn удалить blahblah.

Есть ли быстрый способ сделать это?

+0

Windows? Linux? – RedFilter

+0

Ах, извините. Это OSX, но ответ ниже разработан. – 2009-08-20 19:17:28

+0

Приложения не должны позволять людям умножать свои ошибки на 10000: P О, ужасы, которые у меня были, когда я подумал, что быстрая «замена всех» решит мои проблемы с рефакторингом :) – cwap

ответ

5

Это довольно легко сделать с помощью небольшой оболочки-скриптов-foo.

svn status | grep "^\!" | awk '{print $2}' | xargs svn del 

Вот расстройство, в соответствии с просьбой:

  • Выходом svn status по трубопроводу подают grep
  • grep труб каждую строку, которая начинается с ! (The ^ в регулярном выражении означает начало строки , и «\» необходимо избегать специального значения !)
  • awk затем берет второй «аргумент» (так говорить .. это путь к файлу) из grep и труб только это ...
  • xargs который просто утилита для построения выполнения команд оболочки из стандартного ввода, который генерирует и запускает команду svn del your/file/here

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

svn status | grep "^\?" | awk '{print $2}' | xargs svn add 

Кроме того, я просто вспомнил, и хотел бы отметить, что это не будет работать, если у вас есть пробелы h или имена файлов. Я всегда забываю об этом, потому что никогда этого не делаю. Если у вас есть пробелы в ваших путей/имен файлов, используйте следующую вариацию на первом примере:

svn status | grep "^\!" | sed -e 's/? *//' | sed -e 's/ /\\ /g' | xargs svn del 

(Там, наверное, более изящный способ сделать это, так что не стесняйтесь звонить в). В этом первом sed берет первый символ пробела и любые (если есть) пробелы, которые следуют за ним, и удаляет их (в основном, обрезку). Затем второй вызов sed заменяет все оставшиеся пространства \, который является экранированным пространством, насколько это касается оболочки. Подумайте об этом, вы могли бы просто обернуть его котировками ...

+0

Если вы не хотите удалять файл локально , не забудьте аргумент --keep-local. – RedFilter

+0

Спасибо. Я по-прежнему новичок в оболочке, поэтому я хочу убедиться, что я понимаю, что делает эта строка. Результат работы svn status используется как файл для grep, который ищет! (что делает?)? Я предполагаю, что $ 2 относится ко второй группе символов без пробелов, которые помещаются в svn del? Правильно ли это? – 2009-08-20 19:05:01

+0

Ya, это звучит правильно. «^» совпадает с началом строки и различает строки, такие как «.....! ...» и «! ......» –