git-filter-repo#
С помощью git-filter-repo можно переписать историю репозитория.
Установка#
Глобально или в virtualenv
Замена метаданных коммитов#
git-filter-repo
позволяет создать скрипт на Python
, который будет вызван для всех коммитов репозитория. Доступ к данным коммита, с возможностю их редактирования, предоставляется через объект commit
. Таким образом можно описать любую логику изменения метаданных коммитов на обычном Python
.
Ниже представлен пример изменения метаданных коммита по его хэшу. Узнать хэш коммита можно с помощью, например, git log
.
"""Файл создан для использования с 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 on GitHub
- usage examples