2014-10-20 16 views
6

Tôi đang làm việc trên một trang web sử dụng Sharelatex(github) nhưng nó chứa các kho lưu trữ khác được sử dụng để xây dựng dự án chính. Tôi nhân bản kho lưu trữ chính và đã làm grunt install được sử dụng để tải xuống các kho lưu trữ đó.Duy trì git repo chứa các bản sao khác git repo

Nhưng vấn đề là tôi cần phải thay đổi mã trong cả kho lưu trữ chính và các mã được tải xuống.

Vì các dự án này có thể nhận được các cập nhật mới, tôi cũng muốn hợp nhất các thay đổi đó. Tôi cũng cần phải duy trì một repo, nhưng khi tôi đẩy thay đổi để Github nó chỉ hiển thị những thay đổi trong repo chính.

Tôi đã xem qua submodules trong git nhưng vì dự án chính không chứa bất kỳ loại mô-đun nào tôi không thể sử dụng.

Ví dụ:

Có một repo web được sử dụng trong các dự án chính. Tôi bắt đầu với một số chỉnh sửa trong các tệp trong web. Tôi cần những thay đổi này để phản ánh trong kho lưu trữ từ xa của mình để những người khác có thể sử dụng chúng.

Giả sử sau một thời gian, bản cập nhật quan trọng cho web repo có sẵn, tôi nên sử dụng nó như thế nào?

Tôi nhập grunt install vào dòng lệnh để tải xuống repo này. Nó không tạo ra một submodule nhưng nhái mà repo vào thư mục của tôi, mà sau đó bị bỏ qua bởi repo git chính của tôi.

Câu hỏi có vẻ không rõ ràng nhưng tôi đã cố gắng hết sức để giải thích sự cố.

Trong hạt vỏ:

  • Tôi muốn không chỉ để thực hiện những thay đổi về cả chính và bất kỳ repo khác đó là có liên quan, nhưng kéo và hợp nhất những Repos khác, cũng như, khi cập nhật của họ có sẵn .

  • Tôi cũng cần duy trì repo từ xa cho dự án của mình.

Trả lời

6

tôi đang làm việc trên một trang web sử dụng Sharelatex (github) nhưng nó chứa kho khác được sử dụng để xây dựng dự án chính. [...] Tôi đã gặp các mô-đun con trong git nhưng vì dự án chính không chứa bất kỳ loại mô-đun nào tôi không thể sử dụng nó.

Thực ra, bạn có một mô-đun con. Đó là những gì một kho lưu trữ lồng nhau là, và (Tôi nghiêm túc về điều này) cho đến nay là những gì bạn cần phải hiểu để grok submodules, đó là tất cả có submodules. Để hiểu submodules, hãy tưởng tượng bạn có một kho lưu trữ lồng nhau (bạn làm) và suy nghĩ về các yêu cầu quản trị, những gì cần phải được thực hiện để hỗ trợ thiết lập đó trong một dvcs. Để bắt đầu, khi mọi người nhân bản một dự án sử dụng các mô-đun con từ một số repo bạn đã quyết định chứa các cam kết đã được xuất bản, bản sao đó rõ ràng cũng sẽ không nhận được kho lưu trữ dự án (chắc chắn nó không nên mang tính riêng tư của bạn). biết phiên bản bạn đã làm). Vì vậy, họ cũng phải lấy repo tiểu dự án từ một số kho lưu trữ được xuất bản riêng của mình.

Làm cách nào để bạn nói cho mọi người tìm nạp các cam kết của bạn ở đâu để nhận các cam kết tiểu dự án cần thiết?Nói một cách đơn giản, bạn phải thả một ghi chú ở đâu đó trong một tệp đã cam kết nói rằng "đây là một repo cần có bất kỳ cam kết $ subsproject cần thiết nào". git submodule đã được giải quyết trên .gitmodules làm nơi lưu trữ thông thường như thế này.

Tiếp theo: tốt, những người khác cần làm gì nếu url bạn đưa cho họ đi ngoại tuyến? Họ rõ ràng sẽ cần phải sử dụng repo khác. Do đó, .gitmodules chỉ là các đề xuất, lệnh git submodule sử dụng các giá trị hiện tại trong .git/config của bạn, trong đó git submodule init đã được điền từ các giá trị được đề xuất trong .gitmodules`.

git submodule hoạt động là tất cả như thế này. Quên nó đi. Thậm chí không bận tâm nhìn vào lệnh cho đến khi bạn cần một chút trợ giúp làm những gì bạn đã tìm thấy cần làm. Bắt đầu từ kiến ​​thức, thực tế đơn giản, rằng một mô-đun con là không có gì hơn một repo lồng nhau, và dự án sử dụng nó cam kết không có gì nhiều hơn một cam kết id đó là vụ phải ở đâu đó trong repo lồng nhau. Đó là nó. Đó là tất cả một submodule.

Khi bạn chạy trên các tác vụ tẻ nhạt cần thực hiện, hãy tìm một tiểu ban git submodule làm điều đó cho bạn. Bạn không phải sử dụng tiểu ban. Tất cả những điều mà tiểu ban đang làm là tự động hoá các nhiệm vụ đơn giản mà có thể mất thời gian. Đó là một bộ công cụ để làm bất cứ điều gì bạn cần làm, và không có cách nào trên trái đất nó có thể hoặc nên áp đặt một số tùy ý và đầy đủ (< - đó là phần cứng) trừu tượng trên tất cả mọi người trên thế giới. Vì vậy, đó là một túi lấy.

Điều đó nói rằng, có một lần phát an toàn quan trọng git submodule updategit submodule add sẽ hoạt động cho bạn khi họ thực hiện git clone cho bạn. Các kho lưu trữ thông thường có nội dung repo thực tế trong dự án [sub] toplevel .git, nhưng nếu bạn kiểm tra một chi nhánh không có tiểu dự án đó hoặc nếu không cần hoặc muốn dự án đó biến mất, số .git cũng sẽ biến mất. bạn muốn khi nó giữ không chỉ kiểm tra nội dung của bạn, nhưng toàn bộ repo thực tế. Vì vậy, khi git submodule update thực hiện bản sao ban đầu của nó, nó sẽ nâng thư mục .git của mô-đun con vào một kho nhỏ tiện dụng (và tùy ý) trong kho chứa của dự án có chứa, và thay thế thư mục .git nó vừa chuyển ra khỏi môđun con với tệp .git chứa đường dẫn tương đối thư mục đã di chuyển.

Để thực hiện việc nâng cấp ban đầu trên repo hiện tại, hãy di chuyển nó ra khỏi repo hiện tại của bạn, thêm và cập nhật từ bất cứ nơi nào bạn đặt, sau đó sửa các url ngược dòng trong .gitmodules để thuận tiện cho người khác.

Ở đó. Bây giờ bạn biết tất cả mọi thứ bạn cần biết để hiểu git submodules và từng bước có được chi tiết chỉ khi bạn tìm thấy bạn cần chúng, để hiểu những gì lệnh git submodule đang làm cho bạn, và tại sao bạn không thực sự phải quan tâm đến sự hiểu biết điều trên manpage của nó lên phía trước. IT nhât thi tôi nghi vậy.

Nếu tôi đã bỏ lỡ bất kỳ điều gì quan trọng, tôi sẽ rất vui vì (nhẹ nhàng hoặc thẳng thừng, tôi thực sự không quan tâm) sửa chữa trong các ý kiến.