Git sẽ không init / sync / update submodules mới


113

Đây là một phần nội dung trong .gitmodulestệp của tôi :

[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/configchỉ chứa cái đầ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 nhánh tính năng. Bây giờ tôi đã kế thừa sự phát triển và đã kiểm tra chi nhánh tính năng. Tuy nhiên, Git sẽ không kéo mô-đun con 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/configvà chạy git submodule init. Nó chỉ sao chép trên mô-đun con hiện có trước đó và bỏ qua mô-đun mới.
  • Nhập các định nghĩa mô-đun con mới .git/configtheo cách thủ công và chạy git submodule update. Chỉ các mô-đun con hiện có trước đó mới bận tâm cập nhật.

trong các kết hợp khác nhau, nhưng git chỉ đơn giản là sẽ không cập nhật .git/configdựa trên nội dung mới của .gitmodules, cũng như sẽ không tạo external/pyfacebookthư mục và kéo nội dung của mô-đun con.

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

Chỉnh sửa: Can thiệp thủ công không hoạt động. Việc thêm mục nhập mô-đun con mới theo cách thủ công .git/configsẽ không làm được gì. Mô-đun con mới bị bỏ qua.


1
đang chạy 1.7.7.1 và gặp sự cố tương tự: "git submodule sync" không cập nhật .git / config sau khi thay đổi thành .gitmodules.
James Pritts

Câu trả lời:


35

Gần đây bạn có nâng cấp lên git phiên bản 1.7.0.4 không? Tôi đã làm và hiện đang gặp 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 vấn đề ở đâu. Tôi đã xóa các mục nhập mô-đun con theo cách thủ công khỏi cả .git / config và .gitmodules và thêm lại các mô-đun con của mình với các bước sử dụng (git submodule add, v.v.) ... Worksforme nhưng không thêm giá trị nào cho chuỗi này.


Tôi hiện đang lên đến 1.7.2, nhưng tôi tin rằng tôi đã gặp sự cố kể từ ít nhất 1.6.x.
David Eyk

Và vâng, hãy nghĩ lại, 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 đang bỏ ngỏ!). Nếu bạn không ngại trau dồi câu trả lời của mình một chút, tôi sẽ chấp nhận nó.
David Eyk

9
Đây là một điểm yếu của git. Ngay cả svn là tốt hơn với bên ngoài.
Peter DeWeese

3
Tôi nghĩ tôi cũng vừa gặp phải vấn đề này (các bước tương tự dường như cuối cùng cũng khắc phục được). Điều duy nhất tôi nhận thấy là, sau khi thêm một lần nữa, sau đó commiting, các cam kết nói: tạo chế độ 160000 lib / JRuby-đu-những người giúp đỡ (huh?)
rogerdpack

1
Về "chế độ tạo 160000", sách Pro Git nói thế này: "Lưu ý chế độ 160000 cho mục nhập rack. Đó là một chế độ đặc biệt trong Git, về cơ bản có nghĩa là bạn đang ghi lại một cam kết dưới dạng một mục nhập thư mục chứ không phải là một thư mục con hoặc một tập tin." git-scm.com/book/en/Git-Tools-Submodules
Johann

92

Tôi gặp vấn đề tương tự - hóa ra là tệp .gitmodules đã được cam kết, nhưng cam kết mô-đun con thực tế (tức là bản ghi ID cam kết của mô-đun con) thì 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ì khỏi .git / config hoặc .gitmodules.)

Sau đó cam kết nó để ghi ID đúng.

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

 git config --list

và người ta sẽ nhận được một mục nhập của mô-đun con mà bạn muốn kéo trong kết quả của lệnh git config --list. Nếu có một mục nhập mô-đun con của bạn trong kết quả cấu hình, thì bây giờ bản cập nhật mô-đun con git thông thường --init sẽ kéo mô-đun con của bạn. Để kiểm tra bước này, bạn có thể đổi tên mô-đun con theo cách thủ công 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ó các thay đổi cục bộ trong mô-đun con hay không, bạn có thể xem nó qua git status -u (nếu bạn muốn xem các thay đổi trong mô-đun con) hoặc trạng thái git --ignore-submodules (nếu bạn không muốn xem các thay đổi trong mô-đun con).


Để làm gì external/pyfacebook?
IgorGanapolsky

2
@IgorGanapolsky Đó là đường dẫn đích cho mô-đun con 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 điều đó nếu đường dẫn đích đã tồn tại (điều mà nó đã làm cho tôi do thử các lệnh khác) người ta nhận được thông báo sau đây chỉ làm tăng thêm sự nhầm lẫn:'your/local/path' already exists and is not a valid git repo
Michael Ambrus

1
một lớp lót để đọc các mục 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

64

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


20
Không làm gì cho tôi.
Carlo Wood

1
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 sẽ cập nhật nhánh cục bộ của các mô-đun con.
palik

1
@palik bạn đá!
Denis Trofimov

1
Bạn có thể cập nhật từng mô-đun với git submodule update --init --force --remote <module-name>.
Adam Faryna

15

Gặp vấn đề tương tự, khi git bỏ qua initupdatelệnh, và không làm gì cả.

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

  1. Thư mục mô-đun con của bạn phải được cam kết vào git repo
  2. Nó không nên ở trong .gitignore

Nếu các yêu cầu đó được đá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 - .gitmodulesvà thư mục mô-đun của bạn (lưu ý rằng nội dung của thư mục sẽ không được cam kết)
  5. thả git repo cục bộ của bạn
  6. sao chép một cái mới
  7. đảm bảo rằng .git/configchưa có bất kỳ mô-đun con nào
  8. Bây giờ, git submodule init- và bạn sẽ thấy một 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ờ hãy nhìn vào .git/configvà bạn sẽ tìm thấy mô-đun con đã đăng ký

1
Tôi tin rằng đường dẫn đến các mô-đun con CÓ THỂ ở .gitignore. Ít nhất thì tôi đã làm cho nó hoạt động bằng cách làm theo câu trả lời từ @DaveJamesMiller. Không có gì khác làm việc cho tôi.
gebbissimo

7

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

git submodule initkhông có ý định tạo ra một cách kỳ diệu thứ trong .git / config (từ .gitmodules). Nó nhằm mục đích thiết lập một cái gì đó trong một thư mục con hoàn toàn trống sau khi nhân bản dự án mẹ hoặc kéo một cam kết bổ sung một mô-đun con không tồn tại trước đó.

Nói cách khác, bạn theo dõi một git clonedự án có các mô-đun con (mà bạn sẽ biết được thực tế là bản sao đã kiểm tra tệp .gitmodules) bằng cách a git submodule update --init --recursive.

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

BIÊN TẬP

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


1
Điều đó thật thú vị, vì đã git help submodulenói điều này về init: "init: Khởi tạo các mô-đun con được ghi trong chỉ mục (đã được thêm và cam kết ở nơi khác) bằng cách sao chép tên và url của mô-đun con từ .gitmodules sang .git / config." Vì vậy, có vẻ như nó sẽ làm chính xác những gì bạn nói nó không làm ...? Đã đến lúc 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 phần làm rõ cho trường hợp cụ thể đó. Cảm ơn.
Carlo Wood vào

@CarloWood bất kỳ ý kiến ​​nào tại sao người viết các mô-đun con git lại quyết định rằng --initcần thiết để có được các mô-đun con mới (thay vì lấy chúng tự động update)? Có vẻ như cập nhật kho lưu trữ của bạn sẽ lấy mọi thứ cần thiết trừ khi nó phá hủy dữ liệu. Với --initnó buộc bạn phải biết rằng các mô-đun con mới có thể đã được tạo hoặc chỉ luôn phát hành --initmỗi lần trong trường hợp đó, một lần nữa, có vẻ như nó sẽ được bật theo mặc định.
Catskul

@Catskul Rõ ràng là tôi không biết tại sao những người viết mô-đun con git lại quyết định bất cứ điều gì, nhưng tôi đoán là "cập nhật" đượ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 một cái gì đó (cục bộ) mới. Dưới mui xe, cả hai có lẽ khác nhau đáng kể để đảm bảo một lệnh khác.
Carlo Wood

6

Tôi đã gặp vấn đề tương tự nhưng không có giải pháp nào ở trên giúp được. Các mục nhập trong .gitmodules và .git / config đều đúng nhưng lệnh git submodules update --init --recursivekhông làm gì cả. Tôi cũng đã xóa thư mục submodule và đã chạy git submodules update --init --recursivevà lấy lại thư mục submodule nhưng với chính xác cam kết như trước.

Tôi đã tìm thấy câu trả lời trên trang này . Lệnh là:git submodule update --remote


2
Đây cũng là giải pháp chính xác cho tôi. Tôi đã chạy git submodule updatethay vì git submodule update --remote.
Andrew Medlin

5

Thật kỳ diệu, nhưng hôm nay tôi chạy git submodule inittheo git submodule syncsau git submodule updatevà nó bắt đầu kéo các mô-đun con của tôi ... Phép thuật? Có lẽ! Đây thực sự là một trong những trải nghiệm khó chịu nhất với Git…

Cào đó. Tôi thực sự đã làm cho nó hoạt động bằng cách làm git submodule update --init --recursive. Hi vọng điêu nay co ich.

Tái bút: Hãy chắc chắn rằng bạn đang ở trong thư mục git gốc, không phải mô-đun con.


7
Không, điều này hoàn toàn không có gì cho tôi.
IgorGanapolsky

@IgorGanapolsky Tôi đã chỉnh sửa câu trả lời ở trên với những gì phù hợp với 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 chúng cũng không làm gì cả.
IgorGanapolsky

5

Nghĩ rằng thiết lập thủ công .gitmoduleslà đủ là SAI

Địa phương của tôi git version 2.22.0khi viết bài này.

Vì vậy, tôi đã đến chủ đề này tự hỏi tại sao không hoạt git submodule initđộng; Tôi thiết lập .gitmodulestệp và tiếp tục làm git submodule init...

QUAN TRỌNG

  1. git submodule add company/project.git includes/projectbắt buộc (khi thêm mô-đun lần đầu tiên), điều này sẽ:

    • thêm cấu hình vào .git/config
    • cập nhật .gitmodulestệp
    • theo dõi vị trí mô-đun con ( includes/projecttrong ví dụ này).
  2. bạn phải sau đó git commitsau khi bạn đã thêm submodule, điều này sẽ cam kết .gitmodulesvà vị trí submodule được theo dõi.

Khi dự án được nhân bản một lần nữa, nó sẽ có .gitmodulesvà thư mục mô-đun con trống (ví dụ: includes/projecttrong ví dụ này). Tại thời điểm .git/confignày, vẫn chưa có cấu hình mô-đun con, cho đến khi git submodule initđược chạy, và hãy nhớ điều này chỉ hoạt động vì .gitmodulesAND includes/projectđược theo dõi trong repo git chính.

Ngoài ra để tham khảo xem:



3

Tôi đã từng gặp vấn đề tương tự.

.gitmodulescó mô-đun con, nhưng sau một git submodule initlệnh, nó không ở trong .git/config.

Hóa ra nhà phát triển đã thêm mô-đun con cũng đã thêm thư mục mô-đun con vào .gitignoretệp. Điều đó không hiệu quả.


2

Tương tự như bạn, tôi thấy rằng đồng bộ hóa git con không làm được những gì bạn mong đợi. Chỉ sau khi thực hiện lại một cách rõ ràng, git submodule addurl mô-đun con mới thay đổi.

Vì vậy, tôi đặt tập lệnh này vào ~/bin/git-submodule-sync.rb:

https://gist.github.com/frimik/5125436

Và tôi cũng sử dụng logic tương tự trên một số tập lệnh triển khai git sau nhận.

Tất cả những gì tôi cần làm bây giờ là chỉnh sửa .gitmodules, sau đó chạy tập lệnh này và cuối cùng nó hoạt động như tôi nghĩ git submodule sync.


Điều này dường như chỉ xảy ra trên một số repo ... có thể do một số lỗi trong Git. Nó đã không xảy ra với tôi trên vừa được kho tạo ra trong một thời gian dài, nhưng cách trở lại khi, nó được sử dụng để xảy ra tất cả thời gian trên hợp đồng mua lại nhất định ...
Fridh

2

Tôi đã gặp vấn đề tương tự ngày hôm nay và tìm ra điều đó bởi vì tôi đã nhập git submodule initsau đó tôi có những dòng đó trong .git/config:

[submodule]
   active = .

Tôi đã xóa nó và nhập:

git submodule update --init --remote

Và mọi thứ đã trở lại bình thường, mô-đun con của tôi được cập nhật trong thư mục con của nó như bình thường.


2

Vấn đề đối với tôi là nhà phát triển trước đó của repo đã cam kết submodules/thingthư mục chỉ là một thư mục thông thường, có nghĩa là khi tôi cố gắng chạy git submodule add ..., nó sẽ không thành công với : 'submodules/thing' already exists in the index, nhưng cố gắng cập nhật submodule cũng sẽ không thành công vì nó thấy rằng đường dẫn không chứa một mô-đun con.

Để khắc phục, tôi phải xóa submodules/thingthư mục, thực hiện xóa, sau đó chạy git submodule addlệnh để thêm lại chính xác:

git submodule add --force --name thing https://github.com/person/thing.git submodules/thing

1

Khi tôi nhìn thấy điều này ngày hôm nay, một nhà phát triển đã chuyển một phần của cây vào một thư mục con mới và có vẻ như ứng dụng khách git của anh ấy không ghi lại các quy tắc Subproject được cập nhật trong cây, thay vào đó chúng chỉ là nuked, để lại .gitmodulescả hai đều là cũ địa điểm và các tiểu dự án không còn tồn tại trong cây hiện tại.

Thêm các mô-đun con trở lại và so sánh các cam kết của mô-đun con với các mô-đun con được tìm thấy trong đó git show $breaking_commit_sha(tìm kiếm các dòng khớp với regexp ^-Subproject) để điều chỉnh khi cần thiết.


1

Xóa dir mô-đun con và nội dung của nó (thư mục "bên ngoài / pyfacebook") nếu nó tồn tại trước đó git submodule add ...có thể khắc phục sự cố.


1
Đây là vấn đề đối với tôi. Ai đó đã cam kết thư mục "submodule" chỉ là một thư mục thông thường, có nghĩa là khi tôi cố gắng chạy "git submodule add ...", nó sẽ không thành công với: "'provider / mobx-state-tree' đã tồn tại trong chỉ mục" , nhưng cố gắng cập nhật submodule cũng không thành công vì nó thấy rằng đường dẫn không chứa submodule). Để khắc phục, tôi phải xóa thư mục, cam kết xóa, sau đó chạy lệnh git add để thêm lại chính xác.
Venryx

1

Tôi đã gặp sự cố tương tự với một mô-đun con. Nó chỉ không muốn được nhân bản / kéo / cập nhật / bất cứ điều gì.

Khi cố gắng thêm lại mô-đun con bằng cách sử dụng, git submodule add git@my-repo.git destinationtôi nhận được kết quả sau:

A git directory for 'destination' is found locally with remote(s):
  origin        git@my-repo.git
If you want to reuse this local git directory instead of cloning again from
  git@my-repo.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.

Vì vậy, tôi đã cố gắng thực thi lệnh thêm :
git submodule add --force git@my-repo.git destination

Điều đó đã hoạt động trong trường hợp của tôi.


0

Đối với bản ghi:
Tôi đã tạo cùng một vấn đề bằng cách thêm một kho lưu trữ trống làm mô-đun con. Trong trường hợp này, không có sẵn băm tham chiếu cho mô-đun con, dẫn đến lỗi được mô tả bởi người đăng ban đầu.

Buộc thêm kho lưu trữ sau khi đã cam kết giải quyết vấn đề (như trong bài đăng Arvids)
git submodule add --force git@my-repo.git destination


0
  • Xóa mô-đun con khỏi .git/config
  • Chạy git submodule initlệnh
  • Chuyển đến thư mục mô-đun con của bạn và chạy git pull origin master

Nó sẽ hoạt động ngay bây giờ


0

Chỉ chia sẻ những gì hiệu quả với tôi:

git clone --recurse-submodules <repository path>

Điều này sao chép kho lưu trữ từ xa đã bao gồm các mô-đun con. Điều này có nghĩa là bạn sẽ không cần chạy cập nhật git submodule hoặc init sau khi nhân bả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.