Come utilizzare git filter-repo come libreria con l'interfaccia del modulo Python?
So di dare il codice Python come una stringa nella riga di comando, ad esempio come:
git-filter-repo --name-callback 'return name.replace(b"Wiliam", b"William")'
ma soprattutto quando mi occupo di script più complessi, questo diventerà molto goffo.
Piuttosto, c'è un modo per fare qualcosa come:
main.py
import git_filter_repo
def name_callback(name):
return name.replace(b"Wiliam", b"William")
git_filter_repo.name_callback(name_callback)
Il progetto README menziona che può essere utilizzato come libreria e sono riuscito a installare il pacchetto Python con:
python3 -m pip install --user git-filter-repo
ma non sono riuscito a trovare facilmente la documentazione su come fare un Hello World con l'API Python.
Risposte
Le ultime righe della fonte https://github.com/newren/git-filter-repo/blob/7b3e714b94a6e5b9f478cb981c7f560ef3f36506/git-filter-repo#L3946 sono stati un buon punto di partenza, quindi posso fare qualcosa del genere:
#!/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()
che è inteso essere equivalente a:
git filter-repo --refs HEAD <(echo 'd1==>asdf') --force
Questo risponde anche: come sostituire il testo dai file nella cronologia di git?
Come conoscere anche il percorso del blob: come modificare un blob considerando sia il percorso del file che i dati con git filter-repo?
Testato in git-filter-repo ac039ecc095d con questo repository di prova: https://github.com/cirosantilli/test-git-filter-repo