Làm thế nào để thay đổi kho lưu trữ từ xa cho một mô hình con git?


724

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

Tôi sẽ không ngạc nhiên nếu tôi hơi may mắn và phải làm mọi thứ bằng tay, vì ngay cả việc xóa các mô hình con cũng không dễ dàng.


8
Lưu ý: Git 2.25 (Q1 2020) đi kèm với một lệnh mới ":git submodule set-url [--] <path> <newurl>
VonC

Câu trả lời:


1010

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


22
Đ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.
davidtbernal

6
điều này có cập nhật cấu hình url mô hình con cho các lần xác nhận trước không? ví dụ nếu tôi kiểm tra một cam kết cũ hơn, nó sẽ trỏ đến các url mô hình con mới chứ?
maxmelbin

63
Sử dụng git submodule foreach -q git config remote.origin.urlđể xem các url mô hình con "thực tế"
Joel Purra

10
Nó không cập nhật .git/configcho tôi bằng git 2.1.0. Tôi đã phải cập nhật cả hai .gitmodules.git/configthủ công trước khi chạy một git submodule sync --recursiveđể điều khiển từ xa mô hình con của tôi được cập nhật.
desseim

7
Điều này dường như thiếu bước quan trọng git submodule update --init --recursive --remotethực sự thay đổi kho lưu trữ sang điều khiển từ xa mới
Jason Axelson

155

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 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 Development
git submodule sync
git submodule update --init --recursive --remote

Vui lòng xem blog để chụp ảnh màn hình: Thay đổi URL / Chi nhánh con GIT thành URL / chi nhánh khác của cùng một kho lưu trữ


8
Điều này đã làm việc nhưng tôi phải nhớ để đẩy các thay đổi đến điều khiển từ xa. git add .gitmodules git commit -m "modified submodule URL" git push origin master
skulz00

5
Chà, điều đó đã tạo ra một mớ hỗn độn khủng khiếp đối với tôi. Các lệnh đi xuống lặng lẽ, nhưng kho lưu trữ mô đun con thực tế vẫn nghĩ rằng điều khiển từ xa của nó là cái cũ (URL cũ). Có lẽ các lệnh này phải được đi kèm với các lệnh khác trong kho lưu trữ của mô hình con?
Motti Shneor

5
Lệnh cuối cùng là một chút cực đoan ... Nếu bạn có các mô hình con với các mô hình con bên trong, điều này cũng sẽ cập nhật từ xa các mô hình con phụ, đó là điều không chắc bạn cần.
Baptiste Wicht

7
Lưu ý rằng bạn cần thay thế Submod bằng tên của mô hình con của bạn!
Shital Shah

133

Nói một cách đơn giản, bạn chỉ cần chỉnh sửa tệp .gitmodules, sau đó đồng bộ lại và cập nhật:

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

git config --file=.gitmodules -e

hoặc chỉ:

vim .gitmodules

sau đó đồng bộ lại và cập nhật:

git submodule sync
git submodule update --init --recursive --remote

6
git submodule update --initlàm việc cho tôi, --remotedường như buộc nó vào TRƯỚC của repo từ xa.
Chaim Eliyah

96

Với Git 2.25 (Q1 2020), bạn có thể sửa đổi nó.
Xem " Thay đổi url mô hình con Git " và lệnh mới

git submodule set-url [--] <path> <newurl>

Câu trả lời gốc (tháng 5 năm 2009, mười năm trước)

Trên thực tế, một bản vá đã được đệ trình vào tháng 4 năm 2009 để làm rõ gitmodulevai trò.

Vì vậy, bây giờ tài liệu gitmodule chưa bao gồm:

Các .gitmodulestập tin, 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]:
Vì tệp này được quản lý bởi Git, nó theo dõi các bản ghi + của các mô hình con của dự án.
Thông tin được lưu trữ trong tệp này được sử dụng như một 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.
Nên thay đổi bản ghi cụ thể của người dùng (ví dụ: để tính sự khác biệt trong URL của mô hình con do tình huống kết nối mạng) đối với tệp cấu hình, trong khi các thay đổi bản ghi sẽ được lan truyền (ví dụ + do di chuyển nguồn mô hình con) nên được thực hiện cho tệp này .

Điều đó khá nhiều xác nhận câu trả lời của Jim .


Nếu bạn làm theo hướng dẫn mô hình con git này , bạn sẽ thấy bạn cần một " git submodule init" để thêm URL kho lưu trữ mô hình con vào .git / config.

" git submodule sync" Đã được thêm chính xác vào tháng 8 năm 2008 để thực hiện công việc đó dễ dàng hơn khi URL thay đổi (đặc biệt nếu số lượng mô hình con là quan trọng).
Tập lệnh liên kết với lệnh đó đủ đơn giản:

module_list "$@" |
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"


Tôi chỉ muốn thay đổi URL của mô hình con trên máy này. Từ dự án cha mẹ tôi có thể sửa đổi các bản ghi trong .git/configbằng cách thực hiện: git config submodule."$submodule_name".url "$new_url" đó là cũng được mô tả ở đây .
joeytwiddle

Dấu gạch ngang tùy chọn trong git submodule set-url [--] <path> <newurl>làm gì?
nhảy vào

1
@jeverling Họ giúp tách các tùy chọn khỏi tham số: xem stackoverflow.com/a/1192194/6309
VonC

1
Lưu ý rằng đối với người dùng Ubuntu có phiên bản cũ hơn git, bạn có thể sử dụng PPA này để cập nhật: launchpad.net/~git-core/+archive/ubfox/ppa
starbeamrainbowlabs

69

Điều 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 tệp ".git / config"
  • Xóa thư mục tương ứng trong thư mục ".git / mô-đun / bên ngoài"
  • Xóa chính thư mục mô đun con đã kiểm tra (không chắc chắn nếu điều này là cần thiết)
  • Chạy git submodule initgit submodule update
  • Hãy chắc chắn rằng mô hình con đã kiểm tra là đúng cam kết và cam kết rằng, vì có khả năng hàm băm sẽ khác

Sau khi làm tất cả những điều đó, mọi thứ đều ở trong trạng thái mà tôi mong đợi. Tôi tưởng tượng những người dùng khác của kho lưu trữ sẽ có nỗi đau tương tự khi họ cập nhật - thật là khôn ngoan khi giải thích các bước này 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 a git submodule update. Theo các câu trả lời khác sẽ không thay đổi nội dung trong ./git/modules/externalthư mục vì vậy cố gắng cập nhật sẽ dẫn đến việc nó vẫn kéo url không chính xác.
NtscCobalt

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

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

@MottiShneor có vẻ nguy hiểm nếu bạn cần giữ lịch sử mô đun con trước đó, mặc dù tôi không chắc về điều đó. Trong trường hợp của tôi, đó là giải pháp duy nhất có hiệu quả, điều tôi muốn về cơ bản là thay thế mô hình con ban đầu bằng ngã ba của riêng tôi
arainone

1
Thực hiện theo các bước sau và thấy rằng "Xóa chính thư mục mô đun con đã kiểm tra (không chắc chắn nếu điều này là cần thiết)" nếu không bạn sẽ gặp "fatal: Not a git repository: ..." khi chạy cập nhật mô hình con git
PiersyP

10

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

git config submodule.common.url /data/my_local_common

Đây chỉ là cách tốt nhất nếu bạn đang cố gắng thay đổi URL để sử dụng một lần chứ không phải vĩnh viễn trong siêu dự án. Ví dụ, bạn muốn sao chép các mô hình con từ các bản sao cục bộ trên đĩa.
Andy

4

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

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.