<!--
.. title: Фильтрация репозиториев git
.. slug: git-filter-repo
.. date: 2022-11-22 00:17:11 UTC+03:00
.. tags: git
.. category: git 
.. link: 
.. description: 
.. type: text
-->

## Введение 

Отличный инструмент для изменения репозиториев (с переписыванием и
фильтрацией истории) -  [git-filter-repo](https://github.com/newren/git-filter-repo).

Написан на python в виде одного файла-скрипта и является более удобной
заменой `git filter-branch` и `BFG Repo Cleaner`.

## Запуск под Windows

Для запуска под Windows в виде команды можно положить скрипт в каталог,
прописанный в системной переменной окружения `PATH` и создать,
для более удобного запуска в консоли, 
рядом bat-файл следующего содержания:

```bat
@echo off
set PP=%~dp0
python %PP%git-filter-repo.py %*

```

## Примеры использования

Замена строки во всех файлах:

```bash
git-filter-repo --replace-text <(echo 'find==>replacement')
```

Сохранить выбранный каталог (остальные будут удалены).
Можно указать несколько каталогов, для этого надо добавить аргументов `--path`.

```bash
git-filter-repo --path path/to/folder [--path path/to/another] [--path....]
```

Удалить выбранный каталог.
Можно указать несколько каталогов, для этого надо добавить аргументов `--path`.

```bash
git-filter-repo --path path/to/folder --invert-paths
```

Переименовать (переместить) каталог:

```bash
git-filter-repo --path-rename path/to/folder/:newpath/for/folder/
```

Переместить каталог из глубин на верхний уровень:

```bash
git-filter-repo --path-rename path/to/folder/:
```

Удалить файлы по маске:

```bash
git-filter-repo --path-glob *.bak --path-glob *.old --invert-paths
```

Запуск анализа репозитория:

```bash
git-filter-repo --analyze [--force]
```

Если надо оставить один каталог из глубины и сделать его корневым
это можно сделать либо двумя командами их вышеперечисленных,
либо одной короткой командой:

```bash
## Either that way:
git-filter-repo --path <directory>/
git-filter-repo --path-rename <directory>/:

## Or that way:
git-filter-repo --subdirectory-filter <directory>

```

И это далеко не всё, что умеет делать этот скрипт.

Более подробное описание здесь: [https://www.mankier.com/1/git-filter-repo](https://www.mankier.com/1/git-filter-repo).

 