Подтвердить что ты не робот

Есть ли 'git sed' или эквивалент?

Скажем, я хочу переименовать метод в исходном коде, содержащемся в репозитории git. Я мог бы сделать это вручную, но имя метода может быть в нескольких местах (например, unit test, документация, фактический метод). Чтобы проверить, где используется метод, я использую 'git grep'. Я получаю 'git grep', чтобы показывать только строки, которые я хочу изменить, и затем у меня нет рабочего процесса для автоматического изменения этих строк.

Я ищу автоматический способ (надеюсь, используя инструменты git), чтобы сделать этот последний шаг. Я надеялся, что есть какой-то "git sed" или эквивалент, но я не могу их найти.

Интерфейс, о котором я думаю, будет приятным: git sed/old-method-name/new-method-name/g '

4b9b3361

Ответ 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 и других операционных системах. Оформить его страницу установки.