2012-05-20 30 views
22

gitリポジトリからサブプロジェクトを分割しようとしています。 しかし、 Detach (move) subdirectory into separate Git repository 私はそれ自身のサブディレクトリにはありません(そして、それを移動し、上記を実行すると、移動後の履歴が得られます)。gitの履歴から削除されたファイルを削除する

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

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

は、私はそれはgitのフィルタ分岐で可能でなければならないと思いますが、私は事前に

多くのおかげで

+0

参照[現在追跡されているファイルのみの履歴をコピーした新しいリポジトリ](http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files) 。 –

答えて

5

Here are some instructions to do what you want.

この削除する方法を見つけ出すことはできませんfile_to_remove

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all 
+19

問題は、作業ディレクトリにあるファイルとその履歴を保持し、他のすべてを忘れることです。最初にすべての削除されたファイルを見つけて上記のコマンドで削除するのは非常に面倒です。そのため、それが見つかったにしてもそれはあまり使われていません –

1

今、私は次のテクニックを試しています。動作していれば報告しますが、それはかなり長く実行されているようです。これが唯一のクローンを試着してめちゃめちゃあなたのデータのためのdangeoursかもしれませんすべて削除されたファイルに

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; 

を得るために、クローン化されたリポジトリ

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

ON zshのやbashで。

+0

あなたは何を見つけましたか? –

+1

なぜなら、あなたが 'git filter-branch'コマンド***を各ファイル***に対して一度だけ実行しているからです。他のコマンドもたくさんあります(' git gc'は安価で高速なコマンドを実行するのではなく)、すべてのファイルに対して***を一度実行するのではなく、おそらく非常に非効率的です。 [現在追跡されているファイルのみの履歴をコピーした新しいリポジトリ](http://stackoverflow.com/questions/17901588/new-repo-with-copied-history-of-only-currently-tracked-files)のコメントを参照してください。 –

+0

githubまたはgitlabを使ってリモートリポジトリをクリーンアップしますか? –