SVN: bên ngoài tương đương trong Git?


177

Tôi có hai dự án SVN được sử dụng từ kho lưu trữ SVN khác bằng svn: externals .

Làm thế nào tôi có thể có cấu trúc bố trí kho lưu trữ tương tự trong Git?


Bạn nên nhìn vào mô đun con Git . Nó sẽ cho phép gần như chính xác những gì bạn đang tìm kiếm.
foxxtrot

7
Bất cứ ai cũng có câu trả lời mới cho điều này trong 4 năm qua, hoặc thế giới của git ngày nay giống nhau?
DougW

4
@DougW Vâng, tôi có câu trả lời mới bên dưới : git submodulebây giờ có thể mô phỏng svn:external(kể từ tháng 3 năm 2013).
VonC

Đối với phiên bản mới nhất của Git, tôi khuyên bạn nên đọc về các mô đun con Git trong tài liệu chính thức của Git.
Bulki S Maslom

Câu trả lời:


134

Git có hai cách tiếp cận tương tự, nhưng không chính xác tương đương với svn: externals:

  • Subtree hợp nhất chèn mã của dự án bên ngoài vào một thư mục con riêng trong repo của bạn. Điều này có một quy trình chi tiết để thiết lập và sau đó rất dễ dàng cho những người dùng khác, bởi vì nó được tự động đưa vào khi kho lưu trữ được kiểm tra hoặc nhân bản. Đây có thể là một cách thuận tiện để bao gồm một phụ thuộc trong dự án của bạn.
    Thật dễ dàng để kéo các thay đổi từ dự án khác, nhưng rất phức tạp để gửi lại các thay đổi. Và nếu dự án khác phải hợp nhất từ ​​mã của bạn, lịch sử dự án sẽ được hợp nhất và hai dự án thực sự trở thành một.

  • Các mô đun con Git ( thủ công ) liên kết đến một cam kết cụ thể trong kho lưu trữ của dự án khác, giống như svn: externals với một-rđối số. Các mô hình con rất dễ thiết lập, nhưng tất cả người dùng phải quản lý các mô hình con, không được tự động đưa vào thanh toán (hoặc nhân bản).
    Mặc dù rất dễ để gửi các thay đổi trở lại dự án khác, nhưng làm như vậy có thể gây ra vấn đề nếu repo đã thay đổi. Do đó, nói chung là không phù hợp để gửi các thay đổi trở lại dự án đang được phát triển tích cực.


17
FYI, bây giờ có thể chỉ định các sửa đổi cụ thể với svn: externals ngay bây giờ (kể từ 1.5 hay 1.6 tôi tin?)
Nate Parsons

9
FYI, các mô đun con git có thể được tự động quản lý và cam kết. git tạo một tệp .gitmodules có thể / nên được cam kết giống như tệp .gitignore. Xem [ git-scm.com/book/en/Git-Tools-Submodules] để biết thêm thông tin.
mikijov

5
@NateParsons Luôn luôn có thể chỉ định số sửa đổi chính xác với svn:externals. Với phiên bản 1.5, cú pháp đã được thay đổi thành định dạng linh hoạt hơn. Những gì đã được thêm là địa chỉ URL tương đối.
David W.

@NateParsons nhưng có thể bỏ qua các sửa đổi với các mô đun con git ...> _>
Trejkaz

Tôi nghĩ rằng không thể git subodule các tệp đơn lẻ như với svn: externals
user1911091

38

Như tôi đã đề cập trong " Bản cập nhật phiên bản mới của Git ", bạn có thể đạt được tính năng bên ngoài SVN tương tự với các mô hình con Git 1.8.2:

git config -f .gitmodules submodule.<path>.branch <branch>

Điều này là đủ để một mô hình con đi theo một nhánh (như trong cam kết LATEST của một nhánh từ xa của một mô đun con ngược dòng ). Tất cả bạn cần làm là:

git submodule update --remote

Điều đó sẽ cập nhật các mô hình con.

Thêm chi tiết trong " git submoduletheo dõi mới nhất ".

Để chuyển đổi một mô hình con hiện có thành một nhánh theo dõi một nhánh : xem tất cả các bước trong " Mô đun con Git: Chỉ định một nhánh / thẻ ".


Bạn có thể làm kiểm tra một phần như với svn:externals?
nowox

@nowox Có, bạn có thể kiểm tra thưa thớt (git 1.7+ stackoverflow.com/a/2372044/6309 ) liên quan đến các mô hình con ( stackoverflow.com/a/17693008/6309 )
VonC

thật không may, tất cả các câu trả lời liên quan đến thanh toán thưa thớt không bao giờ đưa ra bất kỳ ví dụ nào :( Tôi sẽ cố gắng viết một ví dụ Gist cho việc này ...
nowox

Vẫn còn một vấn đề với điều này. Bạn vẫn phải lấy toàn bộ lịch sử của một kho lưu trữ mà bạn chỉ cần một phần nhỏ. Trong trường hợp của tôi là 100kB trên 2GB. Tất nhiên tôi có thể sử dụng --depthnhưng nó không thực sự giải quyết vấn đề.
nowox

@nowox Tốt nhất là hỏi một câu hỏi mới giải thích chính xác trường hợp sử dụng của bạn là gì: Tôi không biết liệu repo 2GB của bạn là một mô hình con, hay một repo chính với mô hình con, và chính xác những gì bạn cần trích xuất từ ​​nó.
VonC

3

Tôi là tác giả của công cụ gil (git links)

Tôi có một giải pháp thay thế cho vấn đề - công cụ gil (git links)

Nó cho phép mô tả và quản lý các phụ thuộc kho git phức tạp.

Ngoài ra, nó cung cấp một giải pháp cho vấn đề phụ thuộc đệ quy đệ quy git .

Xem xét bạn có các phụ thuộc dự án sau: biểu đồ phụ thuộc kho lưu trữ git mẫu

Sau đó, bạn có thể xác định .gitlinkstệp với mô tả quan hệ kho lưu trữ:

# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master

# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master

# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master

Mỗi dòng mô tả liên kết git theo định dạng sau:

  1. Tên duy nhất của kho lưu trữ
  2. Đường dẫn tương đối của kho lưu trữ (bắt đầu từ đường dẫn của tệp .gitlinks)
  3. Kho lưu trữ Git sẽ được sử dụng trong lệnh git clone Nhánh kho lưu trữ để kiểm tra
  4. Dòng trống hoặc dòng bắt đầu bằng # không được phân tích cú pháp (được coi là nhận xét).

Cuối cùng, bạn phải cập nhật kho lưu trữ mẫu gốc của mình:

# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link

# The same result with a single command
gil update

Kết quả là bạn sẽ sao chép tất cả các dự án cần thiết và liên kết chúng với nhau theo một cách thích hợp.

Nếu bạn muốn cam kết tất cả các thay đổi trong một số kho lưu trữ với tất cả các thay đổi trong kho lưu trữ được liên kết con, bạn có thể thực hiện bằng một lệnh duy nhất:

gil commit -a -m "Some big update"

Các lệnh kéo, đẩy hoạt động theo cách tương tự:

gil pull
gil push

Công cụ Gil (git links) hỗ trợ các lệnh sau:

usage: gil command arguments
Supported commands:
    help - show this help
    context - command will show the current git link context of the current directory
    clone - clone all repositories that are missed in the current context
    link - link all repositories that are missed in the current context
    update - clone and link in a single operation
    pull - pull all repositories in the current directory
    push - push all repositories in the current directory
    commit - commit all repositories in the current directory

Thông tin thêm về vấn đề phụ thuộc đệ quy git đệ quy .


1
Bạn nên đặt từ chối trách nhiệm ở đầu bài viết nói rằng bạn là tác giả của gil.
Daniel Kamil Kozar
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.