2017-06-02 16 views
0

私は親フィルタで作業しています。の最新のリビジョンの親のリビジョンIDを書き直す必要があります。私は私の親フィルタスクリプト(bash-でそれを使用しようとすると、git filter-branch:マップ関数はどのように使用できますか?

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.

しかし:私はそれの世話をすることができます利用可能マップ機能があることを、マンページで見ることができますベースのスクリプト)機能は使用できません:私は私のコードでこれを持って

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

結果時の処理:

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

NEW_ID=$(map $i)が理想的ですが、関数がでない限り、はあまりできません。

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

答えて

0

各種フィルタのそれぞれは、eval OPとして実行されます。

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

https://github.com/git/git/blob/master/git-filter-branch.sh#L389を参照してください)。つまり、親シェルで定義されているシェル関数にアクセスできます。しかし、あなた自身のスクリプトでは、もはやそれらを持っていません。これは、このシェルですべてを実行するか、フィルタブランチのmap(どちらもisn't really that hardですが、実際は実装に大きく依存しています)をエクスポートまたは再生成する方法を見つける必要があることを意味します。

これはbashの(またはあなたの/bin/shがbashの場合)であれば、あなたは、単に使用することができます:あなたの親フィルタとして

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

を、まだスクリプトとしてそれを書きます。そうでない場合、実際には、フィルタバンク自体から実装を取得する「チート」メソッドはおそらく実際には問題ありません。

関連する問題