Git mô đun đẩy


128

Nếu tôi sửa đổi một mô hình con, tôi có thể đẩy cam kết trở lại nguồn gốc của mô hình con, hoặc điều đó sẽ yêu cầu một bản sao? Nếu nhân bản, tôi có thể lưu trữ một bản sao trong kho lưu trữ khác không?


4
Với git 2.7 (tháng 1 năm 2016), bạn sẽ chỉ cần đặt một lần git config push.recurseSubmodules on-demand. Sau đó, một đơn giản git pushsẽ đủ để đẩy tất cả mọi thứ (repo chính và mô hình con). Xem câu trả lời chỉnh sửa của tôi dưới đây .
VonC

Vui lòng cung cấp mã mẫu cho những gì bạn đang cố gắng làm.
Ciro Santilli 郝海东 冠状 病 事件

Câu trả lời:


138

Một mô hình con không là gì ngoài bản sao của một git repo trong một repo khác với một số dữ liệu meta bổ sung (mục nhập cây gitlink, tệp .gitmodules)

$ cd your_submodule
$ git checkout master
<hack,edit>
$ git commit -a -m "commit in submodule"
$ git push
$ cd ..
$ git add your_submodule
$ git commit -m "Updated submodule"

1
Có, và đừng quên lấy các thay đổi từ chi nhánh địa phương được đồng bộ hóa của bạn (nếu có) trước khi đẩy. Xảy ra khi làm việc với một gh-pageschi nhánh cho tài liệu về repo github :)
NiKo

Tôi không hiểu làm thế nào bạn có thể cd your_submodule trước khi thêm your_submodule? Tôi nghĩ cách tốt nhất để thêm mô hình con là sử dụng lệnh "add" git. Vì vậy, có một cách khác để thêm mô hình con?
MrSo

1
@MrSo Tôi nghĩ rằng mô hình con đã có sẵn, anh ấy đang tham gia vào nó để thay đổi một cái gì đó trong mô hình con.
HattrickNZ

108

Lưu ý rằng kể từ git1.7.11 ( [ANNOUNCE] Git 1.7.11.rc1ghi chú phát hành , tháng 6 năm 2012) đề cập:

" git push --recurse-submodules" Học cách tùy ý nhìn vào lịch sử của các mô hình con được liên kết với siêu dự án và đẩy chúng ra.

Có thể được thực hiện sau bản vá này--on-demandtùy chọn:

recurse-submodules=<check|on-demand>::

Đảm bảo rằng tất cả các cam kết mô hình con được sử dụng bởi các phiên bản được đẩy đều có sẵn trên một nhánh theo dõi từ xa.

  • Nếu checkđược sử dụng, nó sẽ được kiểm tra rằng tất cả các cam kết mô hình con đã thay đổi trong các phiên bản sẽ được đẩy đều có sẵn trên một điều khiển từ xa.
    Nếu không, việc đẩy sẽ bị hủy bỏ và thoát với trạng thái khác không.
  • Nếu on-demandđược sử dụng, tất cả các mô hình con thay đổi trong các phiên bản sẽ được đẩy sẽ được đẩy.
    Nếu theo yêu cầu không thể đẩy tất cả các sửa đổi cần thiết, nó cũng sẽ bị hủy bỏ và thoát với trạng thái khác không.

Vì vậy, bạn có thể đẩy mọi thứ trong một lần với (từ repo cha) a:

git push --recurse-submodules=on-demand

Tùy chọn này chỉ hoạt động cho một cấp độ lồng. Thay đổi mô hình con bên trong mô hình con khác sẽ không được đẩy.


Với git 2.7 (tháng 1 năm 2016), một cú đẩy git đơn giản sẽ đủ để đẩy repo cha mẹ ... và tất cả các mô hình con của nó.

Xem cam kết d34141c , cam kết f5c7cd9 (03 tháng 12 năm 2015), cam kết f5c7cd9 (03 tháng 12 năm 2015) và cam kết b33a15b (17 tháng 11 năm 2015) của Mike Crowe ( mikecrowe) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 5d35d72 , ngày 21 tháng 12 năm 2015)

push: thêm recurseSubmodulestùy chọn cấu hình

Các --recurse-submodulestham số dòng lệnh đã tồn tại trong một thời gian nhưng nó không có tập tin cấu hình tương đương.

Theo kiểu của tham số tương ứng cho git fetch, hãy phát minh push.recurseSubmodulesđể cung cấp mặc định cho tham số này.
Điều này cũng yêu cầu bổ sung --recurse-submodules=nođể cho phép cấu hình được ghi đè trên dòng lệnh khi được yêu cầu.

Cách đơn giản nhất để thực hiện điều này dường như là pushsử dụng mã submodule-configtheo cách tương tự fetch.

Tài git configliệu hiện bao gồm :

push.recurseSubmodules:

Đảm bảo rằng tất cả các cam kết mô hình con được sử dụng bởi các phiên bản được đẩy đều có sẵn trên một nhánh theo dõi từ xa.

  • Nếu giá trị là ' check', thì Git sẽ xác minh rằng tất cả các cam kết của mô hình con đã thay đổi trong các phiên bản sẽ được đẩy đều có sẵn trên ít nhất một điều khiển của mô hình con. Nếu bất kỳ cam kết nào bị thiếu, việc đẩy sẽ bị hủy bỏ và thoát với trạng thái khác không.
  • Nếu giá trị là ' on-demand' thì tất cả các mô hình con đã thay đổi trong các phiên bản sẽ được đẩy sẽ được đẩy. Nếu theo yêu cầu không thể đẩy tất cả các sửa đổi cần thiết, nó cũng sẽ bị hủy bỏ và thoát với trạng thái khác không. -
  • Nếu giá trị là ' no' thì hành vi mặc định của việc bỏ qua các mô hình con khi đẩy được giữ lại.

Bạn có thể ghi đè cấu hình này tại thời điểm đẩy bằng cách chỉ định ' --recurse-submodules=check|on-demand|no'.

Vì thế:

git config push.recurseSubmodules on-demand
git push

Git 2.12 (Q1 2017)

git push --dry-run --recurse-submodules=on-demand sẽ thực sự làm việc

Xem cam kết 0301c82 , cam kết 1aa7365 (17 tháng 11 năm 2016) của Brandon Williams ( mbrandonw) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 12cf113 , ngày 16 tháng 12 năm 2016)

push run with --dry-runkhông thực sự (Git 2.11 tháng 12 năm 2016 và thấp hơn / trước) thực hiện chạy khô khi đẩy được cấu hình để đẩy các mô hình con theo yêu cầu.
Thay vào đó, tất cả các mô hình con cần được đẩy thực sự được đẩy đến điều khiển từ xa trong khi mọi cập nhật cho siêu dự án được thực hiện dưới dạng chạy khô.
Đây là một lỗi và không phải là hành vi dự định của chạy khô.

Dạy pushcách tôn trọng --dry-runtùy chọn khi được định cấu hình để đẩy đệ quy các mô đun con 'theo yêu cầu'.
Điều này được thực hiện bằng cách chuyển --dry-runcờ cho tiến trình con thực hiện thao tác đẩy cho một mô hình con khi thực hiện chạy khô.


Và vẫn còn trong Git 2.12, bây giờ bạn có --recurse-submodules=onlytùy chọn "" để đẩy các mô hình con ra mà không cần đẩy siêu dự án cấp cao nhất .

Xem cam kết 225e8bf , cam kết 6c656c3 , cam kết 14c01bd (ngày 19 tháng 12 năm 2016) của Brandon Williams ( mbrandonw) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 792e22e , ngày 31 tháng 1 năm 2017)


Điều này hiện có sẵn không?
CMCDragonkai

@CMCDragonkai đúng vậy, bạn có thể thấy nó trong git-scm.com/docs/git-push . Tôi đã chỉnh sửa câu trả lời.
VonC

Có một cam kết đệ quy?
CMCDragonkai

1
bạn luôn có thể thực hiện 'git subodule foreach commit'
reflog

Tôi đã phải cập nhật tệp .gitmodules của mình với các url bitbucket.
wclark
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.