0

AおよびBと呼ぶ 2 つの Git リポジトリがあります。Repo Bはたまたま Repo Aのサブモジュールです。

レポBには、履歴から消去したいバイナリ ファイルがぎっしり詰まっています。branch-filter コマンドを実行して、レポBの履歴からこれらのファイルを簡単に消去できます。それは私の問題ではありません。

私の問題は、 repo Bでbranch-filter を実行した後、 repo A の何千ものコミットがrepo Bの(現在は無効な) コミットを指すようになることです。

私の質問は次のとおりです。レポ A の各コミットがレポ B の正しいコミットを指すように、レポ A の履歴を変更するにはどうすれよいです?

ご協力いただきありがとうございます!

4

2 に答える 2

0

私は git の専門家ではありません。

履歴を変更したため、サブモジュールを削除してから再度追加する必要があるようです。

.gitmodules ファイルのエントリを削除します。

[submodule "B"]
path = B
url = git@server:B

.git/config ファイルでサブモジュールのエントリを削除します

[submodule "b"]
url = git@server:B

サブモジュール用に作成されたパスを削除します

git rm --cached B

サブモジュールを追加し直します。

元の履歴が再クローン化せずに書き換えられた場合、別のレポで履歴を修正する方法がわかりません。

于 2012-08-25T20:42:58.633 に答える
0

サブモジュール リポジトリをフィルタリングするときは、各コミット ID が (マップ内で) どのように変化したかを覚えておく必要があります。次に、親リポジトリもフィルタリングする必要があります。サブモジュールへの変更ごとに、古いコミット ID を使用する代わりに、マップから同等の新しい ID を取得して使用します。私は一度もやったことがないので、実際にこれをすべて行う方法はわかりませんが、いくつかのアイデアがあります:

man ページには、どの新しい ID が古い ID に対応するかを出力する機能があると書かれているのでmap、その ID を使用して永続的なマップ ファイルを作成できます。

サブモジュール ID を修正するには、このステージ情報を新しいコミット ID を参照するように変換するスクリプト (同様のタスクに直面したときに使用します)を使用--index-filterする、かなり複雑なスクリプトを使用する必要があります。書き直されたコミット。git ls-files -ssedgit update-index --index-info

于 2012-08-26T08:38:45.100 に答える