Использование git filter-branch с модулем подпроцесса Python - PullRequest
3 голосов
/ 01 февраля 2012

Я пытаюсь написать сценарий, который поможет мне сопоставить некоторых старых пользователей новым пользователям в нескольких репозиториях Git.Проблема у меня с модулем подпроцесса.Простые команды, такие как «git status», вроде бы работают нормально, но более сложная команда «git filter-branch» не работает для меня.

функция filter_history

def filter_history(old, new, name, repoPath):

command = """ filter-branch --env-filter '
        an="$GIT_AUTHOR_NAME"
        am="$GIT_AUTHOR_EMAIL"
        cn="$GIT_COMMITTER_NAME"
        cm="$GIT_COMMITTER_EMAIL"

        if [[ "$GIT_COMMITTER_EMAIL" == |old|* ]]
        then
            cn="|name|"
            cm="|new|"
        fi
        if [[ "$GIT_AUTHOR_EMAIL" == |old|* ]]
        then
            an="|name|"
            am="|new|"
        fi

        export GIT_AUTHOR_NAME="$an"
        export GIT_AUTHOR_EMAIL="$am"
        export GIT_COMMITTER_NAME="$cn"
        export GIT_COMMITTER_EMAIL="$cm"
    '
"""

#Do string replace
command = command.replace("|old|", old)
command = command.replace("|new|", new)
command = command.replace("|name|", name)

subprocess.Popen(['/usr/bin/git', command], cwd=os.path.dirname(repoPath), shell=False)

Пример некоторых выходных данных:

fatal: cannot exec 'git- filter-branch --env-filter '
        an="$GIT_AUTHOR_NAME"
        am="$GIT_AUTHOR_EMAIL"
        cn="$GIT_COMMITTER_NAME"
        cm="$GIT_COMMITTER_EMAIL"

        if [[ "$GIT_COMMITTER_EMAIL" == jacks* ]]
        then
            cn="Jack Slingerland"
            cm="jacks-teamddm"
        fi
        if [[ "$GIT_AUTHOR_EMAIL" == jacks* ]]
        then
            an="Jack Slingerland"
            am="jacks-teamddm"
        fi

        export GIT_AUTHOR_NAME="$an"
        export GIT_AUTHOR_EMAIL="$am"
        export GIT_COMMITTER_NAME="$cn"
        export GIT_COMMITTER_EMAIL="$cm"
    '
': File name too long

Некоторые вещи, которые я заметил, заключаются в том, что к команде git добавляется дефис, что для меня не имеет смысла.Кроме того, если я удаляю лишний hypen из напечатанной команды и выполняю его в repoPath, все работает нормально.Любая помощь или направление по этому вопросу будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Это должно работать: (я использую Linux)

def filter_history(old, new, name, repoPath):
    command = """'
        an="$GIT_AUTHOR_NAME"
        am="$GIT_AUTHOR_EMAIL"
        cn="$GIT_COMMITTER_NAME"
        cm="$GIT_COMMITTER_EMAIL"

        if [[ "$GIT_COMMITTER_EMAIL" == |old|* ]]
        then
            cn="|name|"
            cm="|new|"
        fi
        if [[ "$GIT_AUTHOR_EMAIL" == |old|* ]]
        then
            an="|name|"
            am="|new|"
        fi

        export GIT_AUTHOR_NAME="$an"
        export GIT_AUTHOR_EMAIL="$am"
        export GIT_COMMITTER_NAME="$cn"
        export GIT_COMMITTER_EMAIL="$cm"
    '
    """

#Do string replace
    command = command.replace("|old|", old)
    command = command.replace("|new|", new)
    command = command.replace("|name|", name)

    subprocess.Popen(['git filter-branch --env-filter', command],cwd=os.path.dirname(repoPath), shell=True)

Обратите внимание, что "shell = True" в подпроцессе. Функция открытия

1 голос
/ 06 февраля 2012

В качестве FYI для любого, кто придет, @xueyymusic был самым близким.В итоге я использовал следующее:

def filter_history(old, new, name, repoPath):

command = """--env-filter '
        an="$GIT_AUTHOR_NAME"
        am="$GIT_AUTHOR_EMAIL"
        cn="$GIT_COMMITTER_NAME"
        cm="$GIT_COMMITTER_EMAIL"

        if [[ "$GIT_COMMITTER_EMAIL" == |old|* ]]
        then
            cn="|name|"
            cm="|new|"
        fi

        if [[ "$GIT_AUTHOR_EMAIL" == |old|* ]]
        then
            an="|name|"
            am="|new|"
        fi

        export GIT_AUTHOR_NAME="$an"
        export GIT_AUTHOR_EMAIL="$am"
        export GIT_COMMITTER_NAME="$cn"
        export GIT_COMMITTER_EMAIL="$cm"
'
"""

#DO string replace
command = command.replace("|old|", old)
command = command.replace("|new|", new)
command = command.replace("|name|", name)

process = subprocess.Popen(['git filter-branch', command],cwd=os.path.dirname(repoPath), shell=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...