2010-01-29 30 views
5

Tôi đang sử dụng git để quản lý dự án grails mà tôi có. Tôi thiết lập một kho git trên một máy chủ từ xa và những gì tôi muốn làm là khi tôi có mã làm việc cục bộ, tôi muốn cam kết nó và đẩy đến máy chủ từ xa. Tôi muốn các tập tin groovy cập nhật và gsp của được đưa vào đúng chỗ trên máy chủ từ xa để grails sẽ nhận những thay đổi cho thử nghiệm từ xa. Điều này có thể không?Tôi làm cách nào để kiểm tra tệp để xây dựng bằng git?

+0

Bạn đang sử dụng Linux, mac hoặc cửa sổ? – Alos

+0

Máy chủ từ xa là linux, tại địa phương tôi có một máy cửa sổ (sử dụng git rùa) và tôi cũng có một mac. Vì vậy, tôi đang đồng bộ mã giữa các máy đó thông qua điều khiển từ xa, nhưng tôi muốn điều khiển từ xa để có một bản xây dựng tích cực của ứng dụng grails được cập nhật khi đẩy. – TripWired

+0

Chỉ cần thêm một số đề xuất làm nhận xét cho câu trả lời của tôi cho bản thực thi 'sau khi cập nhật 'của bạn. Xem liên kết cuối cùng của nhận xét đó trước tiên. – VonC

Trả lời

6

Nếu bạn đang đẩy đến repo từ xa, nơi "nó chỉ có vẻ chứa một gói lớn tệp, không có mã nguồn thực tế "(như bạn nêu chi tiết trong nhận xét), điều đó có nghĩa là" bare repo ", điều tốt cho phép bạn đẩy mà không có bất kỳ nguy cơ nào khác nhau giữa cây đang hoạt động và dữ liệu git.

Sau đó, như được mô tả trong "Can I use git to keep a remote server up to date?", một repo khác (không trần) và post-update hook ở phía bên repo trần sẽ đưa bạn đến nơi bạn muốn.


Các OP TripWired cho biết thêm:

Được rồi vì vậy những gì tôi đã làm là:

  • tạo repo trần để kiểm tra trong đó
  • Tôi tạo ra một repo đó là tiêu chuẩn, về cơ bản tôi có ~/project.git~/project.
  • tôi nhân bản project.git vào project và trong project.git/hooks/post-update tôi đặt:

    cd ../../project env -i git checkout. env -i git pull

Tôi cũng chắc chắn rằng sau khi cập nhật đã thực thi.
Khi tôi chạy móc từ dòng lệnh nó hoạt động tốt, nhưng nó không có vẻ làm việc khi tôi làm một kiểm tra trong repo.

Tôi đồng ý với các bước 1 và 2, nhưng sau đó sẽ sử dụng this script, như trong this question.

Kiểm tra xem nó có hoạt động với một số git push từ repo địa phương của bạn để hoàn tiền không.

#!/bin/sh 
# 
# This hook does two things: 
# 
# 1. update the "info" files that allow the list of references to be 
#  queries over dumb transports such as http 
# 
# 2. if this repository looks like it is a non-bare repository, and 
#  the checked-out branch is pushed to, then update the working copy. 
#  This makes "push" function somewhat similarly to darcs and bzr. 
# 
# To enable this hook, make this file executable by "chmod +x post-update". 

git-update-server-info 

is_bare=$(git-config --get --bool core.bare) 

if [ -z "$is_bare" ] 
then 
    # for compatibility's sake, guess 
    git_dir_full=$(cd $GIT_DIR; pwd) 
    case $git_dir_full in */.git) is_bare=false;; *) is_bare=true;; esac 
fi 

update_wc() { 
    ref=$1 
    echo "Push to checked out branch $ref" >&2 
    if [ ! -f $GIT_DIR/logs/HEAD ] 
    then 
     echo "E:push to non-bare repository requires a HEAD reflog" >&2 
     exit 1 
    fi 
    if (cd $GIT_WORK_TREE; git-diff-files -q --exit-code >/dev/null) 
    then 
     wc_dirty=0 
    else 
     echo "W:unstaged changes found in working copy" >&2 
     wc_dirty=1 
     desc="working copy" 
    fi 
    if git diff-index --cached [email protected]{1} >/dev/null 
    then 
     index_dirty=0 
    else 
     echo "W:uncommitted, staged changes found" >&2 
     index_dirty=1 
     if [ -n "$desc" ] 
     then 
      desc="$desc and index" 
     else 
      desc="index" 
     fi 
    fi 
    if [ "$wc_dirty" -ne 0 -o "$index_dirty" -ne 0 ] 
    then 
     new=$(git rev-parse HEAD) 
     echo "W:stashing dirty $desc - see git-stash(1)" >&2 
     (trap 'echo trapped $$; git symbolic-ref HEAD "'"$ref"'"' 2 3 13 15 ERR EXIT 
     git-update-ref --no-deref HEAD [email protected]{1} 
     cd $GIT_WORK_TREE 
     git stash save "dirty $desc before update to $new"; 
     git-symbolic-ref HEAD "$ref" 
     ) 
    fi 

    # eye candy - show the WC updates :) 
    echo "Updating working copy" >&2 
    (cd $GIT_WORK_TREE 
    git-diff-index -R --name-status HEAD >&2 
    git-reset --hard HEAD) 
} 

if [ "$is_bare" = "false" ] 
then 
    active_branch=`git-symbolic-ref HEAD` 
    export GIT_DIR=$(cd $GIT_DIR; pwd) 
    GIT_WORK_TREE=${GIT_WORK_TREE-..} 
    for ref 
    do 
     if [ "$ref" = "$active_branch" ] 
     then 
      update_wc $ref 
     fi 
    done 
fi 
+0

Điều này nghe có vẻ như nó có thể hoạt động. Vì vậy, nếu tôi có kho trống và tôi cập nhật hook sau khi cập nhật, tôi có thể sử dụng nó để sao chép mã nguồn vào một thư mục khác? Tôi giả sử tôi sẽ cần một repo git tương tự như những gì tôi có trên máy địa phương của tôi mà chỉ cần một bản sao từ repo trần? – TripWired

+0

Có cho người đầu tiên, và có (trong trường hợp đơn giản nhất) đến lần thứ hai. Tôi có thể nghĩ ra những cách phức tạp hơn để làm điều đó để tránh sự trùng lặp, nếu kích thước repo khổng lồ là một vấn đề, nhưng tôi nghi ngờ bạn đang ở trong trường hợp đó. – Cascabel

+0

Được rồi vì vậy những gì tôi đã làm là tạo ra repo trần để kiểm tra sau đó tôi tạo ra một repo đó là tiêu chuẩn, về cơ bản tôi có ~/project.git và ~/project. Tôi nhân bản project.git vào dự án và trong project.git/hooks/post-update Tôi đặt: (cd ../../project)(env -i git checkout.) (Env -i git pull) parens chỉ để tách biệt các dòng trên đây. Tôi cũng đảm bảo rằng sau khi cập nhật được thực thi. Khi tôi chạy móc từ dòng lệnh nó hoạt động tốt, nhưng nó không có vẻ làm việc khi tôi làm một kiểm tra trong repo. Ý tưởng nào? – TripWired

0

Nếu bạn dùng Linux, bạn có thể thiết lập công việc cron để sao chép tệp cho bạn hoặc nếu bạn đang ở trên cửa sổ, bạn có thể tạo tác vụ được lập biểu với tập lệnh dơi hoặc vbs nhỏ để sao chép tệp sang máy chủ từ xa . Nếu bạn cần trợ giúp về việc sử dụng Git thì đây là hướng dẫn sử dụng. Nếu đó không phải là những gì bạn đang tìm kiếm chúng tôi có thể làm việc trên một cái gì đó mà có thể làm việc tốt hơn hoặc nếu bạn cần giúp đỡ với các kịch bản cho tôi biết.

+0

Vì vậy, git không lưu trữ các tập tin thực tế trên máy chủ từ xa? Tôi tạo ra một kho lưu trữ cục bộ, cam kết tất cả các tập tin sau đó đẩy đến máy chủ từ xa, nó chỉ có vẻ chứa một tập tin gói lớn, không có mã nguồn thực tế. Máy chủ là linux (mũ đỏ). Cảm ơn bạn về thông tin. – TripWired

+0

Tôi có thể không chắc chắn những gì bạn đã yêu cầu chính xác. Một trong những lợi thế của Git là bạn không cần một cách tiếp cận tập trung, nhưng bạn có thể nếu bạn muốn. – Alos

5

Đối với nhận xét của bạn về bài đăng của Alos: điều khiển từ xa được gọi là kho lưu trữ trống - nó chứa toàn bộ kho ngoại trừ bản sao nội dung đã kiểm xuất. Ý tưởng là cho các kho trung tâm mà bạn chỉ cần đẩy và kéo từ, không cần phải có các tập tin.

Điều đó nói rằng, có rất nhiều cách tiếp cận để làm những gì bạn đang cố gắng làm.

  • Bạn có thể tạo một bản sao không từ xa khác, và sử dụng nó để kéo từ trần và thực hiện kiểm tra. Điều này có lẽ là dễ nhất.

  • Bạn có thể trực tiếp kiểm tra các tệp (sử dụng git read-treegit checkout-index) từ kho lưu trữ trần (ví dụ về tâm trí, git.git's install-doc-quick.sh).

  • Bạn thậm chí có thể sử dụng điều khiển từ xa không phải là từ xa, nhưng hãy nhớ rằng việc đẩy vào repo không trần là nguy hiểm vì cây làm việc không được cập nhật. Tùy thuộc vào phiên bản git của bạn, có nhiều biện pháp bảo vệ khác nhau mà bạn sẽ phải ghi đè và bạn sẽ sửa chữa cây công việc sau khi đẩy (có thể là git reset --hard).

Không có vấn đề mà tiếp cận bạn đi, giả sử bạn muốn kích hoạt kiểm tra của bạn sau mỗi lần đẩy, bạn có thể sử dụng post-receive or post-update hook để làm như vậy. (Bạn có thể kiểm tra độ dài của thời gian kể từ lần kiểm tra cuối cùng nếu bạn muốn tránh lặp lại các thử nghiệm từ một đợt đẩy)

+0

Không phạm tội. Chúc mừng – Alos

+0

Hoàn toàn bị mất câu trả lời của bạn tại thời điểm tôi đã đăng bài của tôi. 1 để liệt kê tất cả các khả năng. – VonC

+0

Bạn đã có +1 của tôi cho liên kết đến câu hỏi trước. – Cascabel

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