Есть ли 'git sed' или эквивалент?
Скажем, я хочу переименовать метод в исходном коде, содержащемся в репозитории git. Я мог бы сделать это вручную, но имя метода может быть в нескольких местах (например, unit test, документация, фактический метод). Чтобы проверить, где используется метод, я использую 'git grep'. Я получаю 'git grep', чтобы показывать только строки, которые я хочу изменить, и затем у меня нет рабочего процесса для автоматического изменения этих строк.
Я ищу автоматический способ (надеюсь, используя инструменты git), чтобы сделать этот последний шаг. Я надеялся, что есть какой-то "git sed" или эквивалент, но я не могу их найти.
Интерфейс, о котором я думаю, будет приятным: git sed/old-method-name/new-method-name/g '
Ответы
Ответ 1
Вы можете сделать
for i in $(git grep --full-name -l old_method_name)
do
perl -p -i -e 's/old_method_name/new_method_name/g' $i
done
поместите это в файл где-нибудь, а затем подпишите его как git sed
в свой конфиг.
Обновление: Комментарий от tchrist ниже - это гораздо лучшее решение, поскольку оно предотвращает повторное появление perl от нереста.
Ответ 2
Вы можете использовать git ls-files
в комбинации с xargs
и sed
:
git ls-files -z | xargs -0 sed -i -e 's/old-method-name/new-method-name/g'
Ответ 3
Благодаря Нуфалу и Грегу за их должности. Я объединил их решения и нашел тот, который использует git grep (более надежный, чем git ls файлы для моего репо, поскольку он, кажется, перечисляет только файлы с фактическим кодом src в них, а не подкадровые папки, например), а также имеет имя старого метода и новое имя метода только в одном месте:
В блоке [alias]
моего файла ~/.gitconfig
:
sed = ! git grep -z --full-name -l '.' | xargs -0 sed -i -e
Для использования:
git sed 's/old-method-name/new-method-name/ig'
Ответ 4
Здесь решение, которое сочетает в себе функции Noufal и claytontstanley и позволяет избежать касания файлов, которые не будут меняться.
В блоке [alias]
моего файла ~/.gitconfig
:
psed = !sh -c 'git grep --null --full-name --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' -
Для использования:
git psed old_method_name new_method_name
Ответ 5
Обратите внимание, что при запуске git 2.1 (Q3 2014) вы можете установить "full-name
" по умолчанию для git grep
.
(зафиксировать 6453f7b Andreas Schwab)
"git grep
" узнал grep.fullname
конфигурационную переменную, чтобы принудительно установить значение <<24 → . Это может привести к регрессиям для пользователей сценариев, которые не ожидают этого нового поведения.
Это означает, что предыдущие решения могут выиграть от:
git config grep.full-name true
И используйте:
psed = !sh -c 'git grep --null --name-only --perl-regexp -e \"$1\" | xargs -0 perl -i -p -e \"s/$1/$2/g\"' -
Ответ 6
Посмотрите git-search-replace на github - он разработан именно для этого.
Ответ 7
Да, есть. В Ubuntu указан пакет git-extras
. Установите его:
$ sudo apt-get install git-extras
Используйте его, как показано ниже. для исправления проблемы правописания:
$ git sed 'qoute' 'quote'
К сожалению, он не поддерживает файловые фильтры, такие как git grep:
$ git grep -e 'class' -- '*.py'
Та же функциональность существует и на Mac и других операционных системах. Оформить его страницу установки.