2017-06-02 4 views
0

Je travaille sur un parent-filtre et je dois obtenir le (éventuellement) réécrit ID de révision des parents de la révision en cours. Je peux voir sur l'homme page qu'il ya une carte fonction disponible qui peut prendre en charge que:git filter-branch: comment utiliser la fonction map?

A map function is available that takes an "original sha1 id" argument and outputs a "rewritten sha1 id" if the commit has been already rewritten, and "original sha1 id" otherwise; the map function can return several ids on separate lines if your commit filter emitted multiple commits.

Cependant, lorsque je tente de l'utiliser dans mon script-filtre parent (un bash- script basé sur) la fonction n'est pas disponible:

Je dans mon code:

echo Finding mapping of revision $i >&2 
    map $i >&2 
    echo done >&2 

Résultat lors du traitement:

Finding mapping of revision e73bf9db5c4ce2fb1970c90e3a24a2ff004ec3fe 
rewrite_svn_parent.sh: line 44: map: command not found 
done 

Idéalement, je voudrais faire quelque chose comme ceci: NEW_ID=$(map $i) mais tant que la fonction n'est pas disponible, ne peut pas faire beaucoup.

https://git-scm.com/docs/git-filter-branch

Répondre

0

Chacun des différents filtres est exécuté en tant eval op:

parentstr="$(echo "$parentstr" | eval "$filter_parent")" || 

(voir https://github.com/git/git/blob/master/git-filter-branch.sh#L389). Cela signifie que vous avez accès aux fonctions shell définies dans le shell parent. Mais dans votre propre script, vous ne les avez plus. Cela signifie que vous devez soit exécuter tout dans ce shell, soit trouver un moyen d'exporter ou de reproduire les map de la branche de filtre (dont isn't really that hard mais évidemment vous dépendez fortement de l'implémentation).

Si cela bash (ou si votre /bin/sh est bash) vous pouvez simplement utiliser:

export -f bash; bash /path/to/script 

comme filtre parent et écrire encore comme un script. Si ce n'est pas le cas, eh bien, la méthode "triche" (récupérez l'implémentation depuis la branche de filtre elle-même) est probablement très bien dans la pratique.