2

この質問は重複しているか、以前の多くの質問 (および同様の主題を扱った数十のブログ投稿) のように思われますが、スクリプトを作成できるアプローチを探していることを認識しておく必要があります。

  • すべてのブランチとタグはマージされるはずです
  • 重複を避けるために、ブランチとタグにはプレフィックスを付ける必要があります
  • 新しいサブフォルダーにインポートするため、ファイルが重複することはありません。
  • 増分マージ プロセス: 一度に 1 つのリポジトリでゆっくりと monorepo セットアップに移行する予定であるため、後で新しいリポジトリをマージできるようにします。

私が構築しようとしているスクリプトは、次のように動作するはずです。

./merge-repo monorepo/subdir/foo git@github.com:example/foo.git

これは、ターゲット リポジトリ (monorepo) がmonorepo/フォルダー内で既に複製されており、ローカルの変更がないことを前提としています。

たとえば、foo.git に 2 つのブランチmasterdevelop1 つのタグ名がある場合、マージを実行した後、 monorepo リポジトリ内にブランチとタグv1.0が表示されることを期待します。foo-masterfoo-developfoo-v1.0

何十もの記事 (またはスクリプト) を読みましたが、これまでのところ、これを取得する方法を説明する記事を見つけることができませんでした。

明確化

  • foo.git レポジトリのルート内に README.txt がある場合、このファイルは .txt 内にあるはずですmonorepo/subdir/foo/README.txt。これらが大きなレポのサブディレクトリ(以前は存在しなかったサブディレクトリ)になる場合、競合することなくリポジトリをマージできる唯一のアプローチです。

アップデート

問題が解決したとはまだ言えませんが、ソース リポジトリにパッチを適用した後にマージを実行することになっているこの bash スクリプトを作成することになりました。それを見てください https://github.com/ssbarnea/monorepo/blob/master/git-monorepo-add.sh

PS。多くのリポジトリでテストされた信頼できるソリューションが得られたら、すぐに適切な回答を返します。

4

2 に答える 2

3

次のような方法で、リモート リポジトリのブランチとタグを名前空間 (つまり、<prefix>) ref にプルできます。

git fetch --no-tags <url> \
    refs/heads/*:refs/heads/<prefix>/* \
    refs/tags/*:refs/tags/<prefix>/*

あなたの例では、これによりブランチfoo/masterfoo/develop、という名前のタグが得られfoo/v1.0ます。あなたが求めたものとは正確には違いますが、多分それでいいのです。--no-tagsタグを「グローバル」名前空間にフェッチしないように指定されていることに注意してください。

この時点で、おそらくこれらのブランチの 1 つをローカル リポジトリのマスターにマージしたいと思うでしょう。これを行う 1 つの方法を次に示します。

$ git merge -s ours --no-commit foo/master
$ git read-tree --prefix=foo/ -u foo/master
$ git commit -m "merged in `master' from project foo"
于 2016-09-28T15:29:08.230 に答える
1

基本的に、次の 2 つのことを行う必要があります。

  1. 基になるすべての git オブジェクトをインポートします。
  2. リポジトリのユーザー向け構造 (ブランチ、タグなど) をマージします。

前者fetchは、リモート リポジトリのすべてのブランチとタグを単に ing するだけで実行できます。オブジェクトはハッシュによってインデックス付けされているため、ユニオンを取得するのは簡単な作業であり、何もする必要はありません。

この時点で、リポジトリ内に必要なオブジェクトがすべて揃っています。すべてのリモート ブランチを取得し、たとえば実行することでそれらを一覧表示できますgit branch -r --list '<remote_name>/*'(実際、この名前パターンで問題がなければ何もする必要はありません)。

私が知る限り、タグは少しトリッキーです。それらはリモートによってスコープされないため、それらをすべてまとめて取得して後で名前を変更することはできません。つまり、タグのリスト ( ) を手動で取得し、git ls-remote --tags <remote_name>それらを反復処理して名前が変更されたものを作成し、フェッチする必要があります。

于 2016-09-28T15:16:44.267 に答える