Как игнорировать файлы в каталоге в git?

Examples

  • Шаблон Соответствует любому файлу или каталогу, имя которого начинается с . Если кто-то хочет ограничить это только каталогом, а не его подкаталогами, можно добавить перед шаблоном косую черту, т.е. ; шаблон теперь соответствует , , но не .

  • Шаблон будет соответствовать каталогу и путям под ним, но не будет соответствовать обычному файлу или символической ссылке (это согласуется с тем, как pathspec в целом работает в Git)

  • Узор и имеют тот же эффект в любом файле. Другими словами, ведущая косая черта не имеет значения, если в шаблоне уже есть средняя косая черта.

  • Шаблон «foo/*» совпадает с «foo/test.json» (обычный файл),»foo/bar» (каталог),но не совпадает с «foo/bar/hello.c» (обычный файл),так как звездочка в шаблоне не совпадает со звездочкой «bar/hello.c»,в которой есть косая черта.

    $ git status
    
    # Untracked files:
    
    #       Documentation/foo.html
    #       Documentation/gitignore.html
    #       file.o
    #       lib.a
    #       src/internal.o
    
    $ cat .git/info/exclude
    # ignore objects and archives, anywhere in the tree.
    *.
    $ cat Documentation/.gitignore
    # ignore generated html files,
    *.html
    # except foo.html which is maintained by hand
    !foo.html
    $ git status
    
    # Untracked files:
    
    #       Documentation/foo.html
    

Еще один пример:

    $ cat .gitignore
    vmlinux*
    $ ls arch/foo/kernel/vm*
    arch/foo/kernel/vmlinux.lds.S
    $ echo '!/vmlinux*' >arch/foo/kernel/.gitignore

Второй .gitignore не позволяет Git игнорировать .

Пример для исключения всего, кроме определенной директории (обратите внимание на — без косой черты подстановочный знак также исключит все, что находится внутри ):

    $ cat .gitignore
    
    /*
    !/foo
    /foo/*
    !/foo/bar

Для чего нужен .gitignore

Файл .gitignore используется для того, чтобы определить, какие файлы и папки не нужно добавлять в git репозиторий.

Мы конечно могли бы вручную добавлять нужные файлы в репозиторий, например так:

git add path/to/file

Однако это было бы очень трудоемко. Гораздо проще использовать команду:

git add .

Которая добавит все файлы в каталоге проекта.

Но что если нам не нужны абсолютно все файлы, а есть файлы например в каталоге или или проекта, которые генерируются в процессе работы. Они не должны быть добавлены в репозиторий.

Тут нам и нужен .gitignore. Вам нужно его самим создать и разместить в корне проекта либо нужной подпапке.

Формат шаблона

  • Пустая строка не соответствует ни одному файлу,поэтому она может служить разделителем для удобочитаемости.

  • Строка, начинающаяся с символа #, служит комментарием. Поместите обратную косую черту (» «) перед первым хешем для шаблонов, которые начинаются с хеша.

  • Конечные пробелы игнорируются, если они не заключены в кавычки с обратной косой чертой (» «).

  • Необязательный префикс » «, Который отменяет шаблон; любой соответствующий файл, исключенный предыдущим шаблоном, снова будет включен. Невозможно повторно включить файл, если родительский каталог этого файла исключен. Git не выводит список исключенных каталогов по соображениям производительности, поэтому любые шаблоны в содержащихся файлах не влияют, независимо от того, где они определены. Поставьте обратную косую черту (» «) перед первым » » Для шаблонов, начинающихся с буквального » », Например, « ».

  • Косая черта используется как разделитель каталогов. Разделители могут в начале, середине или конце поискового шаблона .gitignore .

  • Если есть разделитель в начале или в середине (или в обоих) шаблона, то шаблон относится к уровню каталога конкретного файла . В противном случае шаблон также может совпадать на любом уровне ниже уровня .

  • Если в конце детали есть разделитель,то деталь будет совпадать только с каталогами,в противном случае она может совпадать и с файлами,и с каталогами.

  • Например, шаблон соответствует каталогу , но не каталогу ; однако соответствует и который является каталогом (все пути являются относительными от файла ).

  • Звездочка « » соответствует чему угодно, кроме косой черты. Символ « » Соответствует любому одному символу, кроме « ». Обозначение диапазона, например , может использоваться для соответствия одному из символов в диапазоне. См. Fnmatch (3) и флаг FNM_PATHNAME для более подробного описания.

Две последовательные звездочки (» «) в образцах, совпадающих с полным путем, могут иметь особое значение:

  • Ведущий « », за которым следует косая черта, означает совпадение во всех каталогах. Например, « » соответствует файлу или каталогу « » где угодно, так же, как шаблон « ». « » соответствует файлу или каталогу « » в любом месте, которое находится непосредственно в каталоге « ».

  • Завершающий » » соответствует всему внутри. Например, « » соответствует всем файлам внутри каталога « » относительно местоположения файла с бесконечной глубиной.

  • Косая черта, за которой следуют две звездочки подряд, затем косая черта соответствует нулю или более каталогам. Например, « » соответствует « », « », « » и так далее.

  • Другие последовательные звездочки считаются обычными звездочками и будут соответствовать предыдущим правилам.

3 ответа

Лучший ответ

Хорошо, я разобрался:

По сути, любой файл в любой папке ниже одного уровня в / public должен игнорироваться.

3

kawnah
14 Дек 2017 в 14:04

Git вообще не хранит каталоги (или папки), он только сохраняет файлы в коммите. Когда Git отправляется для проверки коммита, если для какого-либо файла в этом коммите требуется наличие родительского каталога, Git создает этот родительский каталог в этой точке. Вот почему вам нужно зафиксировать файл или в любом случае некоторый файл, внутри каталога: чтобы у Git был какой-то извлекаемый файл, который вынуждает его создать каталог.

Теперь проблема здесь в том, что когда Git выполняет свои «трюки как можно быстрее, даже если это смущает всех» :-), он может обнаружить, что перечисляет имя каталога и что он — в частности, index в Git — не имеет файлов уже в этом каталоге, и он даже не потрудится заглянуть внутрь каталога для файлов. Вот как пропускает прямо над директивой : пока он просматривал, он нашел в качестве каталога, но в нем еще не было файлов для фиксации, а затем нашел ` X4` в и решил вообще не заглядывать внутрь .

Если вместо перечисления в вашем вы перечислите , Git должен заглянуть внутрь , чтобы найти все свои файлы и подкаталоги, чтобы выяснить, могут ли они быть пропущенным Заглянув внутрь, он проверит содержимое . Запись скажет «пропустить это», но более поздняя запись скажет «не пропустить». Затем более поздняя запись переопределяет, и вставляется в индекс Git с помощью или .

Как только находится в индексе, он переходит к следующему коммиту. Как только это произойдет, на самом деле безопасно перечислить , а не в файле , потому что теперь, когда Git имеет файл в каталоге, Git вынужден сканировать каталог. Запись для будет только удалена из индекса только после явного запроса на удаление этой записи ( или ) или перехода к ( — ing) существующий коммит, в котором нет файла. После удаления записи указателя перечислять , а не , теперь небезопасно, поскольку Git может вернуться к своей уловке, заметив, что является каталогом и игнорируется , и Git ничего не заставляет Git заглядывать внутрь , поэтому он не заглядывает внутрь и не находит и, следовательно, не делает проверьте на исключение.

Конечно, есть и другие способы сделать то же самое. Я предпочитаю вообще не указывать каталог на верхнем уровне: вместо этого внутри каталога создайте файл с содержимым:

Затем Git будет сканировать каталог на наличие файлов, поскольку он не игнорируется; в этом каталоге есть файл , и этот файл говорит: игнорировать все здесь, кроме здесь. , поскольку Git уже вошел в каталог на данный момент, и обнаружил список всех файлов и подкаталогов в этом каталоге, он проверит каждый такой файл и подкаталог по отдельности для этого и проигнорирует все из них, кроме сам.

2

torek
13 Дек 2017 в 16:21

Чтобы исключить файлы в подкаталоге, добавьте следующее к .gitignore в вашем базовом каталоге:

Если это единственный элемент в папке, и вам нужно сохранить эту папку активной, возможно, поместите в нее пустой текстовый файл

Shakes
13 Дек 2017 в 16:08

Глобальный .gitignore

Git также позволяет вам создать глобальный файл , в котором вы можете определить правила игнорирования для каждого Git-репозитория вашей локальной системы.

Файл может называться по вашему усмотрению и храниться в любом месте. Наиболее распространенным местом хранения этого файла является домашний каталог. Вам придется вручную создать файл и настроить Git для его использования.

Например, чтобы установить в качестве глобального файла игнорирования Git, выполните следующие действия:

1. Создайте файл:

2. Добавьте этот файл в Git-конфигурацию:

3. Откройте файл в текстовом редакторе и добавьте в него свои правила.

Глобальные правила особенно полезны при игнорировании определенных файлов, которые вы никогда не захотите фиксировать, таких как файлы с конфиденциальной информацией или скомпилированные исполняемые файлы.

Правила формирования строки автозамены

Как уже говорилось ранее, строка автозамены – это строка, по которой механизм автозамены будет подбирать подходящий шаблон. Простейшим случаем является пример, когда на клавиатуре в процессе редактирования текста набрано «Слово1», которое есть и в строке автозамены некоторого шаблона. В такой ситуации после активизации механизма автозамены любым из способов, набранное «Слово1» заменится на текст шаблона.

Однако это не всегда удобно. Так, например, если пользователь хочет заменить слово «Проц» на «Процедура…», то набрав на клавиатуре слово «Проце» и активизировав механизм автозамены, ничего не произойдет, поскольку в строках автозамены в шаблонах слова «Проце» обнаружено не будет.

Механизм шаблонов в 1С:Предприятии 8 предоставляет возможность сделать один шаблон, который будет описывать несколько строк автозамены:

Строка автозамены Текст шаблона
Проц Процедура…
Проце Процедура…
Процед Процедура…
Процеду Процедура…
Процедур Процедура…
Процедура Процедура…

Это обеспечивается использованием постоянной и вариантной части строки автозамены. Постоянная часть– это то, что мы обычно привыкли писать в строке автозамены и рассматривали на примерах ранее. Вариантная часть – часть строки автозамены, которая может участвовать в строке автозамены любым подходящим количеством своих символов слева направо.

Запись строки автозамены с использованием постоянной и вариантной частей выглядит следующим образом:

ПОСТОЯННАЯ_ЧАСТЬВАРИАНТНАЯ_ЧАСТЬ

Рассмотрим пример со словом «Процедура». Очевидно, что во всех строках автозамены строка «Проц» является постоянной частью строки автозамены, а текст правее – некоторой переменной частью, имеющей в каждом случае разное число символов. Решением для рассматриваемого примера будет один шаблон со строкой автозамены «проц».

Хранение и подключение шаблонов

Шаблоны хранятся в виде файлов с расширением st. Подключение шаблонов осуществляется в окне «Шаблоны текста», с помощью «Сервис» – «Шаблоны текста» – «Действия» – «Настройка шаблонов…». В появившемся диалоге можно выбрать любое множество файлов шаблонов, которые будут подключены.

Если включить флажок «Использовать стандартные шаблоны», в список используемых файлов шаблонов при каждом запуске 1С:Предприятия будут автоматически добавляться файлы, находящиеся в каталоге с исполняемыми файлами 1С:Предприятия. В списке файлов шаблонов вновь добавленные файлы будут идти первыми. При этом удалить такие файлы из списка используемых файлов будет нельзя до тех пор, пока этот флажок включен. После отключения флажка «Использовать стандартные шаблоны», автоматически найденные файлы можно будет из списка удалить.

Каждый из файлов можно перемещать внутри списка файлов шаблонов, указывая, таким образом, его приоритет. Этот приоритет будет использоваться при формировании общего дерева шаблонов из всех подключенных файлов.

Файл шаблонов можно открыть в конфигураторе для просмотра и редактирования с помощью диалога открытия файла. Каждый файл шаблонов представляет собой информацию, организованную в виде дерева. Элемент дерева состоит из следующих полей:

  • Название шаблона.
  • Строка автозамены для шаблона.
  • Признак включения шаблона в контекстное меню.
  • Текст шаблона.

Рассмотрим подробно назначение каждого элемента шаблона.

Название – хранит название элемента файла шаблонов, которое будет отображаться в дереве шаблонов в окне «Шаблоны текста» и при выборе шаблона из контекстного меню.

Автоматически заменять строку – строка, по которой механизм автозамены будет подбирать подходящий шаблон. Эта строка также используется для подбора шаблона с помощью команды «Подобрать шаблон…» (Ctrl + Q). Например, если строка автозамены содержит текст «ABC», находясь в текстовом редакторе справа от этого слова и нажав Space или Enter, будет выполнена автозамена текста «ABC» (если механизм автозамены включен).

Включать в контекстное меню – определяет, нужно ли сделать шаблон доступным в контекстном меню текстового редактора.

Текст шаблона – текст, который будет вставлен в редактируемый документ при выполнении шаблона.

Если в системе подключены несколько файлов шаблонов, в окне «Шаблоны текста» будет отображаться единое дерево шаблонов, у которого корневой элемент отсутствует, а ветви дерева совпадают со структурой шаблонов в подключенных файлах. Порядок следования ветвей в корне дерева шаблонов определяется тем порядком, в котором расположены подключенные файлы шаблонов в списке используемых файлов шаблонов из диалога «Настройка шаблонов».

3 ответа

Лучший ответ

Загляните в https://www.gitignore.io/ Там вы можете создать свой рекомендуемый gitignore на основе того, что вы используете.

Для Eclipse это говорит:

У меня было много обсуждений в командах, помещать ли файлы на основе IDE в GIT или нет. Некоторым это нравится, некоторые говорят, что каждый разработчик знает, как настроить свою IDE для проекта на основе pom.xml.

Мое мнение теперь также, держите все файлы IDE от VCS.

11

Michael Wölm
20 Июн 2017 в 19:26

Файл , файл и каталог используются в Eclipse IDE.

Существуют разные мнения о том, чтобы поставить специфичные для IDE файлы проектов под контроль исходного кода. Я предпочитаю исключать их (и позволить IDE генерировать свои файлы проекта из pom, при условии, что он имеет достойную интеграцию с Maven — что делает eclipse), потому что я видел, что их совместное использование вызывает больше проблем, чем решает. Другие люди, вероятно, скажут вам, что они все должны быть включены, и я оставлю это им, чтобы обосновать их причины для этого; Дело в том, что я не верю, что по этому вопросу существует единый окончательный консенсус.

Файл содержит правила игнорирования. В частности, он содержит правила, которые предназначены для совместного использования через репозиторий, поэтому он должен быть включен . (Если у вас есть правила игнорирования, которые вы не хотите использовать в репозитории, есть другие файлы, в которых они будут определены; см. Документацию git ignore.)

4

Mark Adelsberger
20 Июн 2017 в 15:40

Когда вы используете любую IDE для разработки приложения, они обычно генерируют дополнительный набор файлов, в котором сохраняются настройки проекта. Передача этих параметров в инструмент управления версиями, например git, svn и т. Д., Считается плохой практикой, поскольку эти конфигурации относятся к среде разработки каждого разработчика, в некоторых случаях это может помешать правильному открытию проекта в IDE, поскольку он пытается найти ресурсы, которых нет на вашем ПК, по этой причине желательно не загружать эти конфигурации.

Как не загружать конфигурации IDE?

дает нам файл , где мы можем установить все файлы, которые мы хотим игнорировать. Просто создайте файл в основной папке проекта, например , откройте этот файл в любом текстовом редакторе (даже в вашей IDE) и добавьте файлы, которые будут игнорироваться.

Как говорит @Michael, вы можете сгенерировать набор файлов для игнорирования в используемой вами IDE. Взгляните на этот ссылка, например, для затмения (нажмите здесь для создания) скопируйте и вставьте конфигурацию в ваш файл.

Если вы уже загрузили эти конфигурации в свой репозиторий, вы должны удалить их, чтобы новая конфигурация gitignore вступила в силу, посмотрите эти ссылки отменить изменения в git, удалить файлы из git

JUAN CALVOPINA M
20 Июн 2017 в 22:11

Файл шаблонов, поставляемый с 1С:Предприятием

В поставку 1С:Предприятия 8 входит файл шаблонов GenTempl.st. В него включены шаблоны для часто используемых конструкций. Это и шаблоны для написания управляющих конструкций, шаблоны, связанные с использованием прикладных объектов, а так же некоторые другие.

Поскольку в будущем файл шаблонов GenTempl.st, поставляемый вместе с 1С:Предприятием 8, может изменяться и дополняться, он будет перезаписываться заново при установке очередных релизов 1С:Предприятия 8. После установки 1С:Предприятия 8 файл GenTempl.st доступен только для чтения.

Если в процессе работы возникает необходимость расширения состава поставляемых шаблонов или их изменения, рекомендуется скопировать файл GenTempl.st под новым именем, сделать его доступным для редактирования и внести в него необходимые изменения. Можно также для создания новых шаблонов создать новый файл шаблонов и подключить его. Шаблоны начнут использоваться только после того, как файлы шаблонов будут подключены.

Подробнее о шаблонах игнорирования

Шаблон Примеры соответствия Пояснение*
**/logs logs/debug.log logs/monday/foo.bar build/logs/debug.log Добавьте в начало шаблона две звездочки, чтобы сопоставлять каталоги в любом месте репозитория.
**/logs/debug.log logs/debug.log build/logs/debug.log но не logs/build/debug.log Две звездочки можно также использовать для сопоставления файлов на основе их имени и имени родительского каталога.
*.log debug.log foo.log .log logs/debug.log Одна звездочка — это подстановочный знак, который может соответствовать как нескольким символам, так и ни одному.
*.log !important.log debug.log trace.log но не important.log logs/important.log Добавление восклицательного знака в начало шаблона отменяет действие шаблона. Если файл соответствует некоему шаблону, но при этом также соответствует отменяющему шаблону, указанному после, такой файл не будет игнорироваться.
.log !important/.log trace.* debug.log important/trace.log но не important/debug.log Шаблоны, указанные после отменяющего шаблона, снова будут помечать файлы как игнорируемые, даже если ранее игнорирование этих файлов было отменено.
/debug.log debug.log но не logs/debug.log Косая черта перед именем файла соответствует файлу в корневом каталоге репозитория.
debug.log debug.log logs/debug.log По умолчанию шаблоны соответствуют файлам, находящимся в любом каталоге
debug?.log debug0.log debugg.log но не debug10.log Знак вопроса соответствует строго одному символу.
debug.log debug0.log debug1.log но не debug10.log Квадратные скобки можно также использовать для указания соответствия одному символу из заданного диапазона.
debug.log debug0.log debug1.log но не debug2.log debug01.log Квадратные скобки соответствуют одному символу из указанного набора.
debug.log debug2.log но не debug0.log debug1.log debug01.log Восклицательный знак можно использовать для указания соответствия любому символу, кроме символов из указанного набора.
debug.log debuga.log debugb.log но не debug1.log Диапазоны могут быть цифровыми или буквенными.
logs logs logs/debug.log logs/latest/foo.bar build/logs build/logs/debug.log Без косой черты в конце этот шаблон будет соответствовать и файлам, и содержимому каталогов с таким именем. В примере соответствия слева игнорируются и каталоги, и файлы с именем logs
logs/ logs/debug.log logs/latest/foo.bar build/logs/foo.bar build/logs/latest/debug.log Косая черта в конце шаблона означает каталог. Все содержимое любого каталога репозитория, соответствующего этому имени (включая все его файлы и подкаталоги), будет игнорироваться
logs/ !logs/important.log logs/debug.log logs/important.log Минуточку! Разве файл logs/important.log из примера слева не должен быть исключен нз списка игнорируемых? Нет! Из-за странностей Git, связанных с производительностью, вы не можете отменить игнорирование файла, которое задано шаблоном соответствия каталогу
logs/**/debug.log logs/debug.log logs/monday/debug.log logs/monday/pm/debug.log Две звездочки соответствуют множеству каталогов или ни одному.
logs/*day/debug.log logs/monday/debug.log logs/tuesday/debug.log but not logs/latest/debug.log Подстановочные символы можно использовать и в именах каталогов.
logs/debug.log logs/debug.log но не debug.log build/logs/debug.log Шаблоны, указывающие на файл в определенном каталоге, задаются относительно корневого каталога репозитория. (При желании можно добавить в начало косую черту, но она ни на что особо не повлияет.)

5 ответов

Лучший ответ

Попробуйте добавить эти строки в свой файл .gitignore :

23

Lars Haugseth
6 Июл 2009 в 16:31

Принятый ответ у меня не сработал.

Похоже, косая черта не работает с msysgit в файле . Это работает.

Однако это будет соответствовать исключению любых файлов с именами или , что вряд ли будет проблемой, за исключением тех случаев, когда это так. Следующее позволяет обойти это (и да, в этом случае работает косая черта):

Это сопоставляет файлы на разной глубине иерархии под папкой, в которую помещен файл

Обратите внимание, что приведенное выше не сработало, когда я включил префикс для определенной подпапки, поэтому я поместил его напрямую в свою папку

Как пользователь Visual Studio (предположительно, OP тоже взят из ссылки bin / obj), также приятно исключить файлы и .

Из спецификации gitignore:

17

Community
20 Июн 2020 в 09:12

Самый очевидный способ — добавить их в :

Это игнорирует любые пути, которые находятся в вызове каталога или в каталоге с именем от каталога src вниз.

Что-то вроде на верхнем уровне может не работать, если у вас есть неровная иерархия проектов с некоторыми каталогами и ниже по дереву.

Вот сценарий быстрой тестовой оболочки, показывающий в действии правило игнорирования:

Не отслеживаемый файловый раздел первого статуса:

И после добавления файла .gitignore:

В качестве теста, чтобы доказать, что git не игнорирует файлы с именами и , но игнорирует каталоги и ниже по иерархии после запуска этого скрипта:

Новые неотслеживаемые файлы:

9

CB Bailey
6 Июл 2009 в 21:29

Путаница для меня заключалась в том, что после добавления, какую бы маску вы на него не наложили, файлы останутся в репозитории до тех пор, пока не будут удалены принудительно, поэтому, добавив необработанное, скомпилированное решение Visual Studio, мне пришлось очистить репозиторий, выполнив:

Затем добавил это в .gitignore:

Затем совершил:

3

jenson-button-event
17 Фев 2011 в 12:57

Я считаю, что вы сможете добавить

В .gitignore, и все, что соответствует шаблону, будет проигнорировано.

1

Kendall Helmstetter Gelner
6 Июл 2009 в 16:28

Description

В файле указываются намеренно неотслеживаемые файлы, которые Git должен игнорировать. Файлы, уже отслеживаемые Git, не затрагиваются; подробнее см. ПРИМЕЧАНИЯ ниже.

Каждая строка в файле определяет шаблон. Решая, следует ли игнорировать путь, Git обычно проверяет шаблоны из нескольких источников со следующим порядком приоритета, от самого высокого до самого низкого (в пределах одного уровня приоритета результат определяется последним совпадающим шаблоном):

  • Узоры,считанные из командной строки для тех команд,которые их поддерживают.

  • Шаблоны читаются из файла в том же каталоге, что и путь, или в любом родительском каталоге (до верхнего уровня рабочего дерева), при этом шаблоны в файлах более высокого уровня заменяются шаблонами в файлах нижнего уровня вплоть до каталог, содержащий файл. Эти шаблоны совпадают относительно расположения файла . Проект обычно включает такие файлы в свой репозиторий, содержащие шаблоны для файлов, сгенерированных как часть сборки проекта.

  • Шаблоны читаются из .

  • Шаблоны читаются из файла, указанного в конфигурационной переменной .

В какой файл поместить шаблон,зависит от того,как будет использоваться шаблон.

  • Шаблоны, которые должны контролироваться по версиям и распространяться в другие репозитории через клонирование (т.е. файлы, которые все разработчики захотят игнорировать), должны быть файл .gitignore .

  • Шаблоны, которые относятся к конкретному репозиторию, но которые не нужно использовать совместно с другими связанными репозиториями (например, вспомогательные файлы, которые находятся внутри репозитория, но относятся к процессу одного пользователя), должны быть помещены в файл $ GIT_DIR / info / exclude .

  • Шаблоны, которые пользователь хочет, чтобы Git игнорировал во всех ситуациях (например, резервные или временные файлы, созданные выбранным пользователем редактором), обычно попадают в файл, указанный в в пользователя . Его значение по умолчанию — $ XDG_CONFIG_HOME / git / ignore. Если $ XDG_CONFIG_HOME либо не установлен, либо пуст, вместо него используется $ HOME / .config / git / ignore.

Базовые инструменты Git-сантехники, такие как и , читают шаблоны , указанные с помощью параметров командной строки, или из файлов, указанных с помощью параметров командной строки. Инструменты Git более высокого уровня, такие как и , используют шаблоны из указанных выше источников.

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: