Câu hỏi Git sẽ không init / sync / update submodules mới


Đây là một phần nội dung của tôi .gitmodules tập tin:

[submodule "src/static_management"]
        path = src/static_management
        url = git://github.com/eykd/django-static-management.git
[submodule "external/pyfacebook"]
        path = external/pyfacebook
        url = http://github.com/sciyoshi/pyfacebook.git

Tuy nhiên, .git/config chỉ chứa đầu tiên:

[submodule "src/static_management"]
        url = git://github.com/eykd/django-static-management.git

Mô-đun con thứ hai (external/pyfacebook) đã được thêm bởi một nhà phát triển khác trong một chi nhánh tính năng. Tôi đã thừa hưởng sự phát triển hiện nay và đã kiểm tra chi nhánh tính năng. Tuy nhiên, Git sẽ không kéo submodule cho tôi. Tôi đã thử:

  • git submodule init
  • git submodule update
  • git submodule update --init
  • git submodule sync
  • Xóa tất cả các định nghĩa mô-đun con khỏi .git/config và chạy git submodule init. Nó chỉ sao chép trên mô-đun con hiện có trước đây và bỏ qua mô-đun mới.
  • Nhập định nghĩa mô-đun con mới trong .git/config thủ công và chạy git submodule update. Chỉ các mô-đun con hiện có trước đây mới cập nhật.

trong các kết hợp khác nhau, nhưng git đơn giản sẽ không cập nhật .git/config dựa trên nội dung mới của .gitmodulesvà cũng không tạo ra external/pyfacebook và kéo nội dung của môđun con.

Tôi đang thiếu gì? Là can thiệp thủ công (thêm một mục nhập mô-đun bằng tay để .git/config) thực sự cần thiết, và tại sao?

Chỉnh sửa: Can thiệp thủ công không hoạt động. Thêm thủ công mục nhập mô-đun mới vào .git/config không làm gì cả. Mô-đun con mới được bỏ qua.


76
2017-07-26 16:47


gốc


chạy 1.7.7.1 và có cùng một vấn đề: "git submodule sync" không cập nhật .git / config sau khi thay đổi thành .gitmodules. - James Pritts
Bài viết này hữu ích: chrisjean.com/git-submodules-adding-using-removing-and-updating - Igor Ganapolsky


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


Gần đây bạn có nâng cấp lên phiên bản git 1.7.0.4 không? Tôi đã làm và bây giờ có vấn đề tương tự ...

Chỉnh sửa: Tôi đã khắc phục sự cố của mình nhưng hoàn toàn không biết bất kỳ vấn đề nào xảy ra. Tôi tự loại bỏ các mục submodule từ cả hai .git / config và .gitmodules và thêm lại submodules của tôi với các bước ususal (git submodule add etc ...) ... Worksforme nhưng không thêm giá trị cho thread này.


28
2017-08-26 16:10



Tôi lên đến 1.7.2 ngay bây giờ, nhưng tôi tin rằng tôi đã gặp vấn đề kể từ ít nhất 1.6.x. - David Eyk
Và vâng, hãy nghĩ về nó, tôi đã phải làm như bạn mô tả (Tôi quên câu hỏi này vẫn còn mở!). Nếu bạn không ngại đánh bóng câu trả lời của bạn một chút, tôi sẽ chấp nhận nó. - David Eyk
Đây là điểm yếu của git. Ngay cả svn là tốt hơn với externals. - Peter DeWeese
Tôi nghĩ rằng tôi chỉ chạy vào này, quá (cùng một bước dường như cuối cùng sửa chữa nó). Điều duy nhất tôi nhận thấy là, sau khi thêm nó một lần nữa, sau đó cam kết, cam kết cho biết: tạo chế độ 160000 lib / jruby-swing-helpers (huh?) - rogerdpack
Về chế độ "tạo chế độ 160000", cuốn sách Pro Git cho biết: "Chú ý chế độ 160000 cho mục nhập giá. Đây là chế độ đặc biệt trong Git về cơ bản có nghĩa là bạn đang ghi lại cam kết dưới dạng mục nhập thư mục thay vì thư mục con hoặc tập tin." git-scm.com/book/en/Git-Tools-Submodules - Johann


Tôi đã có cùng một vấn đề này - nó bật ra rằng các tập tin .gitmodules đã được cam kết, nhưng thực tế submodule cam kết (tức là hồ sơ của các cam kết submodule ID) không.

Thêm nó theo cách thủ công dường như thực hiện thủ thuật - ví dụ:

git submodule add http://github.com/sciyoshi/pyfacebook.git external/pyfacebook

(Ngay cả khi không xóa bất kỳ thứ gì từ .git / config hoặc .gitmodules.)

Sau đó, cam kết ghi lại ID đúng cách.

Thêm một số ý kiến ​​thêm vào câu trả lời làm việc này: Nếu git submodule init hoặc git submodule update không làm việc, thì như mô tả ở trên git submodule add url nên làm thủ thuật. Người ta có thể vượt qua kiểm tra điều này bằng cách

 git config --list

và bạn sẽ nhận được một mục nhập của mô-đun con mà bạn muốn kéo vào kết quả của lệnh git config --list. Nếu có một mục nhập của mô-đun con của bạn trong kết quả cấu hình, thì bây giờ thông thường cập nhật submodule git --init sẽ kéo submodule của bạn. Để kiểm tra bước này, bạn có thể đổi tên thủ công mô-đun con và sau đó cập nhật mô-đun con.

 mv yourmodulename yourmodulename-temp
 git submodule update --init

Để tìm hiểu xem bạn có thay đổi cục bộ trong submodule, nó có thể được nhìn thấy thông qua git status -u (nếu bạn muốn xem các thay đổi trong submodule) hoặc git status --ignore-submodules (nếu bạn không muốn thấy những thay đổi trong submodule).


64
2018-01-28 23:58



Những gì là external/pyfacebook cho? - Igor Ganapolsky
@IgorGanapolsky Đó là con đường đích cho submodule của bạn. - yuhua
Điều này đã giúp tôi, cảm ơn rất nhiều! Tôi chỉ có thể thêm rằng nếu đường dẫn đích đã tồn tại (mà nó đã làm cho tôi như là kết quả của việc thử các lệnh khác), người ta nhận được thông báo sau chỉ thêm vào sự nhầm lẫn: 'your/local/path' already exists and is not a valid git repo - Michael Ambrus
một lớp lót cho các mục nhập readding trong "git config --list": git config --list | grep submodule | sed -e "s/submodule\.//" -e "s/\(.*\)\.url=\(.*\)/git submodule add --force \2 \1/" | bash - Puggan Se


git phiên bản 2.7.4. Lệnh này cập nhật mã cục bộ git submodule update --init --force --remote


36
2017-11-21 11:15



Không làm gì cho tôi. - Carlo Wood
liên quan đến git-submodule [tài liệu) (git-scm.com/docs/git-submodule#git-submodule---remote) lệnh đã nói ở trên nên cập nhật nhánh địa phương của các mô-đun con. - palik


Đã có cùng một vấn đề, khi git bỏ qua init và update lệnh và không làm gì cả.

LÀM THẾ NÀO ĐỂ KHẮC PHỤC

  1. Thư mục submodule của bạn nên được cam kết thành git repo
  2. Nó không nên ở trong .gitignore

Nếu các yêu cầu đó đáp ứng, nó sẽ hoạt động. Nếu không, tất cả các lệnh sẽ thực thi mà không có bất kỳ thông báo và kết quả nào.

Nếu bạn đã làm tất cả những điều đó, và nó vẫn không hoạt động:

  1. Thêm mô-đun con theo cách thủ công, ví dụ: git submodule add git@... path/to
  2. git submodule init
  3. git submodule update
  4. cam kết và đẩy tất cả các tệp - .gitmodules và thư mục mô-đun của bạn (lưu ý rằng nội dung thư mục đó sẽ không cam kết)
  5. thả repo git cục bộ của bạn
  6. sao chép một cái mới
  7. đảm bảo rằng .git/config chưa có bất kỳ mô-đun con nào
  8. Hiện nay, git submodule init - và bạn sẽ thấy thông báo rằng mô-đun đã đăng ký
  9. git submodule update - sẽ tìm nạp mô-đun
  10. Bây giờ nhìn vào .git/config và bạn sẽ tìm thấy submodule đã đăng ký

14
2017-10-27 13:45



git submodule thêm git @ ... path / to - đã làm thủ thuật cho tôi - Amit Yatagiri


Sắp xếp kỳ diệu, nhưng hôm nay tôi đã chạy git submodule init theo dõi bởi    git submodule sync theo dõi bởi git submodule update và nó bắt đầu   kéo submodules của tôi ... Magic? Có lẽ! Đây thực sự là một trong những   trải nghiệm khó chịu với Git…

Cào đi. Tôi thực sự làm việc đó bằng cách làm git submodule update --init --recursive. Hi vọng điêu nay co ich.

PS: Hãy chắc chắn rằng bạn đang ở trong thư mục gốc git, không phải của submodule.


3
2018-05-19 01:10



Nah điều này hoàn toàn không có gì cho tôi. - Igor Ganapolsky
@IgorGanapolsky Tôi đã chỉnh sửa câu trả lời ở trên với những gì đã làm việc cho tôi. Cho tôi biết nếu nó hoạt động! - Levi Figueira
Tôi đã thử các lệnh mới của bạn, nhưng họ cũng không làm gì cả. - Igor Ganapolsky
Meh, nó sẽ không hoạt động. - adi518


Dường như có rất nhiều sự nhầm lẫn ở đây (cũng) trong các câu trả lời.

git submodule init Là không phải nhằm mục đích tạo ra các công cụ kỳ diệu trong .git / config (từ .gitmodules). Nó được thiết kế để thiết lập một cái gì đó trong một thư mục con rỗng hoàn toàn sau khi nhân bản dự án cha mẹ, hoặc kéo một cam kết thêm một mô-đun con không tồn tại trước đó.

Nói cách khác, bạn theo một git clone của một dự án có submodules (mà bạn sẽ biết bởi thực tế là bản sao đã kiểm tra một tệp .gitmodules) bởi một git submodule update --init --recursive.

Bạn làm không phải theo git submodule add ... với một git submodule init (hoặc là git submodule update --init), đó không phải là nghĩa vụ phải làm việc. Trong thực tế, phần bổ sung sẽ cập nhật tệp .git / config thích hợp nếu mọi thứ hoạt động.

CHỈNH SỬA

Nếu một mô-đun con git trước đây không tồn tại được thêm bởi người khác, và bạn thực hiện git pull của cam kết đó, khi đó thư mục của mô-đun con đó sẽ hoàn toàn trống (khi bạn thực thi git submodule status mã băm nhỏ của mô-đun mới sẽ hiển thị nhưng sẽ có - ở phía trước nó.) Trong trường hợp này, bạn cần phải theo dõi git pull cũng với một git submodule update --init (thêm --recursive khi nó là một mô-đun con trong một môđun con) để có được môđun con mới, không tồn tại trước đó, được kiểm tra; giống như sau một bản sao ban đầu của một dự án với các mô-đun con (trong đó rõ ràng là bạn không có các mô-đun con trước đó).


3
2017-12-27 17:52



Điều đó thật thú vị, bởi vì git help submodule nói về init: "init: Khởi tạo submodules được ghi trong chỉ mục (được thêm vào và cam kết ở nơi khác) bằng cách sao chép tên submodule và url từ .gitmodules sang .git / config." Vì vậy, nó chắc chắn âm thanh như nó phải làm chính xác những gì bạn nói nó không làm ...? Thời gian để cập nhật tài liệu git? - Brad
@ Brad Tôi không nghĩ rằng tôi đã nói điều đó - nhưng tôi đã thêm một sự làm rõ cho trường hợp cụ thể đó. Cảm ơn. - Carlo Wood
@CarloWood bất kỳ ý tưởng nào tại sao các nhà văn của git submodules quyết định rằng --init cần phải có các mô-đun con mới (thay vì tự động lấy chúng update)? Nó có vẻ như cập nhật kho lưu trữ của bạn nên lấy tất cả mọi thứ cần thiết trừ khi nó sẽ phá hủy dữ liệu. Với --init nó buộc bạn phải biết rằng các mô-đun con mới có thể đã được tạo ra, hoặc luôn luôn phát hành --init mỗi lần trong trường hợp đó, một lần nữa, có vẻ như nó sẽ được kích hoạt theo mặc định. - Catskul
@Catskul Rõ ràng là tôi không biết tại sao các nhà văn của git submodules quyết định bất cứ điều gì, nhưng tôi đoán là "update" được dành riêng cho việc cập nhật một cái gì đó đã tồn tại, và "init" được sử dụng để tạo ra một cái gì đó (cục bộ) mới. Dưới mui xe hai có lẽ là khác nhau đáng kể đủ để đảm bảo một lệnh khác nhau. - Carlo Wood


Theo câu trả lời từ Dave James Miller, tôi có thể xác nhận rằng nó làm việc cho tôi. Điều quan trọng ở đây là cam kết các tiểu dự án cam kết ID. Chỉ cần có các mục nhập trong .gitmodules là không đủ.

Đây là một cam kết thích hợp:

https://github.com/dirkaholic/vagrant-php-dev-box/commit/d5f4c40bdbd80eefbb5ac6029823733f591435ae


2
2017-07-15 15:03