2009-05-14 36 views
9

Tôi đang có một trang web có nhiều tệp hình ảnh lớn. Nguồn (cũng như các hình ảnh) được duy trì với git. Tôi muốn triển khai thông qua ftp đến một máy chủ giá rẻ giống như máy chủ xanh.Triển khai chỉ thay đổi một phần của trang web bằng git thành ftp (svn2web for git)

Tôi không muốn để triển khai tất cả các trang web mỗi lần (vì vậy mà tôi sẽ không cần phải tải quá nhiều file không thay đổi hơn và hơn), nhưng để làm xấp xỉ sau:

  1. Trong một git kho lưu trữ, đánh dấu bản sửa đổi được triển khai cuối cùng với thẻ "được triển khai".
  2. Khi tôi nói "triển khai bản sửa đổi X", hãy tìm xem tệp nào đã thay đổi giữa bản sửa đổi X và bản sửa đổi được gắn thẻ là triển khai và chỉ tải chúng lên.

Điều này tương tự tinh thần với svn2web. Nhưng tôi muốn điều đó cho DVCS. Thay thế Mercurial sẽ được xem xét.

Đó là một kịch bản khá đơn giản để viết, nhưng tôi không muốn phát minh lại bánh xe nếu có một số tập lệnh tương tự trên web.

Capistrano và fab dường như chỉ biết cách đẩy toàn bộ bản sửa đổi, trong tích hợp SCM của họ. Vì vậy, tôi không nghĩ rằng tôi có thể sử dụng chúng.

+0

Một công cụ tuyệt vời không liên quan đến scm nhưng thực hiện công việc tương tự, bằng cách lưu vào bộ đệm trang web ftp và chỉ đẩy lên các tệp đã thay đổi, là http://weex.sf.net –

Trả lời

5

Các git-ftp kịch bản có thể là những gì bạn đang tìm kiếm. Nó sẽ thay đổi repository git cục bộ và đồng bộ nó với một repo git từ xa qua ftp.

Tôi đã sử dụng nó bằng cách lưu trữ repo git được tạo bằng cách sử dụng --bare option. Đặt nó trên máy chủ FTP của tôi.

hơn chạy ./git-ftp.py. Nó nhắc cho ftp tên người dùng, mật khẩu, máy chủ ftp, đường dẫn git repo cục bộ, đường dẫn git repo từ xa (vị trí của kho lưu trữ trống).

Sau đó, nó kết nối với repo gp ftp và sau đó gửi khác biệt một mình. (nó sử dụng thư viện git-python để có được thông tin cần thiết).

Tập lệnh có vài sự cố. Dường như luôn nhắc chi tiết tên người dùng và tôi phải nhận xét dòng 68.

#ftp.voidcmd('SITE CHMOD 755 ' + node.name). 

Nhưng những điều đó có thể dễ dàng được sửa.

Alternative

Nếu bạn đang ở trên một nền tảng nix một sự thay thế là sử dụng curlftpfs. Nó sẽ gắn kết tài khoản ftp của bạn như một thư mục thiết bị mà từ đó bạn có thể thực hiện tất cả các thao tác git thông thường (push, pull). Tất nhiên giải pháp này không phải là cụ thể.

Bạn cần sử dụng tùy chọn trống như đã đề cập ở trên trên repo được chia sẻ trên FTP cũng như chạy git update-server-info trong repo trước khi chia sẻ qua FTP.

Thận trọng: Đây không phải là ý tưởng hay nếu bạn định có nhiều người dùng viết thư cho repo git của bạn. Vì FTP không có cơ chế để truy cập LOCK. Bạn sẽ kết thúc với một repo tham nhũng. Thử nghiệm trước khi đưa vào sản xuất.

+0

Không hoàn hảo, nhưng đây có thể là bước đầu tiên! Cảm ơn. –

1

Bạn có thể lưu trữ mới nhất của phiên bản được triển khai ở đâu đó trong một tập tin, sau đó bạn chỉ có thể lấy tên của tập tin thay đổi:

$ git diff --name-only $deployed $latest 

thay thế với theo sha-1 mã, hoặc $ mới nhất có thể được "chính", ví dụ.

+0

Tôi tự trích dẫn: "Đó là một kịch bản khá đơn giản để viết, nhưng tôi không muốn phát minh lại bánh xe nếu có một số tập lệnh tương tự trên web. " –

+0

Vì vậy? Có danh sách các tệp đã thay đổi, bây giờ hãy tải lên và tải chúng lên. – Bombe

+0

Có thực sự đơn giản không? Sẽ không cần phát triển thêm trên kịch bản? Sai tôi nghĩ. Ví dụ về những gì về các tập tin bị loại bỏ? Những người đó phải được thanh lọc ra khỏi trang web ftp. Nhưng có lẽ chúng tôi muốn xác minh rằng tệp bị xóa không bị thay đổi trên máy chủ. Điều gì về tập tin thuộc tính đã thay đổi (đôi khi nó có thể thay đổi với FTP extention tôi nghĩ). Không đơn giản như vậy, thấy không? Vì vậy, đó là lý do tại sao tôi không muốn phát minh lại bánh xe. –

1

Một tùy chọn khác sẽ là sử dụng git archive.

Tất nhiên, như đã đề cập bởi Joey trong tác phẩm "git archive as distro package format":

Phần khó khăn của việc sử dụng một git (hoặc RCS khác) lưu trữ như là định dạng gói nguồn phân phối là xử lý tarball thượng nguồn nguyên sơ.

  • Một cách tiếp cận sẽ là cố tạo một kho lưu trữ git không bao gồm các đối tượng có trong tarball ngược dòng. Sau đó, để giải nén gói nguồn, bạn sẽ giải nén gói tarball ngược dòng, chuyển đổi các tệp trong đó thành các đối tượng git và thêm chúng vào thư mục .git.
    Điều này có vẻ như nó có thể có thể thực hiện, nhưng bạn cần phải biết khá nhiều về git internals để loại bỏ các đối tượng thừa từ git repo và tạo lại chúng từ tarball.

  • Một cách tiếp cận khác sẽ là giữ tarball nguyên gốc ở kho lưu trữ git và sau đó gói nguồn sẽ bao gồm toàn bộ lưu trữ git.Điều này không có hành vi băng thông tối thiểu upload thoải mái cùng - trừ khi bạn có thể "git push" thay đổi của bạn để thực hiện upload

lưu trữ rất nhiều tarball thượng nguồn trong git sẽ không có hiệu quả, nhưng kịch bản pristine-tar chăm sóc đó:

hoang sơ-tar có thể tái tạo một tarball thượng nguồn nguyên sơ chỉ sử dụng một tập tin nhị phân đồng bằng nhỏ và một bản sao của mã nguồn có thể là một kiểm tra kiểm soát sửa đổi.
Gói này cũng bao gồm lệnh pristine-gz, có thể tạo lại tệp .gz nguyên sơ.
Tệp delta được thiết kế để được kiểm tra vào kiểm soát sửa đổi dọc theo mã nguồn, do đó cho phép tarball gốc được trích xuất từ ​​kiểm soát sửa đổi.

Chi tiết khác trong số header of this perl script pristine-tar.

+0

Cảm ơn. Không chính xác những gì tôi muốn vì nó lưu trữ tập tin cụ thể và không cụ thể trên web. Nhưng nó khá gần. (Hạn chế duy nhất là, nó được viết bằng perl :-) –

+0

@Elazar: true. Tôi không nghĩ đây là giải pháp lý tưởng trong trường hợp của bạn, nhưng tôi nghĩ rằng nó đáng được nhắc đến như một câu trả lời có thể cho các vấn đề triển khai tương tự (nhưng không phải trên web cụ thể) khác. – VonC

1

bạn chỉ cũng có thể sử dụng wput (wput --timestamping --reupload --dont-tiếp tục) - như wget chỉ cho ftp tải lên

6

Tôi đã tạo một tập lệnh có tên là git-deploy, hy vọng điều đó sẽ hữu ích.

+1

Rất đẹp và dễ sử dụng. Làm tốt lắm! – mmartinov

0

Lệnh git-ftp push từ git-ftp dường như làm việc khá tốt.

Install nó

sudo apt-get install git-ftp 

Sau khi cài đặt nó, cấu hình tài khoản ftp của bạn

git config git-ftp.url ftp.example.net 
git config git-ftp.user your-ftp-user 
git config git-ftp.password your-secr3t 

Sau đó làm điều đó cho lần đầu tiên

git-ftp init 

Và sau đó, đối với mỗi thay đổi, bạn chỉ cần

git add -A 
git commit -m "update" 
git-ftp push 

Các tệp sẽ được tải lên thư mục nhà của người dùng ~/.

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