8

今では、ほとんどのgitエキスパートがすぐに思い浮かぶことを知っていますがgit rebase、私はより一般的な意味で「リベース」という言葉を使用しています。プロジェクトの構造は次のとおりです。

.
..
.git
tools
lib
src
    .git
build

.とディレクトリはどちら./srcも明らかにgitリポジトリであり、文字通り長い歴史とそれぞれに多数のコミットがあります。のリポジトリはディレクトリ(それ自体のリポジトリ)を.無視します。src

.率直に言って、ビルドシステムはソースコードとともに進化しており、非常に広範囲になっているため、ソースファイルを含むすべてを追跡するために1つのリポジトリだけを使用したいということに気づきました。

私の問題は、このリポジトリに、現在のリポジトリの一部である履歴を保持させる方法がわからないことですsrc。それも可能ですか?これが「リベース」の意味です。N個のコミット全体で変更./src/main.cが追跡される場合./src/.gitは、これらの変更を保持して、新しいリポジトリの一部にします./.git。同じ履歴、リベースされたファイルパス。

アップデート

サブツリーのマージは、SOで収集したものから、私が望むものとは別のものです。要するに、それは私が必要とする以上のことをします。古いリポジトリのコンテンツが必要なだけです。開発のすべてのブランチとすべてのコミット、タグなどが、常に親リポジトリの一部であるかのように見えます。本質的に、唯一の変更はファイル自体へのパスです-子リポジトリが追跡される前に./main.c、新しいリポジトリが追跡さ./src/main.cれます。私が聞いたgitように、ファイルではなくコンテンツを追跡し、上記のようなファイルパスとこれらへの参照を変更しますパスは、かなり些細なものである必要がありますか?

4

4 に答える 4

2

素早く簡単な方法:

src 内のすべてのファイルの名前を変更して、src/. src リポジトリをリモートとして追加し、フェッチ & マージします。古い src リポジトリをドロップすると、すべてが./.

これにより、このアクションが履歴に記録されます。

歴史の書き換え:

このマージを非表示にするには、使用して src リポジトリにプレフィックスgit filter-branch --tree-filterを追加する必要があります。src/次に、これをリモートとして./リポジトリに追加し、フェッチします (まだマージはありません)。履歴をうまくブレンドするには、コミットの順序を変更する必要があります。git log --date-order master src/masterこれらのコミットを正しい順序で取得し、チェリーピックするために使用します。

git checkout -b new-master your-first-commit
git log --format='%H' --date-order --reverse master src/master | xargs git cherry-pick

これは基本的に、コミットのマージソートを行い、それらを線形履歴に並べます。

これはマージを保持しないため、平坦な履歴がない限り実行しないでください。その場合、filter-branch のみを使用してから、通常のマージを実行します。

于 2013-02-12T18:51:38.217 に答える
0

サブツリー マージを使用します。

手順をリストしますが、これらは次の質問に対する答えです: How do you merge two git repositories?

于 2013-02-12T16:28:29.250 に答える
0

私は同じことをする必要があり、これは私のために働いた:

親リポジトリから、

git remote add -f subrepo git@github.com:sub/repo.git
git merge -s ours --no-commit subrepo/master
git read-tree --prefix=subrepo/ -u subrepo/master
git commit -m "Subtree merged"

これは、詳細も記載されている GitHub の投稿からのものです: https://help.github.com/articles/about-git-subtree-merges/

于 2016-01-29T23:17:46.510 に答える
0

これが機能する場合は実際には使用しませんが、試してみる価値はあります。src がリモート サーバー上にあり、親がリモート サーバー上にあると仮定します。以下を試すことができます。

  • git clone url をリモート サーバーに送信して、ツール、lib、およびビルドを使用してレポを複製します
  • git は、リモート src url を src リモート リポジトリに追加します。
  • src リモート リポジトリの追跡ブランチを作成し、親リポジトリでチェックアウトします。
  • リモート追跡ブランチをメイン ブランチにマージします。
  • 2 番目のリモートを削除します。
于 2013-02-12T16:26:36.613 に答える