a

Câu hỏi Làm thế nào để loại bỏ một submodule?


Làm thế nào để loại bỏ một submodule Git?

Nhân tiện, có một lý do tôi không thể đơn giản làm

git submodule rm whatever

?


3024
2017-08-11 14:31


gốc


Câu trả lời đơn giản stackoverflow.com/a/21211232/94687 bây giờ là đúng, và nên được đánh dấu như vậy. Bây giờ, nó đơn giản git rm modulename và rm -rf .git/modules/modulename - imz -- Ivan Zakharyaschev
Điều đó thực sự không đúng. Câu trả lời đó không giải quyết việc loại bỏ mục nhập mô-đun con từ .git/config. Câu trả lời được chấp nhận cho thấy cách cập nhật để loại bỏ hoàn toàn một mô-đun con. Nó cũng được giải thích ngắn gọn hơn trong câu trả lời này: stackoverflow.com/a/36593218/1562138 - fvgs
Tôi thấy bài viết này rất hữu ích trong việc loại bỏ các mô-đun con. Nó bao gồm thông tin về việc xóa các mục trong tệp .gitsubmodules và .git / config liên kết - Ri_
Xin vui lòng tiết kiệm cho mình một thời gian và trực tiếp đi câu trả lời mà các công trình (trong năm 2017): stackoverflow.com/a/36593218/528313 - Vincenzo Pii
Tôi đã vật lộn các vấn đề submodule trong hai ngày. Bước đột phá đến khi tôi tìm thấy điều này: forums.developer.apple.com/thread/13102. Về cơ bản, Xcode, và có lẽ các ứng dụng khác, đấu tranh để mở rộng url chứa '~'. Khi tôi đã thay đổi ssh: //username@server.remoteHost.com/~/git/MyRepo.git thành ssh: //username@server.remoteHost.com/home/username/git/MyRepo.git (tra cứu đường dẫn thực tế trên máy chủ của bạn), tất cả sự kỳ quặc biến mất trong mười phút. Xem thêm stackoverflow.com/questions/32833100/… - Elise van Looij


Các câu trả lời:


git1.8.3 (ngày 22 tháng 4 năm 2013):

Không có cách nào bằng sứ để nói "Tôi không còn quan tâm đến submodule này", một khi bạn thể hiện sự quan tâm của bạn trong một mô-đun con với "submodule init".
  "submodule deinit"là cách để làm như vậy.

Quá trình xóa cũng sử dụng git rm (kể từ git1.8.5 tháng 10 năm 2013).

Tóm lược

Quy trình loại bỏ 3 bước sau đó sẽ là:

0. mv a/submodule a/submodule_tmp

1. git submodule deinit -f -- a/submodule    
2. rm -rf .git/modules/a/submodule
3. git rm -f a/submodule
# Note: a/submodule (no trailing slash)

# or, if you want to leave it in your working tree and have done step 0
3.   git rm --cached a/submodule
3bis mv a/submodule_tmp a/submodule

Giải trình

rm -rf: Điều này được đề cập trong Daniel Schroeder'S câu trả lờivà được tóm tắt bởi Eonil trong các bình luận, ý kiến:

Cái lá này .git/modules/<path-to-submodule>/ không đổi.
  Vì vậy, nếu bạn từng xóa một mô-đun con với phương thức này và thêm lại chúng, nó sẽ không thể được vì kho lưu trữ đã bị hỏng.


git rm: Xem cam kết 95c16418:

Hiện đang sử dụng "git rm"trên một mô-đun con loại bỏ cây công việc của môđun con từ đó từ siêu dự án và gitlink từ chỉ mục.
  Nhưng phần của môđun con trong .gitmodules không bị ảnh hưởng, đó là phần còn lại của mô-đun con đã bị loại bỏ hiện tại và có thể gây kích thích người dùng (trái với cài đặt trong .git/config, điều này phải ở lại như một lời nhắc nhở rằng người dùng đã thể hiện sự quan tâm đến submodule này vì vậy nó sẽ được repopulated sau khi một cam kết cũ được kiểm tra ra).

Để cho "git rm"giúp người dùng bằng cách không chỉ loại bỏ mô-đun con khỏi cây công việc mà còn loại bỏ"submodule.<submodule name>"phần từ .gitmodules tập tin và giai đoạn cả hai.


git submodule deinit: Nó xuất phát từ miếng vá này:

Với "git submodule init"người dùng có thể nói với git rằng họ quan tâm đến một hoặc nhiều mô-đun con và muốn nó được điền vào cuộc gọi tiếp theo"git submodule update".
  Nhưng hiện tại không có cách nào dễ dàng để họ có thể nói với git rằng họ không quan tâm đến submodule nữa và muốn loại bỏ cây làm việc cục bộ (trừ khi người dùng biết rất nhiều về submodule internals và loại bỏ "submodule.$name.url"thiết lập từ .git/config cùng với cây công việc).

Giúp những người dùng đó bằng cách cung cấp 'deinit' chỉ huy.
  Điều này loại bỏ toàn bộ submodule.<name> phần từ .git/config hoặc cho   mô-đun con (hoặc cho tất cả những người đã được khởi tạo nếu '.' được đưa ra).
  Thất bại nếu cây công việc hiện tại có sửa đổi trừ khi bị ép buộc.
  Khiếu nại khi cho một mô-đun con được đưa ra trên dòng lệnh, không thể tìm thấy cài đặt url trong .git/config, nhưng dù sao cũng không thất bại.

Điều này sẽ quan tâm nếu các bước khởi tạo (de) (.git/config và .git/modules/xxx)

Kể từ git1.8.5, git rm lấy cũng thế chăm sóc của:

  • 'add'bước ghi lại url của mô-đun con trong .gitmodules file: nó cần phải loại bỏ cho bạn.
  • submodule mục đặc biệt (như được minh họa bởi câu hỏi này): git rm loại bỏ nó khỏi chỉ mục:
    git rm --cached path_to_submodule(không có dấu gạch chéo)
    Điều đó sẽ loại bỏ thư mục được lưu trữ trong chỉ mục với một chế độ đặc biệt "160000", đánh dấu nó như là một thư mục gốc submodule.

Nếu bạn quên bước cuối cùng và cố gắng thêm một mô-đun con là một thư mục thông thường, bạn sẽ nhận được thông báo lỗi như:

git add mysubmodule/file.txt 
Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

Lưu ý: kể từ khi Git 2.17 (Q2 2018), git submodule deinit không còn là một kịch bản lệnh shell nữa.
Đây là lời gọi hàm C.

Xem cam kết 2e61273, cam kết 1342476 (14/1/2018) bởi Prathamesh Chavan (pratham-pc).
(Hợp nhất bởi Junio ​​C Hamano - gitster - - trong cam kết ead8dbe, Ngày 13 tháng 2 năm 2018) 

git ${wt_prefix:+-C "$wt_prefix"} submodule--helper deinit \
  ${GIT_QUIET:+--quiet} \
  ${prefix:+--prefix "$prefix"} \
  ${force:+--force} \
  ${deinit_all:+--all} "$@"

1799
2018-04-23 05:57



Bạn có thể đưa ra một ví dụ về cách sử dụng submodule deinit? - zakdances
@yourfriendzak đây là một ví dụ về một người nào đó sử dụng thành công nó: stackoverflow.com/a/16161950/6309. Nhưng hãy nhớ rằng, trái với những gì tôi ban đầu tin rằng, 1.8.3 chưa được phát hành! Trên Unix, bạn có thể biên dịch nó từ các nguồn. - VonC
@HamishDowner mục đặc biệt nên được đi (thư mục không còn là một submodule), và .gitmodules nên ổn, nhưng tôi vẫn sẽ kiểm tra lại bất cứ thứ gì với .git thư mục (tức là địa phương config, trong repo cục bộ của bạn: không được sửa đổi bởi git pull) - VonC
@ Jayen có, nếu bạn cam kết xóa .gitmodules nhập và loại bỏ các mục đặc biệt trong chỉ mục, và đẩy repo đó, những người khác có thể kéo nó và submodule đó sẽ biến mất. - VonC
Đây là một kịch bản tự động hóa các bước sau: gist.github.com/sharplet/6289697. Thêm nó vào PATH và git remove-submodule path/to/submodule. - Adam Sharp


Qua trang Git Submodule Tutorial:

Để loại bỏ một mô-đun con bạn cần:

  1. Xóa phần có liên quan khỏi .gitmodules tập tin.
  2. Giai đoạn .gitmodules thay đổi git add .gitmodules
  3. Xóa phần có liên quan khỏi .git/config.
  4. Chạy git rm --cached path_to_submodule (không có dấu gạch chéo).
  5. Chạy rm -rf .git/modules/path_to_submodule
  6. Cam kết git commit -m "Removed submodule <name>"
  7. Xóa các tệp submodule chưa được theo dõi
    rm -rf path_to_submodule

Xem thêm: các bước thay thế bên dưới.


3145
2018-01-18 23:30



"Và nhân tiện, có lí do gì mà tôi không thể đơn giản là git submodule rm được không?" ? - abernier
@abernier Một câu trả lời curt có thể là "bởi vì không có lệnh như vậy tồn tại." Tôi đoán là họ đang cố gắng để loại bỏ các tập tin submodule vs cấu hình submodule rõ ràng để tránh mất dữ liệu ngẫu nhiên. Có lẽ một người sẽ nghĩ rằng git submodule rm chỉ đơn giản là loại bỏ đăng ký submodule, và sẽ ngạc nhiên nếu lệnh cũng đã xóa kho lưu trữ cục bộ. Mọi thay đổi cục bộ sẽ bị mất một cách không thể tin được. Và có lẽ một người khác sẽ nghĩ rằng chỉ có các tập tin sẽ được gỡ bỏ. - John Douthat
Thành thật mà nói, tôi không biết tại sao. Tôi hy vọng họ thêm một lệnh, mặc dù. 4 bước này quá phức tạp. - John Douthat
Đây là một kịch bản bash loại bỏ một mô-đun con, chỉ cần tạo một bí danh git cho submodule-rm;) gist.github.com/2491147 - Capi Etheriel
cũng cần rm -rf .git \ modules \ submodule name? - rogerdpack


Chỉ cần một lưu ý. Kể từ git 1.8.5.2, hai lệnh sẽ thực hiện:

git rm the_submodule
rm -rf .git/modules/the_submodule

Như câu trả lời của @Mark Cheverton được chỉ ra một cách chính xác, nếu dòng thứ hai không được sử dụng, ngay cả khi bạn đã loại bỏ submodule lúc này, thư mục .git / modules / the_submodule còn lại sẽ ngăn chặn cùng một mô-đun con được thêm vào hoặc thay thế trong tương lai . Ngoài ra, như @VonC đã đề cập, git rm sẽ thực hiện hầu hết công việc trên một mô-đun con.

--Update (07/05/2017) -

Chỉ cần làm rõ, the_submodule là đường dẫn tương đối của mô-đun con trong dự án. Ví dụ, đó là subdir/my_submodule nếu submodule nằm bên trong một thư mục con subdir.

Như đã chỉ ra một cách chính xác trong các bình luận và câu trả lời khác, hai lệnh (mặc dù chức năng đủ để loại bỏ một mô-đun con), để lại một dấu vết trong [submodule "the_submodule"] phần của .git/config (tính đến tháng 7 năm 2017), có thể xóa bằng lệnh thứ ba:

git config -f .git/config --remove-section submodule.the_submodule 2> /dev/null

332
2018-04-13 08:51



Tôi đang trên phiên bản git 2.4.9 (Apple Git-60) và tất cả những gì tôi phải làm là rm the_submodule. Tôi đẩy rằng sau đó lại thêm một thư mục có tên giống như submodule và nó làm việc mà không có vấn đề. - David Silva Smith
Điều này không loại bỏ mục nhập mô-đun con từ .git/config. Xem stackoverflow.com/a/36593218/1562138 cho cách hoàn chỉnh để loại bỏ một mô-đun con. - fvgs
Đây là 100% hoàn toàn rực rỡ và hoạt động. Wow. - Dan Rosenstark
@drevicko Tôi vừa thử nghiệm điều này với Git 2.11.1 và tôi quan sát hành vi tương tự như trước đây. git init && git submodule add <repository> && git rm <name> bỏ lại phía sau .git/config nhập cảnh và .git/modules/<name> và nội dung của nó. Có lẽ bạn đã không khởi tạo submodule trước khi loại bỏ nó? - fvgs
tôi cảm thấy an toàn hơn khi chạy điều này .. git submodule deinit -f the_submodule - danday74


Phần lớn câu trả lời cho câu hỏi này là lỗi thời, không đầy đủ hoặc phức tạp không cần thiết.

Một mô-đun con được nhân bản bằng git 1.7.8 hoặc mới hơn sẽ để lại tối đa bốn dấu vết của chính nó trong repo cục bộ của bạn. Quá trình xóa bốn dấu vết này được đưa ra bởi ba lệnh dưới đây:

# Remove the submodule entry from .git/config
git submodule deinit -f path/to/submodule

# Remove the submodule directory from the superproject's .git/modules directory
rm -rf .git/modules/path/to/submodule

# Remove the entry in .gitmodules and remove the submodule directory located at path/to/submodule
git rm -f path/to/submodule

246
2018-03-02 16:07



Tại sao câu trả lời này có rất ít người bỏ phiếu? Tất cả những câu trả lời phổ biến này đều bỏ sót điều gì đó, đây là câu trả lời duy nhất thực sự loại bỏ tất cả dấu vết của một mô-đun con, theo cách đơn giản nhất có thể. Và lưu ý: thứ tự các lệnh quan trọng. - mbdevpl
Để trả lời câu hỏi của riêng tôi: stackoverflow.com/questions/97875/rm-rf-equivalent-for-windows - Thomas
@mbdevpl đến 3 năm sau khi câu trả lời được chấp nhận, và tôi đoán không ai quản lý để thuyết phục OP chấp nhận điều này - Andy
@Thomas rm -rf chỉ có nghĩa là "xóa toàn bộ thư mục" để bạn có thể làm điều đó từ Explorer GUI trong Windows. Ngoài ra, nếu bạn đang sử dụng git trong Windows, bạn cũng sẽ có sẵn git bash, vì vậy bạn có thể chạy tất cả các lệnh này ở đó và chúng sẽ hoạt động như chúng - Andy Madge
Đây là câu trả lời không phức tạp trong năm 2018? - Warren P


Các bước đơn giản

  1. Xóa các mục cấu hình:
    git config -f .git/config --remove-section submodule.$submodulename
      git config -f .gitmodules --remove-section submodule.$submodulename
  2. Xóa thư mục khỏi chỉ mục:
    git rm --cached $submodulepath
  3. Cam kết
  4. Xóa các tệp không sử dụng:
    rm -rf $submodulepath
    rm -rf .git/modules/$submodulename

Xin lưu ý:  $submodulepath không chứa dấu gạch chéo đầu hoặc cuối.

Lý lịch

Khi bạn làm git submodule add, nó chỉ thêm nó vào .gitmodules, nhưng một khi bạn đã làm git submodule init, nó được thêm vào .git/config.

Vì vậy, nếu bạn muốn loại bỏ các mô-đun, nhưng có thể khôi phục lại nó một cách nhanh chóng, sau đó làm điều này:

git rm --cached $submodulepath
git config -f .git/config --remove-section submodule.$submodulepath

Nó là một ý tưởng tốt để làm git rebase HEAD đầu tiên và git commit cuối cùng, nếu bạn đặt điều này trong một kịch bản.

Ngoài ra có một cái nhìn tại một câu trả lời cho Tôi có thể unpopulate một submodule Git?.


185
2017-08-11 14:43



Tôi đã có rất nhiều submodules (và một mess lớn hơn) vì vậy tôi đã phải vượt qua chúng thông qua một vòng lặp for. Vì hầu hết trong số chúng nằm trong một thư mục cụ thể và đầu ra ls chứa dấu gạch chéo. Tôi đã làm một cái gì đó như for dir in directory/*; do git rm --cached $dir; done. - Pablo Olmos de Aguilera C.
Để có được danh sách này có thể được sử dụng trong kịch bản để xóa đệ quy - git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//' - - có vẻ như bạn phải thực sự làm điều này trong trường hợp nếu có điều gì đó sai lầm, nếu không chỉ git submodule | grep -v '^+' | cut -d' ' -f3 - errordeveloper
để có danh sách các mô-đun mà không có thay đổi cục bộ nào được thực hiện - git submodule | grep '^+' | cut -d' ' -f2 - errordeveloper
lưu ý, tôi phải bao gồm submodulename trong dấu ngoặc kép "submodulename" .. đề cập đến .git/config tập tin - muon
# 2 chính xác là những gì tôi đang tìm kiếm, cảm ơn! +1 - AyexeM


Ngoài các khuyến nghị, tôi cũng phải rm -Rf .git/modules/path/to/submodule để có thể thêm một mô-đun con mới có cùng tên (trong trường hợp của tôi, tôi đã thay thế một ngã ba bằng bản gốc)


80
2017-10-12 10:17



Tôi đã gặp rắc rối với điều này là tốt. Nếu bạn cố gắng cài đặt lại một mô-đun con vào cùng một đường dẫn, nó sẽ giữ cho thông tin chi nhánh được lưu trữ trong vị trí bạn đã đề cập. - jangosteve
Cảm ơn, tôi cũng cần điều này. @Anton, tôi đồng ý và tôi đã chỉnh sửa câu trả lời được bình chọn hàng đầu để thêm thông tin này. - William Denniss
Tôi đã sử dụng tùy chọn --name để thực hiện công việc thay thế ... xem stackoverflow.com/questions/14404704/… - joseph.hainline


Bạn phải xóa mục nhập trong .gitmodules và .git/configvà xóa thư mục của mô-đun khỏi lịch sử:

git rm --cached path/to/submodule

Nếu bạn sẽ viết trên danh sách gửi thư của git, có lẽ ai đó sẽ thực hiện một kịch bản lệnh shell cho bạn.


46
2017-11-01 21:43



Không cần bất kỳ kịch bản lệnh shell nào, câu trả lời khác có các lệnh để xóa tất cả các dấu vết của một mô-đun con: stackoverflow.com/a/36593218/4973698 - mbdevpl