¿Cómo usar git filter-repo como una biblioteca con la interfaz del módulo Python?
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
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