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 за то, что заставляю меня прыгать через эти проклятые обручи, но я могу жить с этим. Думаю.
Ответ 15
svn:ignore
- ваш ответ.
Пример:
$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'
Ответ 16
svn propset "svn:ignore" "*.xml" .
*.xml
- это шаблон игнорируемых файлов;
вы также можете использовать имена каталогов.