4

私は、マージする必要があるさまざまな Git リポジトリを使用しています。ワークフローは次のようになります。

git remote add fork1 ...
git remote add fork2 ...
git fetch fork1
git fetch fork2
git merge fork1/master fork2/master

これで問題ありませんが、タグを使用して各リモートの特定のコミットをプルできるようにしたいと考えています。

git merge fork1/v1.0.0 fork2/v2.1.0

各レポの変更は 1 つのサブフォルダーに限定されるため、マージの競合が発生することはありませんが、あったとしてもタコのマージによりトランザクション全体が原子的に失敗します。

問題はタグ参照にあります。このブログ投稿(私のものではありません) で説明されているように、すべてのタグは不可解にもグローバル名前空間にダンプされます。言う方法はありませんfork1/v1.0.0-それはただのことv1.0.0であり、複数のリポジトリに同じタグがある場合、それらは互いに押しつぶされます。

この回答に続いて、refspecs を使用してこれを回避することを検討してきました。これまでのところ、次のことを思いつきました。

git fetch fork1 refs/tags/*:refs/tags/fork1/*

これには、fork1 のv1.0.0タグを として到着させるという意図した効果がありfork1/v1.0.0ます。残念ながら、名前空間のない;として届きます。タグ マッピング セクションで 2 倍の行を出力し、プルされたタグとマージします。refspec に関する適切なドキュメントがどこにも見つかりません (このトピックに関する Git のドキュメントはまったく役に立ちません)。v1.0.0git fetchgit merge v1.0.0

複数のリポジトリのタグが競合しないようにするにはどうすればよいですか?

これについて愚かなことをしているのであれば、他のワークフローの提案にもオープンです。共有コンポーネントと構造を保持する 1 つのコア リポジトリと、コードだけが追加されたコアの完全なクローンである多数のモジュール リポジトリがあります。私の現在の計画は、各モジュールがコアへのリモート ポインター (共有部分の最新情報を取得するため) と、それが依存する他の各モジュールへのポインターを持つことです。共有ビットは同じなのでマージされ、モジュール ビットは独立しているためマージされます。ここで従うべき別のパターンはありますか?(私はサブモジュールを避けてきました。なぜなら、(a) サブモジュールについて良いことを聞いたことがなく、(b) 共有部分はプロジェクト ディレクトリ構造の観点からトップ レベルであり、リポジトリ構造が非常にぎこちなくなります。)

4

1 に答える 1

5

--no-tags以下で使用するとうまくいきますか?

git fetch fork1 refs/tags/*:refs/tags/fork1/* --no-tags

これにより、fork1 のタグが refs/tags/fork1 にドロップされ、refs/tags にもドロップされません。

于 2013-07-30T13:18:32.557 に答える