2009-05-27 26 views
477

Tôi đã tạo một kho lưu trữ git với một mô-đun con trong đó. Tôi có thể nói với submodule chính nó để thay đổi đường dẫn kho lưu trữ từ xa của nó, nhưng tôi không chắc chắn làm thế nào để nói cho kho lưu trữ cha mẹ làm thế nào để thay đổi đường dẫn kho lưu trữ từ xa cho submodule.Thay đổi kho lưu trữ từ xa cho một mô-đun con git

Tôi sẽ không ngạc nhiên nếu tôi phần nào không may mắn và phải làm mọi thứ theo cách thủ công, vì ngay cả deleting mô-đun con cũng không dễ dàng.

Trả lời

711

Bạn chỉ có thể chỉnh sửa tệp .gitmodules để cập nhật URL và sau đó chạy git submodule sync để phản ánh thay đổi đó đối với siêu máy tính và bản sao làm việc của bạn.

+1

ảnh hưởng nên git sync submodule có gì? Tôi đang làm nó không chính xác trong http://gist.github.com/120723, hoặc tôi không chính xác trong mong đợi .git/config được thay đổi bởi git submodule đồng bộ? –

+16

Điều này dường như không cập nhật .git/config, ít nhất là trong 1.7.1 hoặc 1.7.3. – notJim

+5

Nó cập nhật '.git/config' cho tôi, tôi có git 1.7.5.4. – mxcl

52

Thực ra, một bản vá has been submitted in April 2009 để làm rõ vai trò gitmodule.

Vì vậy, bây giờ là gitmodule documentation chưa bao gồm:

File .gitmodules, nằm trong thư mục cấp cao nhất của một cây làm việc git, là một tập tin văn bản với một cú pháp phù hợp với các yêu cầu notice linkgit: git-config 1.
[MỚI]:
Do tệp này được quản lý bởi Git, nó theo dõi các bản ghi + của mô-đun con của dự án.
Thông tin được lưu trữ trong tệp này được sử dụng làm gợi ý để đánh dấu phiên bản có thẩm quyền của bản ghi được lưu trữ trong tệp cấu hình dự án.
Thay đổi bản ghi cụ thể của người dùng (ví dụ: để tính các khác biệt trong URL phụ do tình huống mạng) phải được thực hiện đối với tệp cấu hình, trong khi thay đổi bản ghi được truyền (ví dụ: + do di chuyển nguồn mô-đun con) vào tập tin này.

Điều đó khá nhiều xác nhận Jim's answer.


Nếu bạn làm theo git submodule tutorial này, bạn sẽ thấy bạn cần một "git submodule init" để thêm các URL kho submodule để .git/config.

"git submodule sync" có been added in August 2008 chính xác để làm cho tác vụ đó dễ dàng hơn khi URL thay đổi (đặc biệt nếu số lượng mô-đun con là quan trọng).
Các kịch bản liên kết với lệnh đó là đủ đơn giản:

module_list "[email protected]" | 
while read mode sha1 stage path 
do 
    name=$(module_name "$path") 
    url=$(git config -f .gitmodules --get submodule."$name".url) 
    if test -e "$path"/.git 
    then 
    (
     unset GIT_DIR 
     cd "$path" 
     remote=$(get_default_remote) 
     say "Synchronizing submodule url for '$name'" 
     git config remote."$remote".url "$url" 
    ) 
    fi 
done 

Mục tiêu vẫn là: git config remote."$remote".url "$url"

+0

Tôi chỉ muốn thay đổi URL của mô-đun con trên máy này. Từ dự án cha mẹ tôi có thể sửa đổi bản ghi trong '.git/config' bằng cách làm:' git config submodule. "$ Submodule_name" .url "$ new_url" 'là [cũng được mô tả ở đây] (http: // stackoverflow. com/a/928539/99777). – joeytwiddle

8

Chỉ cần chỉnh sửa .git/config tập tin của bạn. Ví dụ; nếu bạn có một "chung" submodule bạn có thể làm điều này trong các siêu mô-đun:

git config submodule.common.url /data/my_local_common 
56

gì làm việc cho tôi (trên Windows, sử dụng phiên bản git 1.8.3.msysgit.0):

  • Cập nhật .gitmodules với đường dẫn đến kho lưu trữ mới
  • Xóa dòng tương ứng khỏi ".git/config "tập tin
  • Xóa thư mục tương ứng trong" .git/modules/bên ngoài" thư mục
  • Xóa kiểm tra ra thư mục submodule bản thân (không chắc chắn nếu điều này là cần thiết)
  • Run git submodule initgit submodule update
  • Hãy đảm bảo rằng mô-đun con đã đăng ký ở đúng cam kết và cam kết rằng, vì có khả năng hàm băm sẽ khác nhau

Sau khi thực hiện tất cả, mọi thứ đều ở trạng thái tôi mong đợi. kho lưu trữ sẽ có sim ilar đau khi họ đến để cập nhật mặc dù - nó sẽ là khôn ngoan để giải thích các bước trong thông điệp cam kết của bạn!

+2

Cảm ơn bạn rất nhiều vì điều này. Đây là người duy nhất làm việc cho tôi sau khi tôi đã chạy một 'git submodule update'. Sau khi các câu trả lời khác sẽ không thay đổi những gì đã có trong thư mục './Git/modules/external' để cố cập nhật sẽ dẫn đến việc nó vẫn đang kéo url không chính xác. – NtscCobalt

+0

điều này có vẻ là một chút nguy hiểm, và tôi không chắc chắn nó bảo tồn lịch sử của submodule trước đó. Nếu, ví dụ, bạn muốn kiểm tra một cam kết cũ hoặc chi nhánh của kho chính của bạn (một chứa submodule) Tôi không chắc chắn nó sẽ biết để kéo OLD submodule đính kèm và liên quan đến cam kết cũ của chính . –

+0

Không, nó gần như chắc chắn sẽ không biết - bạn sẽ phải làm tất cả các bước sau lần đầu tiên một lần nữa. Đây chỉ là những gì tôi thấy làm việc cho nuking trạng thái hiện tại của submodule. Tôi không biết liệu tình trạng của mọi thứ đã thay đổi kể từ khi tôi viết điều này, tâm trí :) –

71

Những lệnh này sẽ làm công việc trên cửa sổ lệnh mà không thay đổi bất kỳ tập tin trên kho lưu trữ địa phương

git config --file=.gitmodules submodule.Submod.url https://github.com/username/ABC.git 
git config --file=.gitmodules submodule.Submod.branch Development 
git submodule sync 
git submodule update --init --recursive --remote 

Hãy nhìn vào blog cho ảnh chụp màn hình: Changing GIT submodules URL/Branch to other URL/branch of same repository

+4

nhưng tôi phải nhớ đẩy các thay đổi vào điều khiển từ xa. 'git add .gitmodules'' git commit -m "URL submodule đã sửa đổi" '' git push origin master' – skulz00

+0

Cảm ơn bạn đã cập nhật. Tôi quên bao gồm lệnh git add/commit/push. –

+2

Vâng, điều đó đã tạo ra một mớ hỗn độn khủng khiếp đối với tôi. Các lệnh giảm xuống một cách lặng lẽ, nhưng kho lưu trữ submodule thực tế vẫn cho rằng remote của nó là một cái cũ (URL cũ). Có lẽ các lệnh này nên được đi kèm với các lệnh khác trong kho lưu trữ của submodule? –

3

git config --file=.gitmodules -e mở trình biên tập mặc định mà bạn có thể cập nhật đường dẫn

19

Trong điều kiện đơn giản, bạn chỉ cần chỉnh sửa tệp .gitmodules, sau đó đồng bộ hóa và cập nhật:

Chỉnh sửa các tập tin, hoặc thông qua một lệnh git hoặc trực tiếp:

git config --file=.gitmodules -e 

hoặc chỉ:

vim .gitmodules 

sau đó resync và cập nhật:

git submodule sync 
git submodule update --init --recursive --remote 
Các vấn đề liên quan