Як ігнорувати файли в Subversion?


645

Як ігнорувати файли в Subversion?

Крім того, як знайти файли, які не знаходяться під контролем версій?


Приємно бачити, як кожне просте запитання (можливо, від користувача git) означає багато складних відповідей. Якщо це трапиться, це дитина-підривник.
Валеріо Бозз

Відповіді:


738

(Цю відповідь було оновлено, щоб вона відповідала поведінці SVN 1.8 та 1.9)

У вас є 2 питання:

Позначення файлів як ігнорованих:

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

Проігноровані файли задаються "шаблоном файлів". Синтаксис і формат шаблонів файлів пояснюється в онлайн-документації SVN: http://svnbook.red-bean.com/nightly/en/svn.advanced.props.special.ignore.html "Шаблони файлів у підривному режимі".

Subversion, починаючи з версії 1.8 (червень 2013 р.) Та пізнішої версії, підтримує 3 різних способи визначення шаблонів файлів. Ось короткий опис із прикладами:

1 - Зона конфігурації виконання - global-ignoresопція:

  • Це налаштування лише для клієнта , тому ваш global-ignoresсписок не буде наданий спільним доступом для інших користувачів, і він стосується всіх репостів, які ви оформляєте на свій комп’ютер.
  • Цей параметр визначено у вашому файлі області конфігурації виконання:
    • Windows (на основі файлів) - C:\Users\{you}\AppData\Roaming\Subversion\config
    • Windows (на основі реєстру) - і Software\Tigris.org\Subversion\Config\Miscellany\global-ignoresв HKLMі HKCU.
    • Linux / Unix - ~/.subversion/config

2 - svn:ignoreВластивість, встановлена ​​в каталогах (а не файлах):

  • Це зберігається в межах репо, тому інші користувачі матимуть ті самі файли ігнорування. Подібно до того, як .gitignoreпрацює.
  • svn:ignoreзастосовується до каталогів і є нерекурсивним або спадковим. Будь-який файл або безпосередній підкаталог батьківського каталогу, який відповідає файловому шаблону, буде виключено.
  • У той час як SVN 1.8 додає поняття "успадковані властивості", сама svn:ignoreвластивість ігнорується в каталогіх, що не мають безпосереднього нащадка:

    cd ~/myRepoRoot                             # Open an existing repo.
    echo "foo" > "ignoreThis.txt"                # Create a file called "ignoreThis.txt".
    
    svn status                                  # Check to see if the file is ignored or not.
    > ?    ./ignoreThis.txt
    > 1 unversioned file                        # ...it is NOT currently ignored.
    
    svn propset svn:ignore "ignoreThis.txt" .   # Apply the svn:ignore property to the "myRepoRoot" directory.
    svn status
    > 0 unversioned files                       # ...but now the file is ignored!
    
    cd subdirectory                             # now open a subdirectory.
    echo "foo" > "ignoreThis.txt"                # create another file named "ignoreThis.txt".
    
    svn status
    > ?    ./subdirectory/ignoreThis.txt        # ...and is is NOT ignored!
    > 1 unversioned file
    

    (Отже, файл ./subdirectory/ignoreThisне ігнорується, навіть якщо " ignoreThis.txt" застосовано у .кореневому репо).

  • Тому, щоб застосувати список ігнорування рекурсивно, ви повинні використовувати svn propset svn:ignore <filePattern> . --recursive.

    • Це створить копію властивості у кожному підкаталозі.
    • Якщо <filePattern>значення у довіднику різниться, то значення дитини повністю перекриває батьків, тому "аддитивного" ефекту немає.
    • Отже, якщо ви змінюєте <filePattern>корінь на корінь ., тоді ви повинні змінити його, --recursiveщоб перезаписати його на каталоги дітей та нащадків.
  • Зауважу, що синтаксис командного рядка є протиінтуїтивним.

    • Я почав вважати, що ви будете ігнорувати файл у SVN, ввівши щось подібне, svn ignore pathToFileToIgnore.txtоднак це не функція ігнорування SVN.

3- svn:global-ignoresВласність. Потрібен SVN 1.8 (червень 2013 р.):

  • Це схоже на те svn:ignore, за винятком того, що він використовує функцію "успадкованих властивостей" SVN 1.8.
  • Порівняйте з svn:ignore, шаблон файлу автоматично застосовується у кожному каталозі нащадків (не тільки безпосередньо дітей).
    • Це означає , що немає необхідності встановлювати svn:global-ignoresз --recursiveпрапором, як успадковані ігнорувати шаблони файлів автоматично застосовуються , як вони успадкували.
  • Запуск того ж набору команд, що і в попередньому прикладі, але використовуючи svn:global-ignoresзамість цього:

    cd ~/myRepoRoot                                    # Open an existing repo
    echo "foo" > "ignoreThis.txt"                       # Create a file called "ignoreThis.txt"
    svn status                                         # Check to see if the file is ignored or not
    > ?    ./ignoreThis.txt
    > 1 unversioned file                               # ...it is NOT currently ignored
    
    svn propset svn:global-ignores "ignoreThis.txt" .
    svn status
    > 0 unversioned files                              # ...but now the file is ignored!
    
    cd subdirectory                                    # now open a subdirectory
    echo "foo" > "ignoreThis.txt"                       # create another file named "ignoreThis.txt"
    svn status
    > 0 unversioned files                              # the file is ignored here too!
    

Для користувачів TortoiseSVN:

Ця ціла домовленість була для мене заплутаною, тому що термінологія TortoiseSVN (як використовується в їхній системі меню Windows Explorer) спочатку мене вводила в оману - я не знав, яке значення має меню Ігнорувати "Додати рекурсивно", "Додати *" та "Додати" варіанти. Сподіваюсь, у цій публікації пояснено, як функція «Ігнорувати» пов'язана з функцією SVN Properties. Враховуючи це, я пропоную використовувати командний рядок для встановлення ігнорованих файлів, щоб ви відчували, як він працює, а не використовувати графічний інтерфейс і лише використовувати графічний інтерфейс для маніпулювання властивостями, коли вам зручно використовувати командний рядок.

Перелічення файлів, які ігноруються:

Команда svn statusприховає ігноровані файли (тобто файли, які відповідають global-ignoresшаблону RGA , або відповідатимуть шаблону безпосереднього батьківського каталогу svn:ignoreабо відповідатимуть шаблону будь-якого попереднього каталогу svn:global-ignores.

Скористайтеся --no-ignoreопцією, щоб побачити перелічені файли. Проігноровані файли мають статус I, а потім передають вихід, щоб grepвони показували лише рядки, починаючи з "Я".

Команда така:

svn status --no-ignore | grep "^I"

Наприклад:

svn status
> ? foo                             # An unversioned file
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore
> ? foo                             # An unversioned file
> I ignoreThis.txt                  # A file matching an svn:ignore pattern
> M modifiedFile.txt                # A versioned file that has been modified

svn status --no-ignore | grep "^I"
> I ignoreThis.txt                  # A file matching an svn:ignore pattern

та-да!


6
Щоб знайти ігноровані файли: svn status -u -v --no-ignore | grep "^ I" | awk "{print \ $ 2}"
Крістіан Мадсен

3
якщо ви хочете ігнорувати файл ./FolderA/FolderB/FileToIgnore, зробіть це зі свого. папка: svn propset svn: ігноруйте "FileToIgnore" FolderA / FolderB /
jnj

8
якщо ви ssh'ing svn propedit svn:ignore .і не налаштований текстовий редактор, ви отримаєте повідомлення про помилку із записом svn: E205007: жодна зі змінних оточення SVN_EDITOR, VISUAL або EDITOR не встановлена, і опція конфігурації 'editor-cmd' не встановлена. знайдено замість того, щоб відкрити редактор. Тож просто вкажіть --editor-cmd nano, як цеsvn propedit svn:ignore . --editor-cmd nano
Джонатан Моралес Велес

12
Ви також можете ігнорувати файли з певним іменем файлу у всіх папках, використовуючи аргумент "--recursive". тобто svn propset svn: ігнорувати "* .jpg". --рекурсивний
тамплієр

2
Більш простою альтернативою awk є grep:svn status | grep '^?'
Johnride

91

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

svn status | grep "^\?" | awk "{print \$2}" > ignoring.txt

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

svn propset svn:ignore -F ignoring.txt .

Зверніть увагу на крапку в кінці рядка. Він повідомляє SVN, що властивість встановлюється в поточному каталозі.

Видаліть файл:

rm ignoring.txt

Нарешті зобов’язатись,

svn ci --message "ignoring some files"

Потім ви можете перевірити, які файли ігноруються через:

svn proplist -v

2
Приємно. Невелике поліпшення є svn status | awk "/^?/ {print \$2}" > ignoring.txt.
Дірк Еддельбюттель

4
навіщо видаляти файл? тримати його в репо, якщо вам потрібно створити / додати / видалити
tgkprog

Зауважте, що це рішення не буде ігнорувати файли у підкаталогах (навіть якщо вони з’являються в igno.txt).
shaneb

Чи збереже це існуючі ігнори? Якщо ні, то як це зробити в одній команді (тобто --no-ignores та дотримуватись також рядків, які передують I)?
a1an

Це перезаписать ваші поточні ігнори, спробуйте: svn pg svn:ignore . >> ignore.txtпісля першої команди додати поточні ігнори до файлу.
ulitosCoder

54

.Gitignore як підхід

Ви можете ігнорувати файл або каталог на зразок .gitignore. Просто створіть текстовий файл із списку каталогів / файлів, які ви хочете ігнорувати, та запустіть код нижче:

svn propset svn:ignore -F ignorelist.txt .

АБО якщо ви не хочете використовувати текстовий файл, ви можете зробити це так:

svn propset svn:ignore "first
 second
 third" .

Джерело: Блог Карстен - Встановіть svn: ігноруйте для декількох файлів з командного рядка


1
Зауважте, що якщо згодом ви модифікуєте файл ігнорування, вам потрібно повторно скористатися svn:ignoreкомандою (див. Stackoverflow.com/a/58380306/189518 )
Sensei James

50

Якщо ви використовуєте TortoiseSVN , клацніть правою кнопкою миші на файл, а потім виберіть TortoiseSVN / Додати до списку ігнорування . Це додасть файл / підстановку до svn:ignoreвластивості.

svn:ignoreбуде перевірено під час перевірки файлів, а відповідні файли будуть ігноровані. У мене є такий список ігнорування для проекту Visual Studio .NET:

bin obj
*.exe
*.dll
_ReSharper
*.pdb
*.suo

Ви можете знайти цей список у контекстному меню за адресою TortoiseSVN / Properties .


26

Як ніхто, здається, не згадував про це ...

svn propedit svn:ignore .

Потім відредагуйте вміст файлу, щоб вказати шаблони, які слід ігнорувати, вийдіть із редактора і все завершено.


3
Ця відповідь була корисною. У моєму випадку мені потрібно було змінити "". до підкаталогу файлу, який я хотів проігнорувати і просто вказати шаблон файлу. Також перший раз мені потрібно було запустити це (я на Mac): export SVN_EDITOR = "nano"
Ілля Лофгрен

22

Я знайшов статтю .svnignore Приклад для Java .

Приклад: .svnignore для Ruby on Rails,

/log

/public/*.JPEG
/public/*.jpeg
/public/*.png
/public/*.gif

*.*~

А після цього:

svn propset svn:ignore -F .svnignore .

Приклади для .gitignore. Ви можете використовувати для свого .svnignore

https://github.com/github/gitignore


1
Я зробив, як ти сказав ... але коли я запускаю статус svn. він все ще показує ігноровані файли з "?"
Харшит Гупта

Я ніколи не перевіряв статус svn, але зі svn add *, і після цього svn фіксація ігнорування файлів не виконує.
д.данаїлов

якщо файл "a.txt" вже знаходиться в контролі версій, то ігнорування виконується командою типу "svn propset svn: ignore -F .svnignore a.txt"? це правильно ?
errakeshpd

Якщо ви додасте "a.txt" у свій .svnignore файл, я не впевнений, але команда повинна бути належним чином.
д.данаїлов

10

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

Вони вставляються автоматично, якщо ви використовуєте вкладку-автозаповнення в Linux для створення файлу для початку:

svn propset svn:ignore 'file1
file2' .

6
Це працює лише для деяких снарядів, таких як bash. Зауважте, що повторне перевидання команди propset замінює попередній набір шаблонів.
JA Faucett

Тож file1 та file2 повинні бути в окремих рядках?
ІгорГанапольський

8

Ще одне рішення:

svn st | awk '/^?/{print $2}' > svnignore.txt && svn propget svn:ignore >> svnignore.txt && svn propset svn:ignore -F svnignore.txt . && rm svnignore.txt

або рядок за рядком

svn st | awk '/^?/{print $2}' > svnignore.txt 
svn propget svn:ignore >> svnignore.txt 
svn propset svn:ignore -F svnignore.txt . 
rm svnignore.txt

Що це робить:

  1. Отримує файли статусу з svn
  2. Зберігає всі файли за допомогою ? у файл "svnignore.txt"
  3. Отримує вже проігноровані файли та додає їх до файлу "svnignore.txt"
  4. Показує svn ігнорувати файли у "svnignore.txt"
  5. Видаляє файл

8

Крім того, якщо ви використовуєте Tortoise SVN, ви можете зробити це:

  1. У контекстному меню виберіть "TortoiseSVN", потім "Властивості"
  2. У вікні, що з'явилося, натисніть "Нове", потім "Додатково"
  3. У вікні, яке з'явилося навпроти "Назва власності", виберіть або введіть "svn: ignore", навпаки "Значення властивості" введіть потрібне ім'я файлу або ім'я папки або маску файлу (у моєму випадку це було "* / target"), натисніть "Застосувати майно рекурсивно "
  4. Добре. Добре.
  5. Здійснити

6
  1. cd ~ / .субверсія
  2. відкрити конфігурацію
  3. знайти рядок типу "global-ignores"
  4. встановіть тип файлу ігнорування таким чином: global-ignores = * .o * .lo * .la * .al .libs * .so .so. [0-9] * .pyc * .pyo 88 * .rej ~ # #. # *. *. swp .DS_Зберегти вихідний модуль вузла

Дякую, ваша відповідь є єдиною, яка згадує configфайл.
Анріке де Суса

Ця відповідь згадує про нього , а також @HenriquedeSousa stackoverflow.com/a/86052/7724 , а також пояснює , що локальний клієнт-єдиний спосіб ігнорування файлів.
bzlm

5

Більш прочитана версія відповіді bkbilly:

svn st | awk '/^?/{print $2}' > svnignore.txt
svn propget svn:ignore >> svnignore.txt
svn propset svn:ignore -F svnignore.txt .
rm svnignore.txt

Що це робить:

  1. Отримує файли статусу з svn
  2. Зберігає всі файли за допомогою ? у файл "svnignore.txt"
  3. Отримує вже проігноровані файли та додає їх до файлу "svnignore.txt"
  4. Показує svn ігнорувати файли у "svnignore.txt"
  5. Видаляє файл

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

Пропозиція щодо редагування була б доречнішою в цьому випадку. Вдячні за зусилля!
Джим

Мені ще не вистачало репутації, щоб запропонувати змінити. але я не хочу зіпсувати хороший протокол. Чи є простий README щодо вказівок щодо того, коли краще запропонувати та відредагувати, а не опублікувати нову відповідь тощо?
LivingDust

1
Якщо ваша відповідь точно така, як та, що була опублікована рік-півтора тому, це досить прямо. Ви навіть скопіювали пояснення " Що це робить ".
Джим

3

Ви також можете встановити глобальний шаблон ігнорування у файлі конфігурації SVN.


1
Чи можете ви встановити шаблон ігнорування для конкретного сховища?
Девід Дорія



2

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

Що стосується ігнорування файлів, вам потрібно відредагувати властивість svn: ignore, прочитайте розділ Ігнорування неперевершених елементів у svnbook за адресою http://svnbook.red-bean.com/en/1.5/svn.advanced.props.special.ignore. html . У книзі також детальніше описано використання статусу svn.


2

SVN ignoreлегко керувати в TortoiseSVN. Відкрийте TortoiseSVN і клацніть правою кнопкою миші меню меню, а потім виберіть Додати до списку ігнорування.

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

У проект Visual Studio ми додали наступні файли, щоб їх ігнорувати:

bin obj
*.exe
*.dll
*.pdb
*.suo

Цим методом ми успішно керуємо вихідним кодом на SVN з Порівняння


2

Що для мене спрацювало:

Як ігнорувати файли в Subversion?
1. У File Explorer, клацніть правою кнопкою миші на папці SVN проекту ім'я
2. Клацніть на "SVN присвятити ..." 3.З'явиться
вікно "фіксація". 3.
Правий клацніть папку / файл, який ви хочете ігнорувати. 5. Клацніть
на Додати, щоб ігнорувати список
6.Виберіть папку / файл
7.Виберіть "Властивість зміни" на SVN

Крім того, як знайти файли, які не знаходяться під контролем версій?
Після кроку 3 вище натисніть "Показати неперевершені файли"


0
  1. відкрити ви використовуєте продукт JetBrains (тобто Pycharm)
  2. потім натисніть кнопку "здійснити" на верхній панелі інструментів або скористайтеся ярликом "ctrl + k" screenshot_toolbar
  3. в інтерфейсі фіксації перенесіть непотрібні файли в інший список змін, як описано нижче. screenshot_commit_change
  4. наступного разу ви можете зробити лише список змін за замовчуванням.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.