2016-12-22 11 views
0

Gitの履歴にある他のファイルの中にいくつかの "面白い"ファイルがあります。そして、このレポの歴史のどこにいても他のファイルは存在しないので、Gitリポジトリとしての歴史だけを持つ「面白い」ファイルを公開したい。すべてのGitコミットですべての選択されたファイルを削除します

git filter-branch --index-filterのスマートスクリプトを書くにはどうすればよいですか? (あるいは、少なくとも、それが遅くなり、そして私の保存された木が巨大であるため、しかし、望ましくないgit filter-branch --tree-filter、のために)私の質問は、最も一般的な類似した1人と少し異なっている

12を求めている:どのようにGitの履歴から特定の( "機密")ファイルを削除するには?私は補体を削除し、特定のファイルを保持する必要があります。

答えて

0

このスクリプトでは、git filter-branch --index-filterのトリッキーな部分は、インデックスからファイルのリストを取得し、特定のものを除外し、結果のリストを削除することです。

これを個別の実行可能スクリプトとして実装しましたgit-update-index-keeping-only;ここでは大まかな実装です:

再度コマンドを起動するように指示されない限り、私は、(スペースが xargsにとって問題でなければならないファイル名に改行やスペースに何が起こるかについてはあまり考えていない
git ls-files --full-name \ 
| fgrep -v -x -f <(echo "$FILELIST") \ 
| xargs git rm --cached "[email protected]" -- 

それぞれの議論、私は効率のためにしなかった)。

サンプル使用法は、私のユースケースに役立つもう1つのスクリプトで書かれています:2つのコミットの間でdiffで変更または追加されたものとして面白いリストを取得します(例えば、 "上流"コミットとそれ)。

これはgit-filter-only-files-modified-sinceです。その本質は次のようなものです:

FILES="$(git diff-tree "$SINCE": HEAD: \ 
    -r --name-only --diff-filter=MACRT)" 
export FILES 
git filter-branch \ 
    --index-filter 'echo "$FILES" | git-update-index-keeping-only -q'