できますが、それは簡単ではないかもしれません。しかし、最初にまず最初に:ファイルの履歴を移動することはありません。移動するコミットだけがあるので、ファイルのサブセットの履歴を表すコミットが必要な場合は、それらのコミットを作成することが最初の課題です。
最も簡単なのは、転送することですすべての履歴です。 (Repo BをRepo Bの浅いクローンとして作成した場合は、実際にはそれを浅くしてやることができますが、Repo Bの作成方法ではないと思います...)
Repo AからRepo Bに移行しているので、削除したい履歴があります。それは潜在的にそれ自身の全体的な話題ですが、実際には少数のファイルの履歴しか必要としないと仮定しましょう。
特別なケースでは、必要なすべてのファイルがサブディレクトリにあり、それらのファイルをリポジトリのルートディレクトリに移動したい場合は、filter-branch
を使用できます--subdirectory-filter
。より一般的に
我々はパスを想定した場合、は変更しないでください、あなたがしたいファイルは、あなたが--index-filter
でfilter-branch
を使用することができ、ツリー内の任意の場所にすることができました。
git filter-branch --index-filter 'git rm --cached --ignore-unmatch each file or *glob* you do NOT want' --prune-emtpy -- all
レポに多くのコミットがあった場合、時間がかかることがあります。 rm
へのファイルのリストが自明でない場合は、複数のgit rm
コマンドをシェルスクリプトに入れ、それを上に示したようにインライン化する代わりに--index-filter
引数として使用することができます。
まあ、一つの方法または他がうまくいけば、あなたがレポB.
cd repo-b
git remote add repo-a path/to/repo-a
git fetch repo-a
にグラフトしたい歴史を持っている今、あなたはレポBを持っている:
... A -- B <--(repo-a/master)
\
(repo-a/other-branches-maybe)
B' -- C -- D (master)(origin/master)
だから私Repo AでのコミットB
- またはそのツリーの少なくとも一部が、Repo Bでルートコミットとしてインポートされたものです。
今、あなたは3つのオプションがあります:再親、リベースを、または私は最近の歴史の状態が古い履歴状態よりも重要である、と古い歴史は参考のために追加されていることを前提としていますので
を置き換え、一番安全なのは、C
〜B
です。だから、https://git-scm.com/docs/git-filter-branchあなたでし
# be sure you're on master
echo "$commit-id $graft-id" >> .git/info/grafts
git filter-branch $graft-id..HEAD
$commit-id
でfilter-branch
ドキュメントから描画
(...あなたは代わりにA
にB'
をリペアレントすることを選択することもできますが、私はあまり違いはありませんと仮定しています) B
と$graft-id
のためのSHAはC
ためリベースは(履歴間の一貫性のあるレベルを想定して)少し簡単になるかもしれませんSHAですが、あなたはUを終了する可能性を紹介しています木をD
に変更してください。あなたはリベースをしようとすることを決定したならば、それはB'
がレポBルートがコミットのSHA IDで
git rebase --onto repo-A/master B' master
だろう。 (あるいは
git rebase --interactive --onto repo-A/master --root master
、次いでB'
のエントリを削除します。)
これらのオプションのいずれかがコミットC
とD
を書き換えます。 (再育児ではTREE
が変更されないことが保証されますが、コミットは依然として置き換えられます)開発者はこれを上流リベースとして扱う必要があります(git rebase
「上流リベースからの回復」を参照)。これを軽減するために、私は一般的に、devsが持っているすべてのものをチェックし、クローンを破棄した後、書き直しを行い、新しいリポジトリから再クローンを作成するコーディネートされたカットオーバーをお勧めします。
書き換えを避ける場合は、3番目のオプション:git replace
を使用できます。これにはいくつかの欠点があることが知られており、スプライスされた履歴を「見る」ためには、各クローンを正しくセットアップする必要があります。
だから、これをサポートするために、あなただけのB
にタグを付ける(そしておそらくもB'
)したい:
git tag old-history repo-a/master
git tag new-root B'
(B'
が適切なSHA値のID、または同等の式です)。誰かがレポのクローンとき
は、彼らが唯一の新しい歴史を見ることができますが、彼らは
git replace new-root old-history
と歴史の中で休憩を超えるこの意志紙を言うことができます。
親のリベース、リベース、または置き換えが完了したら、repo-a
リモートを削除できます。
なぜこれをやりたいのですか? –