Есть ли «Git Sed» или эквивалент? - PullRequest
37 голосов
/ 11 марта 2012

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

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

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

Ответы [ 8 ]

48 голосов
/ 11 марта 2012

Вы можете использовать git ls-files в сочетании с xargs и sed:

git ls-files -z | xargs -0 sed -i -e 's/old-method-name/new-method-name/g'
18 голосов
/ 11 марта 2012

Спасибо и Нуфалу, и Грегу за их посты.Я объединил их решения и нашел тот, который использует 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'
11 голосов
/ 11 марта 2012

Вы можете вставить

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.

9 голосов
/ 21 августа 2012

Вот решение, которое объединяет решения 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
3 голосов
/ 28 февраля 2017

Да, есть.В Ubuntu пакет git-extras предоставляет команду.Установите его:

$ sudo apt-get install git-extras

Используйте его, как показано ниже, например, для быстрого исправления орфографических ошибок:

$ git sed 'qoute' 'quote'

К сожалению, он не поддерживает файловые фильтры, такие как git grep:

$ git grep -e 'class' -- '*.py'

Та же функциональность также существует на Mac и других операционных системах.Оформить заказ Страница установки .

1 голос
/ 14 июня 2014

Обратите внимание, что начиная с git 2.1 (3 квартал 2014 года) , вы можете установить "full-name" по умолчанию для git grep.
(См. коммит 6453f7b от Андреас Шваб )

"git grep" научился grep.fullname переменная конфигурации, чтобы "--full-name" стал значением по умолчанию.
Это может привести к регрессии у пользователей сценариев, которые не ожидают этого нового поведения.

Это означает, что предыдущие решения могут извлечь выгоду из:

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\"' -
0 голосов
/ 12 февраля 2019

Я написал git sed, который поддерживает фильтрацию файлов:

#!/bin/bash

split=$(($# + 1))

for i in $(seq 1 $#); do
   if [[ "${!i}" = "--" ]]; then
       split=$i
   fi
done

git ls-files -z "${@:$split:$#}" | xargs -0 sed -b -i "${@:1:$(($split - 1))}"

(Возможно, вам не нужен параметр -b на платформах, отличных от Windows; в Windows необходимо сохранить стиль Windowsпереводы строки.)

Затем вы можете добавить псевдоним в .gitconfig:

[alias]
    sed = ! <path to git-sed>

, чтобы использовать его как git sed -e <your expression> -- <path filter>.

0 голосов
/ 01 декабря 2014

См. git-search-replace на github - он предназначен именно для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...