Как мне игнорировать каталог с SVN?


760

Я только начал использовать SVN, и у меня есть каталог кеша, который мне не нужен под контролем исходного кода. Как я могу игнорировать весь каталог / папку с SVN?

Я использую Версии и TextMate на OS X и командной строке.


3
На этот же вопрос ответили здесь [папка игнорирования извлечения SVN] [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
@ Кубер: Ваша проблема в том, что расширение оболочки не знает о свойствах svn: ignore. Таким образом, использование '*' в качестве параметра explicityl передает tmp команде commit. Попробуйте что-то вроде 'svn commit -m "Больше акцентов".
MarkusSchaber

4
Спасибо за ответ. Пико как редактор: svn propedit svn: игнорировать. --editor-cmd pico
hade

157
Примечание: это не будет работать, если каталог уже находится в "svn". svn rm --keep-local dirnameпервый. (Мой вывод статистики SVN был огромным, и я некоторое время врезался в это.)
Эрик Аронести,

10
Если вы хотите игнорировать более одного файла / папки, добавьте все их имена в текстовый файл, по одной строке каждый, и используйте следующий вариант: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
Каталог 'cache' по-прежнему будет указан в '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 (который по предположению на один уровень ниже пути / к / каталогу). Это не будет работать, хотя: SVN propedit SVN: игнорировать. а затем введите путь к / dir / ignored_directory в редакторе. IOW: SVN сопоставляет объекты на один уровень за раз.
Greenoldman

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 import и svn co файлов, что мы обычно делаем в первый раз.

Весь кэш времени выполнения, папки вложений будут находиться под контролем версий. Итак, перед тем, как svn ps svn: ignore , нам нужно удалить его из хранилища.

С SVN версии 1.5 выше мы можем использовать svn del --keep-local your_folder, но для более ранней версии мое решение:

  1. svn экспортирует чистую копию ваших папок (без .svnскрытой папки)
  2. SVN Del Local и хранилище,
  3. SVN CI
  4. Скопируйте обратно папки
  5. Сделайте svn st и подтвердите, что папки помечены как '?'
  6. Теперь мы можем сделать SVN PS в соответствии с решениями

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

  • В одном каталоге у меня есть две папки, которые должны быть установлены как svn:ignore
  • Если мы установим один, другой будет удален.
  • Тогда нам интересно, нам нужно SVN Pe

svn peвам нужно будет отредактировать текстовый файл, и вы можете использовать эту команду, если требуется, чтобы настроить ваш текстовый редактор с помощью vi :

export SVN_EDITOR=vi
  1. С "о" вы можете открыть новую строку
  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; это просто способ ввода многострочной строки в оболочке. Вы также можете использовать редактор и просто написать несколько строк.
Слеське

Обратная косая черта не требуется для bash. bash достаточно умен, чтобы знать, что "открыто, а не обрабатывать строку. Все, что вам нужно сделать, это нажать enter после cache, tmp и null. Вы увидите, что bash меняет запрос на>, чтобы вы знали, что вы все еще вводите команду. Альтернативный вариант - начать вводить команду (svn), затем нажать esc, затем v. Это позволит вам ввести команду в редакторе. Нажмите ZZ, когда закончите, чтобы выполнить команду. Если вы передумали и не хочешь казнить, тогда: q !.
Майкл Поттер

1
svn propset svn:ignore -F .ignorethesefiles .позволит вам использовать файл. И, как уже упоминалось, у вас всегда есть propedit.
Gerard ONeill

5

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

ПРИМЕР:

/хобот

/ Багажник / кэш

/ Багажник / кэш / subdir1

/ Багажник / кэш / 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-all действительно должно быть похоже на 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, то вам нужно установить свойство subversion в / Project. Имя свойства должно быть "svn: ignore", а значение свойства должно быть "Cache".

Обратитесь к этой странице в руководстве Subversion для получения дополнительной информации о свойствах.


3

Ответ Джейсона сделает свое дело. Однако вместо установки svn: ignore на "." в каталоге cache вы можете захотеть включить «cache» в свойство svn: ignore родительского каталога, если каталог кэша присутствует не всегда. Я делаю это на нескольких «одноразовых» папках.


3

ДЕРЖАТЬ ДИРЕКТОРИИ, КОТОРЫЕ СВН БУДУТ ИГНОРИРОВАТЬ

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

svn delete --keep-local path / directory_to_keep / *

  1. затем установите, чтобы игнорировать каталог (и весь контент):

svn propset svn: игнорировать "*" путь / directory_to_keep


2

Если вы используете внешний интерфейс для SVN, такой как TortoiseSVN, или какая-то интеграция с IDE, в том же меню должна быть опция игнорирования, аналогичная операции фиксации / добавления.


1

Установите свойство svn: ignore . Большинство инструментов пользовательского интерфейса svn имеют способ сделать это, а также обсуждение командной строки в ссылке.


1

Поскольку вы используете Версии, это действительно очень просто:

  • Просмотрите свою извлеченную копию
  • Нажмите на каталог, чтобы игнорировать
  • В поле «Игнорировать» справа щелкните «Изменить».
  • Введите *. *, Чтобы игнорировать все файлы (или * .jpg только для файлов jpg и т. Д.)

1

Следите за своими косыми чертами. Я обнаружил, что в том числе images/*в моем файле настроек игнорирования не игнорировать ./images/. Когда я побежал, svn status -uон все еще показал ? images. Итак, я просто изменил настройку игнорирования на просто images, без косых черт. Запустил проверку статуса, и это очистило его.


1

Решено с Eclipse следующим образом:

Прежде всего, сделайте синхронизацию вашей папки с проектом:

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

В следующем представлении, командном представлении, вы можете увидеть все ресурсы, которые вы можете зафиксировать на сервере SVN.

Итак, выберите папку ресурса, который вы хотите игнорировать, и затем вы можете игнорировать его, используя

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

После этого в окне подтверждения выберите первый вариант: «игнорировать по имени».

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

Team-> Добавить

до svn:ignoreи после этого я буду подтвердить первый вариант в окне подтверждения.


0

Потеряв много времени в поисках того, как сделать это простое занятие, я решил опубликовать, что не составило труда найти достойное объяснение.

Сначала позвольте структуре образца

$ svn st? проект / ствол / цель? проекта / багажник / myfile.x

1 - сначала настройте редактор, в mycase vim export SVN_EDITOR = vim

2 - «svn propedit svn: ignore project / trunk /» откроет новый файл, и вы можете добавить свои файлы и подкаталог в нашем случае. Тип «target» сохранить и закрыть файл и работает

$ svn st? проекта / багажник / myfile.x

Спасибо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.