SVN:Gitで外部と同等ですか?


177

svn:externalsを使用して、別のSVNリポジトリから2つのSVNプロジェクトを使用しています。

Gitで同じリポジトリレイアウト構造をどのように持つことができますか?


Gitサブモジュールを調べる必要があります。それはあなたが探しているものをほぼ正確に許可するはずです。
foxxtrot 2009

7
過去4年間で誰もがこれに対する新しい答えを持っていますか、それとも今日のgitの世界は同じですか?
DougW 2013

4
@DougWはい、以下の新しい回答がありますgit submoduleエミュレートできるようになりましたsvn:external(2013年3月以降)。
VonC 2013

Gitの最新バージョンについては、公式のGitドキュメントでGitサブモジュールについて読むことをお勧めします。
Bulki S Maslom

回答:


134

Gitには、svn:externalsと似た2つのアプローチがありますが、厳密には同等ではありません。

  • サブツリーのマージにより、外部プロジェクトのコードがリポジトリ内の別のサブディレクトリに挿入されます。これには詳細な設定プロセスがあり、リポジトリがチェックアウトまたは複製されるときに自動的に含まれるため、他のユーザーにとって非常に簡単です。これは、プロジェクトに依存関係を含めるのに便利な方法です。
    他のプロジェクトから変更をプルするのは簡単ですが、変更を送信するのは複雑です。そして、他のプロジェクトがコードからマージする必要がある場合、プロジェクト履歴がマージされ、2つのプロジェクトは事実上1つになります。

  • Gitサブモジュール手動)は、-r引数を持つsvn:externalsのように、別のプロジェクトのリポジトリ内の特定のコミットにリンクします。サブモジュールは簡単に設定できますが、すべてのユーザーがサブモジュールを管理する必要があります。サブモジュールは、チェックアウト(またはクローン)に自動的には含まれません。
    変更を他のプロジェクトに送信することは簡単ですが、リポジトリを変更した場合、送信すると問題が発生する可能性があります。したがって、開発中のプロジェクトに変更を送信することは一般的に適切ではありません。


17
参考までに、svn:externalsを使用して特定のリビジョンを指定できるようになりました(1.5または1.6からでしょうか?)
Nate Parsons

9
ちなみに、gitサブモジュールは自動的に管理およびコミットできます。gitは.gitignoreファイルと同じようにコミットできる/すべきである.gitmodulesファイルを作成します。詳細については、[ git-scm.com/book/en/Git-Tools-Submodules]をご覧ください。
mikijov

5
@NateParsonsで正確なリビジョン番号を指定することは常に可能svn:externalsでした。リビジョン1.5では、構文がより柔軟な形式に変更されました。追加されたのは、相対URLアドレス指定です。
David W.

@NateParsonsですが、gitサブモジュールを使用してリビジョンを省略できます...> _>
Trejkaz

外観:私はそれはSVNと同じようにgitのサブモジュール、単一のファイルには不可能だと思う
user1911091

38

Gitサブモジュールの新しいバージョンの更新」で述べたように、Git 1.8.2サブモジュールで同じSVN外部機能を実現できます。

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

これは、サブモジュールがブランチをたどるのに十分です(サブモジュールアップストリームリポのリモートブランチの最新のコミットの場合のように)。あなたがする必要があるのは、

git submodule update --remote

これでサブモジュールが更新されます。

詳細は「git submodule最新の追跡」にあります。

既存のサブモジュールをブランチを追跡するサブモジュールに変換するには、「Gitサブモジュール:ブランチ/タグを指定する」のすべての手順を参照してください。


のように部分的なチェックアウトを行うことができますsvn:externalsか?
nowox 2017

はい@nowox、あなたがまばらなチェックアウトを持つことができます(gitの1.7以降stackoverflow.com/a/2372044/6309)(サブモジュールに関連するstackoverflow.com/a/17693008/6309
VonC

残念ながら、すべてのまばらなチェックアウト関連の回答...私はこのために要旨の例を書いてみるよ:(任意の例を与えることはありません
nowox

これにはまだ問題があります。リポジトリの全履歴を取得する必要がありますが、必要なのは1つの小さな部分だけです。私の場合、2GBを超える100kBです。もちろん使用できます--depthが、実際には問題を解決していません。
nowox 2017

@nowoxあなたのユースケースが正確に何であるかを説明する新しい質問をするのが最善です:あなたの2GBのレポがサブモジュールであるか、サブモジュールを備えたメインレポであるか、そしてそれから正確に何を抽出する必要があるのか​​私にはわかりません。
VonC 2017

3

私はgil(gitリンク)ツールの作成者です

問題の代替ソリューションがあります- ギル(gitリンク)ツール

複雑なgitリポジトリの依存関係を記述および管理できます。

また、git再帰サブモジュールの依存関係の問題に対する解決策も提供します。

次のプロジェクト依存関係があると考えてください: サンプルgitリポジトリ依存関係グラフ

次に.gitlinks、リポジトリ関係の説明を含むファイルを定義できます。

# 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

各行は、次の形式でgitリンクを示しています。

  1. リポジトリの一意の名前
  2. リポジトリの相対パス(.gitlinksファイルのパスから開始)
  3. チェックアウトするgit cloneコマンドリポジトリブランチで使用されるGitリポジトリ
  4. 空行または#で始まる行は解析されません(コメントとして扱われます)。

最後に、ルートサンプルリポジトリを更新する必要があります。

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

# The same result with a single command
gil update

その結果、必要なすべてのプロジェクトを複製し、適切な方法で相互にリンクします。

いくつかのリポジトリのすべての変更を子リンクされたリポジトリのすべての変更とともにコミットする場合は、単一のコマンドで実行できます。

gil commit -a -m "Some big update"

プル、プッシュコマンドは同様に機能します。

gil pull
gil push

Gil(gitリンク)ツールは、次のコマンドをサポートしています。

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

詳細をgitの再帰的なサブモジュールの依存関係の問題


1
の作成者であることを示す免責事項を投稿の上部に配置してくださいgil
Daniel Kamil Kozar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.