Как удалить неотслеживаемые файлы из рабочего дерева Perforce?

Что эквивалентно "git clean" с По волеизъявлению?

git-clean - Удаляет неотслеживаемые файлы из рабочего дерева

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

-x Не использовать стандартные правила игнорирования, считываемые из .gitignore (для каждого каталога) и $ GIT_DIR / info / exclude, но все же использовать правила игнорирования, указанные с параметрами -e. Это позволяет удалить все неотслеживаемые файлы, включая продукты сборки. Это можно использовать (возможно, вместе с git reset) для создания нетронутого рабочего каталога для тестирования чистой сборки.

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


person Simon Perreault    schedule 31.08.2009    source источник
comment
Сопоставимого аналога нет. Проголосуйте за запрос функции на p4ideax.com / ideas / 434 / add-a-clean-operation-to-p4-and-p4v.   -  person Colonel Panic    schedule 06.12.2013
comment
Болванчики разорвали ссылку perforce.ideas.aha.io/ideas/P4V-I -7   -  person Colonel Panic    schedule 10.08.2015


Ответы (11)


Попробуйте (для Unix) с верхнего уровня:

# Find all files and filter for those that are unknown by Perforce
find . -type f | p4 -x - fstat 2>&1 > /dev/null | sed 's/ -.*$//' > /tmp/list
### manually check /tmp/list for files you didn't mean to delete
# Go ahead and remove the unwanted files.
xargs rm < /tmp/list

Или, для чистого подхода -f, просто перенаправляйте напрямую в xargs rm вместо того, чтобы сначала помещать список файлов в / tmp / list.

person Emil Sit    schedule 10.09.2009
comment
Затем введите find -depth -type d -empty -exec rmdir {} \; удалить пустые каталоги. - person Simon Perreault; 16.09.2009
comment
это больше похоже на git clean -xf; есть ли способ уважать .p4ignore? - person Ron; 18.12.2009
comment
будьте осторожны, похоже, это решение не работает для имен файлов с пробелами - person Dmytro; 12.10.2011

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

Это не сценарий, но он намного проще, чем большинство других решений для Windows.

person scott77777    schedule 08.05.2013

Новый P4 clean должен помочь

person Newtopian    schedule 21.07.2015
comment
Следует помнить о некоторых тонкостях, см. Мой ответ ниже stackoverflow.com/a/38455024/284795 - person Colonel Panic; 19.07.2016
comment
как и в случае с большинством команд p4 :-), спасибо за пояснения. - person Newtopian; 19.07.2016

Есть небольшие различия в поведении p4 clean "Restore workspace файлы для соответствия состоянию соответствующих файлов депо "и git clean < / a> «Удалить неотслеживаемые файлы из рабочего дерева», поэтому внимательно прочтите руководства.

В частности, vanilla p4 clean отменит изменения, внесенные вами в файлы вне любого ожидающего списка изменений. Таким образом, благоразумно проверять результат с помощью опции «пробный запуск» p4 clean -n.

Насколько я понимаю:

  • p4 clean -a эмулирует git clean «Удалить неотслеживаемые файлы из рабочего дерева».
  • p4 clean -a -I эмулирует git clean -x «Удалите все неотслеживаемые файлы, включая продукты сборки».

К моему разочарованию, нет точного аналога git clean -X "Удалять только файлы, игнорируемые Git", но вы можете приблизиться к нему, работая с _ 10_:

  • p4 reconcile -a && p4 clean -a -I. Не отслеживаемые файлы, соответствующие списку игнорирования, будут удалены, остальные будут перемещены в список изменений по умолчанию.
person Colonel Panic    schedule 19.07.2016

Нет эквивалента. Perforce не имеет команды для удаления файлов, которые не находятся под его контролем. Вы можете увидеть их в P4V на вкладке «Рабочее пространство» (у них простые белые значки, а не линейные значки с зеленой точкой) и удалить их вручную. Если вы хотите автоматизировать процесс, проще всего было бы удалить файлы из вашей рабочей области, удалить все в каталоге, а затем синхронизировать их резервную копию. Пакетный файл для этого будет выглядеть примерно так:

p4 sync "//depot/someFolder/...#0"
erase C:\projects\someFolder\*.* /s /q /f
rd C:\projects\someFolder /s  /q
p4 sync -f "//depot/someFolder/..."

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


Однако у этого решения есть свои недостатки. Если вы в настоящее время работаете с каким-либо из файлов, вы, очевидно, не хотите их стирать. Кроме того, полная синхронизация может занять довольно много времени, если в дереве каталогов имеется огромный объем данных, которые вы хотите очистить.

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

person raven    schedule 31.08.2009
comment
Расширением к этому было бы использование p4 fstat для проверки того, находится ли файл под контролем версий Perforce. Если это не так, Perforce ответит no such file(s), после чего сценарий удалит файл. Используя этот трюк, сценарий будет работать намного быстрее, так как полная повторная синхронизация хранилища не потребуется. - person fbrereto; 01.09.2009
comment
@fbrereton: Вы правы. Мое первое предложение было простым, но не лучшим. Я добавил к своему ответу еще одну идею в соответствии с вашим предложением, но с использованием команды files вместо команды fstat. - person raven; 01.09.2009

К сожалению, вы не можете,. Аналога svn clean или git clean нет. Жаль, это очень полезные команды.

Вот призыв к разработчикам на веб-сайте Perforce добавить чистую команду. https://perforce.ideas.aha.io/ideas/P4V-I-7

person Colonel Panic    schedule 12.12.2012

Решение Easy Gui, а также примеры, подобные уже упомянутым здесь: Как найти неотслеживаемые файлы в дереве Perforce? (аналог svn status)

person josefwells    schedule 06.01.2011

в Linux это можно сделать без временного файла:

find . -type f | p4 -x- have 2>&1 >/dev/null  | grep "not on client" | cut -d " " -f1 | xargs -ifoo echo rm foo
person user2051965    schedule 07.02.2013

В Windows:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
IF "%1"=="" ( 
    SET proceed=N
    ECHO Are you sure you wish to nuke all files under: 
    ECHO %CD%
    SET /P proceed="Y/N: "
    ECHO !proceed!
    IF /I "!proceed!"=="Y" (
        ECHO Nuking %cd%
        FOR /F "tokens=1 delims=-#" %%G IN ('p4 reconcile -nlad -f ...') do (
            DEL /F "%%G"
        )
    )
) ELSE IF /I "%1"=="-n" (
    ECHO Files to be deleted 1>&2
        FOR /F "tokens=1 delims=-#" %%G IN ('p4 reconcile -nlad -f ...') do (
            ECHO "%%G"
        )
) ELSE GOTO :USAGE

GOTO :STOP

:USAGE
ECHO Usage: nuke [-n]
ECHO     -n will only write the files to be deleted but will not actually delete them

:STOP
person DAve    schedule 12.11.2013
comment
Обратите внимание: этому сценарию не будут нравиться файлы, в именах путей которых есть символы - или #. - person DAve; 13.11.2013
comment
Это глючит. Используйте тот, что выше. - person DAve; 13.11.2013

Этот работает намного лучше:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
IF "%1"=="" ( 
    SET proceed=N
    ECHO Are you sure you wish to nuke all files under: 
    ECHO %CD%
    SET /P proceed="Y/N: "
    ECHO Looking for files to be deleted.  This may take some time depending on the depth of your tree. 1>&2
    IF /I "!proceed!"=="Y" (
        ECHO Nuking %cd%
        FOR /F "tokens=1 delims=#" %%G IN ('p4 reconcile -nla -f ...') DO (
            DEL /F %%G
        )
    )
) ELSE IF /I "%1"=="-n" (
    ECHO Looking for files to be deleted.  This may take some time depending on the depth of your tree. 1>&2
    ECHO Files to be deleted 1>&2
    FOR /F "tokens=1 delims=#" %%G IN ('p4 reconcile -nla -f ...') DO (
        ECHO %%G
    )
) ELSE GOTO :USAGE

GOTO :STOP

:USAGE
ECHO Usage: nuke [-n]
ECHO     -n will only write the files to be deleted but will not actually delete them

:STOP
person DAve    schedule 12.11.2013

Следующие команды я использую, если в моем списке изменений нет изменений.

  • Запустите команду p4concile, которая согласовывает все изменения, сделанные вне Perforce (ключ -a может использоваться, если вам нужны только неотслеживаемые файлы).
  • Запустите 'p4 revert path \ ..., v', который удаляет служебные файлы (с суффиксом, v, они добавляются путем согласования) из списка изменений, но оставляет их в файловой системе.
  • Запустите 'p4 revert -w path \ ...', чтобы удалить все остальные файлы из списка изменений и с диска.
person Anatoliy    schedule 24.10.2014