Как стать автором
Обновить

Комментарии 22

Точно не уверен, что понял суть термина «clean build», но для того чтобы работать с проектом в файловом дереве которого есть мешающие неверсионированные файлы (до их коммита мы еще не дошли), я обычно делаю ветку, коммичу туда все эти файлы и переключаюсь на trunk.

Никаких чекаутов и посторонних инструмментов, которые тоже, в общем-то, нужно сопровождать.
как быть с генерированными файлами, например? они-то остаются в рабочей копии
а в svn нет аналога .gitignore?
даже если я добавлю файлы в игнор, как это мне поможет, если у меня запускаемое приложение использует их?
например, файл типа .lock/.crashed и т.п. файлы-флаги и не только?
а ну да, точно… оплошал…
угу, у меркуриала для этого есть hg up --clean
Я использую этот скрипт в двух случаях:

1) Перед commit (все нужные файлы уже помечены как добавленные), который затрагивает build scripts – когда я хочу убедится, что я не забыл каких-то зависимостях. Я достаточно широко использую в проектах скрипты и «сторонние инструменты», у меня много автоматически сгенерированных файлов, поэтому для меня это актуально.

2) На build server’е – clean checkout (т.е. checkout в пустой каталог) для большого проекта может занимать весьма продолжительно время, хочется как-то ускорить это процесс. В этом случае я использую команду svn update на уже подготовленной working copy, но перед этим удаляю все файлы, которые были созданы во время предыдущей сборки. Результат получается такой же, как при clean checkout, но на порядок быстрее.
НЛО прилетело и опубликовало эту надпись здесь
Если вы опасаетесь, просто уберите "| rm -recurse -force" в конце, и вы увидите список файлов и каталогов, которые будут удалены.
P.S. Да, этот скрипт должен быть записан в одну строку!
а не проще испорьзовать параметр svn-ignore?
svn:ignore всего лишь позволяет вам «не видеть» файлы, которые вам не интересны, но сами-то файлы при этом никуда не денутся. Выше XuMiX уже описал один сценарий, при котором svn:ignore ничем не поможет ;-)

Другой сценарий – допустим, я добавляю в проект генерацию каких-то файлов (ну, например, тех же LINQ2SQL-классов), которые используются в дальнейшем. Т.к. эти файлы генерируются, в репозитарии им делать нечего, и я, разумеется, добавляю их в svn:ignore. Дальше я хочу убедится, что я корректно сделал сборочные скрипты, что при чистой сборке, сразу после checkout, эти файлы будут корректно сгенерированы. Самый простой вариант – вручную удалить эти файлы и собрать проект с нуля. Но зачем удалять их вручную, если я могу сделать это автоматически?
svn export — вытаскивает чистную версию куда вам нужно ( без всяких папок .svn ) подозреваю что будет работать быстрее чем svn checkout
Конечно, export но не всегда подходит :)
Скрипт, конечно, полезный. Но лучше делать так, что бы все автогенерированные-временные-ненужные файлы были хорошо локализованы — тогда можно будет их чистить не трогая svn.
Так, например, делает maven (для Java) — он создаёт файлы только в папке project/target, поэтому никаких проблем с очисткой не возникает.
К сожалению, это не всегда возможно. А в некоторых случаях и неудобно – мне, например, удобно помещать генерированные файлы в те каталоги, которые соответствуют по их функциональному назначению.

Впрочем, спорить с вами не буду, удобно-неудобно зависит от личных предпочтений ;-)
Если я правильно понял суть скрипта то для bash/sh ето выглядит немного изящней:

#svn st | grep "?" | awk {'print $2'} | xargs rm -f
Если быть совсем корректным, то скорее так:

svn --no-ignore st | grep ^[I\?] | awk {'print $2'} | xargs rm -f
Будет неправильно работать если в именах файлов, подлежащих удалению, будут встречаться пробелы.
Тогда поправьте – я не очень силен в *nix, а разбираться нет времени :)
Я на самом деле тоже не особо силён, просто знаю, что ваш код работать не будет :)

svn st --no-ignore | grep ^[I\?] | perl -npe "chomp;s/^.\s+(.*)$/\1\0/gs" | xargs -0 rm
Вот так вроде должно работать, но наверное можно сократить.
Мой код для PS работать будет ;-)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории