2009-02-05 25 views
17

Tôi có một ứng dụng HTML + HTML tĩnh nguồn mở được triển khai ở khoảng ba địa điểm khác nhau ngay bây giờ, một trên máy cục bộ của tôi, một trên máy chủ nội bộ và một trên máy chủ bên ngoài ổn định.Bạn sẽ bao gồm id cam kết hiện tại trong tệp của dự án Git như thế nào?

Tôi muốn có thể thông báo ngay lập tức phiên bản nào được triển khai ở vị trí nào và tôi muốn các phóng viên lỗi có thể truy cập dễ dàng vào phiên bản mà họ đang báo cáo lỗi.

Lý tưởng nhất tôi muốn, như là một phần của quy trình cam kết, đối với tệp được ghi bằng hàm băm của cam kết. Tất nhiên, từ những gì tôi biết về Git, điều này là không thể, vì bao gồm cả băm được tính toán như một phần của một tệp trong một cam kết sẽ thay đổi giá trị băm được tính của cam kết đó.

Mặt khác, tôi có thể kết hợp việc xây dựng này như một phần của quá trình xây dựng. Hiện tại tôi không có quy trình xây dựng và tôi muốn tránh thêm một bước nếu có thể.

Cách sạch nhất để thực hiện việc này là gì?

Trả lời

6

Thêm vào hệ thống triển khai tự động của bạn.

Nếu triển khai của bạn không tự động, hãy tự động hóa và thêm nó vào đó. Sau đó, bạn đã xóa một bước.

Làm cho nó hữu ích hơn "điều này đã được triển khai vào ngày x tại thời điểm y từ kho z". Hàm băm của cam kết thực sự không có nghĩa là rất nhiều đối với những người không phát triển.

+5

Tôi muốn thêm đầu ra "git describe". – Dustin

29

Có một số sự tinh tế đối với điều này vì bản chất của Git. Cách tôi đã làm điều này là bằng cách sao chép những gì các nhà phát triển Git tự làm. Trước tiên, bạn sẽ muốn sử dụng các thẻ được chú thích mà có lẽ là một ý tưởng hay. Rà soát, bạn có thể tạo một thẻ mới như thế này:

$ git tag -a -m "Version 0.2" v0.2 HEAD 

Sau đó (như đề xuất trong bài viết của Otto), bạn có thể sử dụng git describe cho một hữu ích "phiên bản" chuỗi đó sẽ bao gồm số lượng cam kết kể từ khi thẻ và số đầu của sha1 của cam kết hiện tại. Dưới đây là một ví dụ từ một trong những dự án của tôi:

$ git describe 
v1.0-3-gee47184 

Đó là, bản sao này là 3 cam kết trước của thẻ "v1.0" và cam kết sha1 bắt đầu với ee47184 (Tôi không chắc chắn lý do tại sao chúng bao gồm mà hàng đầu 'g').

Các nhà phát triển Git tiến thêm một bước và cũng bao gồm thêm một chút nếu bản sao làm việc được sửa đổi (không được cam kết). Điều này đòi hỏi một vài bước nữa để tất cả được bao bọc trong một tập lệnh mà họ đặt tên là VERSION-GEN. Khi chạy, nó sẽ in chuỗi phiên bản thành đầu ra tiêu chuẩn và cũng tạo ra tệp VERSION-FILE (tập lệnh cẩn thận để không liên lạc lại tệp đó nếu phiên bản không thay đổi - vì vậy nó thân thiện với công cụ xây dựng). Sau đó, bạn có thể đưa rằng VERSION-FILE tập tin trong mã nguồn của bạn, giúp tập tin, vv

Sử dụng ví dụ của tôi VERSION-GEN kịch bản (dưới đây), chuỗi phiên bản của tôi cho ví dụ trên là:

$ VERSION-GEN 
version: 1.0-3-gee47 

Nếu tôi sửa đổi bất kỳ tệp được theo dõi nào trông giống như sau:

$ VERSION-GEN 
version: 1.0-3-gee47-mod 

Đây là phiên bản hơi tinh chỉnh của VERSION-GEN. Lưu ý rằng các thẻ đánh dấu phiên bản có dạng v [0-9] * (ví dụ: v1.0 hoặc v0.2 hoặc v12.3.4 hoặc v12.2-4feb2009, v.v.)

#!/bin/sh 

# Tag revisions like this: 
# $ git tag -a -m "Version 0.2" v0.2 HEAD 

VF=VERSION-FILE 
DEFAULT_VERSION=UKNOWN 

LF=' 
' 

# First see if there is a version file (included in release tarballs), 
# then try git-describe, then default. 
if test -d .git -o -f .git && 
    VN=$(git describe --abbrev=4 HEAD 2>/dev/null) && 
    case "$VN" in 
    *$LF*) (exit 1) ;; 
    v[0-9]*) 
     git update-index -q --refresh 
     test -z "$(git diff-index --name-only HEAD --)" || 
     VN="$VN-mod" ;; 
    esac 
then 
     continue 
    #VN=$(echo "$VN" | sed -e 's/-/./g'); 
else 
    VN="$DEFAULT_VERSION" 
fi 

VN=$(expr "$VN" : v*'\(.*\)') 

# Show the version to the user via stderr 
echo >&2 "version: $VN" 

# Parse the existing VERSION-FILE 
if test -r $VF 
then 
    VC=$(sed -e 's/^version: //' <$VF) 
else 
    VC=unset 
fi 

# If version has changed, update VERSION-FILE 
test "$VN" = "$VC" || { 
    echo "version: $VN" >$VF 
    echo >&2 "($VF updated)" 
} 
+0

Có một vài lỗi chính tả ở cuối tập lệnh. Thay thế 3 dòng cuối cùng với: VC = $ (sed -e 's/^ phiên bản: //' $ VF) echo> & 2 "($ VF cập nhật)" fi Lưu ý đóng cửa ')' và thay thế '}' cuối cùng bằng fi. – Patrick

+0

Tôi nghĩ rằng trình kết xuất đã nuốt nhiều dòng lệnh. Tôi đã gửi một chỉnh sửa để thụt lề mã thay vì gói nó trong mã/thẻ trước. Một vài dòng cuối cùng phải là '# Phân tích VERSION-FILE hiện tại' 'nếu kiểm tra -r $ VF' ' then' '\t VC = $ (sed -e 's/^ version: //' < $ VF) ' ' else' '\t VC = unset' ' fi' '# Nếu phiên bản đã thay đổi, cập nhật VERSION-FILE' ' test "$ VN" = "$ VC" || {' ' \t echo "phiên bản: $ VN"> $ VF' '\t echo> & 2" ($ VF được cập nhật) "' '}' – seanf

+0

Ồ, xấu xí. Tôi đã đặt một bản sao toàn bộ tập lệnh tại đây: https://gist.github.com/880771 – seanf

Các vấn đề liên quan