2008-09-05 28 views

Trả lời

83

Tôi khuyên bạn nên điều ngược lại cho các hệ thống xây dựng tự động: đầu tiên bạn sẽ nhận được danh sách thay đổi mới nhất từ ​​máy chủ sử dụng:

p4 changes -s submitted -m1 

sau đó đồng bộ với sự thay đổi đó và ghi vào các thông tin sửa đổi. Lý do là như sau. Mặc dù Perforce recommends the following để xác định danh sách thay đổi mà không gian làm việc được đồng bộ hóa:

p4 changes -m1 @clientname 

họ lưu ý một vài gotchas:

  • này chỉ hoạt động nếu bạn chưa gửi bất cứ điều gì từ không gian làm việc trong câu hỏi.
  • Cũng có thể không gian làm việc của máy khách không được đồng bộ hóa với bất kỳ danh sách thay đổi cụ thể nào.

và có một Gotcha thêm họ không đề cập đến:

  • Nếu danh sách thay đổi cao nhất mà đồng bộ xảy ra file bị xóa hoàn toàn khỏi không gian làm việc, tiếp theo cao nhất danh sách thay đổi sẽ được báo cáo (trừ khi nó cũng vậy, các tệp đã bị xóa hoàn toàn).

Nếu bạn phải đồng bộ hóa trước và ghi lại sau, Perforce khuyên bạn nên chạy lệnh sau đây để xác định xem bạn đã từng bị các gotchas nêu trên hay chưa; nó sẽ cho biết không có nội dung nào được đồng bộ hóa hoặc xóa:

p4 sync -n @changelist_number 
+1

Cảm ơn bạn đã thêm thông tin. –

+0

Tại sao "Điều này chỉ hoạt động nếu bạn chưa gửi bất kỳ điều gì từ không gian làm việc được đề cập."? – gdw2

+0

Nếu bạn gửi thay đổi, 'p4 changes -s submitted -m1' sẽ trả lại số thay đổi của bạn. Ví dụ: giả sử bạn đồng bộ hóa với danh sách thay đổi 5, đợi vài giờ và sau đó gửi danh sách thay đổi 10. Lệnh thay đổi ở trên sẽ trả về 10. – Rinn

25

Chỉ cần trả lời này bản thân mình phù hợp với gợi ý của việc sử dụng Stackoverflow như là một nơi để giữ đoạn kỹ thuật của Jeff ....

Từ việc sử dụng dòng lệnh:

p4 changes -m1 @<clientname> 

Và chỉ cần thay thế với tên thông số khách hàng của bạn. Điều này sẽ tạo ra kết quả đầu ra của biểu mẫu:

Change 12345 on 2008/08/21 by [email protected] '....top line of description...' 

Được phân tích cú pháp dễ dàng để trích xuất số thay đổi.

+0

Tôi nhận được: Yêu cầu quá lớn (trên 1500000); xem 'p4 help maxresults'. – user674669

+0

@ user674669: sử dụng tùy chọn -m1 chỉ trả về danh sách thay đổi cuối cùng (1) – panako

+1

Tên khách hàng là gì? Tôi có cổng máy chủ không gian làm việc ?? Tên người dùng ??? – marsh

5

Đối với bản dựng nghiêm trọng (bản đang được chuẩn bị để thử nghiệm), hãy chỉ định rõ ràng nhãn hoặc số thay đổi mong muốn, đồng bộ hóa với nhãn, và nhúng nó vào các tạo phẩm xây dựng.

Nếu không thay đổi (hoặc nhãn), hãy sử dụng p4 counter change để lấy số thay đổi hiện tại và ghi lại. Nhưng bạn vẫn cần phải đồng bộ hóa mọi thứ bằng cách sử dụng số thay đổi đó.

Tôi không nghĩ rằng bạn có thể đạt được chính xác những gì bạn muốn, bởi vì nói chung, toàn bộ không gian làm việc không được đồng bộ hóa với một số thay đổi cụ thể. Người ta có thể đồng bộ một cách rõ ràng một số tập tin với các phiên bản cũ hơn, và sau đó một số thay đổi duy nhất là vô nghĩa. Đó là lý do tại sao cần có sync mới để đảm bảo rằng một số thay đổi duy nhất thể hiện chính xác phiên bản mã.


Về nhận xét: Có, câu trả lời của tôi là dành cho người quản lý cấu hình chuẩn bị xây dựng để cung cấp cho QA. Các nhà phát triển của chúng tôi thường không đồng bộ hóa như một phần của bản dựng; họ thực hiện một bản dựng trước khi gửi — để họ có thể đảm bảo các thay đổi của họ không phá vỡ bản dựng hoặc thử nghiệm. Trong bối cảnh đó, chúng tôi không bận tâm để nhúng một nhãn kho.

Với cách tiếp cận của bạn, bạn đang giả định rằng toàn bộ không gian làm việc của bạn được đồng bộ hóa vào đầu thời gian gửi bài thay đổi cuối cùng của bạn và danh sách thay đổi đó bao gồm tất cả các tệp đang mở của bạn. Nó quá dễ bị nhầm lẫn trong những giả định đó, khó phát hiện và tốn kém khủng khiếp về thời gian bị mất. Mặt khác, giải quyết vấn đề là dễ dàng, không có nhược điểm. Và bởi vì một số thay đổi có thể được xác định rõ ràng, nó không quan trọng bạn cần sửa đổi gì hoặc codebase thay đổi nhanh như thế nào.

+0

Erickson - gợi ý hay, nhưng tôi nghĩ nó bao gồm một tập hợp hoàn cảnh khác so với câu trả lời tôi đã cung cấp. Chắc chắn truy cập sẽ làm việc nếu bạn có khả năng chỉ có sửa đổi đầu, và máy chủ không đủ bận rộn để một ai đó, có lẽ làm việc trên một dự án khác, sẽ không làm một nộp giữa đồng bộ và gọi p4 truy cập. Vì vậy, tôi nghĩ rằng đề xuất của bạn có lẽ là tốt nhất khi hệ thống xây dựng đang thực hiện một kéo riêng biệt sau đó xây dựng. Câu trả lời của tôi bao gồm các trường hợp đồng bộ có thể được tách biệt trong thời gian từ bản dựng. Cả hai đều hợp lệ tùy thuộc vào hoàn cảnh tôi nghĩ. –

12

Bạn có thể thử tìm số thay đổi tối đa trong đầu ra của lệnh "tệp p4". Tuy nhiên, thư mục làm việc không nên chứa các cam kết sau đồng bộ. Đây chỉ là một chút tốt hơn so với

p4 changes -m1 "./...#have" 

vì sau này dường như chạy trên máy chủ và có thể bị lỗi trên các cây nguồn lớn do giới hạn "MaxResults".

$ p4 changes -m1 "./...#have" 
Request too large (over 850000); see 'p4 help maxresults'. 

$ p4 -G files "./...#have" | python c:/cygwin/usr/local/bin/p4lastchange.py 
Files: 266948 
2427657 

nơi p4lastchange.py được dựa trên mã từ Using P4G.py From the Command Line trình bày bởi JTGoldstone, Mạng Thông tin Kodak/Ofoto, ngày 15 tháng 4, 2005.

#! /usr/bin/env python 
import sys, os, marshal 

if os.name == "nt": 
    # Disable newline translation in Windows. Other operating systems do not 
    # translate file contents. 
    import msvcrt 
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY) 

lastcl = 0 
num = 0 
try: 
    while 1: 
     dict = marshal.load(sys.stdin) 
     num = num + 1 
     for key in dict.keys(): 
      # print "%s: %s" % (key,dict[key]) 
      if key == "change": 
       cl = int(dict[key]) 
       if cl > lastcl: 
        lastcl = cl 
except EOFError: 
    pass 
print "Files: %s" % num 
print lastcl 
2

Điều tốt nhất tôi đã tìm thấy cho đến nay là để đồng bộ hóa với bất kỳ danh sách thay đổi nào bạn muốn xây dựng và sau đó sử dụng các thay đổi -m1 //...#have để lấy danh sách thay đổi cục bộ hiện tại (bản sửa đổi).

đồng bộ hóa p4 @CHANGELIST_NUM thay đổi p4 -m1 //...#have | awk '{print $ 2}'

Cung cấp cho bạn số thay đổi mà bạn có thể sử dụng ở bất cứ nơi nào bạn muốn. Tôi hiện đang tìm kiếm một cách đơn giản hơn p4 thay đổi -m1 //...#have.

+0

+1 cho tập lệnh awk – Watt

6

Bạn cũng có thể sử dụng lệnh cstat:

p4 giúp đỡ cstat

cstat -- Dump change/sync status for current client 

p4 cstat [files...] 

Lists changes that are needed, had or partially synced in the current 
client. The output is returned in tagged format, similar to the fstat 
command. 

The fields that cstat displays are: 

    change changelist number 
    status 'have', 'need' or 'partial' 
3

Đối với toàn bộ kho (không chỉ là không gian làm việc của bạn/khách hàng)

p4 counter change 

hiện công việc, chỉ nói với người thay đổi cuối cùng.

+2

Lưu ý rằng điều này báo cáo số lượng thay đổi depot mới nhất, bao gồm các thay đổi đang chờ xử lý (tức là chưa được gửi). Vì vậy, bất kỳ người dùng nào bắt đầu một số công việc mới trong ứng dụng khách của họ sẽ ảnh hưởng đến số này. Điều này sẽ khác với danh sách thay đổi cuối cùng được đồng bộ hóa với không gian làm việc cục bộ. – jasonmray

0

Tôi không chắc chắn nếu bạn có câu trả lời bạn cần nhưng tôi đã có một vấn đề tương tự. Mục đích là để viết trong logger của chúng tôi phiên bản cụ thể của dự án. Vấn đề là trong khi chúng tôi đang tạo ra makefile của riêng mình, hệ thống xây dựng tổng thể được kiểm soát bởi quản lý cấu hình của chúng tôi. Điều này có nghĩa rằng tất cả các giải pháp nói "đồng bộ hóa với một cái gì đó sau đó làm điều gì đó" không thực sự hoạt động và tôi không muốn thay đổi phiên bản theo cách thủ công bất cứ khi nào chúng tôi cam kết (một nguồn chắc chắn cho các lỗi). Các giải pháp (mà thực sự là gợi ý trong một số câu trả lời ở trên) là: trong makefile của chúng tôi, tôi làm p4 thay đổi -m1 "./...#have " Kết quả cho việc này là Thay đổi change_number vào ngày bởi người dùng @ client 'msg' Tôi chỉ cần tạo thông điệp vào chuỗi được in bởi bộ ghi (số thay đổi là yếu tố quan trọng, nhưng cái kia cũng hữu ích cho nhanh chóng quyết định nếu một phiên bản nhất định có những thay đổi bạn biết bạn đã thực hiện cho mình mà không đi đến cực chẳng đả để kiểm tra). Hope this helps.

2

p4 changes -m1 @clientname đó là "đề nghị" cách để làm điều đó cho khách hàng của tôi mất khoảng 10 phút

đây là những gì tôi sử dụng:

p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }' 

cho cùng một khách hàng mất 2.1 giây

+0

Tên khách hàng là gì? Tôi có thể tìm thông tin này bằng cách nào? – marsh

+1

@marsh client (hoặc cũng không gian làm việc) tên là tên của một đối tượng perforce giữ ánh xạ từ depo máy chủ đến hệ thống tệp cục bộ của bạn – gsf

+0

Trả lời câu trả lời này, vì nó trả lời câu hỏi thực tế hơn là nói “đừng làm vậy ”(Đó là một điểm hợp lệ, nhưng không trả lời câu hỏi). –

2

Nếu bạn đang sử dụng P4V bạn có thể làm điều này bằng đồ thị:

  • Trong tab Dashboard (View-> Dashboard) chọn một thư mục và bạn sẽ thấy một danh sách các changelists rằng thư mục chưa được cập nhật. Lưu ý số thấp nhất (ở hàng cao nhất).
  • Đảm bảo rằng trong Cây không gian làm việc bạn đã chọn cùng một thư mục như trước đây trong Trang tổng quan. Sau đó vào tab History (View-> History) và cuộn xuống số đã lưu ý trước đó. Số ngay dưới số đó là số của danh sách thay đổi hiện tại của bạn.
Các vấn đề liên quan