Hmm, sử dụng này của một tên chi nhánh dường như tanh. Như trong câu trả lời của Dustin, có thể có nhiều nhánh chứa cam kết. Tại sao bất kỳ một trong những tên chi nhánh này tốt hơn tên khác cho mục đích này?
Nếu bạn chỉ quan tâm đến một chi nhánh cụ thể, bạn có thể tính “cơ sở hợp nhất” giữa chi nhánh và cam kết.
Trong các biểu đồ sau, cam kết xây dựng là C
, đầu chi nhánh được xác nhận là T
và cơ sở hợp nhất được gắn nhãn M
phía trên nó.
Nếu M
bằng C
bằng T
, sau đó các cam kết để xây dựng là đỉnh của chi nhánh tuyên bố.
M
↓
o--o--o--o--o--x branch # x is both C and T
Nếu M
bằng C
, sau đó là đỉnh của chi nhánh tuyên bố là một hậu duệ của các cam kết để xây dựng.
M
↓
o--o--C--o--o--T branch
Nếu M
bằng T
, sau đó cam kết để xây dựng là một hậu duệ của các đỉnh của chi nhánh tuyên bố.
M
↓
o--o--T branch
\
o--o--C
Nếu M
bằng cái gì khác, sau đó C
là một hậu duệ của một số tổ tiên của T
.
M
↓
o--o--o--o--o--T branch
\
o--o--C
Nếu không có M
, sau đó cam kết để xây dựng không liên quan đến các chi nhánh tuyên bố.
o--o--o--o--o--T branch
o--o--o--o--C
Bạn có thể thực hiện việc kiểm tra này như thế này:
#!/bin/sh
# Usage: is-ancestor-of <branch> <commit>
if test $# -ne 2; then
echo "$0"': invalid arguments'
exit 128
fi
claimed_branch="$1"
commit="$2"
merge_base="$(git merge-base "$commit" "$claimed_branch")" &&
test -n "$merge_base" &&
test "$merge_base" = "$(git rev-parse --verify "$commit")" &&
exit 0
echo "$commit is not an ancestor of $claimed_branch" 1>&2
exit 1
Các kịch bản trên không thực sự đòi hỏi hoặc kiểm tra xem đối số 'chi nhánh' là một chi nhánh (nó có thể là bất kỳ các uỷ ban ish). Để kiểm tra xem một cái gì đó thực sự là một chi nhánh, bạn có thể sử dụng một cái gì đó như thế này:
#!/bin/sh
# Usage: is-branch <branch>
if test $# -ne 1; then
echo "$0"': invalid arguments'
exit 128
fi
branch="$1"
# check various branch hierarchies, adjust as needed
git show-ref --verify refs/heads/"$branch" ||
git show-ref --verify refs/remotes/"$branch" || {
echo "not a branch name: $branch" 1>&2
exit 1
}
Vì vậy, bạn có thể sử dụng chúng lại với nhau để xác minh cái gì đó là một chi nhánh và một số cam kết là trong ngành rằng:
is-branch "$claimed_branch" && is-ancestor-of "$claimed_branch" "$commit_to_build"
Nguồn
2010-03-15 05:38:17
tại sao bạn cần tên chi nhánh? nó có vẻ như một phần thông tin vô ích bổ sung cho hệ thống xây dựng. Và tôi không thực sự thấy nó sẽ được sử dụng như thế nào đối với một nhà phát triển đọc nhật ký xây dựng. – hasen
Bạn sẽ cần tên chi nhánh trong trường hợp luồng công việc của bạn có, tôi không biết, một nhánh phát triển và chủ được sử dụng để triển khai và bạn muốn biết liệu các cam kết có thành một nhánh cụ thể không? Nhân tiện, hãy chấp nhận câu trả lời thực sự. –
@Pinko Tôi nghĩ câu trả lời đã chọn nên là [this one] (https://stackoverflow.com/a/2444924/161278). Vì nó có nhiều phiếu bầu hơn và đơn giản hơn nhiều do việc sử dụng chức năng git bản địa. –