SVN: Есть ли способ отметить файл как "не совершать"?

С TortoiseSVN я могу переместить файл в список изменений в списке изменений, поэтому, когда я передаю целое дерево, изменения в этом файле не будут зафиксированы.

Есть ли способ сделать что-то подобное с помощью инструмента командной строки svn?

EDIT: Спасибо за предложения по использованию svn:ignore, но это не делает то, что я искал.

svn:ignore влияет на такие вещи, как svn add и svn import. Это дает ему список шаблонов имен файлов, которые нужно игнорировать.

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

Ответ 1

Subversion не имеет встроенной функции "не совершать" / "игнорировать при фиксации", начиная с февраля 2016 года и версии 1.9. Этот ответ является неидеальным решением командной строки

Как указывает OP, TortoiseSVN имеет встроенный список изменений "ignore-on-commit", который автоматически исключается из коммитов. Клиент командной строки этого не имеет, поэтому вам нужно использовать несколько списков изменений для выполнения такого же поведения (с оговорками):

  • один для работы, которую вы хотите совершить [работа]
  • один для вещей, которые вы хотите игнорировать [ignore-on-commit]

Так как там есть TortoiseSVN, я использую "ignore-on-commit" в своих примерах для файлов, которые я не хочу комментировать. Я буду использовать "работу" для файлов, которые я делаю, но вы можете выбрать любое имя, которое вы хотели.

Сначала добавьте все файлы в список изменений под названием "work" . Это должно быть выполнено из корня вашей рабочей копии:

svn cl work . -R

Это приведет к тому, что все файлы в рабочей копии будут рекурсивно перенесены в список изменений под названием "work" . Недостаток заключается в том, что при добавлении новых файлов в рабочую копию вам нужно будет специально добавить новые файлы, иначе они не будут включены. Во-вторых, если вам нужно запустить это снова, вам нужно будет снова добавить все ваши файлы "ignore-on-commit". Не идеально - вы можете начать поддерживать свой собственный список "игнорировать" в файле, как это делали другие.

Затем для файлов, которые вы хотите исключить:

svn cl ignore-on-commit path\to\file-to-ignore

Поскольку файлы могут находиться только в одном списке изменений, запуск этого добавления после добавления предыдущего "рабочего" файла приведет к удалению файла, который вы хотите игнорировать, из списка изменений "work" и поместить его в список изменений "ignore-on-commit".

Когда вы готовы зафиксировать свои измененные файлы, которые вы хотите совершить, вы просто добавили бы "-cl work" к вашей фиксации:

svn commit --cl work -m "message"

Вот какой простой пример выглядит на моей машине:

D:\workspace\trunk>svn cl work . -R
Skipped '.'
Skipped 'src'
Skipped 'src\conf'
A [work] src\conf\db.properties
Skipped 'src\java'
Skipped 'src\java\com'
Skipped 'src\java\com\corp'
Skipped 'src\java\com\corp\sample'
A [work] src\java\com\corp\sample\Main.java
Skipped 'src\java\com\corp\sample\controller'
A [work] src\java\com\corp\sample\controller\Controller.java
Skipped 'src\java\com\corp\sample\model'
A [work] src\java\com\corp\sample\model\Model.java
Skipped 'src\java\com\corp\sample\view'
A [work] src\java\com\corp\sample\view\View.java
Skipped 'src\resource'
A [work] src\resource\icon.ico
Skipped 'src\test'

D:\workspace\trunk>svn cl ignore-on-commit src\conf\db.properties
D [work] src\conf\db.properties
A [ignore-on-commit] src\conf\db.properties

D:\workspace\trunk>svn status

--- Changelist 'work':
        src\java\com\corp\sample\Main.java
        src\java\com\corp\sample\controller\Controller.java
        src\java\com\corp\sample\model\Model.java
M       src\java\com\corp\sample\view\View.java
        src\resource\icon.ico

--- Changelist 'ignore-on-commit':
M       src\conf\db.properties

D:\workspace\trunk>svn commit --cl work -m "fixed refresh issue"
Sending        src\java\com\corp\sample\view\View.java
Transmitting file data .done
Committing transaction...
Committed revision 9.

Альтернативой было бы просто добавить каждый файл, который вы хотите совершить, к списку изменений "работа", и даже не содержать список игнорирования, но это тоже большая работа. Действительно, единственное простое, идеальное решение - если/когда это реализуется в SVN. В этой проблеме существует много вопросов, связанных с отслеживанием проблем Subversion, SVN-2858, если это изменится в будущем.

Ответ 2

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

Я работаю над командной строкой linux: поэтому мое решение заключается в создании script/usr/bin/svnn (да, с двумя "n"!) следующим образом:

#! /bin/bash
DIR=/home/mike/dev/trunk

IGNORE_FILES="\
        foo/pom.xml \
        foo/src/gwt/App.gwt.xml \
        foo/src/main/java/gwt/Common.gwt.xml \
        foo/src/main/resources/context/datasource/local.xml \
        foo/src/main/resources/context/environment/local.xml"

for i in $IGNORE_FILES; do mv $DIR/$i $DIR/"$i"_; done;

svn "[email protected]"

for i in $IGNORE_FILES; do mv $DIR/"$i"_ $DIR/$i; done;

Очевидно, что это связано с моей ситуацией - но просто измените DIR и IGNORE_FILES в соответствии с вашими настройками dev. Вспомните, чтобы изменить script на исполняемый файл с помощью:

sudo chmod +x /usr/bin/svnn

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

Ответ 3

Я не верю, что есть способ игнорировать файл в репозитории. Мы часто сталкиваемся с этим с помощью web.config и других файлов конфигурации.

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

Например, в repo находится файл с именем web.config.default, который имеет значения по умолчанию. Затем создайте новую задачу, которая переименует все файлы web.config.default в web.config, которые затем могут быть настроены на локальные значения. Эта задача должна вызываться, когда извлекается новая рабочая копия или выполняется сборка.

Вам также необходимо проигнорировать созданный файл web.config, чтобы он не был привязан к репозиторию.

Ответ 4

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

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

Ответ 5

Я пришел к этой теме, ища способ сделать "атомарную" фиксацию только некоторых файлов, и вместо того, чтобы игнорировать некоторые файлы при фиксации, я пошел в другую сторону и только выполнил файлы, которые я хотел:

svn ci filename1 filename2

Может быть, это поможет кому-то.

Ответ 6

Ребята, я только нашел решение. Учитывая, что TortoiseSVN работает так, как мы хотим, я попытался установить его под Linux - это значит, что работает на Wine. Удивительно, но это работает! Все, что вам нужно сделать, это:

  • Добавьте файлы, которые вы хотите пропустить, выполнив: "svn changelist 'ignore-on-commit'".
  • Использовать TortoiseSVN для фиксации: "~/.wine/drive_c/Program\Files/TortoiseSVN/bin/TortoiseProc.exe/command: commit/path: '
  • Исключенные файлы будут не отмечены для фиксации по умолчанию, а другие измененные файлы будут проверены. Это точно так же, как в Windows. Наслаждайтесь!

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

Ответ 7

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

Чтобы получить конфликт для a-file, ваша рабочая копия (WC) не имеет обновленного a-file из репозитория и что a-file в вашем WC имеет изменения, которые находятся в том же месте, что и изменения в репозитории (изменения, которые вы еще не обновили). Если вы не хотите ждать вышеуказанных условий, вы можете создать конфликт для a-file следующим образом:
В рабочей копии 1 (WC1) добавьте строку текста вверху a-file, например, "создайте конфликт здесь". Используйте необходимый синтаксис, чтобы вы не разбивали репозиторий. Зафиксировать a-file из WC1. В WC2 добавьте другую строку текста вверху a-file, например "Я хочу конфликт". Обновление с WC2, и теперь a файл должен быть в конфликте.

Ответ 8

Вместо этого я написал помощник bash script, который запускает svn commit для всех файлов, которые вам нужны, и ни у кого из них нет. Таким образом, у вас гораздо больше контроля.

Например, с одной строкой вы можете передать все файлы с расширениями .h и .cpp, на которые вы вносили изменения (и которые не вызвали бы конфликт):

svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`

Измените/добавьте расширения в часть [h|cpp]. Добавьте сообщение журнала между кавычками -m "", если необходимо.

Ответ 9

Некоторые предлагаемые идеи могут быть реализованы следующим образом:

В Windows в PowerShell

добавить все в список по умолчанию list.ps1

dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }

добавить в игнор list.ps1

 dir file1 ... filN  % { $_.FullName } > ignore-on-commit
 cat .\ignore-on-commit | % { svn cl ignore-on-commit $_ }
 svn add ignore-on-commit

Теперь вы можете создать псевдоним svn ci --changelist default, чтобы вам не приходилось указывать его каждый раз. Дополнительным преимуществом является то, что вы можете сохранить список "игнорировать-на-коммите" (если хотите) в репозитории.

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

Ответ 10

Мне надоело ждать, чтобы это было встроено в SVN. Я использовал tortoiseSVN с ignore-on-commit, но это всплывающее диалоговое окно пользователя, которое вы не можете подавить из командной строки, а когда я запустил свою сборку script и пойти и сделать чашку чая, я ненавижу это когда я возвращаюсь, чтобы обнаружить, что он ждет ввода пользователем 10% пути.

Итак, здесь windows powershell script, который фиксирует только файлы, которые не находятся в списке изменений:

# get list of changed files into targets
[XML]$svnStatus = svn st -q --xml C:\SourceCode\Monad
# select the nodes that aren't in a changelist
$fileList = $svnStatus.SelectNodes('/status/target/entry[wc-status/@item != "unversioned"]') | Foreach-Object {$_.path};
# create a temp file of targets
$fileListPath =  [IO.Path]::GetTempFileName();
$fileList | out-file $fileListPath -Encoding ASCII
# do the commit
svn commit --targets $fileListPath -m "Publish $version" --keep-changelists 
# remove the temp file
Remove-Item $filelistPath

Ответ 11

Обновление user88044 script.

Идея состоит в том, чтобы выталкивать файлы в списке изменений do-not-commit и запускать зло script.

script извлекает файлы do-not-commit из команды: svn status --changelist 'do-not-commit'

#!/Бен/bash   DIR = "$ (PWD)"

IGNORE_FILES = "$ (svn status --changelist 'do-not-commit' | tail -n +3 | grep -oE '[^] + $')"

для я в $IGNORE_FILES; do mv $DIR/$i $DIR/ "$ i" _; сделано;

svn "$ @";

для я в $IGNORE_FILES; do mv $DIR/ "$ i" _ $DIR/$i; сделано;

script помещается в /usr/bin/svnn (sudo chmod + x/usr/bin/svnn)

svnn status, svnn commit и т.д.

Ответ 12

Поскольку я столкнулся с одной и той же проблемой, и мой поисковик не дал мне ничего, я думаю, что нашел обходной путь. Вот что я сделал, это работает для меня, но поскольку я застрял в старой версии SVN (< 1,5, так как у нее нет опции -keep-local), и я не эксперт Я не могу быть уверенным, что это универсальное решение. Если это сработает и для вас, пожалуйста, дайте мне знать!

Я имел дело с установкой Prestashop, которую я получил от SVN, так как другие люди уже начали работать над ней. Поскольку настройки БД выполнялись для другого сервера, я поменял их в каком-либо файле в папке /config. Поскольку эта папка уже была версией, установка ее в svn: ignore не помешала бы моим локальным изменениям на ней. Вот что я сделал:

cp config ../cfg_bkp              # copy the files out of the repo
svn rm config                     # delete files both from svn and "physically"
svn propset svn:ignore "config" . # as the files no longer exists, I can add my ignore rule and then...
mv ../cfg_bkp config              # ...bring'em back
svn revert --recursive config     # make svn forget any existing status for the files (they won't be up for deletion anymore)

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

Ответ 13

Вы можете настроить список изменений "ignore-on-commit" непосредственно с помощью TortoiseSVN. Не нужно настраивать какой-либо другой список изменений, включая все остальные файлы.

1) Нажмите "SVN Commit..." (мы не будем фиксировать, просто найти графическое меню для списка изменений) 2) В списке Щелкните правой кнопкой мыши файл, который вы хотите исключить. 3) Меню: перейдите в список изменений > ignore-on-commit

В следующий раз, когда вы выполните SVN Commit... В конце списка будут отображаться неконтролируемые файлы в категории ignore-on-commit.

Протестировано с помощью: TortoiseSVN 1.8.7, Build 25475 - 64 бит, 2014/05/05 20:52:12, Subversion 1.8.9, -release

Ответ 14

Это уже поздно, но я нашел самую сложную команду командной строки для этой проблемы. Выполнено с помощью bash. Наслаждайтесь.

svn status | grep -v excluding | sed 's/^A */"/g; s/$/"/g' | tr '\n' ' ' | xargs svn commit -m "My Message"

Итак, вот объяснение команды. Некоторые вещи нужно будет изменить на основе вашего прецедента.

svn status

Я получаю список всех файлов. Они все начнут с этих символов статуса (?,!, A и т.д.). Каждый из них находится в собственных линиях.

grep -v excluding

Я использую grep для фильтрации списка. Его можно либо использовать обычно (для включения), либо с помощью флага -v (для исключения). В этом случае он используется для исключения, при этом фраза "исключая" будет тем, что будет исключено.

sed 's/^. */"/g; s/$/"/g'

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

tr '\n' ' '

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

xargs svn commit -m "My Message"

Наконец, я использую xargs для выполнения моей команды commit с сообщением. Он выполняет фиксацию и возвращает список цитированных файлов в качестве последнего аргумента.

В результате все работает так, как я хочу. Я все еще ненавижу svn за то, что заставляю меня прыгать через эти проклятые обручи, но я могу жить с этим. Думаю.

Ответ 16

svn propset "svn:ignore" "*.xml" .

*.xml - это шаблон игнорируемых файлов; вы также можете использовать имена каталогов.