2009-10-12 23 views
5

Tôi đang sử dụng Git sai. Tôi muốn sử dụng nó đúng.Đẩy một cây nguồn Git, không chỉ một kho lưu trữ

Đây là những gì tôi có:

Trên đây, trên máy phát triển của tôi là kho lưu trữ Git, tôi cam kết và thử nghiệm.

Ở đó, máy chủ web của tôi - một nơi mà mã này sẽ được triển khai. Máy chủ web có một kho lưu trữ git trống khác mà tôi có thể đẩy tới, qua SSH, khi tôi sẵn sàng triển khai.

Điều tôi muốn xảy ra là có chế độ xem vào kho lưu trữ Git luôn có phiên bản mới nhất của tệp nguồn (trên một số chi nhánh hoặc với một số thẻ).

Điều tôi có thể làm là tạo một kho lưu trữ git khác trên máy chủ web và thực hiện thao tác kéo thủ công sau mỗi lần đẩy, nhưng tôi hy vọng tránh phải đăng nhập vào máy chủ web mỗi thời gian tôi làm một cú git push.

Có cách nào để thực hiện điều khiển từ xa "đẩy tới máy chủ web và làm mới các tệp đã kiểm tra của nó không, nếu tôi hứa tôi không chỉnh sửa bất kỳ tệp nào trên máy chủ web"?

Hoặc tôi chỉ làm điều đó sai bạn muốn tát tôi? :-)

Trả lời

7

Tôi thường tạo ra một kho lưu trữ phi trần với một tập tin .git/móc/post-nhận chứa

#!/bin/sh 
cd .. 
env -i git reset --hard 

Tệp này phải thực thi và phải kiểm tra chi nhánh.

Sau đó, mỗi lần bạn đẩy tới kho lưu trữ đó, cây công việc sẽ được đặt lại về phiên bản mới nhất của nhánh hiện tại. Mọi thay đổi cục bộ sẽ bị ghi đè (nhưng các tệp không được theo dõi sẽ không bị xóa).

Git giờ đây sẽ hiển thị cảnh báo khi bạn đẩy tới chi nhánh đã chọn (và sẽ từ chối nó trong các bản phát hành trong tương lai). Để tránh điều này bạn có thể thiết lập cấu hình này trên kho lưu trữ từ xa:

git config receive.denyCurrentBranch ignore 

Bạn có thể làm việc trên kho lưu trữ này, nhưng bạn phải cam kết thay đổi của bạn trước khi bất kỳ đẩy được thực hiện với nó.

tôi thấy mũi có: http://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6-544f4834cda3

7

hooks có thể là những gì bạn đang tìm kiếm.

Bạn tạo móc hậu sau khi nhận. Và nó sẽ được thực hiện trên máy chủ sau mỗi lần bạn thực hiện. Sau đó, bạn làm một kéo vào kho trần thứ hai và bạn sẽ luôn được cập nhật :)

1

tôi sử dụng cho những thứ như một kho lưu trữ trần (bên trong một tài khoản người dùng) và một kho lưu trữ chia sẻ đó là thư mục gốc của web.
Kho lưu trữ trống có móc hậu cập nhật để kéo gốc web, vì vậy sau khi đẩy vào kho, gốc web sẽ được kéo.

Để có quyền truy cập đọc/ghi từ máy chủ web, người dùng git của tôi cũng nằm trong nhóm www-data và thư mục web root là chmod ug + rwx, g + s để các tệp mới tạo sẽ có quyền sở hữu nhóm.Umask đảm bảo rằng nhóm có quyền truy cập đọc/ghi vì Git sử dụng umask mặc định thường là 0022 (tài liệu nói về việc sử dụng umask riêng trong cấu hình nhưng điều này chưa bao giờ làm việc cho tôi)

#!/bin/bash 
# post-update hook 

WEB_DIR="/var/www/myweb" 
pushd $WEB_DIR > /dev/null 
export GIT_DIR="$WEB_DIR/.git" 
umask 0007 
git pull 
popd > /dev/null 
Các vấn đề liên quan