2013-09-20 5 views
3

У меня есть проблема, аналогичную описанной в вопросе How do I change the author of a commit in git? и решение, которое я пытаюсь использует git filter-branch, но это не работает, потому что она не будет соответствовать строковый литерал с пробелами, то есть мне нужно contains:Есть ли лучший способ совпадения при использовании `git filter-branch`?

git filter-branch --commit-filter ' 
    if [ "$GIT_AUTHOR_NAME" = "giovanni azua" ]; 
    then 
      GIT_COMMITTER_NAME="Giovanni Azua"; 
      GIT_COMMITTER_EMAIL="[email protected]"; 
      GIT_AUTHOR_NAME="Giovanni Azua"; 
      GIT_AUTHOR_EMAIL="[email protected]"; 
      git commit-tree "[email protected]"; 
    else 
      git commit-tree "[email protected]"; 
    fi' HEAD 

Знак равенства не будет работать, если между ними есть пробелы, и я понятия не имею, как его избежать. Я также попытался убежать от него, как giovanni\ azua, но не работает. Я также не мог найти никакой ссылки на то, что это за сценарий, то есть как вы делаете строку contains или substring? Я всегда получаю вывод WARNING: Ref 'refs/heads/master' is unchanged.

ОБНОВЛЕНИЕ: оно также проверит мою коробку, чтобы иметь не if [ "$GIT_AUTHOR_NAME" ~= "giovanni azua" ];, но оператор ~= не работает.

+0

Если я правильно понял, вы хотите совпадение с регулярным выражением или глобусом, так что если GIT_AUTHOR_NAME (скажем) 'pgiovanni azuaq', он также должен совпадать? (Вероятно, нет, но это предназначено, чтобы заставить вас рассмотреть именно то, что вы хотите сопоставить.) Тест, 'if [...]', просто запускает '[' * program * (см. [Test] (http://www.lehman.cuny.edu/cgi-bin/man-cgi?test+1) docs). Используйте 'expr' или' grep' для запуска регулярного выражения. – torek

ответ

2

создания сценариев, используемый git filter-branch просто фрагмент sh, что означает, что все возможности sh и любые команды, которые вы можете вызвать из него (echo, grep, sed и т.д.) находятся в вашем распоряжении. Для реализации подстановочных матчей вам не нужно вызывать внешние команды, так как sh предоставляет несколько неуклюжую, но полезную команду case. В вашем случае (не каламбур), это может выглядеть следующим образом:

git filter-branch --commit-filter ' 
    case "$GIT_AUTHOR_NAME" in 
     *[Gg]iovanni*[Aa]zua*) 
      GIT_COMMITTER_NAME="Giovanni Azua" 
      GIT_COMMITTER_EMAIL="[email protected]" 
      GIT_AUTHOR_NAME="Giovanni Azua" 
      GIT_AUTHOR_EMAIL="[email protected]" 
      git commit-tree "[email protected]" 
      ;; 
     *) 
      git commit-tree "[email protected]" 
      ;; 
     esac 
' HEAD 

выше изменит все фиксации, автор которого имя содержит giovanni или Giovanni и azua или Azua (в указанном порядке) в любом месте имени автора.

Смежные вопросы