2012-06-01 34 views
7

Tôi có một vài trang web sử dụng Drupal, tôi có một số máy chủ, sống, dev1, dev2 ...Giữ gương git đồng bộ ở tất cả các lần

codebase repo Drupal là lớn (112MB), vì vậy tôi mong muốn để tận dụng tối đa khả năng liên kết cứng của git để mỗi lần tôi thêm một trang web, nó không nhân đôi điều này.

Vì vậy, trên máy chủ trực tiếp, tôi có kho lưu trữ chính trống và tất cả các trang web của tôi là bản sao của điều này, mỗi trang web sử dụng một nhánh khác. Điều này là rất tốt trên một máy chủ, liên kết cứng được sử dụng, nó nhanh chóng và hiệu quả.

Nhưng trên máy chủ dev của tôi, chúng thường được sao chép từ repo chính trống, có nghĩa là hai trang web trên cùng một máy không thể sử dụng liên kết cứng để tiết kiệm dung lượng.

Những gì tôi muốn làm là thiết lập một gương của repo trần trên mỗi máy chủ dev của tôi, và sau đó sao chép từ đó.

dev1$ git clone --mirror live:master-bare-repo dev1-mirror-repo 
dev1$ git clone -b site1 dev1-mirror-repo site1 
dev1$ git clone -b site2 dev1-mirror-repo site2 

Tất cả đều tốt cho đến nay. Nhưng tôi muốn những chiếc gương luôn đồng bộ. Vì vậy, tôi đã sử dụng post-receive hook trên gương của dev1 để làm git push --mirror origin. Bây giờ nếu site1 trên dev1 đẩy commit, chúng được đẩy một cách kỳ diệu vào master-bare-repo.

Nhưng điều gì xảy ra nếu tôi thực hiện thay đổi trên máy chủ trực tiếp và đẩy điều đó? Tôi không thể thiết lập móc nối post-receive để đẩy vào (các) khác vì điều đó có lẽ sẽ kích hoạt các mócpost-receive của chúng sẽ kết thúc trong đệ quy?

Có cách nào thông minh xung quanh vấn đề này không?

+1

Quy trình nền có định kỳ cố gắng kéo và đẩy đến công việc máy chủ trực tiếp (thay vì sau khi nhận) không? Ngoài ra, hãy thử nó, nhưng tôi không nghĩ rằng bạn sẽ bị mắc kẹt trong một vòng lặp với phương pháp của bạn, bởi vì lần thứ hai bạn cố gắng đẩy các máy chủ khác không nhận được bất cứ điều gì vì không có gì để đẩy. – Shahbaz

Trả lời

4

Trước hết, bạn sẽ không kết thúc trong một đệ quy, kể từ sau khi nhận được móc không được thực thi khi "Tất cả mọi thứ được cập nhật" (như đã nêu trong this other question), mà sẽ được kết quả của số đẩy từ gương đến máy chủ trực tiếp.

Mặt khác, đó không phải là tất cả thiết kế có thể mở rộng (mỗi khi bạn thêm một gương mới, bạn sẽ cần phải thay đổi móc của máy chủ trực tiếp để thêm trang web để đẩy). Có thể bạn sẽ thấy thanh lịch hơn khi sử dụng một chiến lược đồng bộ "lười" trong gương của bạn: khi họ nhận được một cú đẩy họ không chỉ đẩy tới chủ nhân, mà trước khi họ lấy/kéo từ chủ nhân. Bằng cách này bạn không cần phải thiết lập một móc trong chiến lược tổng thể và đồng bộ hóa sẽ được quản lý hoàn toàn bằng gương. Nhược điểm của chiến lược này là cuối cùng bạn có thể muốn thay đổi máy chủ trực tiếp mà bạn muốn được truyền tới các gương trước khi chúng cần đẩy bất kỳ thay đổi nào. Vì vậy, bạn phải suy nghĩ xem liệu những thay đổi đối với các bậc thầy của bạn sẽ rất quan trọng để bù đắp sự cân bằng trong khả năng mở rộng. Tất nhiên, một bản vá để làm cho "khả năng mở rộng" thiết kế này cũng "đồng bộ hóa" là bằng cách sử dụng một công việc cron bên ngoài để kiểm tra định kỳ cho những thay đổi trong tổng thể, như được đề xuất trong ý kiến.

+0

Điều này nghe có vẻ như nó sẽ hoạt động! Cảm ơn. Tôi sẽ cho nó một đi và đánh dấu vào câu trả lời một lần thử nghiệm. – artfulrobot

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