42

git リポジトリからサブプロジェクトを分割しようとしています。ただし、 サブディレクトリを別の Git リポジトリにデタッチ (移動) する場合とは異なり、 独自のサブディレクトリにはありません (移動して上記を実行しても、移動後の履歴のみが生成されます)。

サブプロジェクトを独自のリポジトリに分割したいブランチを複製し、サブプロジェクトで使用されていないものをすべて削除したので、基本的にこれをサブプロジェクトのリポジトリとして使用できました。

ここで、このリポジトリに存在しなくなったすべてのファイルの履歴を削除して、子孫になったファイルのファイル履歴のみを保持したいと考えています。

git-filter-branch で可能に違いないと思いますが、方法がわかりません

よろしくお願いします

4

2 に答える 2

11

ここにあなたが望むことをするためのいくつかの指示があります.

これにより以下が削除されfile_to_removeます:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all
于 2012-05-20T22:57:53.543 に答える
6

わかりました今、私は次のテクニックを試しています。うまくいった場合は報告します。かなり時間がかかるようです:zshまたはbashでクローンされたリポジトリで

git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt

削除されたすべてのファイルを取得するには

for del in `cat deleted.txt`
do
    git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all
    # The following seems to be necessary every time
    # because otherwise git won't overwrite refs/original
    git reset --hard
    git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
    git reflog expire --expire=now --all
    git gc --aggressive --prune=now
done;

これはデータにとって非常に危険な場合があるため、クローンでのみ試してください。

于 2012-05-22T19:01:20.427 に答える