Comment utiliser git filter-repo comme bibliothèque avec l'interface du module Python?
Je sais que je donne le code Python sous forme de chaîne dans la ligne de commande par exemple comme:
git-filter-repo --name-callback 'return name.replace(b"Wiliam", b"William")'
mais d'autant plus que j'entre dans des scripts plus complexes, cela deviendra très maladroit.
Existe-t-il plutôt un moyen de faire quelque chose comme:
main.py
import git_filter_repo
def name_callback(name):
return name.replace(b"Wiliam", b"William")
git_filter_repo.name_callback(name_callback)
Le projet README mentionne qu'il peut être utilisé comme bibliothèque, et j'ai réussi à installer le package Python avec:
python3 -m pip install --user git-filter-repo
mais je ne pouvais pas facilement trouver de documentation sur la façon de faire un bonjour le monde avec l'API Python.
Réponses
Les dernières lignes de la source https://github.com/newren/git-filter-repo/blob/7b3e714b94a6e5b9f478cb981c7f560ef3f36506/git-filter-repo#L3946 étaient un bon point de départ, donc je peux faire quelque chose comme ceci:
#!/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()
qui est censé être équivalent à:
git filter-repo --refs HEAD <(echo 'd1==>asdf') --force
Cela répond également: Comment remplacer du texte à partir de fichiers dans l'historique git?
Comment connaître également le chemin du blob: Comment modifier un blob en tenant compte à la fois de son chemin de fichier et de ses données avec git filter-repo?
Testé dans git-filter-repo ac039ecc095d avec ce dépôt de test: https://github.com/cirosantilli/test-git-filter-repo