2010-08-05 1 views
7

Tôi muốn đưa ra câu hỏi này để xem tôi có làm đúng không. Các kịch bản sau đây làm việc trừ kiểm tra để xem nếu cam kết đã được đẩy lên một repo từ xa mà tôi không thể tìm thấy lệnh phù hợp với:Bash/Shell Script Chức năng để xác minh Git Tag hoặc Commit Exists và đã được đẩy tới kho lưu trữ từ xa

#!/bin/bash 
set -e # fail on first error  
verify_git_ref() { 
     log "Verifying git tag or commit: \"$1\" ...." 
     if git show-ref --tags --quiet --verify -- "refs/tags/$1" 
     then 
      log_success "Git tag \"$1\" verified...." 
      GIT_TAG_OR_REF=$1 
      return 0 
     elif git rev-list $1>/dev/null 2>&1 
     then 
      log_success "Git commit \"$1\" verified...." 
      GIT_TAG_OR_REF=$1 
      return 0 
     else 
      log_error "\"$1\" is not a valid tag or commit, you must use a valid tag or commit in order for this script to continue" 
      return 1 
     fi 
    } 

liên quan: List Git commits not pushed to the origin yet

Trả lời

7

Kiểm tra liệu một từ xa có một thẻ cho trước khá đơn giản - bạn chỉ cần phân tích đầu ra của git ls-remote --tags để xem thẻ có chứa thẻ của bạn hay không.

Kiểm tra xem một cam kết cụ thể có có chút phức tạp hơn không. Mọi thứ đều dựa trên ref. Bạn có biết những gì ref nên có thể truy cập từ? Nếu bạn làm thế, bạn có lẽ chỉ cần lấy ref và kiểm tra cục bộ nếu cam kết là một tổ tiên của nó. Đó là, lấy chủ từ nguồn gốc và xem nếu cam kết về nguồn gốc/chủ.

Bạn cũng có thể thử sử dụng git push -n để thực hiện việc chạy lệnh cam kết với nhánh đó và xem điều gì xảy ra - nếu đó là no-op, cam kết đã có trên nhánh.

Nếu bạn không biết nhánh nào nên ở trên ... bạn có thể chỉ cần tìm nạp và kiểm tra tất cả.

3

Tôi đã làm việc này - bạn nghĩ sao?

verify_git_ref() { 
    log "Verifying git tag or commit: \"$1\" ...." 
    if git branch -r --contains $(git rev-parse $1) | grep origin>/dev/null 2>&1 
    then 
     log_success "Git tag or commit \"$1\" verified...." 
     GIT_TAG_OR_REF=$1 
     return 0 
    else 
     log_error "\"$1\" is not a valid tag or commit that has been pushed, you must use a valid tag or commit in order for this script to continue" 
     return 1 
    fi 
} 
+1

Vấn đề với điều này là nó không thực sự kiểm tra điều khiển từ xa - nó chỉ kiểm tra những gì bạn biết về điều khiển từ xa (các nhánh từ xa được lưu trữ cục bộ). Điều này sẽ làm việc trong hầu hết các trường hợp, vì nếu bạn đẩy đến điều khiển từ xa, các nhánh từ xa của bạn sẽ được cập nhật. Nhưng nếu điều khiển từ xa kéo từ bạn, bạn sẽ không may mắn - trừ khi bạn tìm nạp trước. (Bạn cũng không cần git rev-parse, tôi không nghĩ.) – Cascabel

+0

Tôi thực hiện lệnh git pull trước khi chạy lệnh này - nhưng bạn nói đúng và tôi nghĩ bạn trả lời là nội tuyến hơn với câu trả lời chung với câu hỏi tôi đặt ra và tôi sẽ đánh dấu câu trả lời của bạn là câu trả lời thực tế. – Freddie