web-dev-qa-db-ja.com

削除されたファイルをgit履歴から削除する

Gitリポジトリからサブプロジェクトを分割しようとしています。ただし、 Detach(move)subdirectoryを別のGitリポジトリに それ自体のサブディレクトリにはありません(移動して上記を実行すると、移動後の履歴のみが生成されます)。

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

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

Git-filter-branchで可能だと思いますが、どうすればいいのかわかりません

よろしくお願いします

33
Niklas Schnelle

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

これにより、file_to_removeが削除されます。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --Prune-empty -- --all
7
Neil Forrester

さて、私は次のテクニックを試しています。かなり長時間実行されているように見えるので、うまくいった場合は報告します。クローンリポジトリの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;

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

3
Niklas Schnelle