言って、私は次のように持ってRepo1
います
special -> E ... F ... G ... H
/
master -> A ... B ... C ... D ... X ... Y ... Z
からを開始するRepo2
にはどうすればよいですか? それは、私が歴史にまったく関心がないからです。master
E
Repo2
E
保持したい履歴にマージが含まれている場合、最も簡単な方法は、グラフトを使用して不要な履歴を一時的に切り離し、次に filter-branch を使用して、その履歴ビューを永続的なものとして持つブランチを作成することです。
cd /path/to/repo
git checkout -b newbranch special
git rev-parse E > .git/info/grafts
git filter-branch
rm .git/info/grafts
これは、現在移植片がないことを前提としています。移植片はめったに使用されず、とにかく新しいクローンでこれを行うのがおそらく良い考えであるため、それは問題にはなりません。
git checkout --orphan newbranch E
git commit -c E
git cherry-pick F..H
git init --bare /path/to/new/repo
git push /path/to/new/repo HEAD:master
簡単で明白な方法: E をチェックアウトして作業ディレクトリのコピーを作成しますが、.git ディレクトリを持ち歩かないようにしてください。そこから新しい git リポジトリを初期化し、他のコミットを移動します。git format-patch
そしてgit apply
あなたの友達です。
関与するgit filter-branch
可能性がありますが、この記事ではパッチを使用した独自のソリューションを提供します。
次のように、一連のパッチを作成します。
git checkout find-ls
git format-patch 9758db3 # where find-ls branched
新しいレポを別の構造にする必要がある場合は、パッチをハックする必要があるかもしれません。私はちょうど使用しました:
perl -pi -E 's|LEADING-DIR/||g' *.patch
次に、パッチを適用できます。
mv 0*.patch where/I/want/my/new/repo
cd where/I/want/my/new/repo
git am *.patch