Почему я не могу редактировать сообщение фиксации SVN?

12

Я использую SVN. Иногда я что-то пропускаю, когда пишу сообщение коммита. Но как только оно будет зафиксировано, его нельзя отменить, и даже я не могу отредактировать сообщение. Почему они не включили в него функцию редактирования?

Санхьюн Ли
источник
7
Напоминает мне историю Dave.cpp на thedailtywtf
Сокол
1
Просто используйте git , он позволяет объединять коммиты, редактировать сообщения и делать все что угодно с вашей историей.
SK-logic
Или, если вы не можете, тогда используйте, git-svnи никто не будет мудрее.
Мэтью Шарли
@ Matthew: как с помощью git-svn вы можете изменить историю в репозитории svn-репозитория с отключенным редактированием истории?
gbjbaanb
2
@gbjbaanb: Это не так, если вы уже зашли на сервер SVN. Но если вы сделали коммит только локально, вы все равно можете изменить сообщение коммита, прежде чем отправлять его в живое репо.
Мэтью Шарли

Ответы:

15

В соответствии с SVN FAQ вы можете это сделать, если администратор хранилища включил его или у вас есть локальный административный доступ к хранилищу .

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

Томас Оуэнс
источник
4
@ Matthew Даже в Git, изменение истории в любой момент, на мой взгляд, ужасная идея. Предполагается, что история служит следом аудита и никогда не должна быть изменена кем-либо в любой момент и по любой причине.
Томас Оуэнс
2
Так что имейте контрольный журнал для сообщения фиксации, потому что обычно целью изменения сообщения фиксации является облегчение отслеживания истории проекта.
Питер Тейлор
2
Предположим, я обнаружил, что сообщение о коммите, которое я ввел месяц назад, вводит в заблуждение, сбивает с толку и совершенно неверно . Разве я не смогу добавить корректирующую запись, которая будет видна всем, кто видит неправильное сообщение? (Я согласен, что исходное сообщение должно быть легко доступно без изменений, а само изменение должно отслеживаться и иметь отметки времени. Но я не согласен с тем, что это составляет «изменяющуюся историю».)
Дэвид Шварц,
2
Неверная информация недопустима, поэтому людям не должно быть разрешено исправлять или уточнять эту информацию, так как это может скрыть их злодеяние. Вау. Просто вау.
Дэвид Шварц
3
Вы честно начинаете выглядеть как самопародия. «Это должно быть правильно, поэтому оно никогда не должно быть исправлено».
Дэвид Шварц
5

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

Проверьте SVN FAQ здесь.

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

Первый способ заключается в том, чтобы администратор хранилища включил изменение свойств ревизии. Это делается путем создания ловушки, называемой pre-revprop-change (см. Этот раздел в книге Subversion для более подробной информации о том, как это сделать). Хук «pre-revprop-change» имеет доступ к старому сообщению журнала до того, как оно будет изменено, поэтому он может каким-то образом его сохранить (например, отправив электронное письмо). После того, как изменения свойств ревизии включены, вы можете изменить сообщение журнала ревизии, передав ключ --revprop в svn propedit или svn propset, как любой из этих:

$svn propedit -r N --revprop svn:log URL 
$svn propset -r N --revprop svn:log "new log message" URL 

где N - номер редакции, чье лог-сообщение вы хотите изменить, а URL-адрес - местоположение хранилища. Если вы запустите эту команду из рабочей копии, вы можете пропустить URL.

Второй способ изменить сообщение в журнале - использовать svnadmin setlog. Это должно быть сделано путем обращения к расположению хранилища в файловой системе. Вы не можете изменить удаленный репозиторий с помощью этой команды.

$ svnadmin setlog REPOS_PATH -r N FILE

где REPOS_PATH - местоположение хранилища, N - номер редакции, чье сообщение журнала вы хотите изменить, а FILE - файл, содержащий новое сообщение журнала. Если хук «pre-revprop-change» не установлен (или по какой-то причине вы хотите обойти скрипт хука), вы также можете использовать опцию --bypass-hooks. Однако, если вы решите использовать эту опцию, будьте очень осторожны. Вы можете обойти такие вещи, как уведомления об изменениях по электронной почте или системы резервного копирования, которые отслеживают свойства изменений.

Ответ Камиля Кисиеля в ответ на аналогичный вопрос о переполнении стека .

Абимаран Кугатасан
источник
Когда вы копируете и вставляете ответ из stackoverflow, вы должны как минимум пометить его как цитату и отдать должное OP (в данном случае Камил Кисиэль). Ссылка на оригинал: stackoverflow.com/questions/304383/… Пожалуйста, измените свой ответ, или я собираюсь понизить ваш рейтинг.
Сокол
4

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

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

l0b0
источник
Они могут разрешить несколько версий сообщения коммита ...
Алекс Фейнман
1
@ l0b0 объективно ли хуже продолжать распространять информацию, которая является ложной, вводящей в заблуждение или способной нанести ущерб? Ведение записей не требует сохранения неверных данных.
user179700
1
@ user179700: Ты прав. Во всех VCS, которые я когда-либо видел, есть принципиально ошибочное предположение: коммит имеет одно сообщение коммита, которое является неизменным. Как говорит Алекс, мы должны «разрешить несколько версий сообщения коммита».
10
@ l0b0 Мне интереснее этот вопрос, чем больше я его обдумываю. Моя первая реакция была такой: просто пиши внимательнее. Текущая практика, кажется, мешает процессу. Мне тоже интересно, если какие-либо другие системы реализуют более надежную практику. Время для другого вопроса +1
179700
@ user179700: В настоящее время я надеюсь написать скрипт, который позволит вам изменить сообщение коммита, но только путем добавления (с отметкой времени) дополнительной строки. Это позволяет исправлять ошибки, сохраняя контрольный журнал.
Тайнам