私はgitサブツリーを使用して実験しており、次の状況に遭遇しました。
私はgitサブツリーを使用して外部プロジェクトをリポに追加しました。プロジェクトの履歴を参照したり、後で上流プロジェクトに貢献したりするために、上流プロジェクトのすべての履歴を意図的に保持しました。
結局のところ、上流プロジェクトの別の貢献者が誤って大きなファイルをマスターブランチにプッシュしました。これを修正するために、上流プロジェクトは履歴を書き直し、強制的にマスターにプッシュしました。「monorepo」を作成するときに、このコミットを含めたので、それも削除したいと思います。
サブツリーの新しい履歴を反映するようにリポジトリを更新するにはどうすればよいですか?
私の最初の試みは、フィルターブランチを使用して、サブツリーとすべての履歴を完全に削除することでした。
git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch upstream-project-dir' --prune-empty HEAD
古いバージョンのサブツリーが削除されたら、新しいアップストリームマスターを使用してサブツリーを再度追加できます。ただし、何らかの理由でコミット履歴がまだgitログ出力に表示されているため、これは機能しませんでした。
更新
最小限の再現可能な例を作成するための手順を書きました。
- 最初に空のgitリポジトリを作成します。 - git init test-monorepo cd ./test-monorepo
- 初期コミットを作成します。 - echo hello world > README git add README git commit -m 'initial commit'
- 次に、外部プロジェクトのサブツリーを追加します。 - git remote add thirdparty git@github.com:teivah/algodeck.git git fetch thirdparty git subtree add --prefix algodeck thirdparty master
- monorepoにいくつかのコミットをします - echo dont panic >> algodeck/README.md git commit -a -m 'test commit'
- 次に、git filter-branchを使用してサブツリーを削除してみます。 - git filter-branch --index-filter 'git rm -rf --cached --ignore-unmatch algodeck' --prune-empty HEAD
- git logの出力を調べます。最初のコミットのみが表示されることを期待しています。 - git log
git gc --prune=now表示されないコミットを削除するだけではありませんgit logか?
                git log、引数を、私はまだ古いコミットを参照してください。