Подтвердить что ты не робот

Svn удалить удаленные файлы

У меня есть рабочая копия проекта SVN. Файлы удаляются из этой рабочей копии приложением. Когда я передаю рабочую копию с помощью командной строки SVN, я хотел бы удалить эти удаленные файлы из репозитория.

Если я выполняю рабочую копию с помощью svn commit, она не удаляет файлы из проекта (потому что они не были удалены локально с помощью svn delete). Есть ли способ, с помощью которого SVN можно удалить (из репозиторий) любые файлы, отсутствующие в рабочей копии?

4b9b3361

Ответ 1

использовать

svn status

это будет список изменений с рабочей копией. (удаленные файлы начинаются с!)

Затем вы можете:

svn delete file_to_del1 file_to_del2 etc

и, наконец, совершить

Вы также можете написать небольшой фрагмент, чтобы автоматизировать это:

svn status | grep '^!' | awk '{print $2}' | xargs svn delete

И, наконец, добавьте псевдоним:

alias svn_precommit="svn status | grep '^!' | awk '{print $2}' | xargs svn delete"

Если вам нужно поддерживать @/пробелы в именах файлов, вам нужно усложнить сценарий (вы не должны использовать эти символы в именах файлов, но иногда это решение, принятое кем-то другим) - вы можете использовать это в своем. Bashrc напрямую:

svn_prepare_del() {
        svn st | grep '^!' | awk '{$1=""; print " --force \""substr($0,2)"@\"" }' | xargs svn delete
}

Ответ 2

Ваш вопрос как сформулированный (Есть ли способ, которым я могу сказать SVN удалить (из репозитория) любые файлы, отсутствующие в рабочей копии?), действительно является дубликатом связанного вопроса svn, чтобы удалить все локально отсутствующие файлы. В ответ на этот вопрос я предоставил однострочный PowerShell script, чтобы вы могли автоматически идентифицировать и удалять необходимые файлы из вашего репозитория. Я воспроизвожу его здесь для удобства:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

Это предполагает, конечно, что вы находитесь в Windows. Здесь является аналогичным решением, если вы находитесь в Linux/Unix.

Однако, когда вы добавите во второй части своего вопроса, который вы непреднамеренно выявили:-) в более позднем комментарии - есть ли способ сделать это автоматически при фиксации? - тогда ваш вопрос уникален.

Единственный способ, который я мог видеть в ответ на вторую часть, - использовать привязку pre-commit, т.е. hook script, выполняемого при инициировании фиксации, но до того, как фактически произойдет фиксация. Как правило, вы должны использовать привязку pre-commit для проверки некоторого набора условий и либо разрешить фиксацию продолжить, либо прекратить действие. Увы, я не думаю, что допустимо, не говоря уже о целесообразности, изменять набор файлов, совершенных во время самой фиксации. Но я не нашел этот пункт документированным, так что вы, возможно, захотите еще больше разобраться в этом вопросе.

2012.06.19 Разъяснение на комментарий дона

Дон прав, что вам нужен клиентский крюк, а не серверный, потому что удаленные файлы для обработки находятся на клиенте. Командная строка svn не имеет этой опции, но TortoiseSVN предлагает клики на стороне клиента. Фактически, после того, как я просмотрел справочную страницу с ссылкой, мне напомнили, что TortoiseSVN предлагает pre-commit, но также предлагает крюк start-commit, который идеально подходит для этой ситуации. Разница заключается в том, что крюк предварительной фиксации запускается после открытия диалогового окна фиксации и после нажатия OK, чтобы выполнить выполнение фиксации. С другой стороны, hook-start-commit запускается до открытия диалога фиксации. Таким образом, с крюком script на месте, к тому моменту, когда вы увидите список файлов для фиксации, он будет содержать файлы, которые он собирается удалить, а также!

Ответ 3

Следующее работает, когда вам вручили кучу файлов или каталоги с именами файлов в них. Он будет работать на OSX, IOS и Linux

svn st | grep ^! | awk '{$1=""; print " --force \""substr($0,2)"@\"" }' | xargs svn rm