svn:externals を使用して、別のSVNリポジトリから2つのSVNプロジェクトを使用しています。
Gitで同じリポジトリレイアウト構造を使用するにはどうすればよいですか?
Gitには2つのアプローチがありますが、svn:externalsとまったく同じではありません。
サブツリーのマージ外部プロジェクトのコードをリポジトリ内の別のサブディレクトリに挿入します。これには 設定する詳細なプロセス があり、リポジトリがチェックアウトまたは複製されるときに自動的に含まれるため、他のユーザーにとって非常に簡単です。これは、プロジェクトに依存関係を含める便利な方法です。
他のプロジェクトから変更をプルするのは簡単ですが、変更を元に戻すのは複雑です。また、他のプロジェクトをコードからマージする必要がある場合、プロジェクトの履歴がマージされ、2つのプロジェクトが事実上1つになります。
Gitサブモジュール ( manual )svnによく似た、別のプロジェクトのリポジトリ内の特定のコミットへのリンク:-r
引数を持つ外部。サブモジュールのセットアップは簡単ですが、すべてのユーザーはサブモジュールを管理する必要があり、サブモジュールはチェックアウト(またはクローン)に自動的に含まれません。
変更を他のプロジェクトに送信するのは簡単ですが、リポジトリを変更した場合、問題を引き起こす可能性があります。したがって、一般的に、アクティブな開発中のプロジェクトに変更を送信することは適切ではありません。
「 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サブモジュール:ブランチ/タグの指定 」のすべての手順を参照してください。
私は 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リンクを記述します。
最後に、ルートサンプルリポジトリを更新する必要があります。
# 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