Как вернуть SVN-фиксацию?

Я нашел несколько примеров того, как вернуть SVN-фиксацию, например

svn merge -r [current_version]:[previous_version] [repository_url]

или

svn merge -c -[R] .

Но ни один из них, похоже, не работает. Я пробовал эти команды и проверял файлы, которые были изменены вручную.

Как вернуть фиксацию с номером версии 1944? Как проверить, что реверс был выполнен (без просмотра фактического файла, чтобы изменения были отменены)?

Ответ 1

Оба примера должны работать, но

svn merge -r UPREV:LOWREV . диапазон отмены

svn merge -c -REV . отменить отдельную ревизию

в этом синтаксисе - если текущий dir является WC и (как это необходимо сделать после каждого слияния), вы будете фиксировать результаты

Вы хотите видеть журналы?

Ответ 3

svn merge -r 1944:1943 . должен возвращать изменения r1944 в вашей рабочей копии. Затем вы можете просмотреть изменения в своей рабочей копии (с помощью diff), но вам нужно будет зафиксировать, чтобы применить возврат в репозиторий.

Ответ 4

Сначала верните рабочую копию в 1943 году.

> svn merge -c -1943 .

Во-вторых, проверьте, что должно произойти.

> svn status

В-третьих, зафиксируйте версию 1945.

> svn commit -m "Fix bad commit."

В-четвертых, посмотрите на новый журнал.

> svn log -l 4

------------------------------------------------------------------------
1945 | myname | 2015-04-20 19:20:51 -0700 (Mon, 20 Apr 2015) | 1 line

Fix bad commit.
------------------------------------------------------------------------
1944 | myname | 2015-04-20 19:09:58 -0700 (Mon, 20 Apr 2015) | 1 line

This is the bad commit that I made.
------------------------------------------------------------------------
1943 | myname | 2015-04-20 18:36:45 -0700 (Mon, 20 Apr 2015) | 1 line

This was a good commit.
------------------------------------------------------------------------

Ответ 5

Невозможно "раскрыть" ревизию, но вы можете вернуть свою рабочую копию на версию 1943 и зафиксировать ее как версию 1945. Варианты 1943 и 1945 будут идентичными, эффективно возвращая изменения.

Ответ 6

Следующее будет выполнять сухой ход, как говорится. HEAD - текущая версия, PREV - это предыдущий, затем путь к вашему файлу или зафиксированный элемент:

svn merge --dry-run -rHEAD:PREV https://example.com/svn/myproject/trunk

Если сухой прогон выглядит хорошо, запустите команду без -dry-run

Проверьте изменения в ревизии и повторите фиксацию. Чтобы просмотреть номера версий, выполните следующие действия:

svn log

Ответ 7

F=code.c
REV=123
svn diff -c $REV $F | patch -R -p0 \
    && svn commit -m "undid rev $REV" $F

Ответ 8

Алекс, попробуйте это: svn merge [WorkingFolderPath] -r 1944: 1943

Ответ 9

Я попробовал выше, (svn merge), и вы правы, он подключается. Однако

svn update -r <revision> <target> [-R]

похоже, работает, но не является постоянным (мой svn просто показывает старую ревизию). Поэтому мне пришлось

mv <target> <target backup>
svn update <target>
mv <target backup> <target>
svn commit -m "Reverted commit on <target>" <target>

В моем конкретном случае моя цель interfaces/AngelInterface.php. Я вносил изменения в файл, исправлял их, обновлял компьютер сборки, запускал компилятор phpdoc и обнаружил, что мои изменения были пустой тратой времени. svn log interfaces/AngelInterface.php показывает мое изменение как r22060, а предыдущая фиксация в этом файле была r22059. Поэтому я могу svn update -r 22059 interfaces/AngelInterface.php, и я снова получаю код, как и в -r22059. Затем: -

mv interfaces/AngelInterface.php interfaces/AngelInterface.php~
svn update interfaces/AngelInterface.php
mv interfaces/AngelInterface.php~ interfaces/AngelInterface.php
svn commit -m "reverted -r22060" interfaces/AngelInterface.php

В качестве альтернативы я мог бы сделать то же самое в каталоге, указав . -R вместо interfaces/AngelInterface.php во всех вышеперечисленных.

Ответ 10

Хотя предложенные предложения уже могут работать для некоторых людей, это не работает для моего случая. При выполнении слияния пользователи в rev 1443, которые обновляют до rev 1445, все еще синхронизируют все файлы, измененные в 1444, даже если они равны 1443 из слияния. Мне нужно, чтобы конечные пользователи вообще не видели обновления.

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

copy -r 1443 file:///<your_branch> file:///<your_branch_at_correct_rev>
svn move file:///<your_branch> file:///<backup_branch>
svn move file:///<your_branch_at_correct_rev> file:///<your_branch>

Это сработало для меня, возможно, это будет полезно кому-то другому =)

Ответ 11

svn merge -c -M PATH

Это спасло мою жизнь.

У меня была одна и та же проблема, после того, как я снова вернулся, я не видел старый код. После выполнения вышеуказанной команды я получил чистый старый код версии.

Ответ 12

Если вы хотите полностью удалить фиксации из истории, вы также можете сделать дамп репо в конкретной ревизии, а затем импортировать этот дамп. В частности:

svnrdump dump -r 1:<rev> <url> > filename.dump

Команда svnrdump выполняет ту же функцию, что и svnadmin dump, но работает на удаленном репо.

Далее просто импортируйте файл дампа в свое репо. Это было проверено, чтобы хорошо работать на Beanstalk.

Ответ 13

Невозможно вернуться к конкретной версии bcoz, так как мы, люди, хорошо учили о слиянии двух рек, но не для того, чтобы отделить соус от карри (и это также имеет математику как управление версиями). Лучший и безопасный способ отменить свой код - проверить свой код на двух местах. Поэтому после фиксации (с первой проверки) вы обнаружите проблемы, которые можете совершить при второй проверке.