Можно ли «игнорировать» файл в Perforce?

101

Иногда я использую функцию «Согласование автономной работы ...» в среде Perforce P4V IDE для синхронизации любых файлов, над которыми я работал, отключившись от хранилища P4. Он запускает другое окно, которое выполняет «Различие папок».

У меня есть файлы, которые я никогда не хочу регистрировать в системе управления версиями (например, файлы, находящиеся в папке bin, такие как библиотеки DLL, сгенерированный код и т. Д.). Есть ли способ отфильтровать эти файлы / папки, чтобы они не отображались как «новые», которые могут быть добавлен. Они имеют тенденцию загромождать список файлов, которые мне действительно интересны. Есть ли в P4 эквивалент функции Subversion «игнорировать файл»?

Луч
источник
Не могли бы вы привести пример вывода CVS, чтобы мы могли понять, что вы имеете в виду, и почему приведенные ответы не делают того, что вы хотите?
Грег Уитфилд
2
На форуме идеи Perforce вы можете проголосовать за предложение списков игнорирования в стиле Git. P4ideax.com/ideas/15/ignore-support
полковник Паник,
Нажмите «Согласовать автономную работу», снимите флажок «Локальные файлы не в хранилище», нажмите «Согласовать». Пока вы не добавляете файлы, это, вероятно, самый быстрый способ решения проблемы.
переулок

Ответы:

59

Начиная с версии 2012.1 Perforce поддерживает P4IGNOREпеременную среды. Я обновил свой ответ на этот вопрос об игнорировании каталогов, объяснив, как это работает. Потом я заметил этот ответ, который, я думаю, теперь излишний.


Предполагая, что у вас есть клиент с именем «CLIENT», каталог с именем «foo» (расположенный в корне вашего проекта), и вы хотите игнорировать все файлы .dll в этом дереве каталогов, вы можете добавить следующие строки в представление рабочей области для выполнения этот:

- // депо / foo / *. dll //CLIENT/foo/*.dll
- // депо / foo /.../*. dll //CLIENT/foo/.../*.dll

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

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

- // депо / foo ... / *. dll //CLIENT/foo.../*.dll
ворон
источник
30
Хотя это работает, это не очень полезно, поскольку вам придется вставлять эти строки в каждое рабочее пространство, которое вы когда-либо создавали.
dgrant 03
6
Примечание: это не работает для нормальной работы согласования в автономном режиме с p4v. «Исключенные файлы» кажутся только в «расширенном» окне согласования ...
Catskul
6
Фильтр исключения не работает внутри Reconcile Offline Workдиалогового окна. Он работает, если вы откроете его внутри, Advanced Reconcile...но это бесполезно, потому что в 99,9% случаев вам не нужно или не нужно использовать расширенный диалог.
sorin
12
@raven: 1) (Пример :) В некоторых проектах папки bin / obj используются в каждом проекте вместо того, чтобы хранить их в одном месте. (Обобщенный вывод :) Предположение Perforce о том, что все промежуточные файлы помещаются в легко исключаемое место рабочей области, является излишне ограничивающим дизайном для VCS. 2) Некоторые проекты включают в себя локальный кеш и / или другие файлы, созданные пользователем, в структуре каталогов (например, кеш * .ncb IntelliSense). Невозможность исключить их из общей политики серьезно ухудшает функции согласования автономной работы и различий папок.
Сэм Харвелл,
6
Эта конкретная проблема меня убивает.
Уоррен П.
47

Да, но.

В Perforce версии 2012.1 добавлена ​​функция p4ignore , вдохновленная Git. Однако разработчики Perforce внесли безосновательные изменения в поведение, что сделало эту функцию менее полезной.

В то время как Git берет правила из всех .gitignoreфайлов, Perforce не знает, где искать, пока вы не укажете имя файла в переменной среды P4IGNORE. Эта свобода - проклятие. Вы не можете взломать два репозитория, которые используют разные имена для своих файлов игнорирования.

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

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

Забавно, но в документации Perforce показано «.p4ignore» в качестве примера правила игнорирования, которое является обратным! Если правила полезны, их следует использовать как часть репозитория.


Perforce все еще может улучшить эту функцию. Выберите соглашение для имен файлов, скажем p4ignore.txt, так, чтобы функция работала как нельзя лучше. Отбросьте P4IGNOREпеременную окружения, это контрпродуктивно. Отредактируйте документы, чтобы побудить разработчиков делиться полезными правилами. Разрешите пользователям записывать личные правила в файл в своей домашней папке, как это делает Git .

Если вы знаете кого-нибудь в Perforce, отправьте им этот пост по электронной почте.

Colonel Panic
источник
2
Спасибо за разъяснение. Я попытался использовать .p4ignore с P4VS, но мое решение, которое должно было игнорироваться, не было проигнорировано. Сначала я подумал, что делаю что-то не так. Теперь я знаю лучше.
Майкл С.
1
@gentlesea, начиная с Perforce 2013.1, функция игнорирования наконец работает в графическом приложении.
Полковник Паник
2
Обсуждение «Сделайте так, чтобы функция игнорирования работала из коробки» на p4ideax.com/ideas/17856/…
полковник Паник,
1
Для переменных конфигурации, которые различаются в зависимости от того, какое рабочее пространство вы используете, попробуйте использовать файлы P4CONFIG. Затем вы можете указать в файле P4CONFIG другое значение P4IGNORE при переходе от рабочего пространства к рабочему.
Bryan Pendleton
2
Perforce не знает, как создавать правильное программное обеспечение, они не понимают даже основ. Вот почему каждый, кто по волеизъявлению застрял, мечтает перейти на git.
Pavel P
22

Это работает с Perforce 2013.1, новый механизм P4IGNORE был впервые добавлен в выпуске 2012.1, описанном в блоге Perforce здесь:

https://www.perforce.com/blog/new-20121-p4ignore

Как это сейчас описано, вы устанавливаете переменную среды «P4IGNORE» в имя файла, которое содержит список файлов, которые следует игнорировать.

Так что вы можете проверить это, чтобы увидеть, как вам это нравится.

свек
источник
1
Вы также можете включать имена каталогов, а не только имена файлов.
ashes999
Как упоминалось ранее: к сожалению, вам НЕОБХОДИМО установить P4IGNORE.
Technophile
1
Я исправил ссылку @DerMike - думаю, Perforce изменил URL-адреса своих блогов.
svec
7

Если вам нужно решение, которое будет применяться ко всем рабочим пространствам без необходимости копирования, вы (или ваш системный администратор) можете отказаться от отправки этих типов файлов, используя строки, подобные приведенным ниже в таблице защиты p4:

write user * * -//.../*.suo
write user * * -//.../*.obj
write user * * -//.../*.ccscc

Я помню, как делал это раньше, но у меня нет необходимых разрешений, чтобы проверить это здесь. Ознакомьтесь с руководством системного администратора Perforce и попробуйте его

Майк Берроуз
источник
3
К сожалению, это вызывает ошибки при отправке, а не игнорирование согласованного представления. Таким образом, он может хранить определенные файлы вне хранилища, но не может помочь вашим пользователям не видеть шума.
Уоррен П.
6

Perforce Streams значительно упрощает игнорирование файлов, начиная с версии 2011.1. Согласно документации, вы можете игнорировать определенные расширения или определенные пути в вашем каталоге.

Из p4 help stream

Ignored: Optional; a list of file or directory names to be ignored in
                 client views. For example:

                     /tmp      # ignores files named 'tmp'
                     /tmp/...  # ignores dirs named 'tmp'
                     .tmp      # ignores file names ending in '.tmp'

                 Lines in the Ignored field may appear in any order.  Ignored
                 names are inherited by child stream client views.

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

Вы можете редактировать поток, p4 stream //stream_depot/stream_nameщелкнув его правой кнопкой мыши в представлении потока p4v.

И, как отметил @svec, скоро появится возможность указывать игнорируемые файлы для каждой рабочей области, и фактически она находится в бета-версии P4 2012.1.

Шанс
источник
Да, это работает для меня, когда я делюсь настройками игнорирования для всей команды (я использую p4 2013.2). Обратите внимание, что он работает только в хранилище с поддержкой потоков. (Если вы можете распространить переменную среды P4IGNORE = .p4ignore в своей команде, это, вероятно, лучшее решение.)
yoyo
1
Обратите внимание, что поле «Игнорируемый» для потока можно использовать для игнорирования определенной папки, файла или расширения файла, но поддержка подстановочных знаков ограничена, и нет способа игнорировать всю папку, а затем «отменить игнорирование» определенных файлов или подпапок. (Начиная с версии сервера p4 2013.2)
yoyo
3

Предложение Уилла об использовании работает .p4ignoreтолько с плагином WebSphere Studio (P4WSAD). Я просто попробовал это в своем локальном окне Windows, и любые файлы и каталоги, которые я перечислил, не были проигнорированы.

Предложение Raven по изменению спецификации вашего клиента - правильный путь в Perforce. Правильная организация вашего кода / данных / исполняемых файлов и сгенерированных выходных файлов значительно упростит процесс исключения файлов из проверки.

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

отметка
источник
15
Я полностью не согласен со всем утверждением «Правильная организация вашего кода ...». Дело в том, что следование соглашению Perforce о редактировании рабочей области требует, чтобы каждый пользователь вносил изменения. В то время как настоящий файл .p4ignore будет создан / управляем только один раз.
Майк,
9
О, и не говоря уже о том, что вы любите разветвлять свой код? Удачи в поддержании ваших рабочих мест для каждой ветки. Это звучит забавно!
Майк
2

ИСТОРИЧЕСКИЙ ОТВЕТ - уже не правильный. В то время, когда это было написано изначально, это было правдой;

Вы не можете записывать и проверять файл, который сервер будет использовать для создания правил игнорирования; общий шаблон файла glob или regexp игнорируется по необходимости.

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

Короче говоря, я считаю Perforce очень слабым в этой области. Хотя я ценю, что те, кто использует подключаемый модуль Eclipse, могут его использовать .p4ignore, и я думаю, что это здорово, это оставляет тех из нас, кто этого не делает, в неведении.

ОБНОВЛЕНИЕ: см. Принятый ответ для новой возможности P4IGNORE, добавленной в середине 2012 года.

Уоррен П.
источник
1

Я обнаружил, что проще всего согласовать автономную работу с помощью сценария BASH, подобного этому:

#!/bin/bash
# reconcile P4 offline work, assuming P4CLIENT is set
if [ -z "$P4CLIENT" ] ; then echo "P4CLIENT is not set"; exit 1; fi
unset PWD # confuses P4 on Windows/CYGWIN

# delete filew that are no longer present
p4 diff -sd ... | p4 -x - delete

# checkout files that have been changed.  
# I don't run this step.  Instead I just checkout everything, 
# then revert unchanged files before committing.
p4 diff -se ... | pr -x - edit

# Add new files, ignoring subversion info, EMACS backups, log files
# Filter output to see only added files and real errors
find . -type f \
 | grep -v -E '(\.svn)|(/build.*/)|(/\.settings)|~|#|(\.log)' \
 | p4 -x - add \
 | grep -v -E '(currently opened for add)|(existing file)|(already opened for edit)'

Я адаптировал это из этой статьи базы знаний Perforce .

Кевин Клайн
источник
Это было семь лет назад, я не удивлен. Я удивлен, что кто-то до сих пор использует Perforce.
Кевин Клайн
... не по собственному желанию: '(
DerMike
0

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

http://p4delta.sourceforge.net

К сожалению, хотя это, похоже, дает правильный список файлов, я не могу заставить работать «p4delta --execute» («Невозможно изменить замороженную строку»), и проект не обновлялся в течение года. Возможно, другим повезет больше.

Дерек Приор
источник
-1

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

Дипак Сарда
источник
5
дубликат и не отвечает на вопрос
Уоррен П.