2010-07-21 22 views
12

Làm cách nào để chúng tôi có thể đẩy mã tới nhiều máy chủ? Chúng tôi có nhiều máy chủ cần phải có cùng một bản sao của mã. Rất khó để đẩy đến máy chủ cá nhân. Tôi biết thủy ngân có móc nhưng không ai trong số họ đưa ra một giải pháp thích hợp.Làm thế nào để đẩy mã vào nhiều máy chủ của Mercurial?

Trả lời

19

Trong máy chủ trung tâm của bạn, bạn tạo ra một cái móc changegroup.

Vì vậy, máy chủ trung tâm của bạn sẽ có HGRC sau:

[paths] 
server2=http://server2 
server3=http://server3 
[hooks] 
changegroup.server2 = hg push -f server2 
changegroup.server3 = hg push -f server3 

Bạn có thể có nhiều móc cho cùng một sự kiện, do đó không nên là một vấn đề.
Lợi thế của móc thay đổi trên móc thay đổi là nó chạy ít thường xuyên hơn.

+2

Đây là giải pháp tốt nhất vì nó sẽ chỉ được kích hoạt nếu push to server 1 thành công. Bạn có thể sẽ cần 'push -f' trong những dòng móc thay đổi nếu bạn đang làm việc với lịch sử nhánh. –

+1

Đã thêm tùy chọn -f –

+0

Mã cần chỉnh sửa để nó hoạt động. Mercurial cho phép bạn [thực hiện nhiều hành động cho mỗi sự kiện] (http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html) ** bằng cách thêm phần mở rộng vào cuối ** của một tên móc. Bạn mở rộng tên móc bằng cách đặt tên móc, theo sau là dấu chấm (ký tự “.”), Tiếp theo là một số văn bản bạn chọn. Ví dụ, Mercurial sẽ chạy cả commit.foo và commit.bar khi sự kiện commit xảy ra. –

1

Trong tệp .hg/hgrc của bạn, bạn cần có chỉ thị [paths], có chứa vị trí mặc định của bạn. Gì về việc thêm một cái gì đó như:

[paths] 
default = http://server1 
server2 = http://server2 

Và sau đó làm một:

hg push default 
hg push server2 
+2

có vấn đề. Tôi biết giải pháp này, những gì tôi muốn là một cái móc hoặc một kích hoạt mà trên một push thành công đến server1, push to server2 được khởi động tự động. Các giải pháp trên luôn luôn có một cơ hội quên để đẩy đến một máy chủ. Nhân tiện, cảm ơn bạn đã trả lời nhanh. – Akshay

+0

Tôi đã gặp vấn đề về chuỗi đẩy tự động. Liệu nó có giải quyết hay không? –

0

tôi giả định rằng một trong các máy chủ là repo chính, phần còn lại là triển khai. trong tình huống như vậy, tôi sẽ chỉ tương tác với chủ nhân và để các triển khai lên tới cron:

cat >$HOME/bin/dist <<'EOM' 
#!/bin/sh 
cd ${1:?} 
tip=$(hg tip --template '{node}') 
for r in $remotes; do 
    hg push -r $tip $r 
done 
EOM 

chmod +x $HOME/bin/dist 
(crontab -l; echo '*/5 * * * * $HOME/bin/dist /var/repos/master') | crontab - 
+0

huh .. điều gì sẽ xảy ra nếu nhiều hơn một cam kết đã được đẩy trong chưa đầy 5 triệu? :-). Trong trường hợp này, tốt hơn là thiết lập móc "changegroup". Ngoài ra khi một changeset đang tạo ra một nhánh, nó sẽ là cần thiết để đẩy với tùy chọn -f (force). Lời khuyên của tôi, nếu bạn muốn sử dụng cron thay vì móc, sẽ thiết lập nó trên các máy từ xa mà thường xuyên sẽ thay đổi: theo cách này, có thể có nhiều hơn một bộ thay đổi (vì vậy bạn thậm chí có thể kéo mỗi giờ cho ví dụ), và cũng kéo không yêu cầu tùy chọn -f. Chỉ cần 0,02 € của tôi. Chúc mừng, Christophe. Giải pháp của –

+1

hoạt động tốt. 'đẩy' đẩy 'tip' và tất cả tổ tiên của nó, vì vậy họ sẽ nhận được tất cả mọi thứ. Mặc dù có rất nhiều mã không cần thiết, bạn có thể sử dụng tên 'tip' thay vì sử dụng mẫu để tìm hiểu nó (-r lấy tên tốt), và bạn có thể bỏ qua tham số -r tất cả cùng nhau và chỉ cần 'đẩy' mặc định là mẹo. Bạn có thể muốn push -f mặc dù kể từ khi bạn có thể cần phải đẩy các chi nhánh mới và người đứng đầu mới tại một số điểm và bạn không muốn kịch bản thất bại. –

+0

@ ry4an: bạn không thể sử dụng tên 'tip', vì nó có thể trỏ đến một changeset khác trước khi tập lệnh nhận được từ server1 đến server3.đó chỉ là lý do tại sao bạn không thể bỏ qua '-r': nếu bạn muốn tất cả các gương có cùng một mẹo sau mỗi lần đẩy, bạn cần phải dính vào bản sửa đổi tương tự cho toàn bộ tập lệnh. bình luận '-f' là hợp lệ. –

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