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

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

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

Ответов (16)

Решение

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

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

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

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

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

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

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

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

Да, НО .

Начиная с Perforce версии 2012.1, есть команда p4 status и в P4V «согласовать автономную работу». Однако они оба очень медленные. Чтобы исключить нерелевантные файлы, вам нужно написать p4ignore.txt файл на https://answacode.com/a/13126496/284795.

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

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

Следующее использование 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"

=== Як

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

  • p4 status
  • p4 opened
  • p4 diff -ds

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

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

--- + КРАТКОЕ

Вероятно, самый удобный способ найти все неотслеживаемые файлы в рабочей области perforce - 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, за исключением некоторых деталей локального рабочего пространства и пути к депо.

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

--- + P4VGUI

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

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

Команда 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 ).

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

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

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

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

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

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

В 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

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

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

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

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

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

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

Под Unix:

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

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

Я использую следующее в моем инструменте, который выполняет резервное копирование любых файлов в рабочей области, которые отличаются от репозитория (для 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 » проверяет этот список (« -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.

И вуаля!