Убрать случайную регистрацию


вы используете subversion и случайно проверяете какой-то код, прежде чем он будет готов. Например, я часто: а) проверяю какой-то код, затем б) немного редактирую, затем в) нажимаю, вводим, чтобы повторить предыдущую команду, которая, к сожалению, была проверкой.

можно ли убрать такую случайную проверку с сервера с помощью subversion?

11 56
svn

11 ответов:

NB: это, вероятно, не будет работать на текущих версиях SUBVERSION и это плохая идея - но я оставил его здесь для информации

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

это не то, что вы обычно хотите, но если вы действительно хотите удалить фактическую зафиксированную версию из репозитория, тогда вы можете сделать неприятный откат в репозитории следующим образом (это предполагает, что $REV устанавливается в последнюю версию, которую вы удаляете):

  • резервное копирование репозитория во-первых, как эти изменения могут нарушить его (и читать предположения ниже)
  • вернуть локальную копию к предыдущей редакции, чтобы она не запуталась (svn revert -r $((REV-1)))
  • в репозитории, удалить db/revs/$REV и db/revprops/$REV
  • в репозитории, удалить db/current и (для Subversion 1.6 или выше) db/rep-cache.db, и запустить svnadmin recover .
  • (возможно) отрегулируйте разрешения на db/rep-cache.db предупреждения попытка записи в базу данных только для чтения ошибки

все это предполагает:

  • вы используете fsfsна основе репозиторий
  • Subversion релиз больше, чем 1.5.0 (в противном случае вам придется вручную редактировать db/current и изменить номер версии, а не работает svnadmin recover .)
  • никакие другие последующие изменения не были совершены
  • у вас есть доступ на запись в файловую систему репозитория
  • вы не боитесь, что кто-то еще попытается получить к нему доступ, пока вы делаете выше

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

посмотреть SVNBook, в частности, раздел "отмена изменений" и обратное слияние.

другое общее использование для слияния svn-откат изменения, которое уже было зафиксировано. Предположим, вы счастливо работаете над рабочей копией /calc/trunk, и вы обнаружите, что изменение было сделано еще в редакции 303, которая изменила целое число.с, это совершенно неправильно. Это никогда не должно было быть совершено. Вы можете использовать svn merge для "отмены" изменения в вашем рабочая копия, а затем зафиксируйте локальную модификацию в репозитории. Все, что вам нужно сделать, это указать обратную разницу:

$ svn merge-r 303: 302 http://svn.example.com/repos/calc/trunk

чтобы уточнить, ваше первоначальное изменение будет все еще быть в хранилище. Но теперь вы отказались от него в более поздней редакции. т. е. репозиторий захватил все ваши изменения (что действительно то, что вы хотите! Если вы проверили в пароль открытого текста или аналогичный!)

предупреждение: принятый ответ (Дэвид Фрейзер) должен работать с репозиторием SVN 1.5, но с SVN 1.6 вы также должны удалить db/rep-cache.db перед следующим коммитом или вы повредите свой репозиторий и может не осознавать этого до следующего раза, когда вы попробуете полную проверку. Я видел, что последующие полные проверки терпят неудачу с ошибкой" неправильный заголовок представления".

что такое rep-cache.дБ, вы можете спросить? Элемент документация по FSFS макет говорит, что вы потеряете "rep-sharing возможности", если вы удалите этот файл; однако он будет воссоздан при следующем фиксации. общее представление было добавлено в 1.6.

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

см. также как мы отслеживаем ветвь нашей рабочей копии? : -)

Если то, что вы имели в виду, как я могу чисто удалить историю случайной проверки: Это очень сложно.

svn не позволяет отменить что-либо, так как он сохраняет изменения в виде наборов изменений. Тем не менее, есть некоторые инструменты, которые позволяют вам делать почти все на дампе репозитория. Ты может:

  1. выброси свой РЕПО.

  2. использовать svndumpfilter С svn admin tools чтобы избавиться о регистрации.

  3. положите его обратно в репозиторий.

но это может полностью разрушить ваше РЕПО, поэтому никогда не пытайтесь сделать это, если вы абсолютно не знаете, что делаете, и все резервное копирование.

вы не можете удалить ревизию-несколько ответов здесь, кажется, совершенно не понимают, что вы хотите. Но вы можете изменить контрольное сообщение, чтобы указать, что это было непреднамеренно. Чеки не стоят очень много, поэтому наличие нечетного дополнительного не имеет большого значения.

Да, это действительно то, для чего существует Subversion.

Что вам нужно сделать, это просто заменить копию с предыдущей версией в репозитории SVN.

есть несколько вариантов:

  1. заменить на ревизию.
  2. заменить на URL
  3. последний из репозитория (но в вашем случае, у вас уже есть последняя)
  4. заменить на ветку

но я настоятельно рекомендую вам сделать следующее Перед замените локальную копию:

  1. сделайте "сравнение с репозиторием / ревизией / URL".

Я бы сомневался. Одна из основных идей системы управления версиями заключается в том, что репозиторий не теряет никакой истории. Вы не можете удалить историю. Лучшее, что вы можете сделать, это получить более старую версию и перезаписать текущую. Но журналы истории все равно покажут вашу ошибку.

(Offtopic: какой IDE вы используете, что делает что-то подобное?)

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

чтобы прокомментировать это также: Это серия команд, которые я сделал в репозитории, чтобы вернуть его из версии 2 обратно в версию 1. Вам также нужно будет проверить в конце.

Last login: Mon Apr 13 16:01:34 on ttys004
[wlynch@orange ~] cd /tmp
[wlynch@orange /tmp] svnadmin create foo
[wlynch@orange /tmp] svn co file:///tmp/foo foo-repo
Checked out revision 0.
[wlynch@orange /tmp] cd foo-repo/
[wlynch@orange foo-repo] ls
[wlynch@orange foo-repo] touch blah
[wlynch@orange foo-repo] touch repl
[wlynch@orange foo-repo] touch bar
[wlynch@orange foo-repo] svn add *
A         bar
A         blah
A         repl
[wlynch@orange foo-repo] svn ci
Adding         bar
Adding         blah
Adding         repl
Transmitting file data ...
Committed revision 1.
[wlynch@orange foo-repo] echo "hi" > bar
[wlynch@orange foo-repo] echo "oh no" > blah
[wlynch@orange foo-repo] svn ci
Sending        bar
Sending        blah
Transmitting file data ..
Committed revision 2.
[wlynch@orange older-foo] svn diff -r 1:2 file:///tmp/foo
Index: bar
===================================================================
--- bar (revision 1)
+++ bar (revision 2)
@@ -0,0 +1 @@
+hi
Index: blah
===================================================================
--- blah    (revision 1)
+++ blah    (revision 2)
@@ -0,0 +1 @@
+oh no

[wlynch@orange foo-repo] svn diff -r 1:2 file:///tmp/foo | patch -R
patching file bar
patching file blah    

иногда необходимо отредактировать РЕПО на сервере, например, когда вы случайно совершили пароль, который трудно изменить. Вот метод, который я считаю полностью безопасным (ответ от @David Fraser вызвал для меня коррупцию РЕПО). NB этот метод удалит только изменения из конца РЕПО, поэтому он наиболее полезен, если вы сразу заметите свою ошибку.

  1. сообщить всем пользователям, что РЕПО переходит в автономный режим и что им нужно создать новая проверка с сервера.
  2. отключите РЕПО, сделайте резервную копию и переместите основное РЕПО в безопасное место с именем reponame_old.
  3. сбросьте свое РЕПО в однофайловое представление, оставив нежелательные изменения в конце:
    • svnadmin dump -r 0:N > reponame.dump
    • например svnadmin dump -r 0:6610 > reponame.dump удалит обороты 6611 вперед
    • обратите внимание, что файл repodump может быть в два раза больше вашей папки РЕПО.
  4. создать новый репо, чтобы загрузить эти изменения в:
    • svnadmin create reponame
  5. загрузите обрезанный набор ревизий в новое РЕПО
    • svnadmin load reponame < reponame.dump
  6. примените все необходимые настройки к вашему новому РЕПО (например, крючки) и верните его в сервис.
    • мы используем сервер VisualSVN, поэтому пришлось восстановить conf\VisualSVN-WinAuthz.ini-файл.
    • мы также видели некоторое странное поведение, пока мы не перезагрузили сервер, поэтому VisualSVN может кэшируйте состояние РЕПО; YMMV с другими настройками хостинга.
  7. Не забудьте либо удалить резервную копию с секретными данными, либо поместить ее в безопасное место.
  8. скажите всем пользователям, чтобы сделать новый svn checkout С сервера РЕПО.