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)"
}
Tôi muốn thêm đầu ra "git describe". – Dustin