# Remove all files except a few files, using filter-branch

5 messages from 2012-09-16 to 2012-09-18. Participants: Yi, EungJun, Andreas Schwab, Johannes Sixt.
Thread: https://gitlist.dev/t/31558

## Yi, EungJun, 2012-09-16 16:28

Subject: Remove all files except a few files, using filter-branch
Message-ID: <CAFT+Tg_ipyPgNQxx8XsXySzmA3YM3mKe1gB5GyTNqN++gdphnQ@mail.gmail.com>
URL: https://gitlist.dev/e/CAFT%2BTg_ipyPgNQxx8XsXySzmA3YM3mKe1gB5GyTNqN%2B%2BgdphnQ%40mail.gmail.com

```
Hi, all.

I want to remove all files except a few files, in the history of my
git repository.

I tried to do that as follows:

    git filter-branch --index-filter "git rm --cached --ignore-unmatch
$(git ls-files | grep -v '^filename$' | tr '\n' ' ')"

But this does not work well if there is a file whose name is not
encoded in us-ascii or includes parenthesis. git-filter-branch is
great to remove some files in my repository, but not good enough to
remove all except only a few.

Does anyone know the better way?

```

## Andreas Schwab, 2012-09-16 17:06

Subject: Re: Remove all files except a few files, using filter-branch
Message-ID: <m24nmxkibw.fsf@igel.home>
URL: https://gitlist.dev/e/m24nmxkibw.fsf%40igel.home
In-Reply-To: <CAFT+Tg_ipyPgNQxx8XsXySzmA3YM3mKe1gB5GyTNqN++gdphnQ@mail.gmail.com>

```
"Yi, EungJun" <semtlenori@gmail.com> writes:

> Hi, all.
>
> I want to remove all files except a few files, in the history of my
> git repository.
>
> I tried to do that as follows:
>
>     git filter-branch --index-filter "git rm --cached --ignore-unmatch
> $(git ls-files | grep -v '^filename$' | tr '\n' ' ')"

Try instead first removing all files, then restoring the files you want
to keep.

--index-filter "git rm --cached -qr -- . && git reset -q -- filename"

Andreas.

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

```

## Yi, EungJun, 2012-09-18 15:01

Subject: Re: Remove all files except a few files, using filter-branch
Message-ID: <CAFT+Tg-4q0mzD6rdY74WBP-0OM_SaZ_wkCAn+Gz2_eDte2a4Nw@mail.gmail.com>
URL: https://gitlist.dev/e/CAFT%2BTg-4q0mzD6rdY74WBP-0OM_SaZ_wkCAn%2BGz2_eDte2a4Nw%40mail.gmail.com
In-Reply-To: <m24nmxkibw.fsf@igel.home>

```
> --index-filter "git rm --cached -qr -- . && git reset -q -- filename"

Hmm... I tried as you said, but it seems to lose history.

In the below example, after rewriting there must be two commits for
'b' file but only one exists.

~$ git init filter-branch2
Initialized empty Git repository in
/home/nori/mysrc/test/git/filter-branch2/.git/
~/filter-branch2$ cd filter-branch2
~/filter-branch2$ echo 1 > a
~/filter-branch2$ echo 1 > b
~/filter-branch2$ git add a b
~/filter-branch2$ git commit -m 'first'
[master (root-commit) ae2b5fd] first
 2 files changed, 2 insertions(+)
 create mode 100644 a
 create mode 100644 b
~/filter-branch2$ echo 2 >> b
~/filter-branch2$ git add b
~/filter-branch2$ git commit -m 'second'
[master a32b84e] second
 1 file changed, 1 insertion(+)
~/filter-branch2$ git filter-branch --index-filter "git rm --cached
-qr -- . && git reset -q -- b"
Rewrite a32b84ed7cec5686e43a47195dfa8114f83619f3 (2/2)
Ref 'refs/heads/master' was rewritten
~/filter-branch2$ git log -- b
commit 19611f9eaf412232e237afcc059d0324a862062f
Author: Yi EungJun <semtlenori@gmail.com>
Date:   Tue Sep 18 23:51:53 2012 +0900

    first

Am I doing something wrong?

On Mon, Sep 17, 2012 at 2:06 AM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> "Yi, EungJun" <semtlenori@gmail.com> writes:
>
>> Hi, all.
>>
>> I want to remove all files except a few files, in the history of my
>> git repository.
>>
>> I tried to do that as follows:
>>
>>     git filter-branch --index-filter "git rm --cached --ignore-unmatch
>> $(git ls-files | grep -v '^filename$' | tr '\n' ' ')"
>
> Try instead first removing all files, then restoring the files you want
> to keep.
>
> --index-filter "git rm --cached -qr -- . && git reset -q -- filename"
>
> Andreas.
>
> --
> Andreas Schwab, schwab@linux-m68k.org
> GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
> "And now for something completely different."

```

## Johannes Sixt, 2012-09-18 15:10

Subject: Re: Remove all files except a few files, using filter-branch
Message-ID: <50588ED7.4090501@viscovery.net>
URL: https://gitlist.dev/e/50588ED7.4090501%40viscovery.net
In-Reply-To: <CAFT+Tg-4q0mzD6rdY74WBP-0OM_SaZ_wkCAn+Gz2_eDte2a4Nw@mail.gmail.com>

```
Am 9/18/2012 17:01, schrieb Yi, EungJun:
>> --index-filter "git rm --cached -qr -- . && git reset -q -- filename"
> 
> Hmm... I tried as you said, but it seems to lose history.

I think it should be '... && git reset -q $GIT_COMMIT -- filename'

-- Hannes

```

## Yi, EungJun, 2012-09-18 15:25

Subject: Re: Remove all files except a few files, using filter-branch
Message-ID: <CAFT+Tg_UbG8C9o2E5P1E2a9GXgLhn2fmE8sMA4un0Kai2HrOeg@mail.gmail.com>
URL: https://gitlist.dev/e/CAFT%2BTg_UbG8C9o2E5P1E2a9GXgLhn2fmE8sMA4un0Kai2HrOeg%40mail.gmail.com
In-Reply-To: <50588ED7.4090501@viscovery.net>

```
> I think it should be '... && git reset -q $GIT_COMMIT -- filename'

It works! Thanks to Hannes and Andreas!

On Wed, Sep 19, 2012 at 12:10 AM, Johannes Sixt <j.sixt@viscovery.net> wrote:
> Am 9/18/2012 17:01, schrieb Yi, EungJun:
>>> --index-filter "git rm --cached -qr -- . && git reset -q -- filename"
>>
>> Hmm... I tried as you said, but it seems to lose history.
>
> I think it should be '... && git reset -q $GIT_COMMIT -- filename'
>
> -- Hannes

```
