Як знайти невідстежені файли в дереві Perforce? (аналог статусу svn)


87

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

РЕДАГУВАТИ: Я оновив прийняту відповідь на цю, оскільки схоже, що P4V додав підтримку для цього у випуску в січні 2009 року.


11
Я не можу собі уявити, як це виходить, що в найбільш часто використовуваному корпоративному інструменті SCM відсутня ця функціональність. Напевно, всі їх розробники використовують лише графічний інтерфейс.
сорін

3
О, за крик уголос !!!! Прийняте p4 statusне просто ЗНАЙДИТИ відстежені файли, воно фактично ПОЧАЄ ВІДСЛІДУВАТИ ЇХ. Тобто p4 statusце не запит лише для читання, як можна підозрювати з назви, а насправді це команда, яка змінює матеріали, а не файли робочої області. Це НЕ те, що повинна робити команда стану, і НЕ те, що svn statusробить. Найближче, що я можу знайти svn status, p4 reconcile -na- це -a сказати "файли, які слід додати", -n сказати "насправді нічого не змінювати". /// Я спочатку сказав щось набагато сильніше.
Krazy Glew

1
Я відновив stackoverflow.com/questions/9642531/… , який був неправильно позначений як дублікат stackoverflow.com/questions/9272/… , як нове запитання (Що таке команда p4, еквівалентна чомусь на зразок git / hg / bzr / svn статус? (Підказка: ні p4 status) , і я відповів сам. Краще вітати
Krazy Glew

Обидва p4 reconcileі p4 statusповільні, як пекло, git statusвиконуючи за 1-3 секунди.
zwcloud

Відповіді:


81

EDIT: Будь ласка, використовуйте p4 statusзараз. Більше немає потреби стрибати через обручі. Див @ ColonelPanic в відповідь .

У версії P4V від січня 2009 року ви можете клацнути правою кнопкою миші будь-яку папку у дереві робочої області та натиснути кнопку "Примирити роботу в автономному режимі ..."

Це зробить невелику обробку, а потім відобразить розділене дерево файлів, які не перевірені, але мають відмінності від версії депо або не зареєстровані взагалі. Існує навіть кілька інших категорій, які він виховує.

Ви можете клацнути правою кнопкою миші на файлах у цьому поданні та перевірити їх, додати або навіть скасувати.

Це дуже зручний інструмент, який врятував мені дупу кілька разів.

РЕДАКТУВАТИ: ах, питання, яке задається конкретно щодо сценаріїв, але я залишу цю відповідь тут про всяк випадок.


Додано рішення Powershell в цьому питанні: stackoverflow.com/questions/3217152 / ...
tenpn

Чи це відрізняє кожен окремий файл від версії в репо? У мене великий репо та повільний зв’язок (коли я працюю вдома). Це може зайняти вічно!
gdw2

Я не думаю, що це повна різниця, але це не швидко.
tenpn

10
О, за крик уголос !!!! p4 statusне просто ЗНАЙТИ файли, що не відстежуються, вони фактично ПОЧАЮТЬ ВІДСЛІДЖУВАТИ ЇХ. Тобто p4 statusце не запит лише для читання, як можна підозрювати з назви, а насправді це команда, яка змінює матеріали, а не файли робочої області. Це НЕ те, що повинна робити команда стану, і НЕ те, що svn statusробить. Найближче, що я можу знайти svn status, p4 reconcile -na- це -a сказати "файли, які слід додати", -n сказати "насправді нічого не змінювати". /// Я спочатку сказав щось набагато сильніше.
Krazy Glew

1
p4 statusє в основному синонімом слова p4 reconcile -n. Можливо, ви бігали, p4 status -Aщо є синонімом p4 reconcile?
Семвайз

50

У Linux або якщо у вас встановлені gnu-інструменти у 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 -друк0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | менше
Джон Надал

2
Це шалено довго займає мою робочу область із 60K-файлами. Я написав сценарій python, який виконує ту саму роботу менш ніж за 10 секунд: p5 . Він також підтримує .p4ignoreі може попередньо переглядати та автоматично редагувати відстежувані / змінені / видалені файли.
hamstergene

@hamstergene, дуже приємно!
Mark Harrison,

Написав невеликий скрипт, який робить саме це, якщо хтось зацікавлений (включаючи аргумент dir, аргумент максимальної глибини та вихід у stdout).
Арнон Зілка

Дякую; Я знайшов це корисним! Зверніть увагу, що це не обробляє символьні посилання ( 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

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

Я не сподіваюся на якусь похвалу за цю відповідь, але я сподіваюся, що це допоможе іншим уникнути втрати часу та помилок, слідуючи прийнятій, але неправильній відповіді IMHO.

--- + КОРОТКИЙ

Мабуть, найзручнішим способом знайти всі файли, що не відслідковуються, у робочій області perforce є p4 reconcile -na.

-a каже "дайте мені файли, яких немає у сховищі, тобто які слід додати".

-nкаже "не вносити змін" - тобто пробіг. (Хоча в повідомленнях може бути написано "відкрито для додавання", подумки ви повинні інтерпретувати це як "буде відкрито для додавання, якщо не -n")

Ймовірно, найбільш зручний спосіб знайти всі локальні зміни , зроблені в автономному режимі - не тільки файли , які , можливо , необхідно додати, але і файли , які , можливо , буде потрібно видалити, або які були змінені без відкриті для редагування з допомогою p4 edit, є p4 reconcile -n.

Кілька відповідей давали сценарії, які часто включали p4 fstat. Хоча я не перевірив усі ці сценарії, я часто використовую подібні сценарії, щоб заповнити недоліки команд perforce, таких як p4 reconcile -n- наприклад, часто я виявляю, що хочу локальні шляхи, а не шляхи складування або робочої області.

--- + ПОПЕРЕДЖЕННЯ

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.

Et voilà!


Це чудове рішення, і воно все ще працює з версією P4 2015.1
Ріан Сандерсон,

дуже швидко! find / xargs закінчується пам'ять і повільно. Згадайте подвоїти% при додаванні до файлу .bat.
kevinf

4

Як варіант від P4Win, скористайтеся опцією "" Локальні файли, що не перебувають у депо "на панелі перегляду зліва.

Я мало використовую P4V, але, на мою думку, еквівалентом є вибір "Сховати файли локальної робочої області" у спадному меню фільтра на вкладці Перегляд робочої області. P4 help fstat

У P4V 2015.1 ви знайдете ці параметри під кнопкою фільтра таким чином: введіть тут опис зображення


Це показує лише файли в поточному каталозі, на жаль :(
JP P.

2

Швидкий і брудний: У p4v клацніть правою кнопкою миші на відповідній папці та додайте всі файли під нею до нового списку змін. Тепер список змін міститиме всі файли, які в даний час не є частиною депо.


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' поза вашим замовленням. За допомогою чистої виконавчої синхронізації 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
Будь ласка, не просто кидайте якийсь код без будь-яких пояснень як відповідь, а додайте пояснення, щоб допомогти ОП зрозуміти код і щось навчитися. :)
Маркус

0

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

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


0

Ця команда може дати вам список файлів, які потрібно додати, відредагувати або видалити:
p4 status -aed ...
ви можете використовувати їх також окремо
p4 status -a ...
p4 status -e ...
p4 status -d ...


-1

У P4V під пунктом меню "Перегляд" виберіть "Файли в папці", що відкриє нову вкладку в правій області. Праворуч від вкладок є маленька піктограма, яка відкриває вікно "Файли в папці" з 2 піктограмами. Виберіть ліву піктограму, яка виглядає як воронка, і ви побачите кілька варіантів. Виберіть "Показати елементи, що не містяться в депо", і всі файли в папці з'являться. Потім просто клацніть правою кнопкою миші файл, який ви хочете додати, і виберіть "Позначити для додавання ...". Ви можете переконатися, що він є на вкладці "Очікує на розгляд". Просто надішліть як зазвичай (Ctrl + S).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.