From cdad11f2d19ec971d3a45ae6f24e30c811dcc7ed Mon Sep 17 00:00:00 2001 From: Arity-T Date: Sat, 18 Jan 2025 03:05:07 +0300 Subject: [PATCH] git-filter-repo --- docs/git/git-filter-repo.md | 86 +++++++++++++++++++++++++++++++++++++ mkdocs.yml | 5 +++ 2 files changed, 91 insertions(+) create mode 100644 docs/git/git-filter-repo.md diff --git a/docs/git/git-filter-repo.md b/docs/git/git-filter-repo.md new file mode 100644 index 0000000..f19692a --- /dev/null +++ b/docs/git/git-filter-repo.md @@ -0,0 +1,86 @@ +--- +title: git-filter-repo +--- + +С помощью [git-filter-repo](https://github.com/newren/git-filter-repo/) можно переписать историю репозитория. + +## Установка + +Глобально или в `virtualenv` + +```sh +pip install git-filter-repo +``` + +## Замена метаданных коммитов + +`git-filter-repo` позволяет создать скрипт на `Python`, который будет вызван для всех коммитов репозитория. Доступ к данным коммита, с возможностю их редактирования, предоставляется через объект `commit`. Таким образом можно описать любую логику изменения метаданных коммитов на обычном `Python`. + +Ниже представлен пример изменения метаданных коммита по его хэшу. Узнать хэш коммита можно с помощью, например, `git log`. + +=== "Command" + + ```sh + git filter-repo --force --commit-callback "callback.py" + ``` + +=== "callback.py" + + ```python + """Файл создан для использования с git-filter-repo. + + Пример команды: + git filter-repo --force --commit-callback "callback.py" + """ + + from datetime import datetime, timedelta, timezone + + + def git_timestamp(date_str: str, tz_offset: int = 3) -> bytes: + """ + Преобразует строку с датой в формат временной метки для git-filter-repo. + + Args: + date_str (str): Дата в формате "DD.MM.YYYY HH:MM:SS". + tz_offset (int, optional): Сдвиг временной зоны относительно UTC. + По умолчанию 3 (московское время). + + Returns: + bytes: Байтовая строка с временной меткой и сдвигом временной зоны + в формате `b"{timestamp} {timezone_offset}"`. + """ + tz = timezone(timedelta(hours=tz_offset)) + dt = datetime.strptime(date_str, "%d.%m.%Y %H:%M:%S").replace(tzinfo=tz) + + timestamp = int(dt.timestamp()) + timezone_offset = f"{tz_offset:+03d}00" + + return f"{timestamp} {timezone_offset}".encode("utf-8") + + + # Обязательно нужно указывать полный хэш коммита + if commit.original_id == b"72f6afa37aac4cdbf8d37f22470b77c221a8fce0": + # Сообщение коммита + commit.message = "Новое сообщение коммита!".encode("utf-8") + + new_name = "Иван Иванов".encode("utf-8") + new_email = "ivan-ivanov@mail.com".encode("utf-8") + new_date = git_timestamp("01.01.2000 10:00:00") + + # Автор изменений + commit.author_name = new_name + commit.author_email = new_email + + # Автор коммита + commit.committer_name = new_name + commit.committer_email = new_email + + # Дата изменени и дата коммита + commit.author_date = new_date + commit.committer_date = new_date + ``` + +## Полезные ссылки + + - [git-filter-repo](https://github.com/newren/git-filter-repo/?tab=readme-ov-file#simple-example-with-comparisons) on GitHub + - [usage examples](https://www.mankier.com/1/git-filter-repo) \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index be000f5..d38f95d 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -43,6 +43,11 @@ extra: markdown_extensions: - attr_list - admonition + - pymdownx.tabbed: + alternate_style: true + slugify: !!python/object/apply:pymdownx.slugs.slugify + kwds: + case: lower - pymdownx.highlight: anchor_linenums: true line_spans: __span