Làm cách nào để thêm một mô hình con vào thư mục con?


310

Tôi có một repo git ~/.janus/với một loạt các mô hình con trong đó. Tôi muốn thêm một mô hình con vào ~/.janus/snipmate-snippets/snippets/, nhưng khi tôi chạy git submodule add <git@github.com:...>trong snipmate-snippetsthư mục, tôi nhận được thông báo lỗi sau:

You need to run this command from the toplevel of the working tree.

Vì vậy, câu hỏi là: Làm thế nào để tôi thêm một mô hình con vào snipmate-snippetsthư mục?


Đi đến thư mục gốc của một git repo cho các lệnh mô đun con sẽ không còn là một yêu cầu nữa (sớm). Xem câu trả lời của tôi dưới đây
VonC

3
git submodule add -b <branch> <url> <relative_path_4m_root>
ký sinh

Câu trả lời:


439

Bạn đi vào ~/.janusvà chạy:

git submodule add <git@github ...> snipmate-snippets/snippets/

Nếu bạn cần thêm thông tin về các mô hình con (hoặc git nói chung), ProGit khá hữu ích.


có vẻ như là một ý tưởng tốt để thêm chi nhánh khi thêm khác TRỤ được dễ dàng tách ra: git submodule add -b <chi nhánh> <kho> [<submodule-path>]
deann

1
Đối với tôi điều này đã gây ra 'subprojects' already exists in the index (tôi đã sử dụng các tiểu dự án làm tên thư mục) . Thay vào đó, những gì đã giúp, là câu trả lời của VonC bên dưới, tức là làm cd subprojects, và sau đó git submodule add <get@github …>không có đường dẫn.
Hi-Angel

83

Lưu ý rằng bắt đầu từ git1.8.4 (tháng 7 năm 2013), bạn sẽ không phải quay lại thư mục gốc nữa.

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

( Nhận xét của Bouke Versteegh mà bạn không phải sử dụng , như trong : là đủ)/.snippets/.snippets

Xem cam kết 091a6eb0feed820a43663ca63dc2bc0bb247bbae :

mô hình con: bỏ yêu cầu cấp cao nhất

Sử dụng rev-parse --prefixtùy chọn mới để xử lý tất cả các đường dẫn được cung cấp cho lệnh mô đun con, loại bỏ yêu cầu nó được chạy từ cấp cao nhất của kho lưu trữ.

Do việc giải thích URL mô hình con tương đối phụ thuộc vào việc " remote.origin.url" có được cấu hình hay không , nên chặn rõ ràng các URL tương đối trong " git submodule add" khi không ở cấp cao nhất của cây làm việc.

Đã ký tắt: John Keeping

Phụ thuộc vào cam kết 12b9d32790b40bf3ea49134095619700191abf1f

Điều này làm cho ' git rev-parse' hoạt động như thể nó được gọi từ thư mục con được chỉ định của kho lưu trữ, với sự khác biệt là bất kỳ đường dẫn tệp nào được in đều có tiền tố với đường dẫn đầy đủ từ đầu cây làm việc .

Điều này hữu ích cho các tập lệnh shell nơi chúng ta có thể muốn lên cdđỉnh của cây làm việc nhưng cần xử lý các đường dẫn tương đối do người dùng đưa ra trên dòng lệnh.


Cảm ơn rất nhiều! Tôi nhận thấy rằng việc theo dõi /.là không cần thiết, git sẽ tạo các đoạn thư mục mà không có nó.
Bouke Versteegh

@BoukeVersteegh Thú vị. Tôi đã bao gồm nhận xét của bạn trong câu trả lời để dễ nhìn hơn.
VonC

Tôi đang dùng phiên bản git 2.7.4 nhưng tôi vẫn nhận được thông báo lỗi này Relative path can only be used from the toplevel of the working tree. Tôi đang làmgit submodule add ../../../functest
FlyingAura

@ user3426353 có, điều đó được mong đợi: câu trả lời trên os về khả năng thực hiện một phép bổ trợ phụ git từ bất kỳ thư mục con nào của repo chính, không chỉ từ thư mục gốc của nó. Nó không phải là về việc tham chiếu repo từ xa mô đun con với một đường dẫn tương đối. Nếu bạn làm như vậy, bạn sẽ nhận được thông báo lỗi mà bạn nhìn thấy.
VonC

@ user3426353 Và nhân tiện, thông báo lỗi đó (mà bạn thấy: " Relative path can only be used from the toplevel of the working tree") không phải là câu hỏi từ câu hỏi ban đầu (" You need to run this command from the toplevel of the working tree")
VonC

17

Tôi đã có một vấn đề tương tự, nhưng đã vẽ mình vào một góc với các công cụ GUI.

Tôi đã có một tiểu dự án với một vài tệp trong đó mà cho đến nay tôi chỉ sao chép xung quanh thay vì kiểm tra repo git của riêng họ. Tôi đã tạo một repo trong thư mục con, có thể cam kết, đẩy, v.v. Nhưng trong repo cha, thư mục con không được coi là một mô hình con và các tệp của nó vẫn bị theo dõi bởi repo cha - không tốt.

Để thoát khỏi mớ hỗn độn này, tôi đã phải nói với Git ngừng theo dõi thư mục con (không xóa các tệp):

proj> git rm -r --cached ./ui/jslib

Sau đó, tôi phải nói với nó rằng có một mô hình con ở đó (mà bạn không thể làm nếu có bất cứ điều gì hiện đang được theo dõi bởi git):

proj> git submodule add ./ui/jslib

Cập nhật

Cách lý tưởng để xử lý việc này bao gồm một vài bước nữa. Lý tưởng nhất, repo hiện có được chuyển ra thư mục riêng của nó, không có bất kỳ mô đun git cha mẹ nào, được cam kết và đẩy, và sau đó được thêm dưới dạng một mô hình con như:

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

Điều đó sẽ sao chép git repo dưới dạng một mô hình con - bao gồm các bước nhân bản tiêu chuẩn, nhưng cũng có một số bước cấu hình khó hiểu khác mà git thay mặt bạn để mô hình con đó hoạt động. Sự khác biệt quan trọng nhất là nó đặt một tệp .git đơn giản ở đó, thay vì một thư mục .git, chứa một tham chiếu đường dẫn đến nơi mà git dir thực sự sống - nói chung là ở gốc .git / module / jslib của dự án gốc.

Nếu bạn không làm mọi thứ theo cách này thì họ sẽ làm việc tốt cho bạn, nhưng ngay khi bạn cam kết và thúc đẩy cha mẹ, và một nhà phát triển khác sẽ lôi kéo cha mẹ đó, bạn sẽ khiến cuộc sống của họ khó khăn hơn rất nhiều. Sẽ rất khó để họ sao chép cấu trúc bạn có trên máy của mình miễn là bạn có một thư mục .git đầy đủ trong thư mục con của thư mục chứa thư mục .git của chính nó.

Vì vậy, di chuyển, đẩy, git thêm mô hình con, là lựa chọn sạch nhất.


16

Đối với những người bạn chia sẻ sở thích kỳ lạ của tôi về chỉnh sửa tệp cấu hình thủ công, việc thêm (hoặc sửa đổi) những điều sau đây cũng sẽ thực hiện thủ thuật.

.git / config (cấu hình cá nhân)

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules (cam kết chia sẻ cấu hình)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

Cũng thấy điều này - sự khác biệt giữa .gitmodules và chỉ định các mô hình con trong .git / config?


2

kịch bản bash một lớp để giúp câu trả lời của Chris ở trên, vì tôi đã tự vẽ ở một góc cũng như sử dụng các bản cập nhật Vundle cho các tập lệnh .vim của mình. DESTlà đường dẫn đến thư mục chứa các mô hình con của bạn. Làm điều này sau khi làmgit rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

chúc mừng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.