2012-03-13 3 views
3

git filter-branchを使用して、gitリポジトリ内のコミッタの名前を変更しようとしています。私はかなり複雑なロジックを使いたいと思っていますが、bashは分かりません。 (作業)スクリプトは、私は現在、このようなルックスを使用しています:私は--env-filter引数としてPythonスクリプトを使用するためpythonスクリプトをgit filter-branchのフィルタとして使用する

git filter-branch -f --tag-name-filter cat --env-filter ' 

cn="$GIT_COMMITTER_NAME" 
cm="$GIT_COMMITTER_EMAIL" 

if [ $cn = "ew" ] 
then 
    cn="Eric" 
    cm="[email protected]" 
fi 

export GIT_COMMITTER_NAME="$cn" 
export GIT_COMMITTER_EMAIL="$cm" 
' -- --all 

ことは可能ですか?もしそうなら、どうすれば$GIT_COMMITTER_NAMEにアクセスして読み書きすることができますか?

どのように私は、Pythonファイルでそのbash文字列に相当するだろうか?

答えて

4

Pythonでは、import osが必要です。その後、os.environは入ってくる環境の辞書です。 os.environへの変更は自動的にエクスポートされます。ここでの本当の問題は、それが言うようにgitの--filter- *フィルタは、実行されていることである。

常に(技術的な理由のために、コミットフィルタの顕著な例外を除いて)のevalコマンドを使用して、シェルのコンテキストで評価

実際にシェルを使用しています。シェルでPythonを呼び出すと、シェルのサブプロセスが終了し、Pythonプロセスで加えられた変更はそのシェルに影響しません。 foo.pyが適切なexportコマンドを出力

eval `python foo.py` 

:(上記のテストされ、すべての)

import os 

def example(): 
    cn = os.environ['GIT_COMMITTER_NAME'] 
    cm = os.environ['GIT_COMMITTER_EMAIL'] 
    if cn == 'ew': 
     cn = 'Eric' 
     cm = '[email protected]' 
    print ('export GIT_COMMITTER_NAME="%s"' % cn) 
    print ('export GIT_COMMITTER_EMAIL="%s"' % cm) 

example() # or if __name__ == '__main__', etc. 

あなたはevalにPythonスクリプトの出力を持っていると思います。

関連する問題