Làm cách nào tôi có thể chỉ định một nhánh / thẻ khi thêm một mô hình con Git?


756

Làm thế nào để git submodule add -blàm việc?

Sau khi thêm một mô hình con với một nhánh cụ thể, một kho lưu trữ nhân bản mới (sau git submodule update --init) sẽ ở một cam kết cụ thể, chứ không phải chính nhánh đó ( git statustrên mô hình con hiển thị "Không hiện trên bất kỳ nhánh nào").

Tôi không thể tìm thấy bất kỳ thông tin nào về .gitmoduleshoặc .git/configvề chi nhánh của mô hình con hoặc bất kỳ cam kết cụ thể nào, vậy làm thế nào để Git tìm ra nó?

Ngoài ra, có thể chỉ định một thẻ thay vì một chi nhánh?

Tôi đang sử dụng phiên bản 1.6.5.2.


3
Nếu bạn có một mô hình con hiện tại chưa theo dõi chi nhánh , nhưng bạn muốn nó bây giờ sẽ theo dõi một chi nhánh ... hãy xem câu trả lời của tôi dưới đây
VonC

Câu trả lời:


745

Lưu ý: Git 1.8.2 đã thêm khả năng theo dõi các nhánh. Xem một số câu trả lời dưới đây.


Có một chút khó hiểu để làm quen với điều này, nhưng các mô hình con không nằm trên một nhánh. Chúng, như bạn nói, chỉ là một con trỏ tới một cam kết cụ thể của kho lưu trữ của mô hình con.

Điều này có nghĩa là, khi người khác kiểm tra kho lưu trữ của bạn hoặc lấy mã của bạn và thực hiện cập nhật mô hình con git, mô hình con được kiểm tra theo cam kết cụ thể đó.

Điều này là tuyệt vời cho một mô hình con không thay đổi thường xuyên, bởi vì sau đó mọi người trong dự án có thể có mô hình con ở cùng một cam kết.

Nếu bạn muốn di chuyển mô hình con sang một thẻ cụ thể:

cd submodule_directory
git checkout v1.0
cd ..
git add submodule_directory
git commit -m "moved submodule to v1.0"
git push

Sau đó, một nhà phát triển khác muốn có Subodule_directory đã thay đổi thành thẻ đó, thực hiện điều này

git pull
git submodule update --init

git pullthay đổi mà cam kết thư mục mô hình con của họ chỉ đến. git submodule updatethực sự hợp nhất trong mã mới.


8
Đó là một lời giải thích rất tốt, cảm ơn! Và tất nhiên, sau khi đọc câu trả lời của bạn, tôi nhận ra rằng cam kết được lưu bên trong chính mô hình con (mô đun con / .git / ĐẦU).
Ivan

4
Điều này dường như không hoạt động trên git 1.7.4.4. cd my_submodule; git checkout [ref in submodule's repositorysản lượng fatal: reference is not a tree: .... Như thể gitsẽ chỉ hoạt động trên kho mẹ.
James A. Rosen

3
Thật tốt khi sử dụng các mô đun con git ngay cả đối với các dự án được cập nhật thường xuyên. Nhân linux sử dụng nó và nó không tệ lắm

10
git checkout v1.0một chi nhánh hoặc một thẻ?
Bernhard Döbler

8
Xem xét một thẻ một bí danh có thể đọc được của con người với một cam kết. Và một cam kết là một tập hợp các trạng thái cụ thể cho mỗi tệp. Một nhánh về cơ bản là giống nhau ngoại trừ bạn có thể thay đổi nó.
deadbabykitten

657

Tôi muốn thêm một câu trả lời ở đây thực sự chỉ là một tập hợp các câu trả lời khác, nhưng tôi nghĩ nó có thể đầy đủ hơn.

Bạn biết bạn có một mô hình con Git khi bạn có hai điều này.

  1. Bạn .gitmodulescó một mục như vậy:

    [submodule "SubmoduleTestRepo"]
        path = SubmoduleTestRepo
        url = https://github.com/jzaccone/SubmoduleTestRepo.git
    
  2. Bạn có một đối tượng mô đun con (có tên SubmoduleTestRepo trong ví dụ này) trong kho Git của bạn. GitHub hiển thị đây là các đối tượng "mô hình con". Hoặc làm git submodule statustừ một dòng lệnh. Các đối tượng mô đun con Git là các loại đối tượng Git đặc biệt và chúng giữ thông tin SHA cho một cam kết cụ thể.

    Bất cứ khi nào bạn làm một git submodule update, nó sẽ điền vào mô hình con của bạn với nội dung từ cam kết. Nó biết nơi để tìm cam kết vì thông tin trong .gitmodules.

    Bây giờ, tất cả những gì -bcần làm là thêm một dòng trong .gitmodulestệp của bạn . Vì vậy, theo cùng một ví dụ, nó sẽ trông như thế này:

    [submodule "SubmoduleTestRepo"]
        path = SubmoduleTestRepo
        url = https://github.com/jzaccone/SubmoduleTestRepo.git
        branch = master
    

    Lưu ý: chỉ tên chi nhánh được hỗ trợ trong một .gitmodulestệp, nhưng SHA và TAG không được hỗ trợ! (thay vì đó, cam kết của từng chi nhánh có thể được theo dõi và cập nhật bằng cách sử dụng " git add .", ví dụ như git add ./SubmoduleTestRepo, và bạn không cần thay đổi .gitmodulestệp mỗi lần)

    Đối tượng mô hình con vẫn đang chỉ vào một cam kết cụ thể. Điều duy nhất mà -btùy chọn mua cho bạn là khả năng thêm --remotecờ vào bản cập nhật của bạn theo câu trả lời của Vogella:

    git submodule update --remote
    

    Thay vì đưa nội dung của mô hình con vào cam kết được chỉ ra bởi mô hình con, nó thay thế cho cam kết đó bằng cam kết mới nhất trên nhánh chính, THÌ nó đưa vào mô hình con với cam kết đó. Điều này có thể được thực hiện trong hai bước bởi câu trả lời djacobs7. Vì hiện tại bạn đã cập nhật cam kết đối tượng mô hình con đang trỏ tới, nên bạn phải cam kết đối tượng mô hình con đã thay đổi vào kho lưu trữ Git của bạn.

    git submodule add -bkhông phải là một cách kỳ diệu để giữ cho mọi thứ được cập nhật với một chi nhánh. Nó chỉ đơn giản là thêm thông tin về một nhánh trong .gitmodulestệp và cung cấp cho bạn tùy chọn để cập nhật đối tượng mô hình con thành cam kết mới nhất của một nhánh được chỉ định trước khi điền vào nó.


14
Câu trả lời này nên có nhiều phiếu bầu hơn. Tôi đã đọc nhiều bài viết trong ngày qua và điều này xóa tan mọi sự nhầm lẫn. Đến từ thế giới SVN và sử dụng các yếu tố bên ngoài - người ta muốn tin rằng theo dõi chi nhánh mô đun con git thực sự giữ mọi thứ cập nhật từ chi nhánh - nhưng điều này không đúng! Bạn phải cập nhật chúng một cách rõ ràng! Như bạn đã đề cập, bạn phải cam kết thay đổi các đối tượng mô đun con.
dtmland

12
Theo dõi chi nhánh này cũng hoạt động với các thẻ ? Thay vì một chi nhánh, tôi đã chỉ định một thẻ trong .gitmodulesvà sau khi thực hiện, $ git submodule update --init --remote TestModuletôi gặp lỗi fatal: Needed a single revisionUnable to find current origin/TestTag revision in submodule path 'TestModule'. Khi làm điều đó với một chi nhánh thực sự nó hoạt động. Có cách nào để chỉ định một thẻ trong .gitmodulesmà không phải xác định cam kết chính xác?
Hhut

5
Điều này dường như không hoạt động. Tôi đã cập nhật hàm băm .gitmodulesvà chạy git submodule updatevà không có gì xảy ra?
CMCDragonkai

2
Bằng cách nào đó, điều này không làm việc cho tôi. Với Id Cam kết SHA, tôi luôn gặp lỗi "Không thể tìm thấy sửa đổi hiện tại (Tôi đã kiểm tra kỹ số sửa đổi của CHÍNH và chính xác). Tuy nhiên, nếu tôi sử dụng chính thì nó hoạt động.
infoclogged

2
Nhập SHA vào thuộc tính nhánh cũng không hiệu quả với tôi. Việc sử dụng này cũng không được hỗ trợ bởi các tài liệu: git-scm.com/docs/gitmodules
Jakub Bochenski

340

(Git 2.22, quý 2 năm 2019, đã giới thiệu git submodule set-branch --branch aBranch -- <submodule_path>)

Lưu ý rằng nếu bạn có một mô hình con hiện tại chưa theo dõi một nhánh , thì ( nếu bạn có git 1.8.2+ ):

  • Hãy chắc chắn rằng repo cha biết rằng mô hình con của nó hiện theo dõi một nhánh:

    cd /path/to/your/parent/repo
    git config -f .gitmodules submodule.<path>.branch <branch>
    
  • Hãy chắc chắn rằng mô hình con của bạn thực sự là muộn nhất của nhánh đó:

    cd path/to/your/submodule
    git checkout -b branch --track origin/branch
      # if the master branch already exist:
      git branch -u origin/master master
    

         (với 'nguồn gốc' là tên của repo từ xa ngược dòng , mô hình con đã được sao chép từ.
         Mộtgit remote -vbên trong mô hình con đó sẽ hiển thị nó. Thông thường, đó là 'origin')

  • Đừng quên ghi lại trạng thái mới của mô hình con trong repo cha mẹ của bạn:

    cd /path/to/your/parent/repo
    git add path/to/your/submodule
    git commit -m "Make submodule tracking a branch"
    
  • Bản cập nhật tiếp theo cho mô hình con đó sẽ phải sử dụng --remotetùy chọn:

    # update your submodule
    # --remote will also fetch and ensure that
    # the latest commit from the branch is used
    git submodule update --remote
    
    # to avoid fetching use
    git submodule update --remote --no-fetch 
    

Lưu ý rằng với Git 2.10+ (quý 3 năm 2016), bạn có thể sử dụng ' .' làm tên chi nhánh:

Tên của chi nhánh được ghi nhận là submodule.<name>.branchtrong .gitmodulescho update --remote.
Một giá trị đặc biệt .được sử dụng để chỉ ra rằng tên của nhánh trong mô hình con phải cùng tên với nhánh hiện tại trong kho lưu trữ hiện tại .

Nhưng, như đã nhận xét của LubosD

Với git checkout, nếu tên chi nhánh phải theo là " .", nó sẽ giết chết công việc không được cam kết của bạn!
Sử dụnggit switch thay thế.

Điều đó có nghĩa là Git 2.23 (tháng 8 năm 2019) trở lên.

Xem " Bối rối bởigit checkout "


Nếu bạn muốn cập nhật tất cả các mô hình con của bạn theo một nhánh:

    git submodule update --recursive --remote

Lưu ý rằng kết quả, đối với mỗi mô hình con được cập nhật, hầu như sẽ luôn là một ĐẦU tách rời , như Dan Cameron lưu ý trong câu trả lời của mình .

( Ghi chú của Clintm trong các bình luận rằng, nếu bạn chạy git submodule update --remotevà kết quả sha1 giống với nhánh mà mô hình con hiện đang hoạt động, nó sẽ không làm gì cả và để mô hình con vẫn "ở nhánh đó" và không ở trạng thái đầu tách ra. )

Để đảm bảo chi nhánh thực sự được kiểm tra (và điều đó sẽ không sửa đổi SHA1 của mục đặc biệt đại diện cho mô hình con cho repo cha), ông gợi ý:

git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; git switch $branch'

Mỗi mô hình con vẫn sẽ tham chiếu cùng một SHA1, nhưng nếu bạn thực hiện các cam kết mới, bạn sẽ có thể đẩy chúng bởi vì chúng sẽ được tham chiếu bởi nhánh mà bạn muốn mô hình con theo dõi.
Sau lần đẩy đó trong một mô hình con, đừng quên quay lại repo cha, thêm, cam kết và đẩy SHA1 mới cho các mô hình con được sửa đổi đó.

Lưu ý việc sử dụng $toplevel, được đề xuất trong các ý kiến của Alexander Pogrebnyak .
$toplevelđã được giới thiệu trong git1.7.2 vào tháng 5 năm 2010: commit f030c96 .

nó chứa đường dẫn tuyệt đối của thư mục cấp cao nhất (ở đâu .gitmodules).

dtmlandthêm vào trong các ý kiến :

Kịch bản foreach sẽ không kiểm tra các mô đun con không theo nhánh.
Tuy nhiên, lệnh này cung cấp cho bạn cả hai:

 git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git switch $branch' –

Lệnh tương tự nhưng dễ đọc hơn:

git submodule foreach -q --recursive \
    'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; \
     [ "$branch" = "" ] && \
     git checkout master || git switch $branch' –

umläute tinh chỉnh lệnh của dtmland với một phiên bản đơn giản hóa trong các ý kiến :

git submodule foreach -q --recursive 'git switch $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

nhiều dòng:

git submodule foreach -q --recursive \
  'git switch \
  $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'

Trước Git 2.26 (Q1 2020), một lần tìm nạp được yêu cầu tìm nạp đệ quy các bản cập nhật trong các mô hình con chắc chắn tạo ra các luồng đầu ra và rất khó phát hiện ra các thông báo lỗi.

Lệnh đã được dạy để liệt kê các mô đun con có lỗi ở cuối hoạt động .

Xem cam kết 0222540 (ngày 16 tháng 1 năm 2020) bởi Emily Shaffer ( nasamuffin) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết b5c71cc , ngày 5 tháng 2 năm 2020)

fetch: nhấn mạnh sự thất bại trong quá trình tìm nạp mô hình con

Đã ký tắt: Emily Shaffer

Trong trường hợp khi tìm nạp mô hình con không thành công khi có nhiều mô hình con, lỗi từ quá trình tìm nạp mô hình con đơn độc bị chôn vùi dưới hoạt động trên các mô hình con khác nếu có nhiều hơn một lần tìm nạp lại fetch-by-oid.
Gọi ra một lỗi muộn để người dùng nhận thức được rằng đã xảy ra lỗi và ở đâu .

Bởi vì fetch_finish()chỉ được gọi một cách đồng bộ bằng cách run_processes_parallel,biến đổi không bắt buộc xung quanh submodules_with_errors.


1
Câu hỏi: nếu tôi có thư mục subModule1 và muốn theo dõi nhánh chính, lệnh kết quả sẽ như thế này: git config -f .gitmodules Subodule.subModule1.branch master
BraveNewMath

1
Các foreachkịch bản sẽ không phụ thuộc vào hardcoded <path>, nếu bạn thay thế <path>với $toplevel/.
Alexander Pogrebnyak

1
Các foreachkịch bản sẽ không submodules thanh toán mà không phải là sau một chi nhánh. Tuy nhiên, lệnh này cung cấp cho bạn cả hai:git submodule foreach -q --recursive 'branch="$(git config -f $toplevel/.gitmodules submodule.$name.branch)"; [ "$branch" = "" ] && git checkout master || git checkout $branch'
dtmland

2
đây là phiên bản đơn giản hóa của tập lệnh @ dtmland:git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'
umläute

1
Ồ! Trên thực tế kịch bản foreach là không cần thiết. Chúng ta phải thực hiện cập nhật mô hình con với công tắc --merge hoặc --rebase: git submodule update --remote --mergehoặc git submodule update --remote --rebase. Các lệnh này làm theo dõi của các chi nhánh từ xa.
GregTom

206

Git 1.8.2 đã thêm khả năng theo dõi các nhánh.

# add submodule to track master branch
git submodule add -b branch_name URL_to_Git_repo optional_directory_rename

# update your submodule
git submodule update --remote 

Xem thêm mô đun con Git


4
Điều này có áp dụng cho các thẻ là tốt?
ThorSummoner

1
Làm thế nào để thêm mô hình con theo cách như vậy phản ánh trên .gitmodulestập tin?
Eugene

1
Cảm ơn tôi vừa sử dụng thông tin về để giúp tôi tạo thư mục mô hình con được đồng bộ hóa với trang web ghit trang GitHub: ví dụ đầy đủ tại github.com/o2pl platform / flententode /issues / 22
Dinis Cruz

4
Bạn có thể khóa một thẻ với git submodule add -b tags/<sometag> <url>đó bạn có thể nhìn thấy như dòng branch = tags/<sometag>trong.gitmodules
KCD

9
@KCD Phiên bản nào của git có thể làm điều đó với các thẻ. Của tôi không hoạt động?
CMCDragonkai

58

Một ví dụ về cách tôi sử dụng các mô đun con Git.

  1. Tạo một kho lưu trữ mới
  2. Sau đó sao chép một kho lưu trữ khác như là một mô hình con
  3. Sau đó, chúng ta có mô hình con đó sử dụng một thẻ có tên V3.1.2
  4. Và sau đó chúng tôi cam kết.

Và nó trông hơi giống thế này:

git init 
vi README
git add README
git commit 
git submodule add git://github.com/XXXXX/xxx.yyyy.git stm32_std_lib
git status

git submodule init
git submodule update

cd stm32_std_lib/
git reset --hard V3.1.2 
cd ..
git commit -a

git submodule status 

Có lẽ nó giúp (mặc dù tôi sử dụng thẻ chứ không phải chi nhánh)?


4
Về cơ bản, đó là câu trả lời tương tự như djacobs7, nhưng dù sao cũng cảm ơn :)
Ivan

1
Bạn có thể cam kết thay đổi sau khi bạn git reset --hard V3.1.2? Tôi chỉ nhận được "không có gì để cam kết" với một git statustrong thư mục mẹ.
Nick Radford

1
@Ivan: Bạn có thể giải thích điều này giống như phản hồi của djacobs7 không? Theo như tôi thấy, phản hồi của anh ta thậm chí không bao gồm lệnh 'subodule add', thay vào đó repo được thêm trực tiếp, không có bất kỳ liên kết nào đến repo git gốc của mô-đun. Ít nhất là khi tôi thử phương pháp này, không có liên kết nào trong .gitmodules.
Michel Müller

Phản hồi của djacobs7 không bao gồm toàn bộ lời giải thích bắt đầu từ việc thêm mô hình con. Ông cho rằng bạn đã có nó.
CodeMonkey

không phải nó chỉ thêm toàn bộ nội dung mô hình con dưới dạng đối tượng được theo dõi vào repo chính của bạn sao?
dùng1312695

38

Theo kinh nghiệm của tôi, việc chuyển các nhánh trong siêu dự án hoặc kiểm tra trong tương lai vẫn sẽ gây ra các tiêu đề phụ tách rời cho dù mô hình con được thêm và theo dõi đúng cách (ví dụ: câu trả lời @ djacobs7 và @Johnny Z).

Và thay vì kiểm tra thủ công các nhánh chính xác bằng tay hoặc thông qua một tập lệnh mô đun con git có thể được sử dụng.

Điều này sẽ kiểm tra tệp cấu hình mô đun con cho thuộc tính nhánh và kiểm tra nhánh được đặt.

git submodule foreach -q --recursive 'branch="$(git config -f <path>.gitmodules submodule.$name.branch)"; git checkout $branch'


Đẹp. +1. Tôi đã bao gồm lệnh của bạn trong câu trả lời của tôi .
VonC

33

Các mô đun con Git hơi lạ một chút - chúng luôn ở chế độ "tách rời" - chúng không cập nhật lên cam kết mới nhất trên một nhánh như bạn mong đợi.

Điều này không có ý nghĩa gì khi bạn nghĩ về nó, mặc dù. Giả sử tôi tạo kho lưu trữ foo với thanh mô đun con . Tôi đẩy các thay đổi của mình và bảo bạn kiểm tra cam kết a7402be từ kho lưu trữ foo .

Sau đó tưởng tượng rằng ai đó cam kết thay đổi thanh lưu trữ trước khi bạn có thể tạo bản sao của mình.

Khi bạn kiểm tra cam kết a7402be từ kho lưu trữ foo , bạn sẽ nhận được mã giống như tôi đã đẩy. Đó là lý do tại sao các mô hình con không cập nhật cho đến khi bạn nói với chúng một cách rõ ràng và sau đó thực hiện một cam kết mới.

Cá nhân tôi nghĩ rằng các mô hình con là phần khó hiểu nhất của Git. Có rất nhiều nơi có thể giải thích các mô đun con tốt hơn tôi có thể. Tôi giới thiệu Pro Git của Scott Chacon.


Tôi nghĩ rằng đã đến lúc tôi bắt đầu đọc một số sách git, cảm ơn vì lời khuyên.
Ivan

Xin lỗi, nhưng bạn đã không làm rõ nếu một người sẽ nhận được giống như bạn đã đẩy lên a7402be, hoặc nhận thanh mới nhất, mặc dù phiên bản foo của bạn. Cảm ơn :)
mmm

6
Vấn đề là cần có một tùy chọn để nói "giữ mô hình con này trên nhánh X" để nếu bạn muốn nó tự động cập nhật thì bạn có thể thực hiện điều đó. Nó sẽ làm cho các mô hình con trở nên hữu ích hơn nhiều cho việc quản lý, ví dụ như cài đặt WordPress trong đó các plugin là tất cả các repos Git mà không phải lưu lại siêu dự án cho mỗi plugin cập nhật.
jerclarke

@jeremyclark git clone git://github.com/git/git.gitvà đẩy tính năng đó ...? = D
Alastair

1
Điều khó hiểu nhất về Git là ngay cả sau hơn một thập kỷ phát triển, một công cụ giúp tôi hoàn thành công việc vẫn có trải nghiệm người dùng tồi tệ như vậy và vì những lý do hoàn toàn vượt xa tôi, mọi người thích được Git chỉ ra thời gian.
0xC0000022L

20

Để chuyển nhánh cho một mô hình con (giả sử bạn đã có mô hình con là một phần của kho lưu trữ):

  • cd vào thư mục gốc của kho chứa các mô hình con
  • Mở .gitmodulesđể chỉnh sửa
  • Thêm dòng dưới đây path = ...url = ...cho biết branch = your-branch, cho mỗi mô hình con; lưu tập tin .gitmodules.
  • sau đó không thay đổi thư mục làm $ git submodule update --remote

... điều này sẽ kéo theo các cam kết mới nhất trên nhánh được chỉ định, cho mỗi mô hình con được sửa đổi.


10

Tôi có cái này trong tập tin .gitconfig. Nó vẫn là một dự thảo, nhưng đã được chứng minh là hữu ích cho đến nay. Nó giúp tôi luôn gắn lại các mô đun con vào nhánh của chúng.

[alias]

######################
#
#Submodules aliases
#
######################


#git sm-trackbranch : places all submodules on their respective branch specified in .gitmodules
#This works if submodules are configured to track a branch, i.e if .gitmodules looks like :
#[submodule "my-submodule"]
#   path = my-submodule
#   url = git@wherever.you.like/my-submodule.git
#   branch = my-branch
sm-trackbranch = "! git submodule foreach -q --recursive 'branch=\"$(git config -f $toplevel/.gitmodules submodule.$name.branch)\"; git checkout $branch'"

#sm-pullrebase :
# - pull --rebase on the master repo
# - sm-trackbranch on every submodule
# - pull --rebase on each submodule
#
# Important note :
#- have a clean master repo and subrepos before doing this !
#- this is *not* equivalent to getting the last committed 
#  master repo + its submodules: if some submodules are tracking branches 
#  that have evolved since the last commit in the master repo,
#  they will be using those more recent commits !
#
#  (Note : On the contrary, git submodule update will stick 
#to the last committed SHA1 in the master repo)
#
sm-pullrebase = "! git pull --rebase; git submodule update; git sm-trackbranch ; git submodule foreach 'git pull --rebase' "

# git sm-diff will diff the master repo *and* its submodules
sm-diff = "! git diff && git submodule foreach 'git diff' "

#git sm-push will ask to push also submodules
sm-push = push --recurse-submodules=on-demand

#git alias : list all aliases
#useful in order to learn git syntax
alias = "!git config -l | grep alias | cut -c 7-"

3

Chúng tôi sử dụng Quack để kéo một mô-đun cụ thể từ kho lưu trữ Git khác. Chúng tôi cần phải kéo mã mà không có toàn bộ cơ sở mã của kho lưu trữ được cung cấp - chúng tôi cần một mô-đun / tệp rất cụ thể từ kho lưu trữ khổng lồ đó và phải được cập nhật mỗi khi chúng tôi chạy cập nhật.

Vì vậy, chúng tôi đã đạt được nó theo cách này:

Tạo cấu hình

name: Project Name

modules:
  local/path:
    repository: https://github.com/<username>/<repo>.git
    path: repo/path
    branch: dev
  other/local/path/filename.txt:
    repository: https://github.com/<username>/<repo>.git
    hexsha: 9e3e9642cfea36f4ae216d27df100134920143b9
    path: repo/path/filename.txt

profiles:
  init:
    tasks: ['modules']

Với cấu hình trên, nó tạo một thư mục từ kho lưu trữ GitHub được cung cấp như được chỉ định trong cấu hình mô-đun đầu tiên, và thư mục còn lại là kéo và tạo một tệp từ kho lưu trữ đã cho.

Các nhà phát triển khác chỉ cần chạy

$ quack

Và nó kéo mã từ các cấu hình trên.


2

Hiệu quả duy nhất của việc chọn một nhánh cho một mô hình con là, bất cứ khi nào bạn vượt qua --remotetùy chọn trong git submodule updatedòng lệnh, Git sẽ kiểm tra ở chế độ CHÍNH tách rời (nếu --checkouthành vi mặc định được chọn) cam kết mới nhất của nhánh từ xa được chọn đó .

Bạn phải đặc biệt cẩn thận khi sử dụng tính năng theo dõi nhánh từ xa này cho các mô đun con Git nếu bạn làm việc với các mô hình con nông cạn. Nhánh bạn chọn cho mục đích này trong cài đặt mô hình con KHÔNG phải là nhánh sẽ được nhân bản trong suốt git submodule update --remote. Nếu bạn cũng truyền --depththam số và bạn không hướng dẫn Git về nhánh nào bạn muốn sao chép - và thực sự bạn không thể trong git submodule updatedòng lệnh !! -, nó sẽ hoàn toàn hành xử giống như được giải thích trong git-clone(1)tài liệu cho git clone --single-branchkhi --branchthiếu tham số rõ ràng , và do đó nó sẽ chỉ sao chép nhánh chính .

Không có gì ngạc nhiên, sau khi giai đoạn nhân bản được thực hiện bởi git submodule updatelệnh, cuối cùng nó sẽ cố gắng kiểm tra cam kết mới nhất cho nhánh từ xa mà bạn đã thiết lập cho mô hình con và nếu đây không phải là chính, nó không phải là một phần của bản sao nông cục bộ của bạn, và do đó nó sẽ thất bại với

gây tử vong: Cần một phiên bản duy nhất

Không thể tìm thấy nguồn gốc hiện tại / NotThePrimaryBranch sửa đổi trong đường dẫn mô hình con 'mySubmodule'


Làm thế nào để sửa lỗi - Cần một sửa đổi?
NidhinSPradeep

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.