Đổi tên một mô hình con git


155

Có một số cách dễ dàng để đổi tên một thư mục mô đun con git (ngoài việc thực hiện toàn bộ chuyển động xóa nó và thêm lại nó với một tên đích mới).

Và trong khi chúng ta đang ở đó, tại sao tôi chỉ đơn giản là không thể làm như sau trong thư mục mẹ: git mv old-submodule-name new-submodule-name


6
Bạn sẽ không còn cần phải cập nhật .gitmodulesthủ công khi di chuyển một mô hình con. xem câu trả lời của tôi dưới đây
VonC

Câu trả lời của @ VonC hoạt động như một cơ duyên đối với tôi
laconbass

Các mô-đun Git quá phức tạp. npmcho thấy cách làm việc đơn giản. Một ngày nào đó ... có lẽ ... ai đó ... sẽ viết lại ... trong lúc này ...
Rolf

Câu trả lời của @ VonC không phải là câu chuyện đầy đủ như ngày hôm nay: nó thực sự sẽ thay đổi .gitmodules, nhưng sẽ chỉ đổi tên đường dẫn, không phải tên mô-đun. Bạn cần chỉnh sửa bổ sung cho .gitmodules để sửa lỗi đó và 'đồng bộ mô đun con git' để hoàn tất toàn bộ quy trình
zertyz

@zertyz: Thuộc tính [mô đun con "name_of_submodule"] là tên nội bộ của Git, bạn có thể đổi tên nó để không gây nhầm lẫn cho bản thân nhưng đó chỉ là nhãn.
MKesper

Câu trả lời:


101

Tôi tìm thấy quy trình làm việc sau đây:

  • Cập nhật .gitmodules
  • mv oldpath newpath
  • git rm oldpath
  • git add newpath
  • git submodule sync

Lưu ý: phương pháp này không cập nhật chỉ mục và .gitmodules đúng cách trong các phiên bản GIT 2018.

Lưu ý: Bây giờ bạn có thể làm git mv oldpath newpathngay bây giờ, như được chỉ ra trong câu trả lời của VonC . (Đảm bảo bạn đang sử dụng phiên bản mới nhất của git)


22
lưu ý đến bản thân: vì git add newpathkhông sử dụng dấu gạch chéo
nguyên tử

10
Với quy trình công việc như vậy, bạn sẽ chỉ tạo một liên kết tượng trưng đến thư mục con mà bạn sử dụng làm mô hình con. Symlink chỉ là một phần của chức năng mô đun con toàn cầu. Điều này có nghĩa là khi bạn sao chép repo sử dụng các mô hình con được đổi tên, bạn có thể kết thúc bằng lỗi sau: Không tìm thấy ánh xạ mô hình con trong .gitmodules cho đường dẫn 'your-oldpath' Sau khi bạn xóa đường dẫn cũ (* git rm oldpath ), bạn nên sử dụng mô đun con git thêm newpath REPO-URL thay vì "git add newpath *. Khi hoàn tất, trạng thái git sẽ hiển thị một cái gì đó như thế này: đổi tên: oldpath -> newpath
Bertrand

5
Giải pháp này không hiệu quả với tôi vì khi sử dụng lệnh git add, mô hình con được đưa vào dự án dưới dạng một thư mục đơn giản chứ không phải là mô hình con. thử $ mv submodule-oldpath ~ / khác-vị trí $ git rm submodule-oldpath $ git submodule add submodule-kho-URL submodule-newpath bcachet.github.io/development/2012/05/25/rename-git-submodule
Mahmoud Adam

3
Nếu bạn gặp vấn đề với cây làm việc, bạn cũng có thể chỉnh sửa .git/modules/SUBMODULE/configtệp, sao cho các worktreeđiểm vào thư mục bên phải một lần nữa.
Vincent Ketelaars

3
Điều này đã không làm việc cho tôi với git 2.13.1. Nhưng chỉ đơn giản là làm git mv old newcông việc như một nét duyên dáng. Tôi chỉ cần thực hiện git commit để hoàn thành các thay đổi.
người dùng

224

Git1.8.5 (tháng 10 năm 2013) nên đơn giản hóa quy trình . Đơn giản chỉ cần làm một:

git mv A B

" git mv A B", Khi di chuyển một mô hình con Ađã được dạy để di chuyển cây làm việc của nó và điều chỉnh các đường dẫn trong .gitmodulestệp .


Xem thêm trong cam kết 0656781fadca1 :

Hiện đang sử dụng " git mv" trên một mô hình con di chuyển cây công việc của mô hình con trong siêu dự án. Nhưng cài đặt đường dẫn của mô hình con trong .gitmoduleskhông bị ảnh hưởng, hiện không phù hợp với cây công việc và làm cho các lệnh git dựa vào hành vi thích path -> name mapping(thích statusdiff) thích hợp .

Hãy để " git mv" trợ giúp ở đây bằng cách không chỉ di chuyển cây công việc của mô hình con mà còn cập nhật submodule.<submodule name>.pathcài đặt "" từ .gitmodulestệp và giai đoạn cả.
Điều này không xảy ra khi không .gitmodulestìm thấy tệp nào và chỉ đưa ra cảnh báo khi nó không có phần dành cho mô hình con này. Điều này là do người dùng có thể chỉ sử dụng gitlinks đơn giản mà không có .gitmodulestệp hoặc đã cập nhật cài đặt đường dẫn bằng tay trước khi ban hành lệnh "git mv" (trong trường hợp cảnh báo nhắc nhở anh ta rằng mvsẽ làm điều đó cho anh ta).
Chỉ khi .gitmodulesđược tìm thấy và chứa xung đột hợp nhất, mvlệnh sẽ thất bại và yêu cầu người dùng giải quyết xung đột trước khi thử lại.


git 2.9 (tháng 6 năm 2016) sẽ cải thiện git mvcho mô hình con:

Xem cam kết a127331 (19 tháng 4 năm 2016) của Stefan Beller ( stefanbeller) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 9cb50a3 , ngày 29 tháng 4 năm 2016)

mv: cho phép di chuyển các mô đun con lồng nhau

" git mv old new" Không điều chỉnh đường dẫn cho một mô hình con sống như một thư mục con bên trong thư mục old/một cách chính xác.

Tuy nhiên, các mô đun con cần cập nhật liên kết của chúng vào thư mục git cũng như cập nhật .gitmodulestệp.


Lưu ý đến bản thân: Hãy thử điều này trên 1.8.4 và bạn sẽ có fatal: source directory is empty, source=my_source, destination=my_destination. Sẽ thử lại lần nữa khi 1.8.5 đã phát hành ổn định.
tổng kiểm tra

@checksum Nhưng 1.8.5 có bản phát hành ổn định, trong ít nhất ... giờ;) github.com/git/git/release/tag/v1.8.5
VonC

Tôi đã phải xây dựng phiên bản Git 1.8.5.GIT từ mã nguồn vì có kho Git v.1.7.5 trong kho Ubuntu. Cách xây dựng Git từ mã nguồn
Maksim Dmitriev

2
@MaksimDmitriev nhưng còn ppa (Lưu trữ gói cá nhân) mà tôi đã đề cập trong stackoverflow.com/a/20918469/6309 thì sao?
VonC

1
git mv chỉ không hoạt động cho mục đích này trên máy của tôi.
Alexander Dyagilev


11

Tôi chỉ thử một vài gợi ý ở trên. Tôi đang chạy:

$ git --version
git version 1.8.4

Tôi thấy tốt nhất là khởi tạo lại mô hình con, xóa thư mục và tạo một mô hình con mới.

git submodule deinit <submodule name>

git rm <submodule folder name>

git submodule add <address to remote git repo> <new folder name>

Ít nhất đó là những gì làm việc cho tôi tốt nhất. YMMV!


7

Không thể đổi tên nó, vì vậy bạn phải xóa nó trước ( deinit) và thêm lại.

Vì vậy, sau khi loại bỏ nó:

git submodule deinit <path>
git rm --cached <path>

bạn cũng có thể kiểm tra lại và xóa các tham chiếu đến nó trong:

  • .gitmodules
  • .git/config
  • xóa thư mục tham chiếu khỏi .git/modules/<name>(tốt nhất để tạo bản sao lưu), vì mỗi thư mục có configtệp nơi lưu giữ tham chiếu đếnworktree

sau đó thực hiện các thay đổi của bạn bằng cách cam kết bất kỳ thay đổi nào đối với repo của bạn bằng cách:

git commit -am 'Removing submodule.'

và kiểm tra lại nếu bạn không có bất kỳ vấn đề nổi bật nào bằng cách:

git submodule update
git submodule sync
git submodule status

vì vậy bây giờ bạn có thể thêm mô hình con git một lần nữa:

git submodule add --name <custom_name> git@github.com:foo/bar.git <my/path>

ngoài ra nó thực sự là ngày hôm nay
Alexey

Tiêu đề câu hỏi là một cách viết sai, nó liên quan đến đường dẫn, không phải tên
Max Robbertze

3

Chỉnh sửa tệp .gitmodules để đổi tên mô hình con và sau đó đổi tên thư mục mô hình con.

Tôi nghĩ rằng bạn có thể cần phải làm git submodule syncsau đó, nhưng tôi không ở vị trí để kiểm tra ngay bây giờ.


Điều này làm cho tên mô hình con mới xảy ra như một cam kết mới và không phải là một tên đổi tên. Nhưng có lẽ đây là cách nó phải được?
Lars Tackmann

1
@Lars: Hãy chắc chắn để loại bỏ thư mục mô hình con cũ quá!
Cascabel

3

MacOs : Khi tôi muốn sử dụng giải pháp VonC để thay đổi thư mục mô đun con Commonthành chữ thường:

git mv Common common

tôi có

fatal: đổi tên 'Common' không thành công: Đối số không hợp lệ

Giải pháp - sử dụng một số tên thư mục tạm thời và di chuyển hai lần:

git mv Common commontemp
git mv commontemp common

Đó là tất cả :)

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.