Як ігнорувати каталог із SVN?


760

Щойно я почав використовувати SVN, і у мене є кеш-каталог, який мені не потрібен під контролем джерела. Як я можу ігнорувати весь каталог / папку за допомогою SVN?

Я використовую версії та TextMate в OS X та командному рядку.


3
Схожий питання відповів тут [SVN Checkout ігнорувати папки] [1] [1]: stackoverflow.com/questions/192824/svn-checkout-ignore-folder
mloskot

Можливий дублікат Як я ігнорую файли в Subversion? (Мене не надто переймає, куди йде дублікат; жоден набір відповідей, очевидно, не кращий за інший.)
Джеффрі Босбом,

Відповіді:


796

Встановіть svn:ignoreвластивість батьківського каталогу:

svn propset svn:ignore dirname .

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

svn propedit svn:ignore .

2
@Kouber: Ваша проблема полягає в тому, що розширення оболонки не знає про властивості svn: ignore. Отже, використовуючи '*' як параметр explicityl, передається tmp команді commit. Спробуйте щось на кшталт 'svn commit -m "Більше акцентів". "
MarkusSchaber

4
Дякую за відповідь. Піко як редактор: svn propedit svn: ignore. --editor-cmd pico
hade

157
Примітка: Це не працюватиме, якщо каталог вже "в" svn. svn rm --keep-local dirnameспочатку. (Моя продукція svn stat була величезною, і я наткнувся на це на деякий час.)
Ерік Аронесті

10
Якщо ви хочете ігнорувати більше одного файлу / папки, додайте всі їх імена до файлу txt, по одному рядку та використовуйте наступний варіант:svn propset svn:ignore -F file.txt .
petervaz

2
Будьте уважні, що ви поставили, svn:ignoreа не так, svn::ignoreяк я. Ви можете встановити довільні властивості, тож останній буде встановлено ОК, і ви зможете бачити та редагувати властивість, але це не змусить SVN ігнорувати перелічені файли.
Річард Тернер

406

Ось приклад структури каталогів:

\project
    \source
    \cache
    \other

Коли projectви бачите, що ваш каталог кешу не додається і відображається як такий.

> svn st
M  source
?  cache

Щоб встановити властивість ігнорування, виконайте це

svn propset svn: ігнорувати кеш.

звідки svn:ignoreназва ресурсу, який ви встановлюєте, cache- це значення властивості, і .це каталог, для якого ви встановлюєте цю властивість. Це повинен бути батьківський каталог cacheкаталогу, який потребує властивості.

Щоб перевірити, які властивості встановлені:

> svn proplist
Properties on '.':
  svn:ignore

Щоб побачити значення svn:ignore:

> svn propget svn:ignore
cache

Щоб видалити раніше встановлені властивості:

svn propdel svn:ignore

17
Тут є одна хитра точка, на яку я натрапив. Переконайтеся, що ви не додаєте косу рису dirname. Наприклад, під час введення тексту svn propset svn:ignore dirname, якщо ви дозволите оболонці (bash) заповнити dirname для вас, вона додасть цей косий ривок, залишаючи вам команду svn propset svn:ignore dirname/, що не призводить до ігнорування папки. Принаймні, це був мій досвід.
Девід Вайнрауб

4
Режим "кеш" все ще буде вказаний у "svn st". Чи є спосіб видалити його з подання? (без видалення з диска)
Том Бріто

131

Важливо зазначити:

У командному рядку ви не можете використовувати

svn add *

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

svn add --force .

зробіть так, як сказав @binco: svn add --force *НЕ працювати. Використовуйте крапку, а не зірку.
мануель

80

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

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


8
Не забудьте використати параметр --keep-local при видаленні файлів, якщо ви просто хочете їх ігнорувати, а фактично не видаляти.
Ділан Холмс

71

Щоб трохи розширити, якщо ви робите це за допомогою інструменту командного рядка svn, потрібно ввести:

svn propedit svn:ignore path/to/dir

який відкриє ваш текстовий редактор за вибором, а потім наберіть '*', щоб ігнорувати все, що знаходиться всередині нього, і зберегти + вийти - це буде включати сам каталог у svn, але ігнорувати всі файли всередині нього, ігнорувати каталог, використовувати шлях батьківського вводу, а потім введіть ім'я каталогу у файлі. Після збереження запустіть оновлення ('svn up') та перевірте відповідний шлях.


8
Дуже хороший момент, дякую. Усі інші відповіді пропустили випадки вкладених каталогів. Отже, у наведеному вище прикладі (працюючи) ви вводите редактор ignored_directory (який, за припущенням, на один рівень нижче шляху / до / dir). Це не працює, хоча: svn propedit svn: ignore. а потім ввести в редактор шлях / до / dir / ignored_directory. IOW: SVN відповідає об'єктам один рівень вниз за один раз.
зелений чоловік

30

Встановіть svn:ignoreвластивість у батьківському каталозі:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

Це замінить будь-яке поточне значення svn:ignore. Ви редагуєте значення за допомогою:

$ svn pe svn:ignore .

Що відкриє ваш редактор. Можна додати кілька шаблонів, по одному на рядок.

Ви можете переглянути поточне значення за допомогою:

$ svn pg svn:ignore .

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


3
svn ps svn:ignore . 'cachedir'результати в cachedir is not under version control. змінився на svn ps svn:ignore 'cachedir' .працював для мене
Ді Капріо

21

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


Коли папки вже перебувають під контролем редагування

Після імпорту svn та svn co файлів, що ми зазвичай робимо вперше.

Весь кеш часу виконання, папки вкладених файлів знаходяться під контролем версій. так, перед svn ps svn: ігноруйте , нам потрібно видалити його з сховища.

З версією SVN 1.5 вище ми можемо використовувати svn del --keep-local your_folder, але для більш ранньої версії моє рішення:

  1. SVN експортує чисту копію ваших папок (без .svnприхованої папки)
  2. svn del the local and сховище,
  3. svn ci
  4. Скопіюйте назад папки
  5. Чи svn st і підтверджують, що папки позначені як "?"
  6. Тепер ми можемо робити svn ps згідно з рішеннями

Коли нам потрібно ігнорувати більше однієї папки

  • В одному каталозі у мене дві папки, які потрібно встановити як svn:ignore
  • Якщо ми встановимо один, інший буде видалено.
  • Тоді ми дивуємося, що нам потрібен svn pe

svn peпотрібно буде відредагувати текстовий файл, і ви можете використовувати цю команду, якщо потрібно, щоб встановити текстовий редактор за допомогою vi :

export SVN_EDITOR=vi
  1. За допомогою "o" ви можете відкрити новий рядок
  2. Введіть усі назви папок, які ви хочете ігнорувати
  3. Натисніть клавішу 'esc', щоб вийти з режиму редагування
  4. Введіть ": wq", потім натисніть, Enterщоб зберегти та вийти

Файл виглядає приблизно так:

runtime
cache
attachments
assets

Ви також можете використовувати svn propset svn:ignore -F .ignorethesefiles ., який буде використовувати вміст файлу. Мені подобається тримати його навколо, щоб ви знали, що ігнорується. Для редагування потрібна додаткова підтримка.
Джерард ONeill

20

Видаліть спочатку ...

Якщо ваш каталог fooвже знаходиться під контролем версій, видаліть його спочатку за допомогою:

svn rm --keep-local foo

... тоді ігноруйте:

svn propset svn:ignore foo .

12

... і якщо ви хочете ігнорувати більше однієї директорії (скажімо , build/ temp/і *.tmpфайли), ви можете або зробити це в два етапи (ігноруючи перший і редагувати ігнорувати властивості (див інші відповіді тут) або один міг би написати що - щось на зразок

svn propset svn:ignore "build
temp
*.tmp" .

в командному рядку.


12

Якщо ви використовуєте конкретний клієнт SVN TortoiseSVN , тоді при фіксації у вас є можливість клацання правою кнопкою миші та вибору "Додати в список ігнорування".


9

Команда ігнорувати кілька записів є трохи хитрою і вимагає зворотних косих рисок.

svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .

Ця команда буде ігнорувати все з ім'ям cache, tmp, nullі and_so_onв поточному каталозі.


6
І лише для уточнення: зворотний нахил тут не є особливістю svn; це просто спосіб ввести багаторядковий рядок на оболонці. Ви також можете скористатися редактором і просто записати кілька рядків.
sleske

Зворотна риса не потрібна. bash досить розумний, щоб знати, що "відкрито, і не обробляти рядок. Все, що вам потрібно зробити, це натиснути клавішу Enter після кешу, tmp та null. Ви побачите, що bash змінює підказку на a>, щоб ви знали вас Ви все ще входите до команди. Альтернативно - почати вводити команду (svn), потім натиснути esc, а потім v. Це дозволить вам ввести команду в редакторі. Після завершення команди натисніть ZZ, якщо ви передумаєте. і не хочете страчувати, тоді: q !.
Майкл Поттер

1
svn propset svn:ignore -F .ignorethesefiles .дозволить вам використовувати файл. І як уже згадувалося, ви завжди пропедитували.
Джерард ONeill

5

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

ПРИКЛАД:

/стовбур

/ магістраль / кеш

/ trunk / cache / subdir1

/ trunk / cache / subdir2

cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci

4

"Дякую"Svn за такий огидний, хибний і складний спосіб ігнорування файлів.

Тому я написав сценарій svn-ignore-all :

#!/bin/sh

# svn-ignore-all

# usage: 
#   1. run svn status to see what is going on at each step 
#   2. add or commit all files that you DO want to have in svn
#   3. remove any random files that you don't want to svn:ignore
#   4. run this script to svn:ignore everything marked '?' in output of `svn status`

svn status |
grep '^?' |
sed 's/^? *//' |
while read f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

Також для ігнорування конкретного списку файлів / імен, ми можемо використовувати цей варіант svn-ignore . Я думаю, svn-ignore-все справді має бути схожим на xargs svn-ignore.

#!/bin/sh

# svn-ignore

# usage:
#   svn-ignore file/to/ignore ...

for f; do
    d=`dirname "$f"`
    b=`basename "$f"`
    ignore=`svn propget svn:ignore "$d"`
    if [ -n "$ignore" ]; then
        ignore="$ignore
"
    fi
    ignore="$ignore$b"
    svn propset svn:ignore "$ignore" "$d"
done

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


Гей, Сем, це приємний сценарій. Питання спливе в моїй голові: чи, можливо, проблема виникає в тому, що ігнорування цілої папки, що є частиною сховища, не працює, тож ми закінчуємо цим "?" файли, які в основному є модифікованими файлами в папках, які ми додали до списку ігнорування? Мені просто цікаво, чи є шлях до вашого сценарію, як це було б втомливо постійно його виконувати. Чи ти?
SquareCat

ні, я не дуже його використовую! просто спробуйте прибрати мої файли
Сем Уоткінс


3

Якщо ваш каталог проектів названий / Project, а ваш кеш-каталог названий / Project / Cache, тоді вам потрібно встановити властивість субверсії на / Project. Назва властивості має бути "svn: ignore", а значення властивості має бути "Кеш".

Докладнішу інформацію про властивості див. На цій сторінці в посібнику з Subversion.


3

Відповідь Джейсона зробить трюк. Однак замість встановлення svn: ігноруйте "." у кеш-каталозі ви можете включити "кеш" у батьківський каталог svn: ігнорувати властивість, якщо каталог кешу не завжди присутній. Я роблю це у ряді папок, що «викидаються».


3

ЗБЕРІГАТИ ДИРЕКТОРИ, ЩО СВН ВІДПРАВИ:

  1. це видалить файли з сховища, але утримуйте каталог під контролем SVN:

svn delete --keke-локальний шлях / каталог_to_keep / *

  1. потім встановіть ігнорувати каталог (і весь вміст):

svn propset svn: ігнорувати "*" шлях / каталог_to_keep


2

Якщо ви використовуєте фронтенд для SVN, як TortoiseSVN, або якусь інтеграцію IDE, у цьому ж меню також має бути варіант ігнорування, як операція фіксація / додавання.


1

Встановіть властивість svn: ignore . Більшість інструментів для використання інтерфейсу користувача мають спосіб зробити це, а також обговорення командного рядка у посиланні.


1

Оскільки ви використовуєте версії, це насправді дуже просто:

  • Перегляньте перевірену копію
  • Клацніть каталог, щоб ігнорувати
  • У полі "Ігнорувати праворуч клацніть Правка
  • Введіть *. *, Щоб ігнорувати всі файли (або * .jpg лише для файлів jpg тощо)

1

Слідкуйте також за своїми косою рискою. Я виявив, що в тому числі images/*в моєму файлі налаштувань ігнорування не ігнорував ./images/. Коли я побіг, svn status -uвсе одно показав ? images. Отже, я просто змінив налаштування ігнорування на просто images, без косої риски. Запустив перевірку стану, і це очистило його.


1

Вирішено затьмаренням наступним чином:

Перш за все, виконайте синхронізацію вашої папки з проектом:

команда -> синхронізувати

У наступному перегляді команди, ви можете побачити всі ресурси, які ви можете скористатись сервером SVN.

Отже, виберіть папку ресурсу ресурсу, який ви хочете проігнорувати, а потім можете ігнорувати його за допомогою

команда -> додати до svn:ignore.

Після цього у вікні підтвердження виберіть перший варіант: "ігнорувати по імені".

Наприклад, якщо я хочу проігнорувати цільову папку та їхні ресурси .class, я зроблю синхронізацію, і в режимі синхронізації я виберу цільову папку. Після цього я виберу

команда-> додати

до, svn:ignoreа потім я підтверджую перший варіант у вікні підтвердження.


0

Втративши багато часу, шукаючи, як зробити цю просту діяльність, я вирішив опублікувати, що не важко було знайти гідне пояснення.

Спочатку дозвольте структурі вибірки

$ svn st? проект / ствол / ціль? project / trunk / myfile.x

1 - спочатку налаштуйте редактор, у моєму випадку vim export SVN_EDITOR = vim

2 - "svn propedit svn: ігнорує проект / trunk /" відкриє новий файл, і ви можете додати свої файли та підкаталог в нашому випадку типу "target" зберегти та закрити файл і працює

$ svn st? project / trunk / myfile.x

Дякую.

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