Comment utiliser git filter-repo comme bibliothèque avec l'interface du module Python?

Oct 02 2020

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

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

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