2013-01-11 23 views
41

Có thể thiết lập gitlab để tự động đồng bộ hóa (mirror) một kho lưu trữ được lưu trữ tại một vị trí khác không?Phản ánh kho lưu trữ Gitlab

Hiện tại, cách dễ nhất mà tôi biết là thực hiện điều này liên quan đến việc đẩy thủ công tới kho lưu trữ hai (gitlab và kho lưu trữ khác), nhưng điều này tốn thời gian và dễ bị lỗi.

Vấn đề lớn nhất là gương có thể đồng bộ hóa lại là hai người dùng đồng thời đẩy các thay đổi vào hai kho lưu trữ khác nhau. Phương pháp tốt nhất tôi có thể đưa ra để ngăn chặn vấn đề này là để đảm bảo người dùng chỉ có thể đẩy tới một trong các kho lưu trữ.

+0

Điều này đã được yêu cầu tại: http://feedback.gitlab.com/forums/176466-general/suggestions/4614663-automatic-push-to-remote-mirror-repo-after-push-to Đi lên và upvote nó . –

Trả lời

15

Cập nhật tháng 12 năm 2016: Phản chiếu được hỗ trợ với GitLAb EE 8.2+: xem "Repository mirroring".

Theo nhận xét của Xiaodong Qi:

Câu trả lời này có thể được đơn giản hóa mà không sử dụng bất kỳ dòng lệnh (chỉ cần đặt nó lên trên giao diện quản lý repo Gitlab)


câu trả lời gốc (tháng 1 năm 2013)

Nếu repo gương từ xa của bạn là bare repo, thì bạn có thể thêm móc hậu nhận vào gitla của mình b-quản lý repo, và đẩy đến repo từ xa của bạn trong đó.

#!/bin/bash 
git push --mirror [email protected]:/path/to/repo.git 

Như Gitolite (được sử dụng bởi Gitlab) mentions:

nếu bạn muốn cài đặt một cái móc chỉ trong một vài kho cụ thể, làm điều đó trực tiếp trên máy chủ.

đó sẽ là ở:

~git/repositories/yourRepo.git/hook/post-receive 

Caveat (Cập nhật Ocotober 2014)

Ciro Santilli points out in the comments:

Hôm nay (Q4 2014) điều này sẽ thất bại b ecit GitLab tự động liên kết symlink github.com/gitlabhq/gitlab-shell/tree/… vào mọi kho lưu trữ mà nó quản lý.
Vì vậy, nếu bạn thực hiện thay đổi này, mọi kho lưu trữ bạn sửa đổi sẽ cố gắng đẩy.
Không đề cập đến các xung đột có thể xảy ra khi nâng cấp gitlab-shell và tập lệnh hiện tại là tập lệnh ruby ​​chứ không phải bash (và bạn không nên xóa nó!).

Bạn có thể khắc phục điều này bằng cách đọc tên thư mục hiện hành và đảm bảo song ánh giữa đó và điều khiển từ xa, nhưng tôi khuyên bạn nên mọi người tránh xa xa những điều

See (và bỏ phiếu cho) feeadback "Automatic push to remote mirror repo after push to GitLab Repo".


Cập nhật tháng 7 năm 2016: Tôi thấy loại tính năng bổ sung cho GitLab EE (Enterprise Edition): MR 249

  • Thêm khả năng để nhập URL đẩy xa dưới thiết lập Repository Gương
  • Thêm mã thực hiện để đẩy tới kho lưu trữ từ xa
  • Thêm nhân viên nền mới
  • Hiển thị ngày cập nhật mới nhất và lỗi đồng bộ hóa nếu chúng tồn tại.
  • Đồng bộ gương từ xa mỗi giờ.

Lưu ý rằng gần đây Remote Mirror Repository (issues 17940) có thể được khôn lanh:

tôi đang cố gắng để thay đổi phát triển chính của module Nguồn NPM mở của công ty tôi Lossless GmbH (https://www.npmjs.com/~lossless) từ GitHub. com để GitLab.com

tôi nhập khẩu tất cả các hợp đồng mua lại từ GitHub, tuy nhiên khi tôi cố gắng để tắt Mirror Repository và bật Remote Mirror Repository với URL GitHub gốc tôi nhận được một lỗi nói:

Remote mirrors url is already in use 

Đây là một trong những hợp đồng mua lại này không thành công với: https://gitlab.com/pushrocks/npmts Chỉnh sửa 2 months ago

quay ra, nó chỉ đòi hỏi nhiều bước:

  • vô hiệu hóa Mirror Repository
  • nhấn save
  • xóa URl
  • báo chí tiết kiệm
  • sau đó thêm Remote Gương
+1

Điều gì xảy ra trong quá trình thiết lập này khi repo từ xa không khả dụng, ví dụ: do bảo trì hoặc mạng lưới hickups? Tôi đoán rằng nó sẽ không thể đẩy đến repo gitlab, hoặc các cam kết đẩy sẽ bị thiếu trong repo từ xa? – jfrantzius

+2

@jfrantzius sau: các cam kết của bạn sẽ vẫn được đẩy tới repo GitLab của bạn, nhưng sẽ không chuyển nó thành nô lệ. – VonC

+0

Hôm nay điều này sẽ thất bại vì GitLab tự động liên kết tượng trưng https://github.com/gitlabhq/gitlab-shell/tree/7eb45672b77a0337e6568ef64cd84e13027f2d7b/hooks vào mọi kho lưu trữ mà nó quản lý. Vì vậy, nếu bạn thực hiện thay đổi này, mọi kho lưu trữ bạn sửa đổi sẽ cố gắng đẩy. Không đề cập đến các xung đột có thể xảy ra khi nâng cấp gitlab-shell và rằng tập lệnh hiện tại là tập lệnh ruby ​​chứ không phải bash (và bạn không nên xóa nó!). Bạn có thể sửa lỗi này bằng cách đọc tên thư mục hiện tại và đảm bảo việc đánh dấu giữa điều đó và điều khiển từ xa, nhưng tôi khuyên mọi người nên tránh xa những thứ đó. –

1

Bạn có thể sử dụng móc để tùy chỉnh tập lệnh chạy sau một số cam kết. Với điều đó, bạn có thể gửi các thay đổi mới cho một kho lưu trữ khác. Tìm thêm thông tin về móc trong trang sau: http://git-scm.com/book/en/Customizing-Git-Git-Hooks

3

Tôi cũng tạo ra một dự án để phản ánh các kho trong GitLab 6 thông qua API (API chủ yếu được sử dụng trên chỉ tạo ra dự án).

https://github.com/sag47/gitlab-mirrors

3

Tùy chọn tốt nhất hiện nay là sử dụng GitLab CI. Về cơ bản nó là một máy chủ đã được triển khai cho các webhook, nó tự động nhái cho bạn và cho phép bạn chạy các lệnh shell tùy ý: tất cả những gì bạn phải làm sau đó là đẩy.

services là tùy chọn tốt nhất nếu ai đó triển khai chúng: chúng sống trong cây nguồn, sẽ thực hiện một lần đẩy và không yêu cầu thêm phí triển khai.Khó khăn trong việc thực hiện chính là cách lưu trữ thông tin đăng nhập một cách an toàn: có khả năng tùy chọn tốt nhất cho GitHub là lấy khóa bằng cách nào đó (Oauth trên giao diện người dùng thông qua dịch vụ sẽ là hoàn hảo) và lưu trữ bản rõ đó.

Một tùy chọn khác vừa được thêm là custom hooks.

0

Tùy chọn tốt nhất là không sử dụng móc sau khi nhận, nhưng triển khai lệnh thực hiện đồng bộ hóa qua rsync, sử dụng Capistrano nếu bạn thích Ruby, sử dụng Shipit nếu bạn thích Javascript (Grunt).

6

Nếu không lưu trữ GitLab của riêng bạn, bạn nên biết GitLab.com đã giới thiệu tính năng này trực tiếp, mà không có bất kỳ giải pháp nào.

  1. Từ bên trong một dự án sử dụng biểu tượng bánh răng để chọn Gương Repository
  2. Cuộn xuống Push to một kho lưu trữ từ xa
  3. Checkmark kho gương từ xa: Tự động cập nhật các chi nhánh gương từ xa, thẻ và cam kết từ kho lưu trữ này mỗi giờ.
  4. Nhập kho lưu trữ bạn muốn cập nhật; cho GitHub ít nhất bạn có thể bao gồm tên người dùng và mật khẩu của bạn trong URL, như vậy: https://yourgithubusername:[email protected]/agaric/guts_discuss_resource.git

Lưu ý rằng nếu bạn đang kéo từ một kho lưu trữ từ xa, nó sẽ vẫn đẩy vào kho từ xa được đặt ở đây. Tôi đã không thử nó, nhưng bạn sẽ có thể đẩy và kéo từ cùng một kho lưu trữ.

0

GitLab Enterprise Edition hiện hỗ trợ tính năng sao lưu kho lưu trữ như phiên bản 8.2. Thông tin về cách định cấu hình này nằm trong Repository Mirroring help topic.