Làm cách nào để tìm các tệp chưa được theo dõi trong cây Perforce? (tương tự của trạng thái svn)


87

Có ai có tập lệnh hoặc bí danh để tìm các tệp chưa được theo dõi (thực sự: chưa được mã hóa) trong cây Perforce không?

CHỈNH SỬA: Tôi đã cập nhật câu trả lời được chấp nhận cho câu trả lời này vì có vẻ như P4V đã thêm hỗ trợ cho câu trả lời này trong bản phát hành tháng 1 năm 2009.


11
Tôi không thể tưởng tượng làm thế nào mà công cụ SCM của công ty được sử dụng nhiều nhất lại thiếu chức năng này. Có lẽ tất cả các nhà phát triển của họ đang chỉ sử dụng GUI.
sorin

3
Khóc to lên nào!!!! Được chấp nhận p4 statuskhông chỉ TÌM các tệp chưa được kiểm tra, mà nó thực sự SAO THEO DÕI CHÚNG. Tức p4 statuslà không phải là một truy vấn chỉ đọc, như người ta sẽ nghi ngờ từ tên, nhưng thực sự là một lệnh thay đổi nội dung - không phải các tệp không gian làm việc. Đây KHÔNG phải là những gì một lệnh trạng thái nên làm, và KHÔNG phải những gì svn statusphải làm. Điều gần nhất mà tôi có thể tìm thấy svn statusp4 reconcile -na- -a để nói "các tệp cần được thêm vào", -n để nói "không thực sự thay đổi bất cứ điều gì". /// Ban đầu tôi đã nói điều gì đó mạnh mẽ hơn nhiều.
Krazy Glew

1
Tôi đã phục hồi stackoverflow.com/questions/9642531/… , được đánh dấu không chính xác là bản sao của stackoverflow.com/questions/9272/… , là câu hỏi mới (Lệnh p4 tương đương với một cái gì đó như git / hg / bzr / svn ? trạng thái (Gợi ý: không p4 status) ., và trả lời nó bản thân mình tốt hơn hoan nghênh
Krazy Glew

Cả hai p4 reconcilep4 statusđều chậm như quái, trong khi git statusthực hiện xong trong 1-3 giây.
zwcloud 19/07/19

Câu trả lời:


81

CHỈNH SỬA: Hãy sử dụng p4 statusngay bây giờ. Không cần phải nhảy qua vòng nữa. Hãy xem câu trả lời của @ ColonelPanic .

Trong phiên bản P4V tháng 1 năm 2009, bạn có thể nhấp chuột phải vào bất kỳ thư mục nào trong cây không gian làm việc của mình và nhấp vào "điều chỉnh công việc ngoại tuyến ..."

Thao tác này sẽ thực hiện một chút xử lý sau đó hiển thị chế độ xem dạng cây gồm các tệp chưa được kiểm xuất nhưng có sự khác biệt so với phiên bản kho hoặc chưa được đăng ký. Thậm chí có thể có một vài danh mục khác mà nó đưa ra.

Bạn có thể nhấp chuột phải vào các tệp trong chế độ xem này và xem chúng, thêm chúng hoặc thậm chí hoàn nguyên chúng.

Đó là một công cụ rất tiện dụng đã cứu tôi vài lần.

EDIT: à câu hỏi được hỏi cụ thể về script, nhưng tôi sẽ để câu trả lời này ở đây để đề phòng.


Thêm một giải pháp PowerShell trong câu hỏi này: stackoverflow.com/questions/3217152/...
tenpn

Điều này có khác mọi tệp với phiên bản trong repo không? Tôi có một repo lớn và kết nối chậm (khi làm việc tại nhà). Điều này có thể mất mãi mãi!
gdw2 23/03/12

Tôi không nghĩ đó là một sự khác biệt đầy đủ, nhưng nó không nhanh chóng.
tenpn

10
Khóc to lên nào!!!! p4 statuskhông chỉ TÌM các tệp chưa được kiểm tra, nó thực sự SAO THEO DÕI CHÚNG. Tức p4 statuslà không phải là một truy vấn chỉ đọc, như người ta sẽ nghi ngờ từ tên, nhưng thực sự là một lệnh thay đổi nội dung - không phải các tệp không gian làm việc. Đây KHÔNG phải là những gì một lệnh trạng thái nên làm, và KHÔNG phải những gì svn statusphải làm. Điều gần nhất mà tôi có thể tìm thấy svn statusp4 reconcile -na- -a để nói "các tệp cần được thêm vào", -n để nói "không thực sự thay đổi bất cứ điều gì". /// Ban đầu tôi đã nói điều gì đó mạnh mẽ hơn nhiều.
Krazy Glew

1
p4 statusvề cơ bản là một từ đồng nghĩa với p4 reconcile -n. Có lẽ bạn đã chạy p4 status -Amà là một từ đồng nghĩa với p4 reconcile?
Samwise

50

Trên linux, hoặc nếu bạn đã cài đặt gnu-tools trên windows:

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

Điều này sẽ hiển thị thông báo lỗi cho mọi tệp chưa được tính. Nếu bạn muốn nắm bắt đầu ra đó:

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

1
Chuyển hướng stderr sang stdout sẽ cho phép bạn thực hiện thêm các thao tác lọc hoặc các thao tác khác. Ví dụ: để xem danh sách các tệp Java có thể cuộn: hãy tìm. -type f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | ít
Jon Nadal

2
Điều này mất nhiều thời gian trên không gian làm việc 60K tệp của tôi. Tôi đã viết một tập lệnh python thực hiện công việc tương tự trong vòng chưa đầy 10 giây: p5 . Nó cũng hỗ trợ .p4ignorevà có thể xem trước và tự động chỉnh sửa các tệp không được theo dõi / thay đổi / xóa.
hamstergene

@hamstergene, rất hay!
Mark Harrison

Đã viết một tập lệnh nhỏ thực hiện chính xác điều đó nếu bất kỳ ai quan tâm (bao gồm đối số dir, đối số chiều sâu tối đa & xuất ra stdout).
Arnon Zilca

Cảm ơn; Tôi thấy điều này hữu ích! Lưu ý rằng điều này không xử lý các liên kết tượng trưng ( find . -type l) và cung cấp đầu ra gây hiểu lầm cho các tệp P4 buộc phải được thêm vào vì chúng chứa ký tự @hoặc %. Tuy nhiên, các tệp như vậy chiếm thiểu số, vì vậy việc xem xét thủ công các trường hợp cạnh này sẽ hoạt động trong hầu hết các trường hợp.
CJBS

19

Dưới Unix:

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

Thao tác này sẽ in ra danh sách các tệp không được thêm vào máy khách của bạn hoặc kho Perforce. Tôi đã từng ! -name '*~'loại trừ các tệp kết thúc bằng ~.


12

Ahh, một trong những tác phẩm kinh điển của Perforce :) Vâng, thật tệ là VẪN không có cách nào dễ dàng cho việc này được tích hợp trong các lệnh mặc định.

Cách dễ nhất là chạy lệnh để tìm tất cả các tệp trong thư mục gốc của máy khách của bạn, sau đó cố gắng thêm chúng vào kho. Bạn sẽ nhận được danh sách thay đổi của tất cả các tệp mới và các tệp hiện có sẽ bị bỏ qua.

Ví dụ: dir / s / b / AD | p4 -x - thêm

(sử dụng 'find. -type f -print' từ dòng lệnh nix).

Nếu bạn muốn có một danh sách vật lý (trong bảng điều khiển hoặc tệp) thì bạn có thể xem kết quả của một khác biệt (hoặc thêm nếu bạn cũng muốn chúng trong danh sách thay đổi).

Nếu bạn đang chạy điều này trong P4Win, bạn có thể sử dụng $ r để thay thế gốc máy khách của không gian làm việc hiện tại.


11

Có một chất tương tự của svn statushoặc git status?

Vâng, NHƯNG .

Kể từ phiên bản Perforce 2012.1, có lệnh p4 statusvà trong P4V 'điều hòa công việc ngoại tuyến'. Tuy nhiên, cả hai đều rất chậm. Để loại trừ các tệp không liên quan, bạn sẽ cần ghi một p4ignore.txttệp theo https://stackoverflow.com/a/13126496/284795


1
Đã có một số cải tiến về hiệu suất p4 statuskể từ bản phát hành 2012.1. Nếu bạn đã tránh xa p4 statusdo lo ngại về hiệu suất, có thể bạn nên thử nghiệm lại để xem hiện tại nó hoạt động như thế nào.
Bryan Pendleton

7

Tôi cảm thấy bị thôi thúc phải thêm một câu trả lời, vì câu trả lời được chấp nhận và một số câu trả lời khác, có những gì tôi nghĩ là một vấn đề quan trọng: họ không hiểu sự khác biệt giữa lệnh truy vấn chỉ đọc và lệnh thực hiện thay đổi.

Tôi không mong đợi bất kỳ tín dụng nào cho câu trả lời này, nhưng tôi hy vọng rằng nó sẽ giúp những người khác tránh lãng phí thời gian và mắc lỗi khi làm theo câu trả lời được chấp nhận nhưng IMHO không chính xác.

--- + SƠ LƯỢC

Có lẽ cách thuận tiện nhất để tìm tất cả các tệp chưa được theo dõi trong không gian làm việc áp lực là p4 reconcile -na.

-a nói "cung cấp cho tôi các tệp không có trong kho lưu trữ, tức là tệp đó sẽ được thêm vào".

-nnói "không thực hiện thay đổi" - tức là chạy khô. (Mặc dù các thông báo có thể nói "đã mở để thêm", về mặt tinh thần, bạn phải giải thích điều đó là "sẽ được mở để thêm nếu không -n")

Có lẽ là cách thuận tiện nhất để tìm tất cả những thay đổi địa phương thực hiện trong khi ẩn - không chỉ các tập tin mà cần sức mạnh để được thêm vào, mà còn tập tin rằng có thể cần phải được xóa bỏ, hoặc đã được thay đổi mà không được mở để chỉnh sửa thông qua p4 edit, là p4 reconcile -n.

Một số câu trả lời cung cấp các kịch bản, thường liên quan đến p4 fstat. Trong khi tôi chưa xác minh tất cả các tập lệnh đó, tôi thường sử dụng các tập lệnh tương tự để bù đắp cho những thiếu sót của lệnh perforce chẳng hạn như p4 reconcile -n- ví dụ: tôi thường thấy rằng tôi muốn đường dẫn cục bộ hơn là đường dẫn kho Perforce hoặc đường dẫn không gian làm việc.

--- + CẢNH BÁO

p4 status KHÔNG phải là bản sao đối với các lệnh trạng thái trên các hệ thống điều khiển phiên bản khác.

p4 statusKHÔNG phải là truy vấn chỉ đọc. p4 statusthực sự tìm thấy cùng một loại thay đổi p4 reconcilevà thêm chúng vào kho lưu trữ. p4 statusdường như không có một -ntùy chọn chạy khô như p4 reconcilehiện tại.

Nếu bạn làm vậy p4 status, nhìn vào các tệp và nghĩ "Ồ, tôi không cần những tệp đó", thì bạn sẽ phải xem p4 revertchúng nếu bạn muốn tiếp tục chỉnh sửa trong cùng một không gian làm việc. Hoặc nếu không, những thay đổi p4 statusđược thêm vào tập thay đổi của bạn sẽ được kiểm tra trong lần tiếp theo.

Dường như có rất ít hoặc không có lý do gì để sử dụng p4 statushơn là p4 reconcile -n, ngoại trừ một số chi tiết của không gian làm việc cục bộ so với tên đường dẫn kho.

Tôi chỉ có thể tưởng tượng rằng bất kỳ ai chọn 'trạng thái' cho lệnh không chỉ đọc đã có lệnh giới hạn về ngôn ngữ tiếng Anh và các công cụ kiểm soát phiên bản khác.

--- + P4VGUI

Trong GUI p4v, lệnh điều hòa tìm các thay đổi cục bộ có thể cần được thêm, xóa hoặc mở để chỉnh sửa. May mắn thay, nó không thêm chúng vào danh sách thay đổi theo mặc định; nhưng bạn vẫn có thể muốn cẩn thận đóng cửa sổ điều chỉnh sau khi kiểm tra nó, nếu bạn không muốn thực hiện các thay đổi.


trạng thái p4 dường như không thêm tệp. nó dường như hoạt động giống như và được ghi lại là 'hoà giải -n'. bạn có chắc nó thay đổi mọi thứ?
kdubs

4

Tôi sử dụng phần sau trong công cụ của mình để sao lưu bất kỳ tệp nào trong không gian làm việc khác với kho lưu trữ (dành cho Windows). Nó xử lý một số trường hợp kỳ lạ mà Perforce không thích lắm, chẳng hạn như khoảng trống được nhúng, dấu sao, phần trăm và dấu thăng:

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 " liệt kê tất cả các tệp ở hoặc bên dưới thư mục này ( / S ) ở định dạng "trần" ( / B ) không bao gồm thư mục (/ AD ). " Sed " thay đổi các ký tự nguy hiểm thành dạng " % xx " của chúng (a la HTML) và lệnh " p4 have " kiểm tra danh sách này (" -x- ") so với máy chủ loại bỏ bất kỳ thứ gì về các tệp mà nó thực sự định vị trong kho lưu trữ (" 1> NUL: "). Kết quả là một loạt các dòng như:

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

Et voilà!


Đây là một giải pháp tuyệt vời, và vẫn làm việc với phiên bản P4 2015,1
Rian Sanderson

rất nhanh! find / xargs hết bộ nhớ và chậm. Nhớ lại để nhân đôi% s khi thêm vào tệp .bat.
kevinf

4

Ngoài ra từ P4Win, hãy sử dụng tùy chọn "" Tệp cục bộ không có trong kho "trên bảng điều khiển bên trái.

Tôi không sử dụng P4V nhiều, nhưng tôi nghĩ cách tương đương là chọn "Ẩn tệp không gian làm việc cục bộ" trong trình đơn thả xuống bộ lọc của chế độ xem không gian làm việc tab.p4 help fstat

Trong P4V 2015.1, bạn sẽ tìm thấy các tùy chọn này dưới nút bộ lọc như sau: nhập mô tả hình ảnh ở đây


Điều này chỉ hiển thị các tệp trong thư mục hiện tại, thật đáng buồn :(
JP P.

2

Quick 'n Dirty: Trong p4v, nhấp chuột phải vào thư mục được đề cập và thêm tất cả các tệp bên dưới nó vào danh sách thay đổi mới. Danh sách thay đổi bây giờ sẽ chứa tất cả các tệp hiện không phải là một phần của kho.


1

Các lệnh sau tạo ra đầu ra giống trạng thái, nhưng không có lệnh nào tương đương với svn statushoặc git status, cung cấp tóm tắt một dòng về trạng thái của mỗi tệp:

  • p4 status
  • p4 opened
  • p4 diff -ds

0

Tôi không có đủ điểm danh tiếng để nhận xét, nhưng giải pháp của Ross cũng liệt kê các tệp đang mở để thêm. Bạn có thể không muốn sử dụng câu trả lời của mình để làm sạch không gian làm việc của bạn.

Phần sau sử dụng p4 fstat(cảm ơn Mark Harrison) thay vì p4 havevà liệt kê các tệp không có trong kho không được mở để thêm.

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"

=== Jac


0

Phương pháp nhanh, nhưng ít chính thống. Nếu cơ sở mã không thêm tệp mới / chế độ xem thay đổi quá thường xuyên, bạn có thể tạo kho lưu trữ 'git' cục bộ từ thanh toán của mình. Từ đồng bộ hóa perforce, git init, thêm và cam kết cục bộ tất cả các tệp. Trạng thái Git nhanh và sẽ hiển thị các tệp chưa được cam kết trước đó.


0

Các p4 fstatlệnh cho phép bạn kiểm tra xem một tập tin tồn tại trong không gian làm việc, kết hợp với findxác định vị trí các tập tin để kiểm tra như trong ví dụ Perl sau:

// 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;

Hoặc bạn có thể sử dụng p4 reconcile -n -m ...

Nếu nó được 'mở để xóa' thì nó đã bị xóa khỏi không gian làm việc. Lưu ý rằng lệnh trên đang chạy ở chế độ xem trước ( -n).


1
Vui lòng không chỉ ném một số mã mà không có bất kỳ giải thích nào dưới dạng câu trả lời mà hãy thêm một số giải thích để giúp OP hiểu mã và học được điều gì đó. :)
Markus

0

Tôi cần thứ gì đó có thể hoạt động trên Linux, Mac hoặc Windows. Vì vậy, tôi đã viết một tập lệnh Python cho nó. Ý tưởng cơ bản là lặp qua các tệp và thực thi p4 fstattrên mỗi tệp . (tất nhiên bỏ qua các phụ thuộc và thư mục tmp)

Bạn có thể tìm thấy nó ở đây: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9


0

Lệnh này có thể cung cấp cho bạn danh sách các tệp cần được thêm, chỉnh sửa hoặc xóa:
trạng thái p4 -aed ...
bạn có thể sử dụng chúng riêng biệt cũng như
trạng thái p4 -a ...
trạng thái p4 -e ...
trạng thái p4 -d ...


-1

Trong P4V, bên dưới mục menu "Xem", chọn "Tệp trong Thư mục", tab này sẽ hiển thị một tab mới trong ngăn bên phải. Ở ngoài cùng bên phải của các tab có một biểu tượng nhỏ mở ra một cửa sổ có tên "Files in Folder" với 2 biểu tượng. Chọn biểu tượng bên trái trông giống như một cái phễu và bạn sẽ thấy một số tùy chọn. Chọn "Hiển thị các mục không có trong Kho" và tất cả các tệp trong thư mục sẽ hiển thị. Sau đó, chỉ cần nhấp chuột phải vào tệp bạn muốn thêm và chọn "Đánh dấu để Thêm ...". Bạn có thể xác minh nó ở đó trong tab "Đang chờ xử lý". Chỉ cần gửi như bình thường (Ctrl + S).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.