Щойно я почав використовувати SVN, і у мене є кеш-каталог, який мені не потрібен під контролем джерела. Як я можу ігнорувати весь каталог / папку за допомогою SVN?
Я використовую версії та TextMate в OS X та командному рядку.
Щойно я почав використовувати SVN, і у мене є кеш-каталог, який мені не потрібен під контролем джерела. Як я можу ігнорувати весь каталог / папку за допомогою SVN?
Я використовую версії та TextMate в OS X та командному рядку.
Відповіді:
Встановіть svn:ignore
властивість батьківського каталогу:
svn propset svn:ignore dirname .
Якщо у вас є кілька речей, які потрібно ігнорувати, розділіть у значеннях властивості нові рядки. У цьому випадку простіше редагувати значення властивості за допомогою зовнішнього редактора:
svn propedit svn:ignore .
svn rm --keep-local dirname
спочатку. (Моя продукція svn stat була величезною, і я наткнувся на це на деякий час.)
svn propset svn:ignore -F file.txt .
svn:ignore
а не так, svn::ignore
як я. Ви можете встановити довільні властивості, тож останній буде встановлено ОК, і ви зможете бачити та редагувати властивість, але це не змусить SVN ігнорувати перелічені файли.
Ось приклад структури каталогів:
\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
dirname
. Наприклад, під час введення тексту svn propset svn:ignore dirname
, якщо ви дозволите оболонці (bash) заповнити dirname для вас, вона додасть цей косий ривок, залишаючи вам команду svn propset svn:ignore dirname/
, що не призводить до ігнорування папки. Принаймні, це був мій досвід.
Важливо зазначити:
У командному рядку ви не можете використовувати
svn add *
Це також додасть ігноровані файли, оскільки командний рядок розширюється *
і тому svn add
вважає, що ви хочете, щоб усі файли були додані. Тому використовуйте це замість:
svn add --force .
svn add --force *
НЕ працювати. Використовуйте крапку, а не зірку.
Оскільки я витратив деякий час, намагаючись змусити це працювати, слід зазначити, що якщо файли вже є у SVN, вам потрібно svn delete
їх, а потім відредагуйтеsvn:ignore
властивість.
Я знаю, що це здається очевидним, але вони продовжували показуватися, як ?
у моєму svn status
списку, коли я думав, що це просто ігнорує їх на місцевому рівні.
Щоб трохи розширити, якщо ви робите це за допомогою інструменту командного рядка svn, потрібно ввести:
svn propedit svn:ignore path/to/dir
який відкриє ваш текстовий редактор за вибором, а потім наберіть '*', щоб ігнорувати все, що знаходиться всередині нього, і зберегти + вийти - це буде включати сам каталог у svn, але ігнорувати всі файли всередині нього, ігнорувати каталог, використовувати шлях батьківського вводу, а потім введіть ім'я каталогу у файлі. Після збереження запустіть оновлення ('svn up') та перевірте відповідний шлях.
Встановіть svn:ignore
властивість у батьківському каталозі:
$ cd parentdir
$ svn ps svn:ignore . 'cachedir'
Це замінить будь-яке поточне значення svn:ignore
. Ви редагуєте значення за допомогою:
$ svn pe svn:ignore .
Що відкриє ваш редактор. Можна додати кілька шаблонів, по одному на рядок.
Ви можете переглянути поточне значення за допомогою:
$ svn pg svn:ignore .
Якщо ви користуєтесь графічним інтерфейсом, для цього має бути опція меню.
svn ps svn:ignore . 'cachedir'
результати в cachedir is not under version control
. змінився на svn ps svn:ignore 'cachedir' .
працював для мене
Дякуємо за всі внески вище. Я просто хотів би поділитися деякою додатковою інформацією зі свого досвіду під час ігнорування файлів.
Коли папки вже перебувають під контролем редагування
Після імпорту svn та svn co файлів, що ми зазвичай робимо вперше.
Весь кеш часу виконання, папки вкладених файлів знаходяться під контролем версій. так, перед svn ps svn: ігноруйте , нам потрібно видалити його з сховища.
З версією SVN 1.5 вище ми можемо використовувати svn del --keep-local your_folder
, але для більш ранньої версії моє рішення:
.svn
прихованої папки)Коли нам потрібно ігнорувати більше однієї папки
svn:ignore
svn pe
потрібно буде відредагувати текстовий файл, і ви можете використовувати цю команду, якщо потрібно, щоб встановити текстовий редактор за допомогою vi :
export SVN_EDITOR=vi
Файл виглядає приблизно так:
runtime
cache
attachments
assets
svn propset svn:ignore -F .ignorethesefiles .
, який буде використовувати вміст файлу. Мені подобається тримати його навколо, щоб ви знали, що ігнорується. Для редагування потрібна додаткова підтримка.
Якщо ваш каталог foo
вже знаходиться під контролем версій, видаліть його спочатку за допомогою:
svn rm --keep-local foo
svn propset svn:ignore foo .
... і якщо ви хочете ігнорувати більше однієї директорії (скажімо , build/
temp/
і *.tmp
файли), ви можете або зробити це в два етапи (ігноруючи перший і редагувати ігнорувати властивості (див інші відповіді тут) або один міг би написати що - щось на зразок
svn propset svn:ignore "build
temp
*.tmp" .
в командному рядку.
Якщо ви використовуєте конкретний клієнт SVN TortoiseSVN , тоді при фіксації у вас є можливість клацання правою кнопкою миші та вибору "Додати в список ігнорування".
Команда ігнорувати кілька записів є трохи хитрою і вимагає зворотних косих рисок.
svn propset svn:ignore "cache\
tmp\
null\
and_so_on" .
Ця команда буде ігнорувати все з ім'ям cache
, tmp
, null
і and_so_on
в поточному каталозі.
svn propset svn:ignore -F .ignorethesefiles .
дозволить вам використовувати файл. І як уже згадувалося, ви завжди пропедитували.
У мене виникли проблеми з ігноруванням вкладених каталогів; верхній каталог, який я хотів ігнорувати, не відображатиметься зі статусом svn, але всі підкаталоги. Це, мабуть, зрозуміло для всіх інших, але я думав, що поділюсь цим:
ПРИКЛАД:
/стовбур
/ магістраль / кеш
/ trunk / cache / subdir1
/ trunk / cache / subdir2
cd /trunk
svn ps svn:ignore . /cache
cd /trunk/cache
svn ps svn:ignore . *
svn ci
"Дякую"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 ігнорувати "старий".
Bash oneliner для кількох ігнорувань:
svn propset svn:ignore ".project"$'\n'".settings"$'\n'".buildpath" "yourpath"
Якщо ваш каталог проектів названий / Project, а ваш кеш-каталог названий / Project / Cache, тоді вам потрібно встановити властивість субверсії на / Project. Назва властивості має бути "svn: ignore", а значення властивості має бути "Кеш".
Докладнішу інформацію про властивості див. На цій сторінці в посібнику з Subversion.
Якщо ви використовуєте фронтенд для SVN, як TortoiseSVN, або якусь інтеграцію IDE, у цьому ж меню також має бути варіант ігнорування, як операція фіксація / додавання.
Встановіть властивість svn: ignore . Більшість інструментів для використання інтерфейсу користувача мають спосіб зробити це, а також обговорення командного рядка у посиланні.
Слідкуйте також за своїми косою рискою. Я виявив, що в тому числі images/*
в моєму файлі налаштувань ігнорування не ігнорував ./images/
. Коли я побіг, svn status -u
все одно показав ? images
. Отже, я просто змінив налаштування ігнорування на просто images
, без косої риски. Запустив перевірку стану, і це очистило його.
Вирішено затьмаренням наступним чином:
Перш за все, виконайте синхронізацію вашої папки з проектом:
команда -> синхронізувати
У наступному перегляді команди, ви можете побачити всі ресурси, які ви можете скористатись сервером SVN.
Отже, виберіть папку ресурсу ресурсу, який ви хочете проігнорувати, а потім можете ігнорувати його за допомогою
команда -> додати до
svn:ignore
.
Після цього у вікні підтвердження виберіть перший варіант: "ігнорувати по імені".
Наприклад, якщо я хочу проігнорувати цільову папку та їхні ресурси .class, я зроблю синхронізацію, і в режимі синхронізації я виберу цільову папку. Після цього я виберу
команда-> додати
до, svn:ignore
а потім я підтверджую перший варіант у вікні підтвердження.
Втративши багато часу, шукаючи, як зробити цю просту діяльність, я вирішив опублікувати, що не важко було знайти гідне пояснення.
Спочатку дозвольте структурі вибірки
$ svn st? проект / ствол / ціль? project / trunk / myfile.x
1 - спочатку налаштуйте редактор, у моєму випадку vim export SVN_EDITOR = vim
2 - "svn propedit svn: ігнорує проект / trunk /" відкриє новий файл, і ви можете додати свої файли та підкаталог в нашому випадку типу "target" зберегти та закрити файл і працює
$ svn st? project / trunk / myfile.x
Дякую.