Xác định danh sách thay đổi cuối cùng được đồng bộ hóa trong Perforce


117

Một câu hỏi đôi khi nảy sinh là cách tốt nhất để xác định danh sách thay đổi mà bạn đã đồng bộ hóa lần cuối trong Perforce là gì. Điều này thường cần thiết cho những việc như đưa số danh sách thay đổi vào thông tin sửa đổi bằng hệ thống xây dựng tự động.


p4 changes | head -1có vẻ dễ dàng hơn hầu hết các giải pháp này.
Sridhar Sarnobat

Câu trả lời:


91

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

p4 changes -s submitted -m1

sau đó đồng bộ hóa với thay đổi đó và ghi lại nó trong thông tin sửa đổi. Lý do như sau. Mặc dù Perforce đề xuất những điều sau để 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 số điều cần hiểu:

  • Điều này chỉ hoạt động nếu bạn chưa gửi bất kỳ thứ gì từ không gian làm việc được đề cập.
  • Cũng có thể không gian làm việc của khách hàng 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 bổ sung mà họ không đề cập đến:

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

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 để xác định xem bạn có bị ảnh hưởng bởi các lỗi ở trên hay không; nó sẽ cho biết không có gì được đồng bộ hóa hoặc bị xóa:

p4 sync -n @changelist_number

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

Nếu bạn gửi thay đổi, 'p4 thay đổi -s đã gửi -m1' sẽ trả về số danh sách 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

Liên kết đã chết, nó là bài viết này? answers.perforce.com/articles/KB/3458/
user31389

Lưu ý rằng bạn có thể sử dụng #havethay thế @clientname, giúp bạn không phải tra cứu tên không gian làm việc của khách hàng.
yoyo

29

Tôi chỉ cần trả lời điều này theo đề xuất của Jeff về việc sử dụng Stackoverflow làm nơi lưu giữ các đoạn mã kỹ thuật ....

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

p4 changes -m1 @<clientname>

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

Change 12345 on 2008/08/21 by joebloggs@mainline-client '....top line of description...'

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


Tôi nhận được: Yêu cầu quá lớn (hơn 1500000); xem 'kết quả tối đa trợ giúp p4'.
user674669

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

Điều này cung cấp thông tin của danh sách thay đổi được gửi cuối cùng , không phải danh sách thay đổi được đồng bộ hóa cuối cùng , đó là những gì op muốn biết.
Andreas

@marsh Tôi nghĩ đó thực sự là tên không gian làm việc của máy khách, được mặc định là tên máy tính nếu không được đặt. Xem tại đây: P4CLIENT .
Andreas Haferburg

15

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 được chứa các cam kết sau đồng bộ hóa. Đây chỉ là một chút tốt hơn

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

vì phần sau dường như chạy trên máy chủ và có thể không thành công trên 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

trong đó p4lastchange.py dựa trên mã từ bản trình bày Sử dụng P4G.py Từ Dòng lệnh của JTGoldstone, Mạng thông tin Kodak / Ofoto, ngày 15 tháng 4 năm 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

10

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

  • Trong tab Trang tổng quan (View-> Dashboard), chọn một thư mục và bạn sẽ thấy danh sách các danh sách thay đổi mà 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 đó trong Bảng điều khiển. Sau đó, chuyển đến tab Lịch sử (Xem-> Lịch sử) và cuộn xuống số đã ghi chú trước đó. Số ngay bên dưới số đó là số danh sách thay đổi hiện tại của bạn.

9

p4 changes -m1 @clientname đó là cách "được khuyến nghị" để 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


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

1
khách hàng @marsh (hay còn workspace) name là tên của một đối tượng cực chẳng đả chứa ánh xạ từ các depo server để hệ thống tập tin địa phương của bạn
GSF

2
Ủng hộ 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 điều đó” (đó là một điểm hợp lệ, nhưng không trả lời câu hỏi).
sam hocevar

1
p4 changes -m1 @clientnamechạy không ngừng ... p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'thực sự hoạt động! Cảm ơn!
simomo

@gsf - cảm ơn, tôi vừa thử nó trên hộp Linux của tôi và nó đã hoạt động!

8

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

p4 help 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'

5

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

Nếu danh sách thay đổi (hoặc nhãn) không được cung cấp, 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ố danh sách thay đổi cụ thể. Người ta có thể đồng bộ rõ ràng một số tệp với các bản sửa đổi cũ hơn, và sau đó một số danh sách thay đổi là vô nghĩa. Đó là lý do tại sao synccần phải làm mới để đảm bảo rằng một số danh sách 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 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 rằng những 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 đến việc nhúng nhãn kho lưu trữ.

Với cách tiếp cận của mình, bạn đang đưa ra 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 thời điểm gửi danh sách 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. Thật dễ dàng để bị nhầm lẫn trong những giả định đó, khó phát hiện và tốn kém kinh khủng về thời gian bị mất. Mặt khác, giải quyết vấn đề rất dễ dàng, không có nhược điểm. Và bởi vì một số danh sách thay đổi có thể được chỉ định rõ ràng, không quan trọng bạn cần bản sửa đổi nào hoặc cơ sở mã thay đổi nhanh như thế nào.


Erickson - gợi ý hay, nhưng tôi nghĩ nó bao gồm một loạt các tình huống hơi khác so với câu trả lời mà tôi đã cung cấp. Chắc chắn bộ đếm sẽ hoạt động nếu bạn có khả năng chỉ có bản sửa đổi đầu và máy chủ không đủ bận để ai đó, có thể đang làm việc trên một dự án khác, sẽ không thực hiện gửi giữa đồng bộ hóa và gọi bộ đếm p4. Vì vậy, tôi nghĩ đề 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 lực 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 trong đó quá trình đồng bộ hóa có thể bị tách rời khỏi bản dựng. Cả hai đều có giá trị tùy thuộc vào hoàn cảnh tôi nghĩ.
Greg Whitfield

3

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

p4 counter change

thực 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 danh sách thay đổi kho mới nhất, BAO GỒM các danh sách 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 con 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

2

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

p4 sync @CHANGELIST_NUM thay đổi p4 -m1 //...#have | awk '{print $ 2}'

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


0

Tôi không chắc liệu bạn có nhận được câu trả lời mình cần hay không nhưng tôi đã gặp vấn đề tương tự. Mục đích là ghi vào nhật ký 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 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 là tất cả các giải pháp có nội dung "đồng bộ hóa với điều 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 lỗi). Giải pháp (thực sự được gợi ý trong một số câu trả lời ở trên) là: trong makefile của chúng tôi, tôi thực hiện thay đổi p4 -m1 "./...#have" Kết quả cho việc này là Thay đổi change_number vào ngày bởi user @ client ' tin nhắn ' Tôi chỉ cần tạo thông báo thành một chuỗi được in bởi trình ghi (số thay đổi là yếu tố quan trọng nhưng số khác cũng hữu ích để nhanh chóng quyết định xem một phiên bản nhất định có chứa những thay đổi mà bạn biết là bạn đã tự thực hiện mà không cần phải bắt buộc kiểm tra hay không). Hi vọng điêu nay co ich.

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.