4

次のgitリポジトリがありました

  • レポA
  • レポB
  • レポC

私が組み合わせたもの

  • 各レポがサブディレクトリに移動された repoAll

これは次のように見えます

  • repoAll
    • dirA
    • dirB
    • dirC

これを実現するために、 http://jasonkarns.com/blog/merge-two-git-repositories-into-one/の指示に従いました。つまり、本質的に

git remote add -f repoA /path/to/repoA
git merge -s ours --no-commit repoA/master
git read-tree --prefix=dirA/ -u repoA/master
git ci -m "merging repoA into dirA"
...

ただし、ファイルの履歴は接続されていません

git log --follow dirA/pom.xml

何も示しません。

でも、

git log --follow pom.xml

そのファイルの正しい(古い)履歴を表示します。Eclipse や他の git クライアントなどのツールでは完全な履歴を表示できないため、これでは十分ではありません。

さらに悪いことに、結合されたレポにはすでに新しいコミットがあったため、マージを再度行うことは実際にはオプションではありません (マージを行う前に移動repoA/*する必要があったことがわかりましたrepoA/dirA)。

repoAll の最初のマージの前に移動を行うコミットを挿入することを考えましたが、それにはすべての変更 (現在は 100 以上) をリベースして変更を解決する必要があります。

質問/解決策Git ログは、読み取りツリーのマージを実行した後、ほとんど表示されず、移動したものを除くすべてのファイルがサブディレクトリにあるように、履歴を書き換えるにはどうすればよいですか? 特定のサブディレクトリではなく、リポジトリ全体でのみ機能するようです(または、少なくともrepoAllに新しいコミットがある場合は機能しません)。

特定のサブディレクトリ (dirA など) の履歴を書き換える方法が必要だと思いますが、その方法がわかりません。

4

2 に答える 2

2

履歴を書き換えるr3m0tのアイデアに基づいて、次の行は、他の git リポジトリを新しいブランチとして既存のリポジトリにサブディレクトリにマージするためのすべてのトリックを実行しました。

git-shコマンドの先頭の「git」を省略することができました)

co -b my-new-branch 
remote add -f origin-my-old-standalone-project ../my-old-standalone-project/
pull origin-my-old-standalone-project master
mkdir my-new-subdir
ci -am "merge 'old' standalone project as new branch 'my-new-branch'"
git filter-branch --index-filter \
        'git ls-files -s | sed "s%\t\"*%&my-new-subdir/%" |
                GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
                        git update-index --index-info &&
         mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD

その後、私は両方を持っていました:新しいサブディレクトリ内の個々のファイルの履歴は、あたかも常にそこにあったかのように、メインディレクトリの通常の履歴は、サブディレクトリ内の新しいファイルが常にそこにあったかのように。(ご覧のとおり、読み取りツリーやその他の日常的に使用されないコマンドは必要ありません。「filter-branch」がすべてのトリックを実行します。)IDEは(そうあるべきです; PyCharmのテストに成功しました)、結果。

その後、通常どおりブランチをマージして、すべてのプロジェクトを 1 つにまとめることができるはずです。

tl;dr: --follow上記の 6 つのコマンドを実行して古い git プロジェクトを新しいブランチと他の git プロジェクトのサブディレクトリにマージした後、通常の履歴でも期待どおりに動作します

于 2015-03-07T12:06:08.227 に答える