Как найти неотслеживаемые файлы в дереве Perforce? (аналог svn status)

У кого-нибудь есть сценарий или псевдоним для поиска неотслеживаемых (на самом деле: не добавленных) файлов в дереве Perforce?

РЕДАКТИРОВАТЬ: Я обновил принятый ответ на этот вопрос, поскольку похоже, что P4V добавил поддержку этого в выпуске января 2009 года.


person David Joyner    schedule 12.08.2008    source источник
comment
Я не могу представить, как так вышло, что наиболее часто используемый корпоративный инструмент SCM лишен этой функциональности. Наверное, все их разработчики используют только графический интерфейс.   -  person sorin    schedule 28.09.2010
comment
Ох, за то, что громко кричал !!!! Принятый p4 status не просто НАХОДИТ неотслеживаемые файлы, он фактически НАЧИНАЕТ ИХ ОТСЛЕЖИВАНИЕ. Т.е. p4 status не является запросом только для чтения, как можно было бы догадаться по названию, но на самом деле это команда, которая меняет что-то, а не файлы рабочей области. Это НЕ то, что должна делать команда статуса, и НЕ то, что делает svn status. Самое близкое, что я могу найти к svn status, - это p4 reconcile -na - -a, чтобы указать файлы, которые следует добавить, -n, чтобы сказать, что на самом деле ничего не меняет. /// Изначально я сказал что-то более сильное.   -  person Krazy Glew    schedule 08.10.2016
comment
Я возродил stackoverflow.com/questions/9642531/, который был неправильно помечен как дубликат stackoverflow.com/questions/9272 /, как новый вопрос (Что такое команда p4, эквивалентная чему-то вроде git / hg / bzr / svn status? (Подсказка: не p4 status), и сам ответил на нее. Лучше приветствовал   -  person Krazy Glew    schedule 09.10.2016
comment
И p4 reconcile, и p4 status работают чертовски медленно, в то время как git status завершил выполнение за 1-3 секунды.   -  person zwcloud    schedule 19.07.2019


Ответы (16)


РЕДАКТИРОВАТЬ: Пожалуйста, используйте p4 status сейчас. Больше нет необходимости прыгать через обручи. См. ответ от @ ColonelPanic.

В версии P4V от января 2009 г. вы можете щелкнуть правой кнопкой мыши любую папку в дереве рабочего пространства и выбрать «согласовать автономную работу ...»

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

Вы можете щелкнуть правой кнопкой мыши файлы в этом представлении и проверить их, добавить или даже отменить.

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

РЕДАКТИРОВАТЬ: вопрос, заданный конкретно о скриптах, но я оставлю этот ответ здесь на всякий случай.

person tenpn    schedule 09.06.2009
comment
В этот вопрос добавлено решение powershell: stackoverflow.com/questions/3217152/ - person tenpn; 10.07.2010
comment
Отличается ли каждый файл от версии в репо? У меня большое репо и медленное соединение (при работе из дома). Это может длиться вечно! - person gdw2; 23.03.2012
comment
Я не думаю, что это полная разница, но это не быстро. - person tenpn; 26.03.2012
comment
Стоит упомянуть, что я выполнил эту команду в каталоге размером 150 МБ с 7300 файлами и 315 папками. Открытие окна заняло менее 10 секунд. Я также запустил его в другом каталоге (1,1 ГБ, 18 138 файлов, 1404 папки), и открытие окна заняло около 50 секунд. Последующие запросы выполняются в течение 5-10 секунд для обеих протестированных мной папок. Так что я бы не СЛИШКОМ боялся, что этот вариант будет слишком медленным (хотя я не уверен, насколько это зависит от характеристик моей системы). P4V 2013 20 марта в Windows 7. - person Bryan Downing; 18.06.2014
comment
И p4 status, и согласование p4v отлично работают, но я подумал, что отмечу, что мне особенно понравилась ошибка сообщение я получил от p4v ... - person davidbak; 24.05.2016
comment
Ох, за то, что громко кричал !!!! p4 status не просто НАХОДИТ неотслеживаемые файлы, он фактически НАЧИНАЕТ ИХ ОТСЛЕЖИВАНИЕ. Т.е. p4 status не является запросом только для чтения, как можно было бы догадаться по названию, но на самом деле это команда, которая меняет что-то, а не файлы рабочей области. Это НЕ то, что должна делать команда статуса, и НЕ то, что делает svn status. Самое близкое, что я могу найти к svn status, - это p4 reconcile -na - -a, чтобы указать файлы, которые следует добавить, -n, чтобы сказать, что на самом деле ничего не меняет. /// Изначально я сказал что-то более сильное. - person Krazy Glew; 08.10.2016
comment
p4 status является синонимом p4 reconcile -n. Возможно, вы использовали p4 status -A, что является синонимом p4 reconcile? - person Samwise; 19.06.2017

В linux или если у вас установлены gnu-tools в Windows:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null

Это покажет сообщение об ошибке для каждого неучтенного файла. Если вы хотите записать этот вывод:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
person Mark Harrison    schedule 12.08.2008
comment
Перенаправление stderr на stdout позволит вам выполнять дополнительную фильтрацию или другие операции. Например, чтобы увидеть прокручиваемый список файлов Java: найти. -тип f -print0 | xargs -0 p4 fstat 2 ›& 1› / dev / null | grep '\ .java' | меньше - person Jon Nadal; 28.11.2012
comment
Это занимает безумно много времени на моем рабочем пространстве размером 60К файлов. Я написал сценарий Python, который выполняет ту же работу менее чем за 10 секунд: p5. Он также поддерживает .p4ignore и может предварительно просматривать и автоматически редактировать неотслеживаемые / измененные / удаленные файлы. - person hamstergene; 02.10.2013
comment
@hamstergene, очень мило! - person Mark Harrison; 02.10.2013
comment
Написал небольшой скрипт, который делает именно это, если кому-то интересно (включая dir аргумент, аргумент максимальной глубины и вывод на стандартный вывод). - person Arnon Zilca; 27.04.2015
comment
Спасибо; Я нашел это полезным! Обратите внимание, что это не обрабатывает символические ссылки (find . -type l) и дает вводящий в заблуждение вывод для принудительно добавленных файлов P4, потому что они содержат символы @ или %. Однако таких файлов меньшинство, поэтому в большинстве случаев подойдет ручная проверка этих крайних случаев. - person CJBS; 12.06.2015
comment
@hamstergene Возможно, что-то изменилось, потому что у меня на рабочем месте более 400 000 файлов, а команда завершилась за ‹20 секунд. Однако, за исключением ~ 40 сообщений об ошибках (обычно из-за файлов, содержащих @), все файлы в каталоге имели соответствующий файл в Perforce. (Я использую P4 / LINUX26X86_64 / 2014.2 / 978861) - person CJBS; 12.06.2015

Под Unix:

find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'

Это распечатает список файлов, которые не добавлены в ваш клиент или хранилище Perforce. Я использовал ! -name '*~', чтобы исключить файлы, заканчивающиеся на ~.

person ahu    schedule 19.09.2008

Ах, один из классиков Perforce :) Да, это действительно отстой, что ВСЕ ЕЩЕ нет простого способа, встроенного в команды по умолчанию.

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

Например, dir / s / b / A-D | p4 -x - добавить

(используйте 'find. -type f -print' из командной строки nix).

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

Если вы запускаете это в P4Win, вы можете использовать $ r для замены клиентского корня текущей рабочей области.

person Andrew Grant    schedule 12.08.2008

Есть аналог svn status или git status?

Да, НО.

В Perforce версии 2012.1 есть команда p4 status, а в P4V - согласование автономной работы. Однако они оба очень медленные. Чтобы исключить нерелевантные файлы, вам необходимо написать p4ignore.txt файл на https://stackoverflow.com/a/13126496/284795

person Colonel Panic    schedule 13.12.2012
comment
После выпуска 2012.1 в p4 status было несколько улучшений производительности. Если вы избегали p4 status из-за проблем с производительностью, возможно, стоит протестировать его еще раз, чтобы увидеть, как он себя ведет сейчас. - person Bryan Pendleton; 07.07.2016

2021-07-16: ЭТОТ ОТВЕТ МОЖЕТ БЫТЬ УСТАРЕЛ.

Я достаточно уверен, что это было правильно в 2016 году, для какой бы версии Perforce я их не использовал (которая не обязательно была самой последней). Но похоже, что эта проблема или ограничение дизайна были устранены в последующих выпусках Perforce. Я не знаю, каков этикет по переполнению стека для этого - следует ли удалить этот ответ?

ОТВЕТ 2016 г.

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

Я не жду никакого уважения к этому ответу, но надеюсь, что он поможет другим избежать тратить время и делать ошибки, следуя принятому, но ИМХО неверному ответу.

--- + КОРОТКО

Вероятно, самый удобный способ найти все неотслеживаемые файлы в специальной рабочей области - p4 reconcile -na.

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

-n говорит, что никаких изменений не вносить - т.е. пробный прогон. (Хотя в сообщениях может быть сказано открыто для добавления, мысленно вы должны интерпретировать это так, как если бы они были открыты для добавления, если не -n)

Вероятно, самый удобный способ найти все локальные изменения, сделанные в автономном режиме - не только файлы, которые, возможно, потребуется добавить, но также файлы, которые, возможно, потребуется удалить, или которые были изменены без открытия для редактирования с помощью p4 edit, - это p4 reconcile -n.

Несколько ответов содержали сценарии, часто с участием p4 fstat. Хотя я не проверил все эти сценарии, я часто использую аналогичные сценарии, чтобы восполнить недостатки команд perforce, таких как p4 reconcile -n - например, часто я обнаруживаю, что мне нужны локальные пути, а не пути к хранилищу Perforce или пути к рабочему пространству.

--- + ВНИМАНИЕ

p4 status НЕ является эквивалентом команд состояния в других системах контроля версий.

p4 status НЕ является запросом только для чтения. p4 status фактически находит такие же изменения, что и p4 reconcile, и добавляет их в репозиторий. p4 status, похоже, не имеет -n опции пробного прогона, как у p4 reconcile.

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

Похоже, что нет причин использовать p4 status вместо p4 reconcile -n, за исключением некоторых деталей о локальном рабочем пространстве и имени пути к депо.

Я могу только представить, что тот, кто выбрал «статус» для команды, не предназначенной только для чтения, имел ограниченное владение английским языком и другими инструментами управления версиями.

--- + P4V GUI

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

person Krazy Glew    schedule 08.10.2016
comment
Статус p4, похоже, не добавляет файлы. похоже, он работает как и задокументирован как «согласование -n». вы уверены, что это что-то меняет? - person kdubs; 12.04.2018

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

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- have 1>NUL:

«dir / S / B / AD» перечисляет все файлы в этой папке или ниже (/ S) в «чистом» формате (/ B ) за исключением каталогов (/ AD). Команда «sed» изменяет опасные символы на их форму «% xx» (а-ля HTML), а команда «p4 have» проверяет это. list ("-x-") против того, чтобы сервер отбрасывал что-либо о файлах, которые он фактически размещает в репозитории ("1> NUL:"). Результат - набор строк вроде:

Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.

Et voil!

person Ross Patterson    schedule 08.06.2009
comment
Это отличное решение, которое по-прежнему работает с P4 версии 2015.1. - person Rian Sanderson; 07.07.2016
comment
очень быстро! find / xargs работает медленно и не хватает памяти. Вспомните, как удваивать% при добавлении в файл .bat. - person Kevin; 19.06.2017

В качестве альтернативы из P4Win используйте опцию «Локальные файлы не в хранилище» на левой панели просмотра.

Я не часто использую P4V, но я думаю, что эквивалентным вариантом будет выбрать «Скрыть файлы локального рабочего пространства» в раскрывающемся списке фильтров на вкладке «Представление рабочего пространства». P4 help fstat

В P4V 2015.1 вы найдете эти параметры под кнопкой фильтра следующим образом:  введите описание изображения здесь

person Greg Whitfield    schedule 28.08.2008
comment
К сожалению, это показывает только файлы в текущем каталоге :( - person JP P.; 16.10.2017

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

person gdw2    schedule 23.03.2012

Следующие команды производят вывод, похожий на статус, но ни одна из них не является полностью эквивалентной svn status или git status, предоставляя однострочную сводку состояния каждого файла:

  • p4 status
  • p4 opened
  • p4 diff -ds
person Rhubbarb    schedule 18.07.2016

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

Далее используется p4 fstat (спасибо, Марк Харрисон) вместо p4 have, и перечислены файлы, которых нет на складе и которые не открыты для добавления.

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- fstat 2>&1 | sed -n -e "s/ - no such file[(]s[)]\.$//gp"

=== Жак

person Jac Goudsmit    schedule 25.11.2015

Быстрый метод, но немного ортодоксальный. Если кодовая база не слишком часто добавляет новые файлы / не меняет представление, вы можете создать локальный репозиторий git вне своей кассы. Из чистой синхронизации perforce, git init, добавьте и зафиксируйте все файлы локально. Статус Git быстр и покажет файлы, которые ранее не были зафиксированы.

person Kevin    schedule 19.06.2017

Команда p4 fstat позволяет вам проверить, существует ли файл в рабочей области, в сочетании с find, чтобы найти файлы для проверки, как в следующем примере Perl:

// throw the output of p4 fstat to a 'output file'
// find:
//  -type f  :-  only look at files,
//  -print0  :-  terminate strings with \0s to support filenames with spaces
// xargs:
//  Groups its input into command lines,
//  -0       :-  read input strings terminated with \0s
// p4:
//  fstat    :-  fetch workspace stat on files

my $status=system "(find . -type f -print0 | xargs -0 p4 fstat > /dev/null) >& $outputFile";

// read output file
open F1, $outputFile or die "$!\n";

// iterate over all the lines in F1
while (<F1>) {
  // remove trailing whitespace
  chomp $_;

  // grep lines which has 'no such file' or 'not in client'
  if($_ =~ m/no such file/ || $_ =~ m/not in client/){

     // Remove the content after '-'
     $_=~ s/-\s.*//g;

     // below line is optional. Check ur output file for more clarity.
     $_=~ s/^.\///g;

     print "$_\n";
  }
}

close F1;

Или вы можете использовать p4 reconcile -n -m ...

Если он «открыт для удаления», значит, он был удален из рабочей области. Обратите внимание, что указанная выше команда работает в режиме предварительного просмотра (-n).

person beena    schedule 19.10.2017
comment
Пожалуйста, не просто бросайте какой-то код без каких-либо объяснений в качестве ответа, но добавьте объяснение, чтобы помочь OP понять код и чему-то научиться. :) - person Markus; 19.10.2017

Мне нужно было что-то, что работало бы в Linux, Mac или Windows. Поэтому я написал для него сценарий Python. Основная идея состоит в том, чтобы перебирать файлы и выполнять p4 fstat для каждого. (конечно, игнорируя зависимости и папки tmp)

Вы можете найти его здесь: https://gist.github.com/givanse/8c69f55f8243733702cf7

person givanse    schedule 02.05.2018

Эта команда может предоставить вам список файлов, которые необходимо добавить, отредактировать или удалить:
p4 status -aed ...
вы также можете использовать их по отдельности
p4 status -a .. .
статус p4 -e ...
статус p4 -d ...

person Hazem Ramadan    schedule 26.10.2020

В P4V в пункте меню «Просмотр» выберите «Файлы в папке», на правой панели появится новая вкладка. Справа от вкладок есть маленький значок, который вызывает окно под названием «Файлы в папке» с двумя значками. Выберите левый значок, похожий на воронку, и вы увидите несколько вариантов. Выберите «Показать предметы не на складе», и все файлы в папке появятся. Затем просто щелкните правой кнопкой мыши файл, который хотите добавить, и выберите «Отметить для добавления ...». Вы можете проверить его наличие на вкладке «Ожидающие». Просто отправьте как обычно (Ctrl + S).

person Engineer    schedule 19.09.2013