2012-02-22 34 views
5

Tôi khá mới với Git: Tôi đến từ SVN và ở đó tôi thấy thực sự mạnh mẽ: tính năng bên ngoài. Ở đây trong Git tôi đã không tìm thấy một cái gì đó tương tự:Đẩy subtrees vào một repo git

  • submodules là hoàn hảo cho việc thêm các module dự án mà không phải là luôn luôn cần thiết. Chúng phải được khởi tạo sau khi nhân bản repo và bạn không thể chỉ bao gồm một phần tử con của dự án gốc.
  • subtrees thực sự tốt cho việc thêm thư viện (chúng cũng cho phép đưa vào thư mục con), nhưng đẩy chúng là một nỗi đau thực sự.

Vì vậy, kịch bản là: Tôi có một dự án, trong đó tôi muốn bao gồm một số thư viện. Tôi muốn có khả năng thay đổi tất cả các thư viện này và đẩy chúng vào các bản repo của riêng họ. Hơn nữa, một số thư viện này là các thư mục con của các dự án lớn hơn (ví dụ, nếu một dự án bao gồm các bản trình diễn hoặc tệp readme, tôi sẽ không bao gồm các thư mục đó trong dự án của tôi).

Tôi có thể làm như thế nào?

Tôi đã thử:

Vâng, nếu bạn đã đạt đến thời điểm này, nhờ sự kiên nhẫn của bạn, bây giờ tôi muốn một cái gì đó khác để thử, bởi vì ngay bây giờ kết luận của tôi là : "subtree đẩy không được phép trong Git" ç_ç

+0

http://stackoverflow.com/questions/3131912/why-are-git-submodules-incompatible-with-svn-externals/3132221#3132221: git submodules và bên ngoài là khác nhau thực sự. Nhưng bạn có thể thay đổi nội dung mô-đun con và đẩy tới repo của nó: http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194. Về cơ bản, câu trả lời của tôi sẽ giống như http://stackoverflow.com/questions/9394286/planning-repository-layout-for-git-migration/9395375#9395375 – VonC

+0

ok, cảm ơn ... nhưng (hãy làm đúng nếu tôi Tôi sai) với submodules tôi không thể "bao gồm" chỉ một submodule-thư mục cụ thể ?? Tôi có nghĩa là: submodule của tôi có hai thư mục: Demos và Source và tôi muốn bao gồm _only_ nội dung Source trong dự án cha mẹ của tôi ... hy vọng nó dễ hiểu ... –

+0

chính xác: submodule là một repo git của riêng nó: bạn nên kiểm tra mọi điều. Trong khi thanh toán thưa thớt là có thể (http://stackoverflow.com/a/2467629/6309), chúng không được khuyến nghị. Sử dụng liên kết tượng trưng để chỉ liên kết những gì bạn muốn xem là tốt hơn. – VonC

Trả lời

3

Vài nhận xét từ các ý kiến:

Vì vậy, tôi khuyên bạn nên:

  • tải (git checkout) repo phụ huynh và tất cả các môđun con
  • nó tạo ra ở những nơi khác cấu trúc chính xác, với liên kết tượng trưng đến submodules (hoặc thư mục con của submodules theo thứ tự để đạt được những gì bạn cần.
  • quay trở lại theo định kỳ để các repo mẹ git ain để phát hiện bất kỳ thay đổi (dones từ cấu trúc thư mục khác tạo ra bên ngoài của Git) để cam kết và đẩy tất cả các môđun con modifs, và sau đó cam kết và đẩy repo chính.

git checkout

parent repo 
    + 
    +--> main project 
    + 
    +-> mainDir1 
    +-> mainDir2 
    +--> lib1 
    + 
    +-> lib1Dir1 
    +-> lib1Dir2 
    +--> lib2 
    + 
    +-> lib2Dir1 
    +-> lib2Dir2 

Và cấu trúc thư mục dự án của riêng của bạn (ví dụ)

+--> main project (symlink to ../parent/main project) 
    + 
    +-> mainDir1 
    +-> mainDir2 
    +-> lib1Dir1 (symlink to ../parent/lib1/lib1Dir1) 
    +-> lib1Dir2 (symlink to ../parent/lib1/lib1Dir2) 
    +-> lib2Dir2 (symlink to ../parent/lib1/lib2Dir2) 

(lưu ý không có lib2Dir1 (ví dụ) vì trong dự án thực tế của bạn, bạn don' t cần nó)

+0

cảm ơn, câu trả lời của bạn thực sự là một ý tưởng tuyệt vời mà tôi chưa bao giờ nghĩ tới. Nhưng bây giờ tôi hiểu nó không phải là những gì tôi đang tìm kiếm ... Tôi có nghĩa là: với giải pháp của bạn nếu tôi muốn sao chép dự án tôi phải làm các liên kết tượng trưng, ​​vì vậy nó không phải là giải pháp chìa khóa trao tay tôi muốn cung cấp. Vâng, nó dễ dàng hơn nhiều so với giải pháp trước đây của tôi với subtrees, nhưng bây giờ tôi sẽ nghĩ rằng đây là một "thiếu" của Git, phải không? BTW cảm ơn rất nhiều vì sự kiên nhẫn của bạn !! –

1

Giải pháp của VonC gọn gàng, nhưng nó có một bất lợi: Không có od cách chụp một cấu hình của dự án của bạn + thư viện tại một điểm trong thời gian.

Nếu bạn cần thiết lập lại dự án của mình, bạn cần phải thanh toán dự án + thư viện, nhưng tất cả chúng có thể nằm trên các nhánh khác nhau và cam kết với những gì bạn đã có trước đây. Vì vậy, nếu bạn làm theo đề nghị của VonC, có thể tạo thẻ trong mỗi repo tại thời điểm bạn thực hiện một dự án của bạn, để bạn ít nhất có thể kiểm tra lại chúng tại cùng một thời điểm.

Nếu không, hãy luôn chuyển tiếp và không bao giờ kiểm tra phiên bản cũ hơn.

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