Tôi muốn chạy một bài kiểm tra đơn vị trước mỗi lần đẩy git và nếu các bài kiểm tra không thành công, hãy hủy lần đẩy, nhưng tôi thậm chí không thể tìm thấy móc đẩy trước, chỉ có pre-commit và pre-rebase.
Tôi muốn chạy một bài kiểm tra đơn vị trước mỗi lần đẩy git và nếu các bài kiểm tra không thành công, hãy hủy lần đẩy, nhưng tôi thậm chí không thể tìm thấy móc đẩy trước, chỉ có pre-commit và pre-rebase.
Câu trả lời:
Tôi muốn chạy thử nghiệm trong một hook trước. Bởi vì sự thay đổi đã được ghi lại khi cam kết. Đẩy và kéo chỉ trao đổi thông tin về thay đổi đã được ghi lại. Nếu thử nghiệm không thành công, bạn đã có một bản sửa đổi "bị hỏng" trong kho lưu trữ của mình. Cho dù bạn đang đẩy nó hay không.
Git có pre-push
móc trong 1.8.2
bản phát hành.
pre-push
Tập lệnh mẫu : https://github.com/git/git/blob/87c86dd14abe8db7d00b0df5661ef8cf147a72a3/templates/hooks--pre-push.sample
Ghi chú phát hành 1.8.2 nói về hook pre-push mới: https://github.com/git/git/blob/master/Documentation/RelNotes/1.8.2.txt
Git có móc đẩy trước trong bản phát hành 1.8.2.
Móc đẩy trước là những gì tôi cần cùng với móc cam kết trước. Ngoài việc bảo vệ một chi nhánh, họ cũng có thể cung cấp bảo mật bổ sung kết hợp với các móc cam kết trước.
Và ví dụ về cách sử dụng (được lấy và thông qua và nâng cao từ mục nhập tốt đẹp này )
Ví dụ đơn giản để đăng nhập vào vagrant, chạy thử nghiệm và sau đó đẩy
#!/bin/bash
# Run the following command in the root of your project to install this pre-push hook:
# cp git-hooks/pre-push .git/hooks/pre-push; chmod 700 .git/hooks/pre-push
CMD="ssh vagrant@192.168.33.10 -i ~/.vagrant.d/insecure_private_key 'cd /vagrant/tests; /vagrant/vendor/bin/phpunit'"
protected_branch='master'
# Check if we actually have commits to push
commits=`git log @{u}..`
if [ -z "$commits" ]; then
exit 0
fi
current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,')
if [[ $current_branch = $protected_branch ]]; then
eval $CMD
RESULT=$?
if [ $RESULT -ne 0 ]; then
echo "failed $CMD"
exit 1
fi
fi
exit 0
Như bạn có thể thấy ví dụ sử dụng một nhánh được bảo vệ, chủ đề của móc đẩy trước.
Nếu bạn đang sử dụng dòng lệnh, cách dễ nhất để làm điều này là viết một kịch bản đẩy chạy các bài kiểm tra đơn vị của bạn và nếu chúng thành công, hãy hoàn thành quá trình đẩy.
Biên tập
Kể từ git 1.8.2, câu trả lời này đã lỗi thời. Xem câu trả lời của manojlds ở trên.
Không có móc cho nó, bởi vì push không phải là một hoạt động sửa đổi kho lưu trữ của bạn.
Tuy nhiên, bạn có thể thực hiện kiểm tra ở phía nhận, trong post-receive
hook. Đó là nơi bạn thường từ chối một cú hích đến. Chạy các bài kiểm tra đơn vị có thể hơi chuyên sâu để thực hiện một cách hiệu quả, nhưng điều đó tùy thuộc vào bạn.
Đối với bản ghi, có một bản vá cho Git 1.6 bổ sung thêm móc đẩy trước . Tôi không biết liệu nó có hoạt động với 1.7 hay không.
Thay vì rắc rối với điều đó, bạn có thể chạy tập lệnh đẩy như @kubi được đề xuất. Thay vào đó, bạn cũng có thể đặt nó thành tác vụ Rake để nó nằm trong repo của bạn. ruby-git có thể giúp bạn với điều này. Nếu bạn kiểm tra repo mục tiêu, bạn chỉ có thể chạy thử nghiệm khi chuyển sang repo sản xuất.
Cuối cùng, bạn có thể chạy các bài kiểm tra trong pre-commit
hook của mình nhưng hãy kiểm tra xem nhánh nào đang được cam kết. Sau đó, bạn có thể có, chẳng hạn, một production
nhánh yêu cầu tất cả các bài kiểm tra phải vượt qua trước khi chấp nhận một cam kết nhưng bạn master
không quan tâm. Lemonrick_rake có thể hữu ích trong trường hợp đó.
Tập lệnh được liên kết bởi câu trả lời được bình chọn cao hiển thị các tham số, v.v. cho pre-push
hook ( $1
là tên từ xa, $2
URL) và cách truy cập các cam kết (các dòng read
từ stdin có cấu trúc <local ref> <local sha1> <remote ref> <remote sha1>
)
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local sha1> <remote ref> <remote sha1>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
z40=0000000000000000000000000000000000000000
while read local_ref local_sha remote_ref remote_sha
do
if [ "$local_sha" = $z40 ]
then
# Handle delete
:
else
if [ "$remote_sha" = $z40 ]
then
# New branch, examine all commits
range="$local_sha"
else
# Update to existing branch, examine new commits
range="$remote_sha..$local_sha"
fi
# Check for WIP commit
commit=`git rev-list -n 1 --grep '^WIP' "$range"`
if [ -n "$commit" ]
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0