2012-06-29 33 views
56

Tôi có một thư mục, đó là một repo git. Nó chứa một số tệp và tệp .gitmodules. Bây giờ, khi tôi làm git init và sau đó git submodule init, đầu ra lệnh sau không là gì cả. Làm thế nào tôi có thể giúp git để xem submodules, được định nghĩa trong tập tin .gitmodules mà không cần chạy git submodule add bằng tay một lần nữa?Khôi phục các mô-đun con git từ .gitmodules

Cập nhật: đây là .gitmodules tập tin của tôi:

[submodule "vim-pathogen"] 
    path = vim-pathogen 
    url = git://github.com/tpope/vim-pathogen.git 
[submodule "bundle/python-mode"] 
    path = bundle/python-mode 
    url = git://github.com/klen/python-mode.git 
[submodule "bundle/vim-fugitive"] 
    path = bundle/vim-fugitive 
    url = git://github.com/tpope/vim-fugitive.git 
[submodule "bundle/ctrlp.vim"] 
    path = bundle/ctrlp.vim 
    url = git://github.com/kien/ctrlp.vim.git 
[submodule "bundle/vim-tomorrow-theme"] 
    path = bundle/vim-tomorrow-theme 
    url = git://github.com/chriskempson/vim-tomorrow-theme.git 

và đây là danh sách các thư mục này:

drwxr-xr-x 4 evgeniuz 100 4096 июня 29 12:06 . 
drwx------ 60 evgeniuz 100 4096 июня 29 11:43 .. 
drwxr-xr-x 2 evgeniuz 100 4096 июня 29 10:03 autoload 
drwxr-xr-x 7 evgeniuz 100 4096 июня 29 12:13 .git 
-rw-r--r-- 1 evgeniuz 100 542 июня 29 11:45 .gitmodules 
-rw-r--r-- 1 evgeniuz 100 243 июня 29 11:18 .vimrc 

như vậy, chắc chắn, đó là ở cấp cao nhất. thư mục git không thay đổi, chỉ git init được thực hiện

+0

Có phải các môđun con đã có, theo nghĩa là nếu bạn thay đổi vào bất kỳ thư mục con nào có tệp, và 'git rev-parse --show-toplevel' cung cấp cho bạn submodule thay vì thư mục" supermodule "? –

+0

không, không có submodule dirs. hãy tưởng tượng thư mục này hoàn toàn trống rỗng chỉ với tệp '.gitmodules' – Shark

+0

Ah, tôi thấy vấn đề là gì - tôi đã cập nhật câu trả lời của mình. –

Trả lời

78

git submodule init chỉ xem xét các mô-đun con đã có trong chỉ mục (tức là "dàn dựng") để khởi tạo. Tôi sẽ viết một kịch bản ngắn mà phân tích .gitmodules, và cho mỗi urlpath cặp chạy:

git submodule add <url> <path> 

Ví dụ, bạn có thể sử dụng đoạn mã sau:

#!/bin/sh 

set -e 

git config -f .gitmodules --get-regexp '^submodule\..*\.path$' | 
    while read path_key path 
    do 
     url_key=$(echo $path_key | sed 's/\.path/.url/') 
     url=$(git config -f .gitmodules --get "$url_key") 
     git submodule add $url $path 
    done 

này được dựa trên cách thức git-submodule.sh script chính nó phân tích cú pháp tệp .gitmodules.

+0

bạn có nghĩa là 'git submodule update --init'? tất cả các lệnh này đều không thành công. Có vẻ như git không thấy các mô đun chỉ được định nghĩa trong '.gitmodules' – Shark

+0

Sau' git submodule init', bạn có thấy bất kỳ đầu ra nào từ 'git config --list | grep submodule'? (Theo tài liệu hướng dẫn, 'git submodule init' nên" Khởi tạo submodules, nghĩa là đăng ký từng tên submodule và url được tìm thấy trong .gitmodules vào '.git/config'".) –

+0

không, không có gì. 'git config --list' chỉ cung cấp các giá trị chuẩn, không đề cập đến submodules – Shark

15

Mở rộng về câu trả lời @ Mark Longair, tôi đã viết một kịch bản bash để tự động hóa các bước từ 2 & 3 của quy trình sau:

  1. Clone một 'soạn sẵn' repo để bắt đầu một dự án mới
  2. Tháo. git thư mục và tái khởi tạo như một repo mới
  3. tái khởi tạo các môđun con, khiến cho đầu vào trước khi thư mục xóa

#!/bin/bash 

set -e 
rm -rf .git 
git init 

git config -f .gitmodules --get-regexp '^submodule\..*\.path$' > tempfile 

while read -u 3 path_key path 
do 
    url_key=$(echo $path_key | sed 's/\.path/.url/') 
    url=$(git config -f .gitmodules --get "$url_key") 

    read -p "Are you sure you want to delete $path and re-initialize as a new submodule? " yn 
    case $yn in 
     [Yy]*) rm -rf $path; git submodule add $url $path; echo "$path has been initialized";; 
     [Nn]*) exit;; 
     *) echo "Please answer yes or no.";; 
    esac 

done 3<tempfile 

rm tempfile 

Lưu ý: các mô-đun con sẽ được kiểm tra ở đầu nhánh chính thay vì cùng cam kết như repo soạn sẵn, vì vậy bạn cần thực hiện thủ công.

Đường ống đầu ra từ cấu hình git vào vòng lặp đọc đã gây ra sự cố với lời nhắc nhập, do đó, kết quả đầu ra nó vào tệp tạm thời thay thế. Bất kỳ sự cải thiện trên kịch bản bash đầu tiên của tôi sẽ rất hoan nghênh :)


Big nhờ Mark, https://stackoverflow.com/a/226724/193494, bash: nested interactive read within a loop that's also using read, và tnettenba @ chat.freenode.net vì đã giúp tôi đi đến giải pháp này!

2

Tôi gặp sự cố tương tự. git submodule init không hoạt động âm thầm.

Khi tôi đã làm:

git submodule add <url> <path>

tôi nhận:

The following path is ignored by one of your .gitignore files: ...

Tôi nghĩ rằng .gitignore (d) những con đường có thể là nguyên nhân.

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