Есть ли способ зафиксировать файл "частично" в TortoiseSVN? - PullRequest
44 голосов
/ 24 ноября 2008

Я хотел бы зафиксировать только часть файла, используя TortoiseSVN, есть ли способ сделать это?

Я приведу пример, чтобы прояснить, почему я хочу это сделать.

У меня есть файл с некоторыми определениями, которые заменяются в процессе сборки, что-то вроде этого:

#define SOME_PATH "[SOME_PATH]"

Этот тег [SOME_PATH] заменяется в процессе сборки, но когда я пишу код, я должен изменить его, чтобы фактический путь в моей машине.

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

Есть ли какой-нибудь способ сказать TortoiseSVN "игнорировать" некоторые изменения, скажем, в строках X, Y и Z?

Ответы [ 8 ]

66 голосов
/ 16 января 2014

Ответ с наибольшим количеством голосов устарел.

С веб-сайта tortoiseSVN: http://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-commit.html

Фиксация только частей файлов

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

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

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

12 голосов
/ 24 ноября 2008

Нет. Subversion работает на уровне файлов.

7 голосов
/ 24 ноября 2008

номер

Лучший способ сделать это - зарегистрировать какой-нибудь файл, такой как "build_paths.h.default", затем на каждой платформе сборки скопировать его в build_paths.h, изменить его так, чтобы он подходил, а затем передать SVN в IGNORE build_paths.h , И, наконец, #include "buiild_paths.h" в вашей программе.

5 голосов
/ 27 июня 2013

В общем да! Функциональность была добавлена ​​в последней версии torroise svn (1.8). См. примечания к выпуску * 1002. середина новой функции, и вы заметили ошибку и хотите зафиксировать ситуацию "только исправление ошибки".

В вашей ситуации я использую файл шаблона, который используется в процессе сборки для создания фактического используемого файла (этот файл создается только из файла шаблона, больше ничего нет). У меня есть файл tempalte в SVN, но острый файл игнорируется. Это означает, что мне нужно собрать только один раз после новой проверки, и тогда моя рабочая копия в порядке - но значения для тегов не зафиксированы. Если мне нужно добавить новые теги, я делаю это в файле tempalte и перестраиваю свою рабочую копию.

4 голосов
/ 03 декабря 2008

Решение вашей проблемы состоит не в том, чтобы заставить Subversion сделать это для вас, а в том, чтобы сконфигурировать ваше приложение таким образом, чтобы специфические для среды сведения (такие как значение [SOME_PATH]) сохранялись «извне» для кода, который проверен .

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

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

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

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

4 голосов
/ 24 ноября 2008

Короткая версия: НЕТ. Subversion - это система "все или ничего" (как и все известные мне системы контроля версий)

Более длинная версия: Нет, однако, если вы используете что-то вроде NANT для сборки, вы можете использовать xmlpoke или аналогичный для перезаписи частей файла при сборке. Работает для нас :) Мы переписываем около 6 файлов web.config и различные другие файлы конфигурации приложения при сборке (ну, при сборке пакета развертывания) ....

1 голос
/ 24 ноября 2008

Вы также можете определить:

  • хук предварительной фиксации, который позаботится о вас для отката,
  • и хук post-commit для восстановления вашего файла.

Ой ... на самом деле это не очень хорошая идея, согласно SVN Manual .

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

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

0 голосов
/ 24 ноября 2008

То, что вы ищете, является функцией различных распределенных систем контроля версий, таких как darcs .

...