Come utilizzare git filter-repo come libreria con l'interfaccia del modulo Python?

Oct 02 2020

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

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

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