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

87

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

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

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

Ответы:

81

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

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

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

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

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

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

tenpn
источник
В этот вопрос добавлено решение powershell: stackoverflow.com/questions/3217152/…
tenpn
Отличается ли каждый файл от версии в репо? У меня большое репо и медленное соединение (при работе из дома). Это может длиться вечно!
gdw2
Я не думаю, что это полная разница, но это не быстро.
tenpn
10
Ох, как громко кричать !!!! p4 statusне просто НАХОДИТ неотслеживаемые файлы, он фактически НАЧИНАЕТ ИХ ОТСЛЕЖИВАНИЕ. Т.е. p4 statusэто не запрос только для чтения, как можно было бы догадаться по названию, а на самом деле команда, которая меняет что-то, а не файлы рабочей области. Это НЕ то, что должна делать команда статуса, и НЕ то, что svn statusделает. Самое близкое, что я могу найти, svn statusэто p4 reconcile -na- -a сказать «файлы, которые следует добавить», -n сказать «фактически ничего не меняйте». /// Я изначально сказал что-то более сильное.
Krazy Glew 08
1
p4 statusпо сути является синонимом p4 reconcile -n. Возможно, вы сбежали, p4 status -Aчто является синонимом p4 reconcile?
Samwise
50

В 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
Марк Харрисон
источник
1
Перенаправление stderr на stdout позволит вам выполнять дополнительную фильтрацию или другие операции. Например, чтобы увидеть прокручиваемый список файлов Java: найти. -тип f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | меньше
Джон Надаль
2
Это занимает безумно много времени на моем рабочем пространстве размером 60К файлов. Я написал сценарий python, который выполняет ту же работу менее чем за 10 секунд: p5 . Он также поддерживает .p4ignoreи может предварительно просматривать и автоматически редактировать неотслеживаемые / измененные / удаленные файлы.
hamstergene 02
@hamstergene, очень мило!
Марк Харрисон
Написал небольшой скрипт, который делает именно это, если кому-то интересно (включая аргумент dir, аргумент максимальной глубины и вывод на стандартный вывод).
Арнон Зилка,
Благодарность; Я нашел это полезным! Обратите внимание, что это не обрабатывает символические ссылки ( find . -type l) и дает вводящий в заблуждение вывод для принудительно добавленных файлов P4, потому что они содержат символы @или %. Однако таких файлов меньшинство, поэтому в большинстве случаев можно просмотреть эти крайние случаи вручную.
CJBS
19

Под Unix:

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

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

аху
источник
12

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

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

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

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

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

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

Эндрю Грант
источник
11

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

Да, НО .

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

Полковник Паник
источник
1
p4 statusПосле выпуска 2012.1 было несколько улучшений производительности . Если вы избегали из- p4 statusза проблем с производительностью, возможно, стоит протестировать его снова, чтобы увидеть, как он себя ведет сейчас.
Брайан Пендлтон
7

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

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

--- + КРАТКОЕ

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

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

--- + P4Vграфический интерфейс

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

Крейзи Глю
источник
Статус p4, похоже, не добавляет файлы. похоже, что он работает и задокументирован как «согласование -n». ты уверен, что это что-то меняет?
kdubs
4

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

И вуаля!

Росс Паттерсон
источник
Это отличное решение, которое по-прежнему работает с P4 версии 2015.1
Райан Сандерсон,
очень быстро! find / xargs работает медленно и не хватает памяти. Вспомните, как удваивать% при добавлении в .bat-файл.
Кевинф
4

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

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

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

Грег Уитфилд
источник
К сожалению, это показывает только файлы в текущем каталоге :(
JP P.
2

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

gdw2
источник
1

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

  • p4 status
  • p4 opened
  • p4 diff -ds
Ревень
источник
0

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

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

=== Жак

Джейк Гоудсмит
источник
0

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

Кевинф
источник
0

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

был
источник
1
Пожалуйста, не просто бросайте какой-то код без каких-либо объяснений в качестве ответа, но добавьте объяснение, чтобы помочь OP понять код и чему-то научиться. :)
Маркус
0

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

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

Givanse
источник
0

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

Хазем Рамадан
источник
-1

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

Инженер
источник