これを行う1つの方法はその逆です。保持したいファイル以外をすべて削除します。
基本的に、リポジトリのコピーを作成してから、を使用git filter-branch
して、保持したいファイル/フォルダー以外のすべてを削除します。
たとえば、ファイルtvnamer.py
を新しいリポジトリに抽出するプロジェクトがあります。
git filter-branch --tree-filter 'for f in *; do if [ $f != "tvnamer.py" ]; then rm -rf $f; fi; done' HEAD
これはgit filter-branch --tree-filter
、各コミットを実行し、コマンドを実行して、結果のディレクトリの内容を再コミットするために使用します。これは非常に破壊的であり(リポジトリのコピーでのみ実行する必要があります!)、時間がかかる可能性があります(300のコミットと約20のファイルがあるリポジトリでは約1分)。
上記のコマンドは、各リビジョンで次のシェルスクリプトを実行するだけです。もちろん、これを変更する必要があります(サブディレクトリをの代わりに除外するにはtvnamer.py
)。
for f in *; do
if [ $f != "tvnamer.py" ]; then
rm -rf $f;
fi;
done
最大の明らかな問題は、残りのファイルと関係がない場合でも、すべてのコミットメッセージが残ることです。スクリプトgit-remove-empty-commitsはこれを修正します。
git filter-branch --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'
あなたが使用する必要が-f
力引数の実行をfilter-branch
中に何もして再びrefs/original/
(これは基本的にバックアップ)
もちろん、これは完璧ではありません。たとえば、コミットメッセージが他のファイルについて言及している場合は、git currentが許す限り近いです(とにかく私が知っている限り)。
繰り返しますが、これはリポジトリのコピーでのみ実行してください!-しかし、要約すると、「thisismyfilename.txt」以外のすべてのファイルを削除するには、次のようにします。
git filter-branch --tree-filter 'for f in *; do if [ $f != "thisismyfilename.txt" ]; then rm -rf $f; fi; done' HEAD
git filter-branch -f --commit-filter 'if [ z$1 = z`git rev-parse $3^{tree}` ]; then skip_commit "$@"; else git commit-tree "$@"; fi'