Включение новых файлов в SVN diff

У меня есть script, который строит мое приложение, загружает его на удаленную машину, запускает там тест производительности и фиксирует некоторые показатели, которые меня волнуют. script создает файл исправления для локальных изменений, которые я создаю в своем рабочем пространстве, и показывает его вместе с номерами производительности. Это помогает мне сравнить эффект различных параметров настройки. Если я захочу снова создать свое рабочее пространство, я могу использовать номер версии SVN и патч.

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

PS: Подобный вопрос был задан здесь, но на него не ответил адекватно, ИМО.

Ответ 1

Чтобы сделать svn diff, включите все неверсированные файлы из вашей локальной рабочей копии, вы должны сначала добавить эти файлы. svn diff выводит тот же набор изменений, который будет использоваться svn commit.

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

Подготовьте список неверсированных файлов, выведя из вывода svn status все строки, начинающиеся с вопросительного знака:

svn status | grep ^? | sed -r 's/^\? +//' > ../unversioned_files_list.txt

Затем вы можете передать этот список файлов svn add с помощью xargs:

xargs -r -d '\n' svn add < ../unversioned_files_list.txt

И затем создайте патч:

svn diff > ../my_patch.patch

Если вы не хотите добавлять эти файлы, используйте список файлов, чтобы их unadd:

xargs -r -d '\n' svn rm --keep-local < ../unversioned_files_list.txt

Ответ 2

Спасибо Александру. Сначала его подход не работал в моем случае. Я был уверен, что все новые файлы были сделаны A в svn status, однако файл diff был по-прежнему пуст. Наконец, я нашел разницу в выводах svn status, четвертые столбцы в моем случае заполнены с помощью +, например:

$ svn st
M      .
A  +    New.java

Это означает, что элемент запланирован на addition-with-history [1]. Обычно это происходит, когда вы svn move или svn copy файл или каталог [2]. В моем случае New.java есть svn merged из другой ветки, включая предыдущую историю фиксации в этой ветке. Удалите эту историческую информацию.

Сначала найдите все addition-with-history элементы:

svn status | grep ^A | sed -r 's/^A[ +]+//' > /tmp/add_list

Необязательно, удалите пути каталога в /tmp/add_list, чтобы избежать предупреждений на следующем шаге.

Затем удалите их данные фиксации истории с помощью svn remove:

xargs -r -d '\n' svn remove --keep-local --force < /tmp/add_list

Затем вернитесь к решению Alexandre, чтобы снова добавить их в subversion и получить diff.

Литература:

[1]http://svnbook.red-bean.com/nightly/en/svn.ref.svn.c.status.html
[2]http://www.linuxtopia.org/online_books/programming_tool_guides/version_control_with_subversion/svn.ref.svn.c.status.html