Включение новых файлов в 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