2012-05-04 17 views
30

Tôi yêu các mô-đun con git. Ngoài ra, tôi ghét git submodules. Những gì tôi yêu thích về chúng là cách nó cho phép bạn dọn dẹp một cách rõ ràng các phụ thuộc, vv Tôi nhận được điểm để họ chỉ ra một cam kết cụ thể về một repo, tôi làm. Nhưng trong trường hợp của tôi, tôi đang xây dựng một thư viện sẽ được sử dụng trong một dự án khác, vì vậy tôi muốn giữ nó trong repo riêng biệt.Các mô-đun phụ Git luôn ở trạng thái hiện tại

Tuy nhiên, sự phiền toái xảy ra khi tôi làm việc hàng ngày trên thư viện này và tôi liên tục phải chuyển về ứng dụng bằng thư viện của mình để thực hiện cập nhật con trỏ.

Vì vậy, có thể có một mô-đun con git luôn luôn nằm trên đầu của repo nó chỉ trong khi tôi liên tục cập nhật và thêm vào thư viện này?

+0

Liệu sự giúp đỡ này? http://stackoverflow.com/questions/1777854/git-submodules-specify-a-branch-tag –

Trả lời

18

Không, và điều này là do thiết kế. Nếu có một cách để trỏ một mô-đun con đến "đầu hiện tại" của một số kho lưu trữ khác, thì sẽ không thể truy xuất phiên bản lịch sử (chẳng hạn như phiên bản được gắn thẻ) từ kho lưu trữ chính. Nó sẽ không biết phiên bản của submodule để kiểm tra.

Có nói rằng, bạn có thể quan tâm đến tập lệnh git subtree. Điều này cung cấp một cách khác để làm việc với các mô-đun con có thể tương thích hơn với quy trình làm việc của bạn. Tôi đã được nhắc nhở về điều này bởi post on HN gần đây.

+2

vâng, tôi hiểu điều đó, điều tôi đang nói là tôi muốn repo cha mẹ của tôi chỉ tự động cập nhật con trỏ mô-đun con mỗi khi có những thay đổi được cam kết cục bộ trong mô-đun con. Nếu tôi có dự án A có submodule X, khi tôi đi vào submodule X trong khi làm việc trên dự án A, tôi liên tục phải thực hiện 2 commit, một trong submodule, sau đó một lần nữa trong parent. Không phải là một vấn đề lớn nếu bạn đang làm việc trên một submodule mà không thay đổi nhiều, nhưng khi bạn liên tục phải đi qua lại, nó được thực sự gây phiền nhiễu ....Có vẻ như tôi nên chỉ có thể có repo địa phương của tôi chỉ cam kết cả hai – Ben

+1

dịch: nói với repo địa phương của tôi để chỉ tự động cam kết cập nhật con trỏ submodule cho tôi khi tôi cam kết thay đổi để submodule ... – Ben

+2

Tôi cho rằng bạn có thể viết một kịch bản mà bạn sử dụng khi cam kết với mô-đun con, điều đó sẽ tự động thực hiện một cam kết tương ứng trong mô-đun chính. Hoặc, bạn có thể viết một kịch bản mà bạn chạy trong thư mục làm việc của mô-đun cha, nó tự động thực hiện các cam kết cho bất kỳ mô-đun con nào đã được cập nhật kể từ lần commit cuối cùng của dự án cha. –

0

Tại sao bạn không thực hiện thay đổi bên trong thư mục con, mà chính nó là một repo git? Bằng cách này, ứng dụng của bạn sẽ luôn có thư viện được cập nhật.

Hãy cẩn thận:

  1. Bạn vẫn cần phải cam kết thay đổi submodule bên repo ứng dụng của bạn để đưa sự thay đổi trong điều khiển phiên bản (đối với ứng dụng).

  2. Nếu có nhiều ứng dụng hơn một ứng dụng đang sử dụng thư viện này, điều này sẽ không hoạt động vì chỉ có một ứng dụng sẽ được cập nhật tại bất kỳ thời điểm đã định nào.

24

Như tôi đã đề cập đến trong "git submodule tracking latest", bạn có thể từ git 1.8.2 (tháng 3 năm 2013) làm cho một submodule theo dõi các HEAD của chi nhánh:

git submodule add -b <branch> <repository> [<path>] 

Một SHA1 submodule vẫn được ghi trong repo cha mẹ như một gitlink (special entry in the index)

Nhưng một git submodule update --remote sẽ cập nhật mục nhập vào SHA1 phù hợp với các HEAD của một chi nhánh của submodule repo từ xa.

Nếu bạn có một submodule hiện có, you can make it follow a branch với:

cd /path/to/your/parent/repo 
git config -f .gitmodules submodule.<path>.branch <branch> 

cd path/to/your/submodule 
git checkout -b branch --track origin/branch 
    # if the master branch already exist: 
    git branch -u origin/master master 

cd /path/to/your/parent/repo 
git add path/to/your/submodule 
git commit -m "Make submodule tracking a branch" 
+0

Mỗi khi tôi chạy 'git submodule update --remote' submodule quay lại commit và mất tham chiếu HEAD –

+0

Làm' git submodule foreach git pull' nó không xảy ra. –

+0

@MarceloFilho không đáng ngạc nhiên khi xem xét một mô-đun con không kiểm tra chi nhánh. Nếu nó được cấu hình để theo một nhánh từ xa, thì 'git submodule update --remote --recursive' là lệnh duy nhất cần thiết. Kiểm tra các tập tin .gitmodules của bạn để xem liệu các/mô-đun con đó có theo dõi một nhánh hay không. – VonC

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