2015-12-08 13 views
7

Tôi đã tìm một lúc và không tìm thấy câu trả lời (có lẽ tôi không biết phải nhìn gì).Nhiều repos với một submodule đơn

Chúng tôi đã có một thư viện chính là một kho lưu trữ của nó tự (chúng ta hãy gọi nó Lib) nó chứa hầu hết các mô-đun và submodules của chúng tôi. Giả sử nó có kích thước 2GB ...

Bây giờ chúng tôi có nhiều dự án như: ProjA, ProjB, ProjC, mỗi dự án sử dụng Lib làm mô đun con.

ProjA

  • Lib (chi nhánh: thạc sĩ, cam kết #: 1)

ProjB

  • Lib (chi nhánh: khác, cam kết #: 2)

ProjA

  • Lib (chi nhánh: thạc sĩ, cam kết #: 4)

Vì vậy, trong khi tôi có thể giữ tất cả các dự án tham khảo để sửa thư viện (aka submodule) phiên bản. Bây giờ tôi đã có 3 * 2GB = 6GB của mô-đun con SAME.

Có cách nào để tham chiếu đến một mô-đun con duy nhất trong khi vẫn duy trì các tệp/phiên bản chính xác được tham chiếu không?

Ví dụ:

ProjA

  • Lib/base_lib.h (v1.0)

  • Lib/file_only_in_this_commit

ProjB

  • Lib/base_l ib.h (v1.0)

ProjC

  • Lib/base_lib.h (v1.1)

Cảm ơn!

+0

Không phải là tôi biết. Mỗi kho lưu trữ, bạn chỉ có thể có một tham chiếu đến một SHA trong một mô-đun con, do đó lý do bạn thêm nó 3 lần. Tôi đoán bạn có thiết lập này vì 'ProjA',' ProjB' và 'ProjC' đều liên quan và tương tác với nhau? Nếu không, đây có thể là 3 kho khác nhau. Hoặc bạn có thể có 3 nhánh trong một kho lưu trữ, trong trường hợp này bạn có thể có các tham chiếu submodule khác nhau trên mỗi nhánh chỉ với một phiên bản của submodule – houtanb

+0

Nếu mục tiêu của bạn là tiết kiệm dung lượng, sau khi thanh toán ban đầu thay thế thư mục đối tượng một bản sao được liên kết cứng – basin

+0

@basin Có cách nào để xác định các liên kết cứng như vậy trong git không? Thực hiện đề xuất của bạn theo cách thủ công không thực sự giải quyết vấn đề và tôi cũng muốn tránh các tập lệnh nếu có thể. – Danra

Trả lời

3

Vâng, nội bộ toàn bộ mô hình con là khá đơn giản, vì vậy bạn có thể làm chủ nó theo sở thích của bạn.

Bên trong mỗi Proj<N>/.git/modules/ có một thư mục tương ứng với Lib môđun con với kho trống được sao chép từ tham chiếu từ xa được chỉ định trong Proj<N> /.gitmodules trong Lib.url. Những kho trống đó là các điểm tối ưu hóa.

Bạn có thể chỉ cần tạo lại chúng bằng cách sử dụng các liên kết cứng nếu có thể.

1) Tạo một bản sao trần của Lib của bạn trong một thư mục trên hệ thống tập tin giống như tất cả các hợp đồng mua Proj của bạn:

git clone --bare url://to/Lib /path/to/Lib.git 

2) Thay thế repo submodule mặc định với repo, tham khảo repo trần từ p. 1:

mv ProjA/.git/modules/Lib ProjA/.git/modules/Lib.old // preserve it for a while 
git clone --bare --local url://to/Lib \ 
    --reference /path/to/Lib.git ProjA/.git/modules/Lib 

3) Khôi phục lại cấu hình từ repo bảo quản trong ProjA/.git/modules/Lib:

cp ProjA/.git/modules/Lib.old/config ProjA/.git/modules/Lib/config 

Bây giờ bạn có thể kiểm tra xem mọi thứ có hoạt động trong ProjA và xóa ProjA/.git/modules/Lib.old và cứ tiếp tục như vậy. Trong trường hợp này tất cả các repos sẽ sử dụng cùng một fileobjects.

Trong git, một trạng thái cụ thể của một môđun con được tham chiếu bởi một SHA1 chính xác. Trừ khi bạn thực hiện một số hoạt động "ác" trong bạn Lib repo chính (ví dụ: git filter-branch hoặc các hoạt động khác có thể dẫn đến việc xóa cam kết), tất cả các cam kết thích hợp trong Lib sẽ được lưu giữ vĩnh viễn. Proj<N> kiểm tra các cam kết cụ thể hoàn toàn độc lập với nhau, vì vậy bạn không nên bận tâm trạng thái Lib trong ProjA có thể ảnh hưởng đến trạng thái khác Lib trong ProjB.

6

Bạn có thể sử dụng git worktree (có sẵn từ git 2.5) để tạo ra worktrees bổ sung cho các submodule Lib, tại các địa điểm bên trong ProjA, ProjB vv

git worktree làm cho nó một nỗi đau để thực hiện một số worktrees với cùng tên (tất cả được gọi là "Lib"), tôi vừa tạo một tập lệnh, share_submodules để làm việc xung quanh những khó khăn và tạo thêm worktree thay vì một mô-đun con, đặt nó vào đúng submodule cam kết, và làm nó đệ quy cho tất cả các submodules bên trong module được chia sẻ.

Nó sẽ hoạt động cũng như nếu môđun con được tạo bởi git submodule update --init --recursive, ngoại trừ tất cả các bản sao đề cập đến một đối tượng của mô-đun.

Nếu bạn đang chuyển sang nó bằng cách loại bỏ mô-đun con, có các tệp con mô-đun đi lạc trong số .git và tôi đã tạo find_stray_submodules.py để xóa chúng.

+0

Có khả năng, anh/cô ấy sẽ cần phải hoàn toàn ngừng sử dụng 'git submodule's trong trường hợp này , phải không? – user3159253

+0

@ user3159253: ** này nên ** tương thích với 'git submodule'. Mặc dù tôi chỉ có thể nói điều đó với sự tự tin cao sau khi sử dụng giải pháp này một thời gian (tôi mới bắt đầu) – yairchu

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