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

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

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

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

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

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

Ответы [ 17 ]

1 голос
/ 20 мая 2013

Некоторые из предложенных идей могут быть реализованы так:

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

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

1 голос
/ 12 мая 2011

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

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

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

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

1 голос
/ 28 сентября 2017

Это поздно в игре, но я нашел самую классную команду командной строки для этой проблемы. Закончено с использованием 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 за то, что заставлял меня прыгать через эти проклятые обручи, но я могу с этим смириться. Я думаю.

0 голосов
/ 26 июля 2012

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

Я имел дело с установкой 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. в корне репо без добавления моего конфига, даже если он не соответствует версии репо (я думаю, мне придется пройти через все это снова, если я изменю его еще раз, не тестировал). Я также могу обновить svn, не перезаписывая файлы и не получая ошибок.

0 голосов
/ 11 марта 2009
svn propset "svn:ignore" "*.xml" .

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

0 голосов
/ 24 апреля 2018

Решение, которое не игнорирует изменения в свойствах каталога

Я пытался использовать решение, основанное на changelist, но у меня есть пара проблем с ним. Во-первых, в моем хранилище тысячи файлов, поэтому список изменений, который нужно зафиксировать, огромен, и мой вывод svn status стал слишком длинным и его нужно было проанализировать, чтобы быть полезным. Наиболее важным является то, что я хотел зафиксировать изменения, которые произошли от слияния, что означает, что они включают изменения свойств. При фиксации списка изменений свойства svn, прикрепленные к каталогу, не фиксируются, поэтому мне пришлось сделать дополнительную фиксацию:

svn ci --cl work -m "this commits files from the work changelist only"
svn up
svn ci --depth empty DIR . -m "record merge properties"

Возможно, вам придется сделать это для нескольких каталогов (здесь я записываю свойства DIR и текущего каталога .), в основном те, которые имеют M во втором столбце при выдаче команды svn status .

Решение

Я использовал патчи и svn patch. В псевдокоде:

svn diff $IGNORE_FILES > MYPATCH   # get the mods to ignore
svn patch --reverse-diff MYPATCH   # remove the mods
svn ci -m "message"                # check-in files and directory properties
svn patch MYPATCH                  # re-apply the mods

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

#! /usr/bin/env bash

finish() {
    svn patch MYPATCH               # re-apply the mods
}
trap finish EXIT

IGNORE_FILES="\
sources/platform/ecmwf-cca-intel-mpi.xml \
runtime/classic/platform/ecmwf-cca.job.tmpl \
runtime/classic/platform/ecmwf-cca-intel.xml"

svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore
svn patch --reverse-diff MYPATCH # remove the mods

svn "$@"

Обычно я использовал его с ci и revert -R ..

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

svn:ignore ваш ответ.

Пример:

$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...