SVN: Чи існує спосіб позначати файл як "не виконувати"?


153

За допомогою TortoiseSVN я можу перемістити файл у список змін ігнорувати при здійсненні, так що коли я виконую ціле дерево, зміни до цього файлу не виконуються.

Чи є спосіб зробити щось подібне за допомогою інструмента командного рядка svn?

EDIT: Дякую за пропозиції використовувати svn:ignore, але це не зовсім те, що я шукав.

svn:ignoreвпливає на такі речі, як svn add& svn import. Це дає йому список шаблонів назв файлів, які слід ігнорувати.

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


1
Існує спосіб використання статусу особистої гілки та переключення. [Дивіться інші мої пост на цю тему.] [1] [1]: stackoverflow.com/questions/862950 / ...
ptitpion

Відповіді:


120

Subversion не має вбудованої функції "не виконувати" / "ігнорувати при здійсненні" станом на лютий 2016 року / версія 1.9. Ця відповідь є неідеальним вирішенням командного рядка

Як зазначається в ОП, TortoiseSVN має вбудований список змін, "ігнорувати-на-виконувати", який автоматично виключається з комітетів. У клієнта командного рядка цього немає, тому вам потрібно скористатися декількома списками змін, щоб виконати таку саму поведінку (із застереженнями) :

  • один для роботи, яку ви хочете зробити [робота]
  • один для речей, які ви хочете ігнорувати [ignore-on-počin]

Оскільки у TortoiseSVN є прецедент, у своїх прикладах я використовую "ignore-on-commit" для файлів, які я не хочу робити. Я буду використовувати "роботу" для файлів, які я роблю, але ви можете вибрати будь-яке ім'я.

Спочатку додайте всі файли до списку змін під назвою "робота". Це потрібно виконати з кореня вашої робочої копії:

svn cl work . -R

Це додасть усі файли в робочій копії рекурсивно до списку змін під назвою "робота". У цьому є недолік - оскільки нові файли додаються до робочої копії, вам потрібно буде спеціально додати нові файли, інакше вони не будуть включені. По-друге, якщо вам доведеться запустити це ще раз, вам потрібно буде знову додати всі свої файли "ігнорувати-на-фіксувати" знову. Не ідеально - ви можете почати вести власний список "ігнорувати" у файлі, як це робили інші.

Потім для файлів, які потрібно виключити:

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 , якщо це зміниться в майбутньому.


1
Я додав два файли з командою, яку ви згадали: $svn st --- Changelist 'ignore-on-commit': M database.php M config.php і все-таки вони були надіслані до репортажу на фіксацію. Будь-яка ідея, що я зробив не так?
Аттіла Фулоп

7
Додавання файлів до списку змін "ігнорувати-на-фіксувати" саме по собі не перешкоджає вчиненню файлів. TortoiseSVN (клієнт GUI-інтерфейс Windows) побудував у відношенні "ігнорувати-на-виконувати", але командний рядок svn цього не робить. Єдиною пропозицією, яку я мав у своєму початковій відповіді, було додати файли, які ви хочете зробити, до списку змін, і сказати це зробити це
Джошуа МакКіннон

7
Ігнорувати-на-вчинення, безумовно, є список зарезервованих черепах. Все, що він робить, - це не дозволяти елементам перевірятись у графічному інтерфейсі за замовчуванням, тож це особливість графічного інтерфейсу Turtoise. Вам не потрібно використовувати командний рядок для додавання до списку, якщо ви користуєтесь графічним інтерфейсом. Просто контекстне меню для елементів списку комісій, і внизу ви можете перемістити їх до списку змін, і ігнорувати при виконанні вже визначено. tortoisesvn.net/docs/release/TortoiseSVN_en/…
tjmoore

це не зробив джек. вона все здійснила.
ahnbizcad

Не працює, питання спеціально задається щодо рішення командного рядка, а не GUI.
riv

26

Я послідовно знайшов себе в цій ситуації теж: і не групи змін працювати для мене - я хочу , щоб зробити короткий список файлів , які я НЕ хочу робити, а не підтримувати масовий список файлів , які я зробити покупку здійснити!

Я працюю в командному рядку 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 відповідно до вашої настройки програми. Remeber змінить сценарій на виконуваний за допомогою:

sudo chmod +x /usr/bin/svnn

.. тоді ви просто використовуєте "svnn" замість "svn" для запуску субверсії, не боячись перевірити локальні зміни файлів у списку IGNORE_FILES. Я сподіваюся, що це допомагає!


Нарешті, ця відповідь насправді правильна. Вам потрібно написати якийсь інструмент. Це насправді недосконало, тому що я хочу мати динамічний варіант, як-от svnn ignore configs/*- із подвійними знаками та дзвіночками. Я думаю, що я щось подібне пишу, а потім повертаюся сюди!
Томаш Гандор

це чудово! Ще краще створити псевдонім у .bashrc для svn -> svnn. Ще краще, замість того, щоб вказати файли, які слід ігнорувати всередині команди, він може вести себе як git, він перевірить .ignore-файл всередині папки та ігнорує кожен файл, що відповідає шаблону.
Тарек

Замість того, щоб повторно вчитися вводити текст svnn, подумайте про те, щоб викликати його svnта розмістити цей скрипт у тому, що може бути на початку вашої PATH, наприклад ${HOME}/bin. З самого сценарію ви б зателефонували /usr/bin/svn.
Joost

17

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

Хоча це не ідеально, рішення, яке я найчастіше бачу і використовую, - це мати файл .default і невідкладне завдання для створення локальних копій.

Наприклад, у репо є файл, який називається, web.config.defaultякий має значення за замовчуванням. Потім створіть нант-завдання, яке перейменовано всі web.config.defaultфайли, web.configякі потім можуть бути налаштовані під локальні значення. Це завдання слід викликати, коли буде отримана нова робоча копія або запущена збірка.

Вам також потрібно буде проігнорувати створений web.configфайл, щоб він не був прив’язаний до сховища.


8

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

Це вимагає додаткової роботи для вас, і ви можете застосувати список змін лише до вашої робочої копії (очевидно, уявіть собі хаос, який може настати, якщо ви можете застосувати властивість "ніколи не оновлювати" до версії!).


1
Але саме цього ми хочемо. Наприклад, вихідний файл, для якого потрібно встановити defaultUserId = yourId, а не системний стандарт.
orbfish

4

Я підійшов до цієї теми, шукаючи спосіб зробити «атомну» фіксацію лише деяких файлів, і замість того, щоб ігнорувати деякі файли на фіксацію, я пішов іншим шляхом і лише зафіксував потрібні файли:

svn ci filename1 filename2

Можливо, комусь це допоможе.


Ваша відповідь - лише одна адекватна пропозиція в цій темі. svn ciпросто псевдонім svn commit. Команда "
Коміт"

3

Хлопці, я щойно знайшов рішення. Враховуючи, що TortoiseSVN працює так, як ми хочемо, я спробував встановити його під Linux - це означає, що працює на Wine. Дивно це працює! Все, що вам потрібно зробити, це:

  1. Додайте файли, які ви хочете пропустити, запустивши: "svn change list 'ignore-on-commit'".
  2. Використовуйте TortoiseSVN, щоб зробити: "~ / .wine / drive_c / Program \ Files / TortoiseSVN / bin / TortoiseProc.exe / command: commit / path: '
  3. Файли, що виключаються, не буде встановлено прапорці для фіксації за замовчуванням, тоді як інші змінені файли будуть перевірені. Це точно так само, як і під Windows. Насолоджуйтесь!

(Причина, чому потрібно виключати файли CLI, полягає в тому, що запис меню для цього не знайдено, не впевнений, чому. У будь-якому випадку це працює чудово!)


2

Конфліктні файли не можуть здійснюватися. Ви можете скористатись цим, щоб уникнути приватних змін із сховища. Це найкраще працює з невеликою кількістю файлів.

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


1

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

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

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

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


1

Деякі із запропонованих ідей можна реалізувати так:

У Windows в PowerShell

додати все до списку за замовчуванням.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

Я втомився чекати, коли це вбудується у SVN. Я використовував tortoiseSVN з ігноруванням-на-комірі, але це з'являється діалогове вікно користувача, яке ви не можете придушити з командного рядка, і коли я запускаю сценарій побудови та піднімаю чашку чаю, я ненавиджу його, коли Я повертаюся, щоб дізнатися, що він очікує на введення користувачем 10% шляху.

Ось ось скрипт Windowshellshell, який виконує лише файли, які не входять до списку змін:

# 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

1

Оновлення сценарію user88044.

Ідея полягає у натисканні файлів у списку змін, які не виконують, та запустіть злий сценарій.

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

#! / bin / bash DIR = "$ (pwd)"

IGNORE_FILES = "$ (статус svn - змінник" виконувати не робити "| хвіст -n +3 | grep -oE '[^] + $')"

для i в $ IGNORE_FILES; робити mv $ DIR / $ i $ DIR / "$ i" _; зроблено;

svn "$ @";

для i в $ IGNORE_FILES; робити mv $ DIR / "$ i" _ $ DIR / $ i; зроблено;

Сценарій розміщується в / usr / bin / svnn (sudo chmod + x / usr / bin / svnn)

статус svnn, фіксація svnn тощо.


1

Ви можете налаштувати список змін "ігнорувати-здійснити", безпосередньо з TortoiseSVN. Не потрібно налаштовувати жоден інший список змін, включаючи всі інші файли

1) Клацніть на "SVN Commit ..." (ми не будемо виконувати, просто спосіб знайти графічне меню для списку змін) 2) У списку правою кнопкою миші натисніть на файл, який ви хочете виключити. 3) Меню: перейдіть до списку змін> ігнорувати-на-виконувати

Наступного разу, коли ви виконуватимете SVN-зобов’язання ... Файли з’являтимуться без позначення в кінці списку під категорією ігнорувати-на-виконувати.

Тестовано з: TortoiseSVN 1.8.7, збірка 25475 - 64 біт, 2015/05/05 20:52:12, Subversion 1.8.9, -випуск


1
youps, я щойно побачив коментарі tjmoore, які вже дають хорошу інформацію для користувача tortoiseSVN ... жодного командного рядка tortoisesvn.net/docs/release/TortoiseSVN_en/…
luney

Це зламано в 1.9?
Джейк Хм

1

Це вже пізно в грі, але я знайшов найдивовижнішу команду командного рядка для цієї проблеми. Виконано з використання 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, щоб виконати команду фіксації повідомлення. Він виконує фіксацію і відкидає мій список цитованих файлів як останній аргумент.

Результат полягає в тому, що в кінцевому підсумку все працює так, як я цього хочу. Я все ще ненавиджу svn за те, що змушує мене стрибати через ці прокляті обручі, але я можу з цим жити. Я вважаю.


0

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


0

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

Я намагався використовувати рішення на основі 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та поточного 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 ..


-1

svn:ignore це ваша відповідь.

Приклад:

$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'

1
Зауважте, вищенаведений приклад показує, як використовувати раніше налаштований файл cvsignore як вхід до вашого властивості svnignore.
Бен Гофштейн

1
no svn: ignore - це лише файли з конверсією. не працює з файлами версій
Серхіо

1
А також це не місцево. Це зміна властивості, яка буде здійснена сама собою.
Адам Бадура

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

*.xmlє зразком ігнорованих файлів; тут також можна використовувати імена каталогів.


3
-1 тому, що ви не можете проігнорувати файл, який є частиною сховища.
целюс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.