¿Cómo usar git filter-repo como una biblioteca con la interfaz del módulo Python?

Oct 02 2020

Sé que doy el código de Python como una cadena en la línea de comando, por ejemplo, como:

git-filter-repo --name-callback 'return name.replace(b"Wiliam", b"William")'

pero especialmente a medida que me meto en guiones más complejos, esto se vuelve muy torpe.

Más bien, ¿hay alguna manera de hacer algo como:

main.py

import git_filter_repo

def name_callback(name):
    return name.replace(b"Wiliam", b"William")

git_filter_repo.name_callback(name_callback)

El proyecto README menciona que se puede usar como biblioteca y logré instalar el paquete Python con:

python3 -m pip install --user git-filter-repo

pero no pude encontrar fácilmente documentación sobre cómo hacer un hola mundo con la API de Python.

Respuestas

CiroSantilli郝海东冠状病六四事件法轮功 Oct 02 2020 at 01:05

Las últimas líneas de la fuente https://github.com/newren/git-filter-repo/blob/7b3e714b94a6e5b9f478cb981c7f560ef3f36506/git-filter-repo#L3946 fue un buen punto de partida, así que puedo hacer algo como esto:

#!/usr/bin/env python

import git_filter_repo

def blob_callback(blob, callback_metadata):
    blob.data = blob.data.replace(b'd1', b'asdf')

# Args deduced from:
# print(git_filter_repo.FilteringOptions.parse_args(['--refs', 'HEAD', '--force'], error_on_empty=False))
args = git_filter_repo.FilteringOptions.default_options()
args.force = True
args.partial = True
args.refs = ['HEAD']
args.repack=False
args.replace_refs='update-no-add'

git_filter_repo.RepoFilter(
   args,
   blob_callback=blob_callback
).run()

que pretende ser equivalente a:

git filter-repo --refs HEAD <(echo 'd1==>asdf') --force

Esto también responde: ¿Cómo sustituir texto de archivos en el historial de git?

Cómo saber también la ruta del blob: ¿Cómo modificar un blob considerando tanto su ruta de archivo como sus datos con git filter-repo?

Probado en git-filter-repo ac039ecc095d con este repositorio de prueba: https://github.com/cirosantilli/test-git-filter-repo