2012-03-13 85 views
3

我想重命名git倉庫中的一些提交器,使用git filter-branch。我很想使用一些更復雜的邏輯,但我並不真正瞭解bash。的(工作)腳本我目前使用這個樣子的:使用python腳本作爲git過濾器分支的過濾器

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 

是否有可能對我使用python腳本作爲--env-filter說法?如果是這樣,我將如何訪問$GIT_COMMITTER_NAME來讀取和寫入它?

我該如何做一個Python文件中的bash字符串的等價物?

回答

4

在Python中,您需要import os,之後os.environ是一個帶有傳入環境的字典。 os.environ的更改會自動導出。這裏真正的問題是,Git的--filter- *過濾器運行,因爲它說:

使用eval命令,在外殼方面始終評估(與提交過濾器顯着的例外,由於技術原因) 。

所以它的實際使用shell,如果你有外殼調用的Python,你風與外殼的子進程,並在Python進程作出不影響該外殼的任何變化。你不得不eval Python腳本的輸出

eval `python foo.py` 

其中foo.py輸出相應export命令:

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. 

(以上全部是未經測試)。