7

次の構造の git リポジトリがあります。

.git/
    project-root/
        abc/
        xyz/

そして、これは私が欲しいものです:

project-root/
    .git
    abc/
    xyz/

私はこれを達成する方法を研究してきましたが、これは私がこれまでに見つけたものです: http://git-scm.com/docs/git-filter-branch

それによると、次のコマンドで目的を達成する必要があります。

git filter-branch --subdirectory-filter project-root -- --all

これによりコミット履歴が書き換えられますが、早送り以外のマージ コミットのほとんどは失われます (下の画像を参照)。

これらのコミットを保存する方法はありますか?

ここに画像の説明を入力

4

2 に答える 2

0

--subdirectory-filter の代わりに --tree-filter を使用してみましたが、うまくいくようです。これは私が使用したコマンドです:

git filter-branch --tree-filter 'git mv -k project-root/{,.[!.],..?}* .' -- --all

このコマンドを実行すると、「project-root」が git によって追跡されたことがないかのようにコミット履歴が書き換えられ、希望どおりにブランチ トポロジが保持されます。

誰かがこれを Windows で使用しようとして「許可が拒否されました」というエラーが表示された場合は、explorer.exe プロセスを強制終了すると解決する可能性があります (この回避策はこちらで見つかりました: http://academe.co.uk/2011/12/git-mv-許可拒否/ )。

編集:上記のコマンドはタグを書き換えません。タグを書き換えるための正しいコマンドは次のとおりです。

git filter-branch --tree-filter 'git mv -k project-root/{,.[!.],..?}* .' --tag-name-filter cat -- --all

于 2013-09-02T14:17:11.363 に答える