2008-09-23 42 views
29

Ngay bây giờ, chúng tôi đang sử dụng Perforce để kiểm soát phiên bản. Nó có tính năng tiện dụng của một số thay đổi tăng nghiêm ngặt mà chúng tôi có thể sử dụng để tham khảo các bản dựng, ví dụ: "bạn sẽ nhận được bugfix nếu bản dựng của bạn tối thiểu là 44902".Xây dựng trình tự khi sử dụng điều khiển phiên bản được phân phối

Tôi muốn chuyển sang sử dụng hệ thống phân tán (có thể là git) để giúp dễ dàng phân nhánh và làm việc tại nhà. Vì vậy, mặc dù "phát triển nhánh" sẽ được phân phối và không đề cập đến một trình tự sửa đổi phổ biến, chúng tôi vẫn sẽ duy trì một repo git chủ mà tất cả các thay đổi sẽ cần phải nạp vào trước khi một bản dựng được tạo.

Cách tốt nhất để duy trì việc tăng id xây dựng là gì? Cách đơn giản nhất tôi có thể nghĩ là có một số loại hook hậu cam kết cháy bất cứ khi nào repo chủ được cập nhật, và nó đăng ký (hash của) đối tượng cây mới (hoặc đối tượng commit?) git) với một cơ sở dữ liệu tập trung đưa ra các id. (Tôi nói "cơ sở dữ liệu", nhưng tôi có thể làm điều đó với các thẻ git, và chỉ cần tìm số thẻ có sẵn tiếp theo hoặc một cái gì đó. Vì vậy, "cơ sở dữ liệu" thực sự sẽ là .git/refs/tags/build-id /.)

Điều này có thể thực hiện được, nhưng tôi tự hỏi liệu có cách thực hiện dễ dàng hơn, hoặc đã được triển khai hoặc chuẩn/"thực hành tốt nhất" hay không.

Trả lời

28

Tôi đề nghị thứ hai của việc sử dụng git describe. Với điều kiện bạn có chính sách phiên bản lành mạnh và bạn không làm bất kỳ thứ gì điên rồ với kho lưu trữ, git describe sẽ luôn luôn đơn điệu (ít nhất là đơn điệu như bạn có thể, khi lịch sử sửa đổi của bạn là DAG thay vì cây) và độc nhất.

Một cuộc biểu tình nhỏ:

git init 
git commit --allow-empty -m'Commit One.' 
git tag -a -m'Tag One.' 1.2.3 
git describe # => 1.2.3 
git commit --allow-empty -m'Commit Two.' 
git describe # => 1.2.3-1-gaac161d 
git commit --allow-empty -m'Commit Three.' 
git describe # => 1.2.3-2-g462715d 
git tag -a -m'Tag Two.' 2.0.0 
git describe # => 2.0.0 

Kết quả của git describe bao gồm các thành phần sau:

  1. Thẻ mới có thể truy cập từ các cam kết bạn đang yêu cầu để mô tả
  2. Số lượng cam kết giữa cam kết và thẻ (nếu khác không)
  3. Id (viết tắt) của cam kết (nếu # 2 khác 0)

# 2 là điều làm cho đầu ra đơn điệu, # 3 là điều làm cho nó trở nên độc đáo. # 2 và # 3 được bỏ qua, khi cam kết thẻ, làm cho git describe cũng thích hợp cho bản phát hành sản phẩm.

+1

Thẻ không xử lý các chi nhánh và hợp nhất. Cách tự động chính xác để thêm trình tự thích hợp là đếm số cam kết đằng sau cam kết hiện tại. Điều này được giải thích trong câu trả lời của tôi dưới đây. – squadette

1

Tôi muốn sử dụng "Nhãn" Tạo nhãn bất cứ khi nào bạn xây dựng thành công (hoặc thậm chí không thành công) và bạn sẽ có thể xác định được công trình đó mãi mãi. Nó không hoàn toàn giống nhau, nhưng nó cung cấp những con số xây dựng, trong khi vẫn cung cấp những lợi ích của phát triển phân tán.

4

git tag có thể đủ cho những gì bạn cần. Chọn định dạng thẻ mà mọi người sẽ đồng ý không sử dụng cách khác.

Lưu ý: khi bạn gắn thẻ cục bộ, git push sẽ không cập nhật các thẻ trên máy chủ. Sử dụng git push --tags cho điều đó.

2

Bạn nên điều tra git describe. Nó cung cấp một chuỗi duy nhất mô tả nhánh hiện tại (hoặc bất kỳ id cam kết đã truyền) nào về thẻ chú thích mới nhất, số lần commit từ thẻ đó và một id cam kết viết tắt của người đứng đầu nhánh.

Có lẽ bạn có một chi nhánh duy nhất mà bạn thực hiện phát hành các bản phát hành được kiểm soát. Trong trường hợp này, tôi sẽ gắn thẻ một cam kết sớm với định dạng thẻ đã biết và sau đó sử dụng git mô tả với tùy chọn --match để mô tả HEAD hiện tại liên quan đến một thẻ đã biết. Sau đó bạn có thể sử dụng kết quả của git mô tả như là hoặc nếu bạn thực sự muốn chỉ là một số duy nhất bạn có thể sử dụng một regex để cắt số ra khỏi thẻ.

Giả sử bạn không bao giờ tua lại nhánh, số lần commit sau sẽ luôn xác định một điểm duy nhất trong lịch sử nhánh.

ví dụ: (sử dụng bash hoặc tương tự)

# make an annotated tag to an early build in the repository: 
git tag -a build-origin "$some_old_commitid" 

# describe the current HEAD against this tag and pull out a build number 
expr "$(git describe --match build-origin)" : 'build-origin-\([0-9]*\)-g' 
0

Như bạn có thể biết, git tính toán một băm (một số) xác định duy nhất một nút của lịch sử. Sử dụng chúng, mặc dù chúng không tăng nghiêm ngặt, có vẻ như nó sẽ đủ tốt. (Thậm chí tốt hơn, chúng luôn là tương ứng với nguồn, vì vậy nếu bạn có mã băm, bạn có cùng mã.) Chúng là số lớn, nhưng chủ yếu bạn có thể nhận được bằng 6 hoặc nhiều chữ số hàng đầu.

Ví dụ,

Đó lỗi đã được cố định tại 064f2ea ...

+6

Ok, nhưng tôi có 1a92b6. Tôi có bugfix không? – sfink

+0

git rev-list 1a92b6 | grep 064f2ea -> nếu điều này cho một cái gì đó, bạn đã có nó; nếu không thì không. – EfForEffort

+0

git branch --contains = sẽ cung cấp cho bạn tất cả các chi nhánh có chứa (thường hữu ích hơn) –

0

Với Mercurial bạn có thể sử dụng lệnh sau:

# get the parents id, the local revision number and the tags 
[[email protected]:~/my-repo]$ hg id -nibt 
03b6399bc32b+ 23716+ default tip 

Xem hg identify

+0

Điều đó không tăng nghiêm ngặt. – OrangeDog

30

đơn điệu tăng số tương ứng với hiện cam kết có thể được tạo ra với

git log --pretty=oneline | wc -l 

mà trả về một số duy nhất . Bạn cũng có thể thêm sha1 hiện tại vào số đó, để thêm tính độc đáo.

Cách tiếp cận này tốt hơn git describe, vì nó không yêu cầu bạn thêm bất kỳ thẻ nào và nó sẽ tự động xử lý các lần hợp nhất.

Nó có thể có vấn đề với rebasing, nhưng rebasing là "nguy hiểm" hoạt động anyway.

+0

Vấn đề với cách tiếp cận này là bạn sẽ không thể phân biệt các nhánh. Bạn có thể thêm tên chi nhánh để xây dựng id mặc dù là tốt. – timurb

+0

Bạn xây dựng một số tệp nhị phân (chẳng hạn như -beta, -stable, -nightly) từ các nhánh nhất định. Vì vậy, tên chi nhánh là "bên ngoài" với số bản dựng. – squadette

8
git rev-list BRANCHNAME --count 

này là ít hơn nhiều nguồn lực chuyên sâu hơn

git log --pretty=oneline | wc -l 
Các vấn đề liên quan