svn:externalsを使用して、別のSVNリポジトリから2つのSVNプロジェクトを使用しています。
Gitで同じリポジトリレイアウト構造をどのように持つことができますか?
svn:externalsを使用して、別のSVNリポジトリから2つのSVNプロジェクトを使用しています。
Gitで同じリポジトリレイアウト構造をどのように持つことができますか?
回答:
Gitには、svn:externalsと似た2つのアプローチがありますが、厳密には同等ではありません。
サブツリーのマージにより、外部プロジェクトのコードがリポジトリ内の別のサブディレクトリに挿入されます。これには詳細な設定プロセスがあり、リポジトリがチェックアウトまたは複製されるときに自動的に含まれるため、他のユーザーにとって非常に簡単です。これは、プロジェクトに依存関係を含めるのに便利な方法です。
他のプロジェクトから変更をプルするのは簡単ですが、変更を送信するのは複雑です。そして、他のプロジェクトがコードからマージする必要がある場合、プロジェクト履歴がマージされ、2つのプロジェクトは事実上1つになります。
Gitサブモジュール(手動)は、-r
引数を持つsvn:externalsのように、別のプロジェクトのリポジトリ内の特定のコミットにリンクします。サブモジュールは簡単に設定できますが、すべてのユーザーがサブモジュールを管理する必要があります。サブモジュールは、チェックアウト(またはクローン)に自動的には含まれません。
変更を他のプロジェクトに送信することは簡単ですが、リポジトリを変更した場合、送信すると問題が発生する可能性があります。したがって、開発中のプロジェクトに変更を送信することは一般的に適切ではありません。
svn:externals
でした。リビジョン1.5では、構文がより柔軟な形式に変更されました。追加されたのは、相対URLアドレス指定です。
「Gitサブモジュールの新しいバージョンの更新」で述べたように、Git 1.8.2サブモジュールで同じSVN外部機能を実現できます。
git config -f .gitmodules submodule.<path>.branch <branch>
これは、サブモジュールがブランチをたどるのに十分です(サブモジュールアップストリームリポのリモートブランチの最新のコミットの場合のように)。あなたがする必要があるのは、
git submodule update --remote
これでサブモジュールが更新されます。
詳細は「git submodule
最新の追跡」にあります。
既存のサブモジュールをブランチを追跡するサブモジュールに変換するには、「Gitサブモジュール:ブランチ/タグを指定する」のすべての手順を参照してください。
svn:externals
か?
--depth
が、実際には問題を解決していません。
問題の代替ソリューションがあります- ギル(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リンクを示しています。
最後に、ルートサンプルリポジトリを更新する必要があります。
# 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
gil
。