Làm cách nào để thay thế một mô-đun con git bằng một repo khác?


95

Làm cách nào để thay thế một mô-đun con git bằng một repo git khác?

Cụ thể, tôi có một mô-đun con:

  • nằm ở ./ExternalFrameworks/TestFrameworkđó trỏ đến một git repogit@github.com:userA/TestFramework.git
  • Tôi muốn nó bây giờ chỉ đến git@github.com:userB/TestFramework.git.

Vấn đề là khi tôi xóa mô-đun con bằng phương pháp được mô tả ở đây , sau đó thêm lại nó bằng lệnh

git submodule add git@github.com:userB/TestFramework.git

Tôi gặp lỗi này:

A git directory for 'ExternalFrameworks/TestFramework' is found locally with remote(s):
  origin    git@github.com:userA/TestFramework.git
If you want to reuse this local git directory instead of cloning again from
  git@github.com:userB/TestFramework.git
use the '--force' option. If the local git directory is not the correct repo
or you are unsure what this means choose another name with the '--name' option.

Câu trả lời:


122

Nếu vị trí (URL) của mô-đun con đã thay đổi, thì bạn có thể chỉ cần:

  1. Sửa đổi .gitmoduletệp của bạn để sử dụng URL mới
  2. Xóa thư mục mô-đun con trong repo rm -rf .git/modules/<submodule>
  3. Xóa thư mục mô-đun con trong thư mục làm việc rm -rf <submodule>
  4. Chạy git submodule sync
  5. Chạy git submodule update

Thông tin đầy đủ hơn có thể được tìm thấy ở những nơi khác:


4
Cũng cần lưu ý: khi một người dùng khác (người đã nhập mô-đun con) nhận được bản cập nhật của bạn, họ cũng sẽ phải thực hiện "đồng bộ hóa mô-đun con git" một lần trước khi mô-đun con mới hoạt động cho họ.
joseph.hainline

2
Điều này đã không làm việc cho tôi. Mô-đun con của tôi vẫn trỏ đến URL cũ sau đó. Bất kỳ ý tưởng tại sao?
Arne

34
@Arne Có thể mô-đun con của bạn chưa bao giờ được khởi tạo đúng cách. Tôi đã phải làm rm -rf .git/modules/<submodule>trước khi nó làm việc cho tôi.
David Braun

@DavidBraun Tôi có cùng một vấn đề như @Arne dù làm git submodule syncsau khi rm -rf .git/modules/<submodule>cung cấp cho fatal: Not a git repository: ../.git/modules/<submodule>. Bất kỳ lời khuyên? Tôi ban đầu tạo ra submodule qua git submodule add https://<submodule-url>theo các tài liệu git ...
acannon828

1
Sau đó, tôi phải cd vào thư mục của mô-đun, git kiểm tra chi nhánh tôi muốn, sau đó git pull.
Nicolas Raoul

34

Trước tiên, hãy xóa mô-đun con hiện tại bằng phương pháp đã được đề cập ở đây , mà tôi đang đưa vào để thuận tiện:

  • Xóa phần có liên quan khỏi .gitmodulestệp
  • Xóa phần có liên quan khỏi .git/config
  • Chạy git rm --cached path_to_submodule(không có dấu gạch chéo)
  • Cam kết và xóa các tệp mô-đun con hiện chưa được theo dõi

Bây giờ, hãy thêm mô-đun con mới với --namecờ. Điều này sẽ cung cấp cho git một tên thay thế để tham chiếu .git/configcho mô-đun con, để loại bỏ liên kết với mô-đun con đã có trong lịch sử, mà bạn vẫn muốn làm việc trong lịch sử trước đây của mình.

Vì vậy, hãy nhập:

git submodule add --name UpdatedTestFramework git@github.com:userB/TestFramework.git

và bạn sẽ tải mô-đun con theo đường dẫn mà bạn mong đợi.


2
Mặc dù cách này có hiệu quả, nhưng nó gần như không sạch bằng phương pháp của Tim.
joseph.hainline

4
Điều này đã làm việc cho tôi nhưng tôi cũng phải xóa .git/modules/<path_to_submodule>.
Nate

1
Đánh giá cao tài liệu tham khảo --name. Tôi không biết các vấn đề xung quanh điều này và tôi không thể thay thế một mô-đun con cho đến khi tôi sử dụng tùy chọn này (nhờ câu trả lời của bạn).
aknuds1

Đây là phương pháp duy nhất phù hợp với tôi, tuy nhiên tôi muốn giữ nguyên tên thư mục. Nó đã kiểm tra đúng đường dẫn và đặt tên mô-đun thành tên mong muốn nhưng tên thư mục làm việc là tên repo mới. Vì vậy, nếu bạn muốn cùng tên bạn cũng cần phải xác định rằng vào cuối url như sau: git submodule add --name old-name-to-keep git@github.com:userB/new-repository.git old-name-to-keep
rgb

8

Các lệnh này sẽ thực hiện công việc trên dấu nhắc lệnh mà không làm thay đổi bất kỳ tệp nào trên kho lưu trữ cục bộ.

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

5

Điều đã khắc phục sự cố này cho tôi là trong thư mục gốc của repo git của bạn (không phải mô-đun con), hãy chạy

rm -rf .git/modules/yourmodule

Sau đó, bạn sẽ có thể thêm như bình thường.


3

Cách dễ nhất mà tôi tìm thấy là:

git rm -rf [submodule_dir]
git submodule add --name new_[submodule_name] [new_submodule_url] [submodule_dir]

Tôi không thích ý tưởng sửa đổi .gitmodulesthủ công của mình . Tôi cũng đã viết một blogpost nhỏ về nó.


2

Nếu bạn chỉ muốn thay đổi URL từ xa cho bản sao này :

git config submodule."$submodule_name".url "$new_url"

Điều này sẽ không ảnh hưởng đến .gitmodulestệp trong dự án mẹ, vì vậy nó sẽ không được phổ biến cho các nhà phát triển khác.

Đây được mô tả là "thay đổi bản ghi cụ thể của người dùng" ở đây .

Không chạygit submodule syncvì điều đó sẽ đặt lại về URL mặc định.

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.