SVN: есть ли способ пометить файл как "не фиксировать"? - PullRequest
149 голосов
/ 11 марта 2009

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

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

РЕДАКТИРОВАТЬ: Спасибо за предложения использовать svn:ignore, но это не совсем то, что я искал.

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

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

Ответы [ 17 ]

116 голосов
/ 11 марта 2009

Subversion не имеет встроенной функции «не фиксировать» / «игнорировать при фиксации», по состоянию на февраль 2016 г. / версия 1.9. Этот ответ - неидеальный обход командной строки

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

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

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

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

svn cl work . -R

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

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

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

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

Когда вы будете готовы к фиксации ваших измененных файлов, которые вы хотите зафиксировать, вы просто добавите "--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 , существует давняя проблема на случай, если это изменится в будущем.

26 голосов
/ 17 сентября 2012

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

Я работаю в командной строке linux: поэтому я решил создать скрипт / 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 "$@"

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

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

sudo chmod +x /usr/bin/svnn

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

17 голосов
/ 11 марта 2009

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

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

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

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

8 голосов
/ 11 марта 2009

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

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

4 голосов
/ 23 ноября 2010

Я пришел к этой теме в поисках способа сделать «атомарный» коммит только для некоторых файлов, и вместо игнорирования некоторых файлов при коммите, я пошел другим путем и зафиксировал только те файлы, которые хотел:

svn ci filename1 filename2

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

3 голосов
/ 12 августа 2011

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

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

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

2 голосов
/ 23 июля 2009

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

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

1 голос
/ 18 апреля 2016

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

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

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

Протестировано с: TortoiseSVN 1.8.7, сборка 25475 - 64-битная, 2014/05/05 20:52:12, Subversion 1.8.9, -релиз

1 голос
/ 14 января 2015

Обновление скрипта user88044.

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

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

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

IGNORE_FILES = "$ (svn status --changelist 'не-коммит' | tail -n +3 | grep -oE '[^] + $')"

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

svn "$ @";

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

Скрипт находится в / usr / bin / svnn (sudo chmod + x / usr / bin / svnn)

svnn status, svnn commit и т.д ...

1 голос
/ 09 ноября 2013

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

Итак, вот скрипт Windows PowerShell, который фиксирует только файлы, которых нет в списке изменений:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...