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

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

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

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


person Binil Thomas    schedule 22.11.2010    source источник
comment
В чем проблема? Подготовка патча с помощью SVN похожа на подготовку фиксации. Вы запускаете svn status и svn diff, чтобы увидеть, есть ли все нужные вам части, и откат, add, rm и редактируете файлы, пока не получите доволен вашими изменениями.   -  person Alex Jasmin    schedule 22.11.2010
comment
@Alexandre, мне нужен скрипт способ фиксировать мои локальные изменения таким образом, чтобы я мог позже воссоздать состояние рабочего пространства с помощью этой дельты информации, примененной к номеру ревизии XYZ или чему-то подобному.   -  person Binil Thomas    schedule 23.11.2010
comment
Возможно, вы сможете использовать svn diff --show-copies-as-adds, чтобы делать то, что хотите, см. stackoverflow.com/a/2185988/131504   -  person Amos Joshua    schedule 02.11.2017


Ответы (2)


Чтобы 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

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

xargs -r -d '\n' svn rm --keep-local < ../unversioned_files_list.txt
person Alex Jasmin    schedule 23.11.2010
comment
Спасибо, Александр, похоже, это может сработать. Я попробую и вернусь. - person Binil Thomas; 23.11.2010
comment
Не могу найти более слов, чтобы поздравить вас, как Денис. :-) - person Michaël Le Barbier; 23.08.2014
comment
Это действительно отличный ответ! - person Oscar Jara; 19.03.2015
comment
Обратите внимание, что для Mac это «sed -E». - person ajfbiw.s; 11.02.2021

Спасибо, Александр. Сначала его подход в моем случае не сработал. Я был уверен, что все новые файлы были добавлены A в svn status, однако файл различий все еще был пуст. Наконец, я обнаружил разницу в 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

Затем вернитесь к решению Александра, чтобы снова добавить их в Subversion и получить разницу.

Использованная литература:

[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
person guiwuu    schedule 03.02.2013