web-dev-qa-db-ja.com

SVN:Gitの外部同等物?

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

Gitで同じリポジトリレイアウト構造を使用するにはどうすればよいですか?

166
dsimard

Gitには2つのアプローチがありますが、svn:externalsとまったく同じではありません。

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

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

131
Paul

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

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

これは、サブモジュールがブランチをたどるのに十分です(サブモジュールのリモートブランチの最新のコミット upstream repo )。あなたがする必要があるのは:

git submodule update --remote

これにより、サブモジュールが更新されます。

詳細は、「 git submodule tracking latest 」にあります。

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

35
VonC

私は gil(git links)tool の著者です

私は問題の代替ソリューションを持っています- ギル(gitリンク)ツール

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

また、 git recursive submodulesdependency problem の解決策も提供します。

次のプロジェクト依存関係があることを考慮してください。 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 links)ツールは以下のコマンドをサポートしています:

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の再帰的なサブモジュールの依存関係の問題 の詳細。

0
chronoxor