Для выполнения данной задачи, необходимо использовать библиотеку GitPython, которая позволит работать с репозиторием Git в Python. Вот пример скрипта на Python, который выбирает коммиты между двумя указанными timestamp и равномерно распределяет их между другими двумя timestamp, полностью переписывая историю Git. ```python import os import git import time import datetime # Функция для получения списка коммитов между start_ts и end_ts def get_commits_between_time(repo, start_ts, end_ts): start_datetime = datetime.datetime.fromtimestamp(start_ts) end_datetime = datetime.datetime.fromtimestamp(end_ts) commits = [] for commit in repo.iter_commits(): commit_time = datetime.datetime.fromtimestamp(commit.committed_date) if start_datetime <= commit_time <= end_datetime: commits.append(commit) return commits # Функция для изменения даты коммитов def change_commit_date(commit, new_date): os.environ['GIT_COMMITTER_DATE'] = str(new_date) os.environ['GIT_AUTHOR_DATE'] = str(new_date) commit.author.date = new_date commit.committer.date = new_date commit.tree = commit.tree.write() # Задаем переменные repo_path = "/path/to/repo" start_ts = 1631109875 # первый timestamp end_ts = 1631355267 # второй timestamp new_start_ts = 1641000000 # новый первый timestamp new_end_ts = 1642000000 # новый второй timestamp # Открываем репозиторий repo = git.Repo(repo_path) # Получаем список коммитов между start_ts и end_ts commits = get_commits_between_time(repo, start_ts, end_ts) # Вычисляем разницу во времени между новыми timestamp total_time_diff = new_end_ts - new_start_ts # Вычисляем шаг, на который мы будем изменять дату коммитов step = total_time_diff / len(commits) # Изменяем дату каждого коммита for i, commit in enumerate(commits): new_date = int(new_start_ts + i * step) change_commit_date(commit, new_date) # Перезаписываем историю гита repo.git.rebase('-i', '--root', '--autosquash', '--keep-empty') # Вызываем команду git gc, чтобы убедиться, что все ненужные данные были удалены repo.git.gc('--prune=now') ``` Этот скрипт сначала открывает репозиторий с указанным путем, затем находит список коммитов между первыми двумя timestamp и изменяет дату каждого коммита, чтобы они были равномерно распределены между новыми timestamp. Затем он вызывает команду `git rebase` с опциями, чтобы переписать историю Git. Наконец, он вызывает команду `git gc`, чтобы убедиться, что все ненужные данные были удалены.